summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorS.H <gamelinks007@gmail.com>2022-10-23 16:17:24 +0900
committerGitHub <noreply@github.com>2022-10-23 16:17:24 +0900
commitc8c136265c6dd343990293016eb9904aa78a0412 (patch)
tree8b2e525580f3aac8ecbf27cd0b11da7f6d23cb72 /hash.c
parent54cad3123a07583c90e85bcfc55ebd87124c1250 (diff)
downloadruby-c8c136265c6dd343990293016eb9904aa78a0412.tar.gz
Introduce `hash_iter_status_check` function
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/hash.c b/hash.c
index 9218b17421..37c32af3ba 100644
--- a/hash.c
+++ b/hash.c
@@ -1346,15 +1346,8 @@ struct hash_foreach_arg {
};
static int
-hash_ar_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
+hash_iter_status_check(int status)
{
- struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
-
- if (error) return ST_STOP;
-
- int status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
- /* TODO: rehash check? rb_raise(rb_eRuntimeError, "rehash occurred during iteration"); */
-
switch (status) {
case ST_DELETE:
return ST_DELETE;
@@ -1368,6 +1361,19 @@ hash_ar_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
}
static int
+hash_ar_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
+{
+ struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
+
+ if (error) return ST_STOP;
+
+ int status = (*arg->func)((VALUE)key, (VALUE)value, arg->arg);
+ /* TODO: rehash check? rb_raise(rb_eRuntimeError, "rehash occurred during iteration"); */
+
+ return hash_iter_status_check(status);
+}
+
+static int
hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
{
struct hash_foreach_arg *arg = (struct hash_foreach_arg *)argp;
@@ -1381,16 +1387,7 @@ hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
rb_raise(rb_eRuntimeError, "rehash occurred during iteration");
}
- switch (status) {
- case ST_DELETE:
- return ST_DELETE;
- case ST_CONTINUE:
- break;
- case ST_STOP:
- return ST_STOP;
- }
-
- return ST_CHECK;
+ return hash_iter_status_check(status);
}
static int