File tree Expand file tree Collapse file tree 3 files changed +21
-7
lines changed Expand file tree Collapse file tree 3 files changed +21
-7
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 ++ ) {
Original file line number Diff line number Diff 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+
370384static inline uint32_t
371385ROBJECT_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
You can’t perform that action at this time.
0 commit comments