diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2022-09-27 11:51:34 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2022-10-19 07:54:46 -0700 |
commit | eeea633eb20cfdcaf0fec35109afa3821cb994f3 (patch) | |
tree | 2f68ec48fcb1e710dcafc2e92e28c0780404981f /gc.c | |
parent | 412e3c7a8db275567eaceece6c48dde3aedf2ae6 (diff) |
Stop zeroing memory on allocation / copy
Shapes gives us an almost exact count of instance variables on an
object. Since we know the number of instance variables that have been
set, we will never access slots that haven't been initialized with an
IV.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6585
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 33 |
1 files changed, 8 insertions, 25 deletions
@@ -2919,40 +2919,28 @@ rb_class_instance_allocate_internal(VALUE klass, VALUE flags, bool wb_protected) uint32_t index_tbl_num_entries = RCLASS_EXT(klass)->max_iv_count; size_t size; - bool embed = true; #if USE_RVARGC size = rb_obj_embedded_size(index_tbl_num_entries); if (!rb_gc_size_allocatable_p(size)) { size = sizeof(struct RObject); - embed = false; } #else size = sizeof(struct RObject); - if (index_tbl_num_entries > ROBJECT_EMBED_LEN_MAX) { - embed = false; - } #endif -#if USE_RVARGC VALUE obj = newobj_of(klass, flags, 0, 0, 0, wb_protected, size); -#else - VALUE obj = newobj_of(klass, flags, Qundef, Qundef, Qundef, wb_protected, size); -#endif - if (embed) { #if USE_RVARGC - uint32_t capa = (uint32_t)((rb_gc_obj_slot_size(obj) - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); - GC_ASSERT(capa >= index_tbl_num_entries); - - ROBJECT(obj)->numiv = capa; - for (size_t i = 0; i < capa; i++) { - ROBJECT(obj)->as.ary[i] = Qundef; - } + uint32_t capa = (uint32_t)((rb_gc_obj_slot_size(obj) - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); + ROBJECT(obj)->numiv = capa; #endif + +#if RUBY_DEBUG + VALUE *ptr = ROBJECT_IVPTR(obj); + for (size_t i = 0; i < ROBJECT_NUMIV(obj); i++) { + ptr[i] = Qundef; } - else { - rb_ensure_iv_list_size(obj, 0, index_tbl_num_entries); - } +#endif return obj; } @@ -10032,11 +10020,6 @@ gc_ref_update_object(rb_objspace_t *objspace, VALUE v) uint32_t capa = (uint32_t)((slot_size - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); ROBJECT(v)->numiv = capa; - - // Fill end with Qundef - for (uint32_t i = numiv; i < capa; i++) { - ptr[i] = Qundef; - } } #endif |