summaryrefslogtreecommitdiff
path: root/enum.c
diff options
context:
space:
mode:
authorYusuke Endoh <[email protected]>2024-07-11 11:46:23 +0900
committerYusuke Endoh <[email protected]>2024-07-11 12:28:23 +0900
commite1238a1faba5cbb7975d08963bf0bfa50a96d2b0 (patch)
treea8a3c6bb29397840c339226e74838b183a18f582 /enum.c
parent724d95a713f47ff7a6f1907b63cd02710824ba76 (diff)
Enumerable#all?: Stop optimizing when a given block is not optimizable
This is a follow up to 182822683f86c8f8d63b05765addf5a04d112aa2. Co-Authored-By: Aaron Patterson <[email protected]>
Diffstat (limited to 'enum.c')
-rw-r--r--enum.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/enum.c b/enum.c
index 30f374ad7b..b4cddec9bc 100644
--- a/enum.c
+++ b/enum.c
@@ -1743,6 +1743,9 @@ enum_sort_by(VALUE obj)
#define ENUMFUNC(name) argc ? name##_eqq : rb_block_given_p() ? name##_iter_i : name##_i
+#define ENUM_BLOCK_CALL(name) \
+ rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(name), (VALUE)memo, rb_block_given_p() && rb_block_pair_yield_optimizable() ? RB_BLOCK_NO_USE_PACKED_ARGS : 0);
+
#define MEMO_ENUM_NEW(v1) (rb_check_arity(argc, 0, 1), MEMO_NEW((v1), (argc ? *argv : 0), 0))
#define DEFINE_ENUMFUNCS(name) \
@@ -1836,7 +1839,7 @@ enum_all(int argc, VALUE *argv, VALUE obj)
{
struct MEMO *memo = MEMO_ENUM_NEW(Qtrue);
WARN_UNUSED_BLOCK(argc);
- rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(all), (VALUE)memo, RB_BLOCK_NO_USE_PACKED_ARGS);
+ ENUM_BLOCK_CALL(all);
return memo->v1;
}
@@ -1898,7 +1901,7 @@ enum_any(int argc, VALUE *argv, VALUE obj)
{
struct MEMO *memo = MEMO_ENUM_NEW(Qfalse);
WARN_UNUSED_BLOCK(argc);
- rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(any), (VALUE)memo, RB_BLOCK_NO_USE_PACKED_ARGS);
+ ENUM_BLOCK_CALL(any);
return memo->v1;
}
@@ -2187,7 +2190,7 @@ enum_one(int argc, VALUE *argv, VALUE obj)
VALUE result;
WARN_UNUSED_BLOCK(argc);
- rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(one), (VALUE)memo, RB_BLOCK_NO_USE_PACKED_ARGS);
+ ENUM_BLOCK_CALL(one);
result = memo->v1;
if (UNDEF_P(result)) return Qfalse;
return result;
@@ -2248,7 +2251,7 @@ enum_none(int argc, VALUE *argv, VALUE obj)
struct MEMO *memo = MEMO_ENUM_NEW(Qtrue);
WARN_UNUSED_BLOCK(argc);
- rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(none), (VALUE)memo, RB_BLOCK_NO_USE_PACKED_ARGS);
+ ENUM_BLOCK_CALL(none);
return memo->v1;
}