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.
This commit is contained in:
parent
e210a70e9a
commit
f9966b9b76
Notes:
git
2025-06-09 14:38:44 +00:00
3
gc.c
3
gc.c
@ -4093,7 +4093,8 @@ vm_weak_table_gen_fields_foreach(st_data_t key, st_data_t value, st_data_t data)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (uint32_t i = 0; i < fields_tbl->as.shape.fields_count; i++) {
|
uint32_t fields_count = RSHAPE_LEN(RBASIC_SHAPE_ID((VALUE)key));
|
||||||
|
for (uint32_t i = 0; i < fields_count; i++) {
|
||||||
if (SPECIAL_CONST_P(fields_tbl->as.shape.fields[i])) continue;
|
if (SPECIAL_CONST_P(fields_tbl->as.shape.fields[i])) continue;
|
||||||
|
|
||||||
int ivar_ret = iter_data->callback(fields_tbl->as.shape.fields[i], iter_data->data);
|
int ivar_ret = iter_data->callback(fields_tbl->as.shape.fields[i], iter_data->data);
|
||||||
|
7
ractor.c
7
ractor.c
@ -1658,10 +1658,9 @@ obj_traverse_replace_i(VALUE obj, struct obj_traverse_replace_data *data)
|
|||||||
if (d.stop) return 1;
|
if (d.stop) return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (uint32_t i = 0; i < fields_tbl->as.shape.fields_count; i++) {
|
uint32_t fields_count = RSHAPE_LEN(RBASIC_SHAPE_ID(obj));
|
||||||
if (!UNDEF_P(fields_tbl->as.shape.fields[i])) {
|
for (uint32_t i = 0; i < fields_count; i++) {
|
||||||
CHECK_AND_REPLACE(fields_tbl->as.shape.fields[i]);
|
CHECK_AND_REPLACE(fields_tbl->as.shape.fields[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
variable.c
33
variable.c
@ -1228,19 +1228,10 @@ gen_fields_tbl_bytes(size_t n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct gen_fields_tbl *
|
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);
|
RUBY_ASSERT(new_capa > 0);
|
||||||
|
return xrealloc(old, gen_fields_tbl_bytes(new_capa));
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1253,7 +1244,8 @@ rb_mark_generic_ivar(VALUE obj)
|
|||||||
rb_mark_tbl_no_pin(fields_tbl->as.complex.table);
|
rb_mark_tbl_no_pin(fields_tbl->as.complex.table);
|
||||||
}
|
}
|
||||||
else {
|
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]);
|
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);
|
return sizeof(struct gen_fields_tbl) + st_memsize(fields_tbl->as.complex.table);
|
||||||
}
|
}
|
||||||
else {
|
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;
|
return 0;
|
||||||
@ -1299,21 +1291,12 @@ rb_generic_ivar_memsize(VALUE obj)
|
|||||||
static size_t
|
static size_t
|
||||||
gen_fields_tbl_count(VALUE obj, const struct gen_fields_tbl *fields_tbl)
|
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)) {
|
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 {
|
else {
|
||||||
for (i = 0; i < fields_tbl->as.shape.fields_count; i++) {
|
return RSHAPE_LEN(RBASIC_SHAPE_ID(obj));
|
||||||
if (!UNDEF_P(fields_tbl->as.shape.fields[i])) {
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
struct gen_fields_tbl {
|
struct gen_fields_tbl {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint32_t fields_count;
|
|
||||||
VALUE fields[1];
|
VALUE fields[1];
|
||||||
} shape;
|
} shape;
|
||||||
struct {
|
struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user