Skip to content

Commit 28cd97a

Browse files
committed
[GR-18163] Correct arity value for Proc (#2098)
PullRequest: truffleruby/1992
2 parents 82d2961 + c5dc421 commit 28cd97a

File tree

12 files changed

+33
-19
lines changed

12 files changed

+33
-19
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ Compatibility:
3535
* Implemented `rb_yield_values2`.
3636
* Implemented `Digest::Base#{update, <<}` (#2100).
3737
* Pass the final `super` specs (#2104, @chrisseaton).
38+
* Fix arity for arguments with optional kwargs (#1669, @ssnickolay)
39+
* Fix arity for `Proc` (#2098, @ssnickolay)
3840

3941
Performance:
4042

spec/tags/core/proc/arity_tags.txt

Lines changed: 0 additions & 6 deletions
This file was deleted.

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.sharedMethodInfo.getArity().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.sharedMethodInfo.getArity().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 }));

src/main/java/org/truffleruby/core/method/MethodNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public abstract static class ArityNode extends CoreMethodArrayArgumentsNode {
9797

9898
@Specialization
9999
protected int arity(RubyMethod method) {
100-
return method.method.getSharedMethodInfo().getArity().getArityNumber();
100+
return method.method.getArityNumber();
101101
}
102102

103103
}

src/main/java/org/truffleruby/core/method/UnboundMethodNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public abstract static class ArityNode extends CoreMethodArrayArgumentsNode {
6666

6767
@Specialization
6868
protected int arity(RubyUnboundMethod unboundMethod) {
69-
return unboundMethod.method.getSharedMethodInfo().getArity().getArityNumber();
69+
return unboundMethod.method.getArityNumber();
7070
}
7171

7272
}

src/main/java/org/truffleruby/core/proc/ProcNodes.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,8 @@ public abstract static class ArityNode extends CoreMethodArrayArgumentsNode {
160160

161161
@Specialization
162162
protected int arity(RubyProc proc) {
163-
return proc.sharedMethodInfo.getArity().getArityNumber();
163+
return proc.getArityNumber();
164164
}
165-
166165
}
167166

168167
@CoreMethod(names = "binding")

src/main/java/org/truffleruby/core/proc/RubyProc.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ public SourceSection getSourceLocation() {
8686
}
8787
// endregion
8888

89+
public int getArityNumber() {
90+
return sharedMethodInfo.getArity().getArityNumber(type);
91+
}
92+
8993
// region Executable
9094
@ExportMessage
9195
public boolean isExecutable() {

src/main/java/org/truffleruby/language/globals/IsDefinedGlobalVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ protected Object executeDefinedHooksWithBinding(VirtualFrame frame,
5959
}
6060

6161
protected int isDefinedArity(GlobalVariableStorage storage) {
62-
return storage.getIsDefined().sharedMethodInfo.getArity().getArityNumber();
62+
return storage.getIsDefined().getArityNumber();
6363
}
6464

6565
protected GlobalVariableStorage getStorage() {

src/main/java/org/truffleruby/language/globals/ReadGlobalVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected Object readHooksWithBinding(VirtualFrame frame,
5353
}
5454

5555
protected int getterArity(GlobalVariableStorage storage) {
56-
return storage.getGetter().sharedMethodInfo.getArity().getArityNumber();
56+
return storage.getGetter().getArityNumber();
5757
}
5858

5959
protected GlobalVariableStorage getStorage() {

src/main/java/org/truffleruby/language/globals/WriteGlobalVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ protected Object writeHooksWithBinding(VirtualFrame frame, Object value,
5959
}
6060

6161
protected int setterArity(GlobalVariableStorage storage) {
62-
return storage.getSetter().sharedMethodInfo.getArity().getArityNumber();
62+
return storage.getSetter().getArityNumber();
6363
}
6464

6565
protected GlobalVariableStorage getStorage() {

0 commit comments

Comments
 (0)