Skip to content

Commit c5dc421

Browse files
committed
Use the more efficient arity check for Hash#{each_pair,map}
* Since it does not seem to affect semantics at all, since anyway a non-lambda Proc will destructure a single Array argument, unless there is a rest argument (but then arity would be negative) or there is no rest argument, no optional argument and required <= 1 (but then required > 1 for yieldPair() is always false).
1 parent cf9831f commit c5dc421

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/main/java/org/truffleruby/core/hash/HashNodes.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,8 @@ protected RubyHash eachBuckets(RubyHash hash, RubyProc block) {
501501

502502
private Object yieldPair(RubyProc block, Object key, Object value) {
503503
// MRI behavior, see rb_hash_each_pair()
504-
if (arityMoreThanOne.profile(block.getArityNumber() > 1)) {
504+
// We use getMethodArityNumber() here since for non-lambda the semantics are the same for both branches
505+
if (arityMoreThanOne.profile(block.sharedMethodInfo.getArity().getMethodArityNumber() > 1)) {
505506
return yield(block, key, value);
506507
} else {
507508
return yield(block, createArray(new Object[]{ key, value }));
@@ -722,7 +723,8 @@ protected RubyArray mapBuckets(RubyHash hash, RubyProc block,
722723

723724
private Object yieldPair(RubyProc block, Object key, Object value) {
724725
// MRI behavior, see rb_hash_each_pair()
725-
if (arityMoreThanOne.profile(block.getArityNumber() > 1)) {
726+
// We use getMethodArityNumber() here since for non-lambda the semantics are the same for both branches
727+
if (arityMoreThanOne.profile(block.sharedMethodInfo.getArity().getMethodArityNumber() > 1)) {
726728
return yield(block, key, value);
727729
} else {
728730
return yield(block, createArray(new Object[]{ key, value }));

0 commit comments

Comments
 (0)