From: Vlad Brezae Date: Tue, 10 Nov 2015 14:53:35 +0000 (+0200) Subject: [sgen] Fix binary protocol scan process reference entries X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=e314e599917a49d4d575a47191c7ef75b5c0cdde;p=mono.git [sgen] Fix binary protocol scan process reference entries The obj pointer can actually point inside the object for big arrays --- diff --git a/mono/sgen/sgen-marksweep-drain-gray-stack.h b/mono/sgen/sgen-marksweep-drain-gray-stack.h index c459a5b264c..bfddff0d891 100644 --- a/mono/sgen/sgen-marksweep-drain-gray-stack.h +++ b/mono/sgen/sgen-marksweep-drain-gray-stack.h @@ -223,7 +223,7 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ #ifdef COPY_OR_MARK_CONCURRENT #define HANDLE_PTR(ptr,obj) do { \ GCObject *__old = *(ptr); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old && !sgen_ptr_in_nursery (__old)) { \ MSBlockInfo *block = MS_BLOCK_FOR_OBJ (__old); \ if (G_UNLIKELY (!sgen_ptr_in_nursery (ptr) && \ @@ -242,7 +242,7 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ #else #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old) { \ gboolean __still_in_nursery = COPY_OR_MARK_FUNCTION_NAME ((ptr), __old, queue); \ if (G_UNLIKELY (__still_in_nursery && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (*(ptr)))) { \ diff --git a/mono/sgen/sgen-marksweep-scan-object-concurrent.h b/mono/sgen/sgen-marksweep-scan-object-concurrent.h index fe080905de9..ab234e12695 100644 --- a/mono/sgen/sgen-marksweep-scan-object-concurrent.h +++ b/mono/sgen/sgen-marksweep-scan-object-concurrent.h @@ -33,7 +33,7 @@ #undef HANDLE_PTR #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old) { \ gboolean __still_in_nursery = major_copy_or_mark_object_with_evacuation ((ptr), __old, queue); \ if (G_UNLIKELY (__still_in_nursery && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (*(ptr)))) { \ diff --git a/mono/sgen/sgen-minor-scan-object.h b/mono/sgen/sgen-minor-scan-object.h index cda7746a44d..b1895985dc3 100644 --- a/mono/sgen/sgen-minor-scan-object.h +++ b/mono/sgen/sgen-minor-scan-object.h @@ -38,7 +38,7 @@ extern guint64 stat_scan_object_called_nursery; #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old) { \ SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue); \ SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \ @@ -46,9 +46,9 @@ extern guint64 stat_scan_object_called_nursery; } while (0) static void -SERIAL_SCAN_OBJECT (GCObject *object, SgenDescriptor desc, SgenGrayQueue *queue) +SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue) { - char *start = (char*)object; + char *start = (char*)full_object; SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;