summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-06-09 10:37:28 +0200
committerJean Boussier <jean.boussier@gmail.com>2025-06-09 16:38:29 +0200
commitf9966b9b76706705202f83112e0e2dea0237aea1 (patch)
tree6519f4385382e7fb33e71bb5c36eb448b2bb0d4e /variable.c
parente210a70e9a5eb891fe8a999f2f9eb942d295a078 (diff)
Get rid of `gen_fields_tbl.fields_count`
This data is redundant because the shape already contains both the length and capacity of the object's fields. So it both waste space and create the possibility of a desync between the two. We also do not need to initialize everything to Qundef, this seem to be a left-over from pre-shape instance variables.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/13561
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c33
1 files changed, 8 insertions, 25 deletions
diff --git a/variable.c b/variable.c
index 6d0e9832e7..a54bebcec0 100644
--- a/variable.c
+++ b/variable.c
@@ -1228,19 +1228,10 @@ gen_fields_tbl_bytes(size_t n)
}
static struct gen_fields_tbl *
-gen_fields_tbl_resize(struct gen_fields_tbl *old, uint32_t n)
+gen_fields_tbl_resize(struct gen_fields_tbl *old, uint32_t new_capa)
{
- RUBY_ASSERT(n > 0);
-
- uint32_t len = old ? old->as.shape.fields_count : 0;
- struct gen_fields_tbl *fields_tbl = xrealloc(old, gen_fields_tbl_bytes(n));
-
- fields_tbl->as.shape.fields_count = n;
- for (; len < n; len++) {
- fields_tbl->as.shape.fields[len] = Qundef;
- }
-
- return fields_tbl;
+ RUBY_ASSERT(new_capa > 0);
+ return xrealloc(old, gen_fields_tbl_bytes(new_capa));
}
void
@@ -1253,7 +1244,8 @@ rb_mark_generic_ivar(VALUE obj)
rb_mark_tbl_no_pin(fields_tbl->as.complex.table);
}
else {
- for (uint32_t i = 0; i < fields_tbl->as.shape.fields_count; i++) {
+ uint32_t fields_count = RSHAPE_LEN(RBASIC_SHAPE_ID(obj));
+ for (uint32_t i = 0; i < fields_count; i++) {
rb_gc_mark_movable(fields_tbl->as.shape.fields[i]);
}
}
@@ -1290,7 +1282,7 @@ rb_generic_ivar_memsize(VALUE obj)
return sizeof(struct gen_fields_tbl) + st_memsize(fields_tbl->as.complex.table);
}
else {
- return gen_fields_tbl_bytes(fields_tbl->as.shape.fields_count);
+ return gen_fields_tbl_bytes(RSHAPE_CAPACITY(RBASIC_SHAPE_ID(obj)));
}
}
return 0;
@@ -1299,21 +1291,12 @@ rb_generic_ivar_memsize(VALUE obj)
static size_t
gen_fields_tbl_count(VALUE obj, const struct gen_fields_tbl *fields_tbl)
{
- uint32_t i;
- size_t n = 0;
-
if (rb_shape_obj_too_complex_p(obj)) {
- n = st_table_size(fields_tbl->as.complex.table);
+ return st_table_size(fields_tbl->as.complex.table);
}
else {
- for (i = 0; i < fields_tbl->as.shape.fields_count; i++) {
- if (!UNDEF_P(fields_tbl->as.shape.fields[i])) {
- n++;
- }
- }
+ return RSHAPE_LEN(RBASIC_SHAPE_ID(obj));
}
-
- return n;
}
VALUE