mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Revert "[Bug #21331] Prohibit modification during stlike loop"
This reverts commit bb180b87b4
, which
caused "malloc during GC" error on wasm.
This commit is contained in:
parent
cb88edf0bf
commit
b66c5c3b1b
Notes:
git
2025-05-14 02:42:51 +00:00
2 changed files with 10 additions and 76 deletions
78
hash.c
78
hash.c
|
@ -880,7 +880,7 @@ ar_general_foreach(VALUE hash, st_foreach_check_callback_func *func, st_update_c
|
||||||
return 0;
|
return 0;
|
||||||
case ST_REPLACE:
|
case ST_REPLACE:
|
||||||
if (replace) {
|
if (replace) {
|
||||||
(*replace)(&key, &val, arg, TRUE);
|
retval = (*replace)(&key, &val, arg, TRUE);
|
||||||
|
|
||||||
// TODO: pair should be same as pair before.
|
// TODO: pair should be same as pair before.
|
||||||
pair = RHASH_AR_TABLE_REF(hash, i);
|
pair = RHASH_AR_TABLE_REF(hash, i);
|
||||||
|
@ -1404,84 +1404,26 @@ hash_foreach_ensure(VALUE hash)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hash_stlike_foreach_arg {
|
|
||||||
VALUE hash;
|
|
||||||
st_foreach_callback_func *func;
|
|
||||||
VALUE arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
hash_stlike_foreach_call(VALUE args)
|
|
||||||
{
|
|
||||||
struct hash_stlike_foreach_arg *argp = (void *)args;
|
|
||||||
VALUE hash = argp->hash;
|
|
||||||
st_foreach_callback_func *func = argp->func;
|
|
||||||
VALUE arg = argp->arg;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (RHASH_AR_TABLE_P(hash)) {
|
|
||||||
ret = ar_foreach(hash, func, arg);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = st_foreach(RHASH_ST_TABLE(hash), func, arg);
|
|
||||||
}
|
|
||||||
return (VALUE)ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_hash_stlike_foreach(VALUE hash, st_foreach_callback_func *func, st_data_t arg)
|
rb_hash_stlike_foreach(VALUE hash, st_foreach_callback_func *func, st_data_t arg)
|
||||||
{
|
{
|
||||||
struct hash_stlike_foreach_arg args = {
|
|
||||||
.hash = hash,
|
|
||||||
.func = func,
|
|
||||||
.arg = arg,
|
|
||||||
};
|
|
||||||
hash_iter_lev_inc(hash);
|
|
||||||
VALUE ret = rb_ensure(hash_stlike_foreach_call, (VALUE)&args,
|
|
||||||
hash_foreach_ensure, hash);
|
|
||||||
return (int)ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct hash_stlike_foreach_with_replace_arg {
|
|
||||||
VALUE hash;
|
|
||||||
st_foreach_check_callback_func *func;
|
|
||||||
st_update_callback_func *replace;
|
|
||||||
VALUE arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
hash_stlike_foreach_with_replace_call(VALUE args)
|
|
||||||
{
|
|
||||||
struct hash_stlike_foreach_with_replace_arg *argp = (void *)args;
|
|
||||||
VALUE hash = argp->hash;
|
|
||||||
st_foreach_check_callback_func *func = argp->func;
|
|
||||||
st_update_callback_func *replace = argp->replace;
|
|
||||||
VALUE arg = argp->arg;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (RHASH_AR_TABLE_P(hash)) {
|
if (RHASH_AR_TABLE_P(hash)) {
|
||||||
ret = ar_foreach_with_replace(hash, func, replace, arg);
|
return ar_foreach(hash, func, arg);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, arg);
|
return st_foreach(RHASH_ST_TABLE(hash), func, arg);
|
||||||
}
|
}
|
||||||
return (VALUE)ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func,
|
rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg)
|
||||||
st_update_callback_func *replace, st_data_t arg)
|
|
||||||
{
|
{
|
||||||
struct hash_stlike_foreach_with_replace_arg args = {
|
if (RHASH_AR_TABLE_P(hash)) {
|
||||||
.hash = hash,
|
return ar_foreach_with_replace(hash, func, replace, arg);
|
||||||
.func = func,
|
}
|
||||||
.replace = replace,
|
else {
|
||||||
.arg = arg,
|
return st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, arg);
|
||||||
};
|
}
|
||||||
hash_iter_lev_inc(hash);
|
|
||||||
VALUE ret = rb_ensure(hash_stlike_foreach_with_replace_call, (VALUE)&args,
|
|
||||||
hash_foreach_ensure, hash);
|
|
||||||
return (int)ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
|
|
@ -1853,14 +1853,6 @@ class TestHash < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
assert_equal(@cls[a: 2, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10], x)
|
assert_equal(@cls[a: 2, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10], x)
|
||||||
|
|
||||||
x = (1..1337).to_h {|k| [k, k]}
|
|
||||||
assert_raise_with_message(RuntimeError, /rehash during iteration/) do
|
|
||||||
x.transform_values! {|v|
|
|
||||||
x.rehash if v == 1337
|
|
||||||
v * 2
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def hrec h, n, &b
|
def hrec h, n, &b
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue