@@ -1307,17 +1307,10 @@ iter_lev_in_flags_set(VALUE hash, unsigned long lev)
1307
1307
RBASIC (hash )-> flags = ((RBASIC (hash )-> flags & ~RHASH_LEV_MASK ) | ((VALUE )lev << RHASH_LEV_SHIFT ));
1308
1308
}
1309
1309
1310
- static unsigned long
1311
- RHASH_ITER_LEV (VALUE hash )
1310
+ static inline bool
1311
+ hash_iterating_p (VALUE hash )
1312
1312
{
1313
- unsigned long lev = iter_lev_in_flags (hash );
1314
-
1315
- if (lev == RHASH_LEV_MAX ) {
1316
- return iter_lev_in_ivar (hash );
1317
- }
1318
- else {
1319
- return lev ;
1320
- }
1313
+ return iter_lev_in_flags (hash ) > 0 ;
1321
1314
}
1322
1315
1323
1316
static void
@@ -1436,7 +1429,7 @@ void rb_st_compact_table(st_table *tab);
1436
1429
static void
1437
1430
compact_after_delete (VALUE hash )
1438
1431
{
1439
- if (RHASH_ITER_LEV (hash ) == 0 && RHASH_ST_TABLE_P (hash )) {
1432
+ if (! hash_iterating_p (hash ) && RHASH_ST_TABLE_P (hash )) {
1440
1433
rb_st_compact_table (RHASH_ST_TABLE (hash ));
1441
1434
}
1442
1435
}
@@ -1691,14 +1684,14 @@ tbl_update(VALUE hash, VALUE key, tbl_update_func func, st_data_t optional_arg)
1691
1684
return ret ;
1692
1685
}
1693
1686
1694
- #define UPDATE_CALLBACK (iter_lev , func ) ((iter_lev) > 0 ? func##_noinsert : func##_insert)
1687
+ #define UPDATE_CALLBACK (iter_p , func ) ((iter_p) ? func##_noinsert : func##_insert)
1695
1688
1696
- #define RHASH_UPDATE_ITER (h , iter_lev , key , func , a ) do { \
1697
- tbl_update((h), (key), UPDATE_CALLBACK((iter_lev) , func), (st_data_t)(a)); \
1689
+ #define RHASH_UPDATE_ITER (h , iter_p , key , func , a ) do { \
1690
+ tbl_update((h), (key), UPDATE_CALLBACK(iter_p , func), (st_data_t)(a)); \
1698
1691
} while (0)
1699
1692
1700
1693
#define RHASH_UPDATE (hash , key , func , arg ) \
1701
- RHASH_UPDATE_ITER(hash, RHASH_ITER_LEV (hash), key, func, arg)
1694
+ RHASH_UPDATE_ITER(hash, hash_iterating_p (hash), key, func, arg)
1702
1695
1703
1696
static void
1704
1697
set_proc_default (VALUE hash , VALUE proc )
@@ -1986,7 +1979,7 @@ rb_hash_rehash(VALUE hash)
1986
1979
VALUE tmp ;
1987
1980
st_table * tbl ;
1988
1981
1989
- if (RHASH_ITER_LEV (hash ) > 0 ) {
1982
+ if (hash_iterating_p (hash )) {
1990
1983
rb_raise (rb_eRuntimeError , "rehash during iteration" );
1991
1984
}
1992
1985
rb_hash_modify_check (hash );
@@ -2465,7 +2458,7 @@ rb_hash_shift(VALUE hash)
2465
2458
rb_hash_modify_check (hash );
2466
2459
if (RHASH_AR_TABLE_P (hash )) {
2467
2460
var .key = Qundef ;
2468
- if (RHASH_ITER_LEV (hash ) == 0 ) {
2461
+ if (! hash_iterating_p (hash )) {
2469
2462
if (ar_shift (hash , & var .key , & var .val )) {
2470
2463
return rb_assoc_new (var .key , var .val );
2471
2464
}
@@ -2480,7 +2473,7 @@ rb_hash_shift(VALUE hash)
2480
2473
}
2481
2474
if (RHASH_ST_TABLE_P (hash )) {
2482
2475
var .key = Qundef ;
2483
- if (RHASH_ITER_LEV (hash ) == 0 ) {
2476
+ if (! hash_iterating_p (hash )) {
2484
2477
if (st_shift (RHASH_ST_TABLE (hash ), & var .key , & var .val )) {
2485
2478
return rb_assoc_new (var .key , var .val );
2486
2479
}
@@ -2838,7 +2831,7 @@ rb_hash_clear(VALUE hash)
2838
2831
{
2839
2832
rb_hash_modify_check (hash );
2840
2833
2841
- if (RHASH_ITER_LEV (hash ) > 0 ) {
2834
+ if (hash_iterating_p (hash )) {
2842
2835
rb_hash_foreach (hash , clear_i , 0 );
2843
2836
}
2844
2837
else if (RHASH_AR_TABLE_P (hash )) {
@@ -2909,15 +2902,15 @@ NOINSERT_UPDATE_CALLBACK(hash_aset_str)
2909
2902
VALUE
2910
2903
rb_hash_aset (VALUE hash , VALUE key , VALUE val )
2911
2904
{
2912
- unsigned long iter_lev = RHASH_ITER_LEV (hash );
2905
+ bool iter_p = hash_iterating_p (hash );
2913
2906
2914
2907
rb_hash_modify (hash );
2915
2908
2916
2909
if (RHASH_TYPE (hash ) == & identhash || rb_obj_class (key ) != rb_cString ) {
2917
- RHASH_UPDATE_ITER (hash , iter_lev , key , hash_aset , val );
2910
+ RHASH_UPDATE_ITER (hash , iter_p , key , hash_aset , val );
2918
2911
}
2919
2912
else {
2920
- RHASH_UPDATE_ITER (hash , iter_lev , key , hash_aset_str , val );
2913
+ RHASH_UPDATE_ITER (hash , iter_p , key , hash_aset_str , val );
2921
2914
}
2922
2915
return val ;
2923
2916
}
@@ -2937,7 +2930,7 @@ rb_hash_replace(VALUE hash, VALUE hash2)
2937
2930
{
2938
2931
rb_hash_modify_check (hash );
2939
2932
if (hash == hash2 ) return hash ;
2940
- if (RHASH_ITER_LEV (hash ) > 0 ) {
2933
+ if (hash_iterating_p (hash )) {
2941
2934
rb_raise (rb_eRuntimeError , "can't replace hash during iteration" );
2942
2935
}
2943
2936
hash2 = to_hash (hash2 );
0 commit comments