diff options
author | Jemma Issroff <jemmaissroff@gmail.com> | 2022-11-08 14:09:43 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-11-10 10:11:34 -0500 |
commit | c726c48a3dacd9ca1cb0d96fee98890cb74b37d3 (patch) | |
tree | f2bbd9f9797ee63e8666fffd18c47e04571b7a6f /gc.c | |
parent | 5246f4027ec574e77809845e1b1f7822cc2a5cef (diff) |
Remove numiv from RObject
Since object shapes store the capacity of an object, we no longer
need the numiv field on RObjects. This gives us one extra slot which
we can use to give embedded objects one more instance variable (for a
total of 3 ivs). This commit removes the concept of numiv from RObject.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6699
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 22 |
1 files changed, 5 insertions, 17 deletions
@@ -2943,14 +2943,9 @@ rb_class_instance_allocate_internal(VALUE klass, VALUE flags, bool wb_protected) VALUE obj = newobj_of(klass, flags, 0, 0, 0, wb_protected, size); -#if USE_RVARGC - uint32_t capa = (uint32_t)((rb_gc_obj_slot_size(obj) - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); - ROBJECT_SET_NUMIV(obj, capa); -#endif - #if RUBY_DEBUG VALUE *ptr = ROBJECT_IVPTR(obj); - for (size_t i = 0; i < ROBJECT_NUMIV(obj); i++) { + for (size_t i = 0; i < ROBJECT_IV_CAPACITY(obj); i++) { ptr[i] = Qundef; } #endif @@ -4859,7 +4854,7 @@ obj_memsize_of(VALUE obj, int use_all_types) switch (BUILTIN_TYPE(obj)) { case T_OBJECT: if (!(RBASIC(obj)->flags & ROBJECT_EMBED)) { - size += ROBJECT_NUMIV(obj) * sizeof(VALUE); + size += ROBJECT_IV_CAPACITY(obj) * sizeof(VALUE); } break; case T_MODULE: @@ -8409,7 +8404,7 @@ gc_compact_destination_pool(rb_objspace_t *objspace, rb_size_pool_t *src_pool, V break; case T_OBJECT: - obj_size = rb_obj_embedded_size(ROBJECT_NUMIV(src)); + obj_size = rb_obj_embedded_size(ROBJECT_IV_CAPACITY(src)); break; case T_STRING: @@ -10019,7 +10014,7 @@ gc_ref_update_object(rb_objspace_t *objspace, VALUE v) VALUE *ptr = ROBJECT_IVPTR(v); #if USE_RVARGC - uint32_t numiv = ROBJECT_NUMIV(v); + uint32_t numiv = ROBJECT_IV_CAPACITY(v); size_t slot_size = rb_gc_obj_slot_size(v); size_t embed_size = rb_obj_embedded_size(numiv); @@ -10038,13 +10033,6 @@ gc_ref_update_object(rb_objspace_t *objspace, VALUE v) rb_shape_t * initial_shape = rb_shape_get_shape_by_id((shape_id_t)size_pool_shape_id); rb_shape_t * new_shape = rb_shape_rebuild_shape(initial_shape, rb_shape_get_shape(v)); rb_shape_set_shape(v, new_shape); - ROBJECT_SET_NUMIV(v, new_shape->capacity); -#if RUBY_DEBUG - if(RB_TYPE_P(v, T_OBJECT) && ROBJECT_IV_CAPACITY(v) != ROBJECT_NUMIV(v)) { - fprintf(stderr, "shape capa: %d, v capa: %d\n", ROBJECT_IV_CAPACITY(v), ROBJECT_NUMIV(v)); - } -#endif - RUBY_ASSERT(!RB_TYPE_P(v, T_OBJECT) || ROBJECT_IV_CAPACITY(v) == ROBJECT_NUMIV(v)); } #endif @@ -13975,7 +13963,7 @@ rb_raw_obj_info_buitin_type(char *const buff, const size_t buff_size, const VALU } case T_OBJECT: { - uint32_t len = ROBJECT_NUMIV(obj); + uint32_t len = ROBJECT_IV_CAPACITY(obj); if (RANY(obj)->as.basic.flags & ROBJECT_EMBED) { APPEND_F("(embed) len:%d", len); |