Skip to content

Commit fbcb327

Browse files
nobuk0kubun
authored andcommitted
Revert "[Bug #21331] Prohibit modification during stlike loop"
This reverts commit bb180b8, which caused "malloc during GC" error on wasm.
1 parent 65e02ab commit fbcb327

2 files changed

Lines changed: 8 additions & 74 deletions

File tree

hash.c

Lines changed: 8 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
(*replace)(&key, &val, arg, TRUE);
883+
retval = (*replace)(&key, &val, arg, TRUE);
884884

885885
// TODO: pair should be same as pair before.
886886
pair = RHASH_AR_TABLE_REF(hash, i);
@@ -1404,84 +1404,26 @@ hash_foreach_ensure(VALUE hash)
14041404
return 0;
14051405
}
14061406

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)
1407+
int
1408+
rb_hash_stlike_foreach(VALUE hash, st_foreach_callback_func *func, st_data_t arg)
14151409
{
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-
14221410
if (RHASH_AR_TABLE_P(hash)) {
1423-
ret = ar_foreach(hash, func, arg);
1411+
return ar_foreach(hash, func, arg);
14241412
}
14251413
else {
1426-
ret = st_foreach(RHASH_ST_TABLE(hash), func, arg);
1414+
return st_foreach(RHASH_ST_TABLE(hash), func, arg);
14271415
}
1428-
return (VALUE)ret;
14291416
}
14301417

14311418
int
1432-
rb_hash_stlike_foreach(VALUE hash, st_foreach_callback_func *func, st_data_t arg)
1419+
rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg)
14331420
{
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-
14621421
if (RHASH_AR_TABLE_P(hash)) {
1463-
ret = ar_foreach_with_replace(hash, func, replace, arg);
1422+
return ar_foreach_with_replace(hash, func, replace, arg);
14641423
}
14651424
else {
1466-
ret = st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, arg);
1425+
return st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, arg);
14671426
}
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;
14851427
}
14861428

14871429
static VALUE

test/ruby/test_hash.rb

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1853,14 +1853,6 @@ def test_transform_values_bang
18531853
end
18541854
end
18551855
assert_equal(@cls[a: 2, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10], x)
1856-
1857-
x = (1..1337).to_h {|k| [k, k]}
1858-
assert_raise_with_message(RuntimeError, /rehash during iteration/) do
1859-
x.transform_values! {|v|
1860-
x.rehash if v == 1337
1861-
v * 2
1862-
}
1863-
end
18641856
end
18651857

18661858
def hrec h, n, &b

0 commit comments

Comments
 (0)