[sgen] Pass descriptor, not vtable, to OBJ_COMPLEX_ARR_FOREACH_PTR.
authorMark Probst <mark.probst@gmail.com>
Fri, 22 Aug 2014 21:04:33 +0000 (14:04 -0700)
committerMark Probst <mark.probst@gmail.com>
Mon, 29 Sep 2014 18:03:59 +0000 (11:03 -0700)
Later on, when we enqueue objects with their GC descriptors, we won't
load the vtable before scanning (because we'll already have the
descriptor), so the scanning macros shouldn't take them as arguments.

mono/metadata/sgen-descriptor.h
mono/metadata/sgen-scan-object.h

index 366c7667778a06284f8f27ac2c0692fda29b6347..1910f98a1178ca65816f1acbf6030bc78d1a57d2 100644 (file)
@@ -258,15 +258,16 @@ sgen_gc_descr_has_references (mword desc)
        } while (0)
 
 /* this one is untested */
-#define OBJ_COMPLEX_ARR_FOREACH_PTR(vt,obj)    do {    \
+#define OBJ_COMPLEX_ARR_FOREACH_PTR(desc,obj)  do {    \
                /* there are pointers */        \
-               gsize *mbitmap_data = sgen_get_complex_descriptor ((vt)->desc); \
+               GCVTable *vt = (GCVTable*)SGEN_LOAD_VTABLE (obj); \
+               gsize *mbitmap_data = sgen_get_complex_descriptor ((desc)); \
                gsize mbwords = (*mbitmap_data++) - 1;  \
                gsize el_size = mono_array_element_size (vt->klass);    \
                char *e_start = (char*)(obj) +  G_STRUCT_OFFSET (MonoArray, vector);    \
                char *e_end = e_start + el_size * mono_array_length_fast ((MonoArray*)(obj));   \
                if (0)                                                  \
-                        g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, (obj), (vt)->desc, vt->klass->name_space, vt->klass->name); \
+                        g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, (obj), (desc), (vt)->klass->name_space, (vt)->klass->name); \
                while (e_start < e_end) {       \
                        void **_objptr = (void**)e_start;       \
                        gsize *bitmap_data = mbitmap_data;      \
index 7cbe57a6c83e82f9c59d6dc7345120d2e2bf7540..d33560cdb00ac63549d06c2c946f372b457906d0 100644 (file)
@@ -97,7 +97,7 @@
 #ifndef SCAN_OBJECT_NOVTABLE
        case DESC_TYPE_COMPLEX_ARR:
                /* this is an array of complex structs */
-#define SCAN OBJ_COMPLEX_ARR_FOREACH_PTR (vt, start)
+#define SCAN OBJ_COMPLEX_ARR_FOREACH_PTR (desc, start)
 #ifndef SCAN_OBJECT_NOSCAN
                SCAN;
 #endif