diff options
author | Peter Zhu <peter@peterzhu.ca> | 2022-12-15 12:00:30 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-12-15 12:00:30 -0500 |
commit | f50aa19da63067c4b0de5964b6632df20202e71c (patch) | |
tree | 0c8167251eeffb1a6bf32f78a97acb06068bfb03 /gc.c | |
parent | 9c54466e299aa91af225bc2d92a3d7755730948f (diff) |
Revert "Fix Object Movement allocation in GC"
This reverts commit 9c54466e299aa91af225bc2d92a3d7755730948f.
We're seeing crashes in Shopify CI after this commit.
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 41 |
1 files changed, 5 insertions, 36 deletions
@@ -574,7 +574,6 @@ struct RMoved { VALUE flags; VALUE dummy; VALUE destination; - shape_id_t original_shape_id; }; #define RMOVED(obj) ((struct RMoved *)(obj)) @@ -6082,19 +6081,10 @@ invalidate_moved_plane(rb_objspace_t *objspace, struct heap_page *page, uintptr_ object = rb_gc_location(forwarding_object); - shape_id_t old_shape_id = 0; - if (RB_TYPE_P(object, T_OBJECT)) { - old_shape_id = RMOVED(forwarding_object)->original_shape_id; - } - gc_move(objspace, object, forwarding_object, GET_HEAP_PAGE(object)->slot_size, page->slot_size); /* forwarding_object is now our actual object, and "object" * is the free slot for the original page */ - if (old_shape_id) { - ROBJECT_SET_SHAPE_ID(forwarding_object, old_shape_id); - } - struct heap_page *orig_page = GET_HEAP_PAGE(object); orig_page->free_slots++; heap_page_add_freeobj(objspace, orig_page, object); @@ -8458,28 +8448,12 @@ gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, rb_size_pool_t *size_p { GC_ASSERT(BUILTIN_TYPE(src) != T_MOVED); - rb_size_pool_t *dest_pool = gc_compact_destination_pool(objspace, size_pool, src); - rb_heap_t *dheap = SIZE_POOL_EDEN_HEAP(dest_pool); - rb_shape_t *new_shape = NULL; - rb_shape_t *orig_shape = NULL; + rb_heap_t *dheap = SIZE_POOL_EDEN_HEAP(gc_compact_destination_pool(objspace, size_pool, src)); if (gc_compact_heap_cursors_met_p(dheap)) { return dheap != heap; } - if (RB_TYPE_P(src, T_OBJECT)) { - orig_shape = rb_shape_get_shape(src); - if (dheap != heap) { - rb_shape_t *initial_shape = rb_shape_get_shape_by_id((shape_id_t)((dest_pool - size_pools) + SIZE_POOL_COUNT)); - new_shape = rb_shape_traverse_from_new_root(initial_shape, orig_shape); - - if (!new_shape) { - dest_pool = size_pool; - dheap = heap; - } - } - } - while (!try_move(objspace, dheap, dheap->free_pages, src)) { struct gc_sweep_context ctx = { .page = dheap->sweeping_page, @@ -8504,15 +8478,6 @@ gc_compact_move(rb_objspace_t *objspace, rb_heap_t *heap, rb_size_pool_t *size_p return false; } } - - if (orig_shape) { - if (new_shape) { - VALUE dest = rb_gc_location(src); - rb_shape_set_shape(dest, new_shape); - } - RMOVED(src)->original_shape_id = rb_shape_id(orig_shape); - } - return true; } @@ -10094,6 +10059,10 @@ gc_ref_update_object(rb_objspace_t *objspace, VALUE v) xfree(ptr); } ptr = ROBJECT(v)->as.ary; + size_t size_pool_shape_id = size_pool_idx_for_size(embed_size); + rb_shape_t * initial_shape = rb_shape_get_shape_by_id((shape_id_t)size_pool_shape_id + SIZE_POOL_COUNT); + rb_shape_t * new_shape = rb_shape_rebuild_shape(initial_shape, rb_shape_get_shape(v)); + rb_shape_set_shape(v, new_shape); } #endif |