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 коммит произвёл Aaron Patterson
Родитель 412e3c7a8d
Коммит eeea633eb2
2 изменённых файлов: 8 добавлений и 28 удалений

33
gc.c
Просмотреть файл

@ -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

Просмотреть файл

@ -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);
}
for (; len < newsize; len++) {
newptr[len] = Qundef;
}
#if USE_RVARGC
ROBJECT(obj)->numiv = newsize;
#else