Skip to content

Commit 1660b81

Browse files
authored
Eliminate redundant work and branching when marking T_OBJECT (#15274)
1 parent 5f55c9c commit 1660b81

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

gc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3227,19 +3227,21 @@ rb_gc_mark_children(void *objspace, VALUE obj)
32273227
}
32283228

32293229
case T_OBJECT: {
3230+
uint32_t len;
32303231
if (rb_shape_obj_too_complex_p(obj)) {
32313232
gc_mark_tbl_no_pin(ROBJECT_FIELDS_HASH(obj));
3233+
len = ROBJECT_FIELDS_COUNT_COMPLEX(obj);
32323234
}
32333235
else {
32343236
const VALUE * const ptr = ROBJECT_FIELDS(obj);
32353237

3236-
uint32_t len = ROBJECT_FIELDS_COUNT(obj);
3238+
len = ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj);
32373239
for (uint32_t i = 0; i < len; i++) {
32383240
gc_mark_internal(ptr[i]);
32393241
}
32403242
}
32413243

3242-
attr_index_t fields_count = ROBJECT_FIELDS_COUNT(obj);
3244+
attr_index_t fields_count = (attr_index_t)len;
32433245
if (fields_count) {
32443246
VALUE klass = RBASIC_CLASS(obj);
32453247

ractor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ obj_traverse_replace_i(VALUE obj, struct obj_traverse_replace_data *data)
17961796
if (d.stop) return 1;
17971797
}
17981798
else {
1799-
uint32_t len = ROBJECT_FIELDS_COUNT(obj);
1799+
uint32_t len = ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj);
18001800
VALUE *ptr = ROBJECT_FIELDS(obj);
18011801

18021802
for (uint32_t i = 0; i < len; i++) {

shape.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,16 +367,28 @@ ROBJECT_SET_FIELDS_HASH(VALUE obj, const st_table *tbl)
367367
ROBJECT(obj)->as.heap.fields = (VALUE *)tbl;
368368
}
369369

370+
static inline uint32_t
371+
ROBJECT_FIELDS_COUNT_COMPLEX(VALUE obj)
372+
{
373+
return (uint32_t)rb_st_table_size(ROBJECT_FIELDS_HASH(obj));
374+
}
375+
376+
static inline uint32_t
377+
ROBJECT_FIELDS_COUNT_NOT_COMPLEX(VALUE obj)
378+
{
379+
RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT);
380+
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
381+
return RSHAPE(RBASIC_SHAPE_ID(obj))->next_field_index;
382+
}
383+
370384
static inline uint32_t
371385
ROBJECT_FIELDS_COUNT(VALUE obj)
372386
{
373387
if (rb_shape_obj_too_complex_p(obj)) {
374-
return (uint32_t)rb_st_table_size(ROBJECT_FIELDS_HASH(obj));
388+
return ROBJECT_FIELDS_COUNT_COMPLEX(obj);
375389
}
376390
else {
377-
RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT);
378-
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
379-
return RSHAPE(RBASIC_SHAPE_ID(obj))->next_field_index;
391+
return ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj);
380392
}
381393
}
382394

0 commit comments

Comments
 (0)