summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2025-05-14 10:23:16 +0900
committerNobuyoshi Nakada <[email protected]>2025-05-14 10:23:16 +0900
commitb66c5c3b1b31581960bcb69d49b618d69ae2a87f ()
treee2540f1a9d84505681ed9c5277558ed884e878dd /hash.c
parentcb88edf0bfdc2ce6bfbe3b4e0463a4c2dc5d2230 (diff)
Revert "[Bug #21331] Prohibit modification during stlike loop"
This reverts commit bb180b87b43c45e17ff49735a26d7a188d5c8396, which caused "malloc during GC" error on wasm.
Notes: Merged: https://.com/ruby/ruby/pull/13329
-rw-r--r--hash.c74
1 files changed, 8 insertions, 66 deletions
@@ -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);
// 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);
}
else {
- ret = st_foreach_with_replace(RHASH_ST_TABLE(hash), func, replace, 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)
-{
- 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;
}
static VALUE