@@ -880,7 +880,7 @@ ar_general_foreach(VALUE hash, st_foreach_check_callback_func *func, st_update_c
880880 return 0 ;
881881 case ST_REPLACE :
882882 if (replace ) {
883- retval = (* replace )(& key , & val , arg , TRUE);
883+ (* replace )(& key , & val , arg , TRUE);
884884
885885 // TODO: pair should be same as pair before.
886886 pair = RHASH_AR_TABLE_REF (hash , i );
@@ -1404,26 +1404,84 @@ hash_foreach_ensure(VALUE hash)
14041404 return 0 ;
14051405}
14061406
1407- int
1408- rb_hash_stlike_foreach (VALUE hash , st_foreach_callback_func * func , st_data_t arg )
1407+ struct hash_stlike_foreach_arg {
1408+ VALUE hash ;
1409+ st_foreach_callback_func * func ;
1410+ VALUE arg ;
1411+ };
1412+
1413+ static VALUE
1414+ hash_stlike_foreach_call (VALUE args )
14091415{
1416+ struct hash_stlike_foreach_arg * argp = (void * )args ;
1417+ VALUE hash = argp -> hash ;
1418+ st_foreach_callback_func * func = argp -> func ;
1419+ VALUE arg = argp -> arg ;
1420+ int ret ;
1421+
14101422 if (RHASH_AR_TABLE_P (hash )) {
1411- return ar_foreach (hash , func , arg );
1423+ ret = ar_foreach (hash , func , arg );
14121424 }
14131425 else {
1414- return st_foreach (RHASH_ST_TABLE (hash ), func , arg );
1426+ ret = st_foreach (RHASH_ST_TABLE (hash ), func , arg );
14151427 }
1428+ return (VALUE )ret ;
14161429}
14171430
14181431int
1419- rb_hash_stlike_foreach_with_replace (VALUE hash , st_foreach_check_callback_func * func , st_update_callback_func * replace , st_data_t arg )
1432+ rb_hash_stlike_foreach (VALUE hash , st_foreach_callback_func * func , st_data_t arg )
14201433{
1434+ struct hash_stlike_foreach_arg args = {
1435+ .hash = hash ,
1436+ .func = func ,
1437+ .arg = arg ,
1438+ };
1439+ hash_iter_lev_inc (hash );
1440+ VALUE ret = rb_ensure (hash_stlike_foreach_call , (VALUE )& args ,
1441+ hash_foreach_ensure , hash );
1442+ return (int )ret ;
1443+ }
1444+
1445+ struct hash_stlike_foreach_with_replace_arg {
1446+ VALUE hash ;
1447+ st_foreach_check_callback_func * func ;
1448+ st_update_callback_func * replace ;
1449+ VALUE arg ;
1450+ };
1451+
1452+ static VALUE
1453+ hash_stlike_foreach_with_replace_call (VALUE args )
1454+ {
1455+ struct hash_stlike_foreach_with_replace_arg * argp = (void * )args ;
1456+ VALUE hash = argp -> hash ;
1457+ st_foreach_check_callback_func * func = argp -> func ;
1458+ st_update_callback_func * replace = argp -> replace ;
1459+ VALUE arg = argp -> arg ;
1460+ int ret ;
1461+
14211462 if (RHASH_AR_TABLE_P (hash )) {
1422- return ar_foreach_with_replace (hash , func , replace , arg );
1463+ ret = ar_foreach_with_replace (hash , func , replace , arg );
14231464 }
14241465 else {
1425- return st_foreach_with_replace (RHASH_ST_TABLE (hash ), func , replace , arg );
1466+ ret = st_foreach_with_replace (RHASH_ST_TABLE (hash ), func , replace , arg );
14261467 }
1468+ return (VALUE )ret ;
1469+ }
1470+
1471+ int
1472+ rb_hash_stlike_foreach_with_replace (VALUE hash , st_foreach_check_callback_func * func ,
1473+ st_update_callback_func * replace , st_data_t arg )
1474+ {
1475+ struct hash_stlike_foreach_with_replace_arg args = {
1476+ .hash = hash ,
1477+ .func = func ,
1478+ .replace = replace ,
1479+ .arg = arg ,
1480+ };
1481+ hash_iter_lev_inc (hash );
1482+ VALUE ret = rb_ensure (hash_stlike_foreach_with_replace_call , (VALUE )& args ,
1483+ hash_foreach_ensure , hash );
1484+ return (int )ret ;
14271485}
14281486
14291487static VALUE
0 commit comments