diff options
author | Nobuyoshi Nakada <[email protected]> | 2025-05-14 10:23:16 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2025-05-14 10:23:16 +0900 |
commit | b66c5c3b1b31581960bcb69d49b618d69ae2a87f () | |
tree | e2540f1a9d84505681ed9c5277558ed884e878dd /hash.c | |
parent | cb88edf0bfdc2ce6bfbe3b4e0463a4c2dc5d2230 (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.c | 74 |
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 |