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:
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
29
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;
|
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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue