@@ -1303,7 +1303,7 @@ VALUE
1303
1303
rb_obj_field_get (VALUE obj , shape_id_t target_shape_id )
1304
1304
{
1305
1305
RUBY_ASSERT (!SPECIAL_CONST_P (obj ));
1306
- RUBY_ASSERT (RSHAPE (target_shape_id ) -> type == SHAPE_IVAR || RSHAPE (target_shape_id ) -> type == SHAPE_OBJ_ID );
1306
+ RUBY_ASSERT (RSHAPE_TYPE_P (target_shape_id , SHAPE_IVAR ) || RSHAPE_TYPE_P (target_shape_id , SHAPE_OBJ_ID ) );
1307
1307
1308
1308
if (rb_shape_too_complex_p (target_shape_id )) {
1309
1309
st_table * fields_hash ;
@@ -1325,7 +1325,7 @@ rb_obj_field_get(VALUE obj, shape_id_t target_shape_id)
1325
1325
break ;
1326
1326
}
1327
1327
VALUE value = Qundef ;
1328
- st_lookup (fields_hash , RSHAPE (target_shape_id )-> edge_name , & value );
1328
+ st_lookup (fields_hash , RSHAPE_EDGE_NAME (target_shape_id ), & value );
1329
1329
1330
1330
#if RUBY_DEBUG
1331
1331
if (UNDEF_P (value )) {
@@ -1337,7 +1337,7 @@ rb_obj_field_get(VALUE obj, shape_id_t target_shape_id)
1337
1337
return value ;
1338
1338
}
1339
1339
1340
- attr_index_t attr_index = RSHAPE (target_shape_id )-> next_field_index - 1 ;
1340
+ attr_index_t attr_index = RSHAPE_INDEX (target_shape_id );
1341
1341
VALUE * fields ;
1342
1342
switch (BUILTIN_TYPE (obj )) {
1343
1343
case T_CLASS :
@@ -1505,7 +1505,7 @@ rb_ivar_delete(VALUE obj, ID id, VALUE undef)
1505
1505
goto too_complex ;
1506
1506
}
1507
1507
1508
- RUBY_ASSERT (RSHAPE (next_shape_id )-> next_field_index == RSHAPE (old_shape_id )-> next_field_index - 1 );
1508
+ RUBY_ASSERT (RSHAPE_LEN (next_shape_id ) == RSHAPE_LEN (old_shape_id ) - 1 );
1509
1509
1510
1510
VALUE * fields ;
1511
1511
switch (BUILTIN_TYPE (obj )) {
@@ -1526,9 +1526,9 @@ rb_ivar_delete(VALUE obj, ID id, VALUE undef)
1526
1526
1527
1527
RUBY_ASSERT (removed_shape_id != INVALID_SHAPE_ID );
1528
1528
1529
- attr_index_t new_fields_count = RSHAPE (next_shape_id )-> next_field_index ;
1529
+ attr_index_t new_fields_count = RSHAPE_LEN (next_shape_id );
1530
1530
1531
- attr_index_t removed_index = RSHAPE (removed_shape_id )-> next_field_index - 1 ;
1531
+ attr_index_t removed_index = RSHAPE_INDEX (removed_shape_id );
1532
1532
val = fields [removed_index ];
1533
1533
size_t trailing_fields = new_fields_count - removed_index ;
1534
1534
@@ -1810,8 +1810,8 @@ generic_fields_lookup_ensure_size(st_data_t *k, st_data_t *v, st_data_t u, int e
1810
1810
1811
1811
if (!existing || fields_lookup -> resize ) {
1812
1812
if (existing ) {
1813
- RUBY_ASSERT (RSHAPE (fields_lookup -> shape_id ) -> type == SHAPE_IVAR || RSHAPE (fields_lookup -> shape_id ) -> type == SHAPE_OBJ_ID );
1814
- RUBY_ASSERT (RSHAPE_CAPACITY (RSHAPE (fields_lookup -> shape_id )-> parent_id ) < RSHAPE_CAPACITY (fields_lookup -> shape_id ));
1813
+ RUBY_ASSERT (RSHAPE_TYPE_P (fields_lookup -> shape_id , SHAPE_IVAR ) || RSHAPE_TYPE_P (fields_lookup -> shape_id , SHAPE_OBJ_ID ) );
1814
+ RUBY_ASSERT (RSHAPE_CAPACITY (RSHAPE_PARENT (fields_lookup -> shape_id )) < RSHAPE_CAPACITY (fields_lookup -> shape_id ));
1815
1815
}
1816
1816
else {
1817
1817
FL_SET_RAW ((VALUE )* k , FL_EXIVAR );
@@ -2186,57 +2186,42 @@ struct iv_itr_data {
2186
2186
bool ivar_only ;
2187
2187
};
2188
2188
2189
- /*
2190
- * Returns a flag to stop iterating depending on the result of +callback+.
2191
- */
2192
- static bool
2193
- iterate_over_shapes_with_callback (rb_shape_t * shape , rb_ivar_foreach_callback_func * callback , struct iv_itr_data * itr_data )
2189
+ static int
2190
+ iterate_over_shapes_callback (shape_id_t shape_id , void * data )
2194
2191
{
2195
- switch ((enum shape_type )shape -> type ) {
2196
- case SHAPE_ROOT :
2197
- return false;
2198
- case SHAPE_OBJ_ID :
2199
- if (itr_data -> ivar_only ) {
2200
- return iterate_over_shapes_with_callback (RSHAPE (shape -> parent_id ), callback , itr_data );
2201
- }
2202
- // fallthrough
2203
- case SHAPE_IVAR :
2204
- ASSUME (callback );
2205
- if (iterate_over_shapes_with_callback (RSHAPE (shape -> parent_id ), callback , itr_data )) {
2206
- return true;
2207
- }
2192
+ struct iv_itr_data * itr_data = data ;
2208
2193
2209
- VALUE * iv_list ;
2210
- switch (BUILTIN_TYPE (itr_data -> obj )) {
2211
- case T_OBJECT :
2212
- RUBY_ASSERT (!rb_shape_obj_too_complex_p (itr_data -> obj ));
2213
- iv_list = ROBJECT_FIELDS (itr_data -> obj );
2214
- break ;
2215
- case T_CLASS :
2216
- case T_MODULE :
2217
- RUBY_ASSERT (!rb_shape_obj_too_complex_p (itr_data -> obj ));
2218
- iv_list = RCLASS_PRIME_FIELDS (itr_data -> obj );
2219
- break ;
2220
- default :
2221
- iv_list = itr_data -> fields_tbl -> as .shape .fields ;
2222
- break ;
2223
- }
2224
- VALUE val = iv_list [shape -> next_field_index - 1 ];
2225
- if (!UNDEF_P (val )) {
2226
- switch (callback (shape -> edge_name , val , itr_data -> arg )) {
2227
- case ST_CHECK :
2228
- case ST_CONTINUE :
2229
- break ;
2230
- case ST_STOP :
2231
- return true;
2232
- default :
2233
- rb_bug ("unreachable" );
2234
- }
2235
- }
2236
- return false;
2194
+ if (itr_data -> ivar_only && !RSHAPE_TYPE_P (shape_id , SHAPE_IVAR )) {
2195
+ return ST_CONTINUE ;
2196
+ }
2197
+
2198
+ VALUE * iv_list ;
2199
+ switch (BUILTIN_TYPE (itr_data -> obj )) {
2200
+ case T_OBJECT :
2201
+ RUBY_ASSERT (!rb_shape_obj_too_complex_p (itr_data -> obj ));
2202
+ iv_list = ROBJECT_FIELDS (itr_data -> obj );
2203
+ break ;
2204
+ case T_CLASS :
2205
+ case T_MODULE :
2206
+ RUBY_ASSERT (!rb_shape_obj_too_complex_p (itr_data -> obj ));
2207
+ iv_list = RCLASS_PRIME_FIELDS (itr_data -> obj );
2208
+ break ;
2237
2209
default :
2238
- UNREACHABLE_RETURN (false);
2210
+ iv_list = itr_data -> fields_tbl -> as .shape .fields ;
2211
+ break ;
2239
2212
}
2213
+
2214
+ VALUE val = iv_list [RSHAPE_INDEX (shape_id )];
2215
+ return itr_data -> func (RSHAPE_EDGE_NAME (shape_id ), val , itr_data -> arg );
2216
+ }
2217
+
2218
+ /*
2219
+ * Returns a flag to stop iterating depending on the result of +callback+.
2220
+ */
2221
+ static void
2222
+ iterate_over_shapes (shape_id_t shape_id , rb_ivar_foreach_callback_func * callback , struct iv_itr_data * itr_data )
2223
+ {
2224
+ rb_shape_foreach_field (shape_id , iterate_over_shapes_callback , itr_data );
2240
2225
}
2241
2226
2242
2227
static int
@@ -2262,7 +2247,7 @@ obj_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg, b
2262
2247
rb_st_foreach (ROBJECT_FIELDS_HASH (obj ), each_hash_iv , (st_data_t )& itr_data );
2263
2248
}
2264
2249
else {
2265
- iterate_over_shapes_with_callback ( RSHAPE ( shape_id ) , func , & itr_data );
2250
+ iterate_over_shapes ( shape_id , func , & itr_data );
2266
2251
}
2267
2252
}
2268
2253
@@ -2285,7 +2270,7 @@ gen_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg, b
2285
2270
rb_st_foreach (fields_tbl -> as .complex .table , each_hash_iv , (st_data_t )& itr_data );
2286
2271
}
2287
2272
else {
2288
- iterate_over_shapes_with_callback ( RSHAPE ( shape_id ) , func , & itr_data );
2273
+ iterate_over_shapes ( shape_id , func , & itr_data );
2289
2274
}
2290
2275
}
2291
2276
@@ -2306,7 +2291,7 @@ class_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg,
2306
2291
rb_st_foreach (RCLASS_WRITABLE_FIELDS_HASH (obj ), each_hash_iv , (st_data_t )& itr_data );
2307
2292
}
2308
2293
else {
2309
- iterate_over_shapes_with_callback ( RSHAPE ( shape_id ) , func , & itr_data );
2294
+ iterate_over_shapes ( shape_id , func , & itr_data );
2310
2295
}
2311
2296
}
2312
2297
@@ -2344,7 +2329,7 @@ rb_copy_generic_ivar(VALUE dest, VALUE obj)
2344
2329
shape_id_t initial_shape_id = rb_obj_shape_id (dest );
2345
2330
2346
2331
if (!rb_shape_canonical_p (src_shape_id )) {
2347
- RUBY_ASSERT (RSHAPE (initial_shape_id ) -> type == SHAPE_ROOT );
2332
+ RUBY_ASSERT (RSHAPE_TYPE_P (initial_shape_id , SHAPE_ROOT ) );
2348
2333
2349
2334
dest_shape_id = rb_shape_rebuild (initial_shape_id , src_shape_id );
2350
2335
if (UNLIKELY (rb_shape_too_complex_p (dest_shape_id ))) {
0 commit comments