@@ -880,7 +880,7 @@ ar_general_foreach(VALUE hash, st_foreach_check_callback_func *func, st_update_c
880
880
return 0 ;
881
881
case ST_REPLACE :
882
882
if (replace ) {
883
- retval = (* replace )(& key , & val , arg , TRUE);
883
+ (* replace )(& key , & val , arg , TRUE);
884
884
885
885
// TODO: pair should be same as pair before.
886
886
pair = RHASH_AR_TABLE_REF (hash , i );
@@ -1404,26 +1404,84 @@ hash_foreach_ensure(VALUE hash)
1404
1404
return 0 ;
1405
1405
}
1406
1406
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 )
1409
1415
{
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
+
1410
1422
if (RHASH_AR_TABLE_P (hash )) {
1411
- return ar_foreach (hash , func , arg );
1423
+ ret = ar_foreach (hash , func , arg );
1412
1424
}
1413
1425
else {
1414
- return st_foreach (RHASH_ST_TABLE (hash ), func , arg );
1426
+ ret = st_foreach (RHASH_ST_TABLE (hash ), func , arg );
1415
1427
}
1428
+ return (VALUE )ret ;
1416
1429
}
1417
1430
1418
1431
int
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 )
1420
1433
{
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
+
1421
1462
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 );
1423
1464
}
1424
1465
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 );
1426
1467
}
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 ;
1427
1485
}
1428
1486
1429
1487
static VALUE
0 commit comments