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:
Nobuyoshi Nakada 2025-05-14 10:23:16 +09:00
parent cb88edf0bf
commit b66c5c3b1b
No known key found for this signature in database
GPG key ID: 3582D74E1FEE4465
Notes: git 2025-05-14 02:42:51 +00:00
2 changed files with 10 additions and 76 deletions

78
hash.c
View file

@ -880,7 +880,7 @@ ar_general_foreach(VALUE hash, st_foreach_check_callback_func *func, st_update_c
return 0;
case ST_REPLACE:
if (replace) {
(*replace)(&key, &val, arg, TRUE);
retval = (*replace)(&key, &val, arg, TRUE);
// TODO: pair should be same as pair before.
pair = RHASH_AR_TABLE_REF(hash, i);
@ -1404,84 +1404,26 @@ hash_foreach_ensure(VALUE hash)
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
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)) {
ret = ar_foreach_with_replace(hash, func, replace, arg);
return ar_foreach(hash, func, arg);
}
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
rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func,
st_update_callback_func *replace, st_data_t arg)
rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg)
{
struct hash_stlike_foreach_with_replace_arg args = {
.hash = hash,
.func = func,
.replace = replace,
.arg = 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;
if (RHASH_AR_TABLE_P(hash)) {
return ar_foreach_with_replace(hash, func, replace, arg);
}
else {
return st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, arg);
}
}
static VALUE