#include "sgen-major-copy-object.h"
static void
-major_copy_or_mark_object (void **obj_slot, SgenGrayQueue *queue)
+major_copy_or_mark_object (void **obj_slot, void *obj_void, SgenGrayQueue *queue)
{
char *forwarded;
- char *obj = *obj_slot;
+ char *obj = obj_void;
mword objsize;
SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation);
*obj_slot = copy_object_no_checks (obj, queue);
}
+static void
+major_copy_or_mark_object_canonical (void **ptr, SgenGrayQueue *queue)
+{
+ major_copy_or_mark_object (ptr, *ptr, queue);
+}
+
#include "sgen-major-scan-object.h"
/* FIXME: later reduce code duplication here with build_nursery_fragments().
collector->handle_gc_param = NULL;
collector->print_gc_param_usage = NULL;
- collector->major_ops.copy_or_mark_object = major_copy_or_mark_object;
+ collector->major_ops.copy_or_mark_object = major_copy_or_mark_object_canonical;
collector->major_ops.scan_object = major_scan_object;
}
void *__copy; \
if (__old && FOLLOW_OBJECT (__old)) { \
PREFETCH_DYNAMIC_HEAP (__old); \
- major_copy_or_mark_object ((ptr), queue); \
+ major_copy_or_mark_object ((ptr), __old, queue); \
__copy = *(ptr); \
SGEN_COND_LOG (9, __old != __copy, "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \
if (G_UNLIKELY (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)))) \
#ifdef SGEN_PARALLEL_MARK
static void
-major_copy_or_mark_object (void **ptr, SgenGrayQueue *queue)
+major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
{
- void *obj = *ptr;
mword objsize;
MSBlockInfo *block;
MonoVTable *vt;
#else
#ifdef SGEN_CONCURRENT_MARK
static void
-major_copy_or_mark_object (void **ptr, SgenGrayQueue *queue)
+major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
{
- void *obj = *ptr;
-
g_assert (!SGEN_OBJECT_IS_FORWARDED (obj));
if (!sgen_ptr_in_nursery (obj)) {
}
#else
static void
-major_copy_or_mark_object (void **ptr, SgenGrayQueue *queue)
+major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
{
- void *obj = *ptr;
MSBlockInfo *block;
HEAVY_STAT (++stat_copy_object_called_major);
#endif
#endif
+static void
+major_copy_or_mark_object_canonical (void **ptr, SgenGrayQueue *queue)
+{
+ major_copy_or_mark_object (ptr, *ptr, queue);
+}
+
#ifdef SGEN_CONCURRENT_MARK
static long long
major_get_and_reset_num_major_objects_marked (void)
collector->is_valid_object = major_is_valid_object;
collector->describe_pointer = major_describe_pointer;
- collector->major_ops.copy_or_mark_object = major_copy_or_mark_object;
+ collector->major_ops.copy_or_mark_object = major_copy_or_mark_object_canonical;
collector->major_ops.scan_object = major_scan_object;
#ifdef SGEN_CONCURRENT_MARK
collector->major_ops.scan_vtype = major_scan_vtype;