diff options
| author | Luke Gruber <luke.gruber@shopify.com> | 2025-11-26 16:23:34 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-26 16:23:34 -0500 |
| commit | 1660b8145c30f53771671dec343fa7025a953fb5 (patch) | |
| tree | aa422384ef2c5924a155639cc00236a934272355 | |
| parent | 5f55c9c8fb8f401537e7121171747196e66c3ba0 (diff) | |
Eliminate redundant work and branching when marking T_OBJECT (#15274)
| -rw-r--r-- | gc.c | 6 | ||||
| -rw-r--r-- | ractor.c | 2 | ||||
| -rw-r--r-- | shape.h | 20 |
3 files changed, 21 insertions, 7 deletions
@@ -3227,19 +3227,21 @@ rb_gc_mark_children(void *objspace, VALUE obj) } case T_OBJECT: { + uint32_t len; if (rb_shape_obj_too_complex_p(obj)) { gc_mark_tbl_no_pin(ROBJECT_FIELDS_HASH(obj)); + len = ROBJECT_FIELDS_COUNT_COMPLEX(obj); } else { const VALUE * const ptr = ROBJECT_FIELDS(obj); - uint32_t len = ROBJECT_FIELDS_COUNT(obj); + len = ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj); for (uint32_t i = 0; i < len; i++) { gc_mark_internal(ptr[i]); } } - attr_index_t fields_count = ROBJECT_FIELDS_COUNT(obj); + attr_index_t fields_count = (attr_index_t)len; if (fields_count) { VALUE klass = RBASIC_CLASS(obj); @@ -1796,7 +1796,7 @@ obj_traverse_replace_i(VALUE obj, struct obj_traverse_replace_data *data) if (d.stop) return 1; } else { - uint32_t len = ROBJECT_FIELDS_COUNT(obj); + uint32_t len = ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj); VALUE *ptr = ROBJECT_FIELDS(obj); for (uint32_t i = 0; i < len; i++) { @@ -368,15 +368,27 @@ ROBJECT_SET_FIELDS_HASH(VALUE obj, const st_table *tbl) } static inline uint32_t +ROBJECT_FIELDS_COUNT_COMPLEX(VALUE obj) +{ + return (uint32_t)rb_st_table_size(ROBJECT_FIELDS_HASH(obj)); +} + +static inline uint32_t +ROBJECT_FIELDS_COUNT_NOT_COMPLEX(VALUE obj) +{ + RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT); + RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj)); + return RSHAPE(RBASIC_SHAPE_ID(obj))->next_field_index; +} + +static inline uint32_t ROBJECT_FIELDS_COUNT(VALUE obj) { if (rb_shape_obj_too_complex_p(obj)) { - return (uint32_t)rb_st_table_size(ROBJECT_FIELDS_HASH(obj)); + return ROBJECT_FIELDS_COUNT_COMPLEX(obj); } else { - RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT); - RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj)); - return RSHAPE(RBASIC_SHAPE_ID(obj))->next_field_index; + return ROBJECT_FIELDS_COUNT_NOT_COMPLEX(obj); } } |
