@@ -1264,16 +1264,18 @@ rb_gc_obj_free(void *objspace, VALUE obj)
12641264
12651265 switch (BUILTIN_TYPE (obj )) {
12661266 case T_OBJECT :
1267- if (rb_shape_obj_too_complex_p (obj )) {
1268- RB_DEBUG_COUNTER_INC (obj_obj_too_complex );
1269- st_free_table (ROBJECT_FIELDS_HASH (obj ));
1270- }
1271- else if (RBASIC (obj )-> flags & ROBJECT_EMBED ) {
1272- RB_DEBUG_COUNTER_INC (obj_obj_embed );
1267+ if (FL_TEST_RAW (obj , ROBJECT_HEAP )) {
1268+ if (rb_shape_obj_too_complex_p (obj )) {
1269+ RB_DEBUG_COUNTER_INC (obj_obj_too_complex );
1270+ st_free_table (ROBJECT_FIELDS_HASH (obj ));
1271+ }
1272+ else {
1273+ xfree (ROBJECT (obj )-> as .heap .fields );
1274+ RB_DEBUG_COUNTER_INC (obj_obj_ptr );
1275+ }
12731276 }
12741277 else {
1275- xfree (ROBJECT (obj )-> as .heap .fields );
1276- RB_DEBUG_COUNTER_INC (obj_obj_ptr );
1278+ RB_DEBUG_COUNTER_INC (obj_obj_embed );
12771279 }
12781280 break ;
12791281 case T_MODULE :
@@ -2313,11 +2315,13 @@ rb_obj_memsize_of(VALUE obj)
23132315
23142316 switch (BUILTIN_TYPE (obj )) {
23152317 case T_OBJECT :
2316- if (rb_shape_obj_too_complex_p (obj )) {
2317- size += rb_st_memsize (ROBJECT_FIELDS_HASH (obj ));
2318- }
2319- else if (!(RBASIC (obj )-> flags & ROBJECT_EMBED )) {
2320- size += ROBJECT_FIELDS_CAPACITY (obj ) * sizeof (VALUE );
2318+ if (FL_TEST_RAW (obj , ROBJECT_HEAP )) {
2319+ if (rb_shape_obj_too_complex_p (obj )) {
2320+ size += rb_st_memsize (ROBJECT_FIELDS_HASH (obj ));
2321+ }
2322+ else {
2323+ size += ROBJECT_FIELDS_CAPACITY (obj ) * sizeof (VALUE );
2324+ }
23212325 }
23222326 break ;
23232327 case T_MODULE :
@@ -3543,19 +3547,21 @@ gc_ref_update_object(void *objspace, VALUE v)
35433547{
35443548 VALUE * ptr = ROBJECT_FIELDS (v );
35453549
3546- if (rb_shape_obj_too_complex_p (v )) {
3547- gc_ref_update_table_values_only (ROBJECT_FIELDS_HASH (v ));
3548- return ;
3549- }
3550+ if (FL_TEST_RAW (v , ROBJECT_HEAP )) {
3551+ if (rb_shape_obj_too_complex_p (v )) {
3552+ gc_ref_update_table_values_only (ROBJECT_FIELDS_HASH (v ));
3553+ return ;
3554+ }
35503555
3551- size_t slot_size = rb_gc_obj_slot_size (v );
3552- size_t embed_size = rb_obj_embedded_size (ROBJECT_FIELDS_CAPACITY (v ));
3553- if (slot_size >= embed_size && !RB_FL_TEST_RAW (v , ROBJECT_EMBED )) {
3554- // Object can be re-embedded
3555- memcpy (ROBJECT (v )-> as .ary , ptr , sizeof (VALUE ) * ROBJECT_FIELDS_COUNT (v ));
3556- RB_FL_SET_RAW (v , ROBJECT_EMBED );
3557- xfree (ptr );
3558- ptr = ROBJECT (v )-> as .ary ;
3556+ size_t slot_size = rb_gc_obj_slot_size (v );
3557+ size_t embed_size = rb_obj_embedded_size (ROBJECT_FIELDS_CAPACITY (v ));
3558+ if (slot_size >= embed_size ) {
3559+ // Object can be re-embedded
3560+ memcpy (ROBJECT (v )-> as .ary , ptr , sizeof (VALUE ) * ROBJECT_FIELDS_COUNT (v ));
3561+ FL_UNSET_RAW (v , ROBJECT_HEAP );
3562+ xfree (ptr );
3563+ ptr = ROBJECT (v )-> as .ary ;
3564+ }
35593565 }
35603566
35613567 for (uint32_t i = 0 ; i < ROBJECT_FIELDS_COUNT (v ); i ++ ) {
@@ -4773,21 +4779,18 @@ rb_raw_obj_info_buitin_type(char *const buff, const size_t buff_size, const VALU
47734779 }
47744780 case T_OBJECT :
47754781 {
4776- if (rb_shape_obj_too_complex_p (obj )) {
4777- size_t hash_len = rb_st_table_size (ROBJECT_FIELDS_HASH (obj ));
4778- APPEND_F ("(too_complex) len:%zu" , hash_len );
4779- }
4780- else {
4781- uint32_t len = ROBJECT_FIELDS_CAPACITY (obj );
4782-
4783- if (RBASIC (obj )-> flags & ROBJECT_EMBED ) {
4784- APPEND_F ("(embed) len:%d" , len );
4782+ if (FL_TEST_RAW (obj , ROBJECT_HEAP )) {
4783+ if (rb_shape_obj_too_complex_p (obj )) {
4784+ size_t hash_len = rb_st_table_size (ROBJECT_FIELDS_HASH (obj ));
4785+ APPEND_F ("(too_complex) len:%zu" , hash_len );
47854786 }
47864787 else {
4787- VALUE * ptr = ROBJECT_FIELDS (obj );
4788- APPEND_F ("len:%d ptr:%p" , len , (void * )ptr );
4788+ APPEND_F ("(embed) len:%d" , ROBJECT_FIELDS_CAPACITY (obj ));
47894789 }
47904790 }
4791+ else {
4792+ APPEND_F ("len:%d ptr:%p" , ROBJECT_FIELDS_CAPACITY (obj ), (void * )ROBJECT_FIELDS (obj ));
4793+ }
47914794 }
47924795 break ;
47934796 case T_DATA : {
0 commit comments