summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2025-05-13 22:34:18 +0900
committerNobuyoshi Nakada <[email protected]>2025-05-13 23:16:58 +0900
commitbb180b87b43c45e17ff49735a26d7a188d5c8396 ()
tree18184ac323c3492f7da25a5002fd85aeec9fd835 /hash.c
parent1e2a67e1b0d12b193f3d9b367ec6f1743fc70a13 (diff)
[Bug #21331] Prohibit modification during stlike loop
Notes: Merged: https://.com/ruby/ruby/pull/13317
-rw-r--r--hash.c74
1 files changed, 66 insertions, 8 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) {
- retval = (*replace)(&key, &val, arg, TRUE);
// TODO: pair should be same as pair before.
pair = RHASH_AR_TABLE_REF(hash, i);
@@ -1404,26 +1404,84 @@ hash_foreach_ensure(VALUE hash)
return 0;
}
-int
-rb_hash_stlike_foreach(VALUE hash, st_foreach_callback_func *func, st_data_t arg)
{
if (RHASH_AR_TABLE_P(hash)) {
- return ar_foreach(hash, func, arg);
}
else {
- return st_foreach(RHASH_ST_TABLE(hash), func, arg);
}
}
int
-rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg)
{
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