1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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.
This commit is contained in:
Aaron Patterson 2022-09-27 11:51:34 -07:00 committed by Aaron Patterson
parent 412e3c7a8d
commit eeea633eb2
Notes: git 2022-10-19 14:55:16 +00:00
2 changed files with 8 additions and 28 deletions

29
gc.c
View file

@ -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; uint32_t index_tbl_num_entries = RCLASS_EXT(klass)->max_iv_count;
size_t size; size_t size;
bool embed = true;
#if USE_RVARGC #if USE_RVARGC
size = rb_obj_embedded_size(index_tbl_num_entries); size = rb_obj_embedded_size(index_tbl_num_entries);
if (!rb_gc_size_allocatable_p(size)) { if (!rb_gc_size_allocatable_p(size)) {
size = sizeof(struct RObject); size = sizeof(struct RObject);
embed = false;
} }
#else #else
size = sizeof(struct RObject); size = sizeof(struct RObject);
if (index_tbl_num_entries > ROBJECT_EMBED_LEN_MAX) {
embed = false;
}
#endif #endif
#if USE_RVARGC
VALUE obj = newobj_of(klass, flags, 0, 0, 0, wb_protected, size); 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 #if USE_RVARGC
uint32_t capa = (uint32_t)((rb_gc_obj_slot_size(obj) - offsetof(struct RObject, as.ary)) / sizeof(VALUE)); 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; ROBJECT(obj)->numiv = capa;
for (size_t i = 0; i < capa; i++) { #endif
ROBJECT(obj)->as.ary[i] = Qundef;
#if RUBY_DEBUG
VALUE *ptr = ROBJECT_IVPTR(obj);
for (size_t i = 0; i < ROBJECT_NUMIV(obj); i++) {
ptr[i] = Qundef;
} }
#endif #endif
}
else {
rb_ensure_iv_list_size(obj, 0, index_tbl_num_entries);
}
return obj; 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)); uint32_t capa = (uint32_t)((slot_size - offsetof(struct RObject, as.ary)) / sizeof(VALUE));
ROBJECT(v)->numiv = capa; ROBJECT(v)->numiv = capa;
// Fill end with Qundef
for (uint32_t i = numiv; i < capa; i++) {
ptr[i] = Qundef;
}
} }
#endif #endif

View file

@ -1404,9 +1404,6 @@ rb_ensure_iv_list_size(VALUE obj, uint32_t len, uint32_t newsize)
newptr = obj_ivar_heap_realloc(obj, len, newsize); newptr = obj_ivar_heap_realloc(obj, len, newsize);
} }
for (; len < newsize; len++) {
newptr[len] = Qundef;
}
#if USE_RVARGC #if USE_RVARGC
ROBJECT(obj)->numiv = newsize; ROBJECT(obj)->numiv = newsize;
#else #else