summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2022-09-27 11:51:34 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2022-10-19 07:54:46 -0700
commiteeea633eb20cfdcaf0fec35109afa3821cb994f3 (patch)
tree2f68ec48fcb1e710dcafc2e92e28c0780404981f
parent412e3c7a8db275567eaceece6c48dde3aedf2ae6 (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
-rw-r--r--gc.c33
-rw-r--r--variable.c3
2 files changed, 8 insertions, 28 deletions
diff --git a/gc.c b/gc.c
index ffc610dcc7..44b3f6a83c 100644
--- a/gc.c
+++ b/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
diff --git a/variable.c b/variable.c
index 8d329d7900..d83b8487a7 100644
--- a/variable.c
+++ b/variable.c
@@ -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