Tue Aug 22 15:53:29 CEST 2006 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Tue, 22 Aug 2006 13:54:44 +0000 (13:54 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Tue, 22 Aug 2006 13:54:44 +0000 (13:54 -0000)
* gc.c: cope with the target object of a GC handle being NULL
(bug #78877).

svn path=/trunk/mono/; revision=64190

mono/metadata/ChangeLog
mono/metadata/gc.c

index d6e9d96fd2df40caedcd9f9e7eb6f476e3b358c4..c43fc7a2b3c8feb87818b23dbb59e5ddc822d66b 100644 (file)
@@ -1,4 +1,9 @@
 
+Tue Aug 22 15:53:29 CEST 2006 Paolo Molaro <lupus@ximian.com>
+
+       * gc.c: cope with the target object of a GC handle being NULL
+       (bug #78877).
+
 Tue Aug 22 11:10:33 CEST 2006 Paolo Molaro <lupus@ximian.com>
 
        * class.c: recursively check parent's explicit implementations
index 22869606649ee15e264dfbb0fb688f2ff2a32b92..162eaccdfe3556688f1ae8cd7c642841be303ece 100644 (file)
@@ -475,7 +475,8 @@ alloc_handle (HandleData *handles, MonoObject *obj)
                        memcpy (domain_ids, handles->domain_ids, sizeof (guint16) * handles->size);
                        for (i = 0; i < handles->size; ++i) {
                                MonoObject *obj = mono_gc_weak_link_get (&(handles->entries [i]));
-                               mono_gc_weak_link_remove (&(handles->entries [i]));
+                               if (handles->entries [i])
+                                       mono_gc_weak_link_remove (&(handles->entries [i]));
                                /*g_print ("reg/unreg entry %d of type %d at %p to object %p (%p), was: %p\n", i, handles->type, &(entries [i]), obj, entries [i], handles->entries [i]);*/
                                if (obj) {
                                        mono_gc_weak_link_add (&(entries [i]), obj);
@@ -600,7 +601,8 @@ mono_gchandle_set_target (guint32 gchandle, MonoObject *obj)
        lock_handles (handles);
        if (slot < handles->size && (handles->bitmap [slot / 32] & (1 << (slot % 32)))) {
                if (handles->type <= HANDLE_WEAK_TRACK) {
-                       mono_gc_weak_link_remove (&handles->entries [slot]);
+                       if (handles->entries [slot])
+                               mono_gc_weak_link_remove (&handles->entries [slot]);
                        if (obj)
                                mono_gc_weak_link_add (&handles->entries [slot], obj);
                } else {
@@ -666,10 +668,12 @@ mono_gchandle_free (guint32 gchandle)
                return;
        lock_handles (handles);
        if (slot < handles->size && (handles->bitmap [slot / 32] & (1 << (slot % 32)))) {
-               if (handles->type <= HANDLE_WEAK_TRACK)
-                       mono_gc_weak_link_remove (&handles->entries [slot]);
-               else
+               if (handles->type <= HANDLE_WEAK_TRACK) {
+                       if (handles->entries [slot])
+                               mono_gc_weak_link_remove (&handles->entries [slot]);
+               } else {
                        handles->entries [slot] = NULL;
+               }
                handles->bitmap [slot / 32] &= ~(1 << (slot % 32));
        } else {
                /* print a warning? */