-
-
Save headius/0fa85000348bc22ede6af60d66cebbda to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/core/src/main/java/org/jruby/ir/targets/JVMVisitor.java b/core/src/main/java/org/jruby/ir/targets/JVMVisitor.java | |
index 64e360c14e..17e7de46bd 100644 | |
--- a/core/src/main/java/org/jruby/ir/targets/JVMVisitor.java | |
+++ b/core/src/main/java/org/jruby/ir/targets/JVMVisitor.java | |
@@ -1241,7 +1241,7 @@ public class JVMVisitor extends IRVisitor { | |
if (jvm.methodData().specificArity >= 0) { | |
// no arity check in specific arity path | |
} else { | |
- checkArity(checkarityinstr.required, checkarityinstr.opt, checkarityinstr.rest, checkarityinstr.receivesKeywords, checkarityinstr.restKey); | |
+ checkArity(checkarityinstr.getKeywords(), checkarityinstr.required, checkarityinstr.opt, checkarityinstr.rest, checkarityinstr.receivesKeywords, checkarityinstr.restKey); | |
} | |
} | |
@@ -1249,10 +1249,24 @@ public class JVMVisitor extends IRVisitor { | |
jvmMethod().loadContext(); | |
jvmMethod().loadStaticScope(); | |
jvmMethod().loadArgs(); | |
+ jvmMethod().invokeIRHelper("undefined", sig(IRubyObject.class)); | |
jvmMethod().loadSelfBlock(); | |
jvmAdapter().invokedynamic( | |
"checkArity", | |
- sig(void.class, ThreadContext.class, StaticScope.class, Object[].class, Block.class), | |
+ sig(void.class, ThreadContext.class, StaticScope.class, Object[].class, Object.class, Block.class), | |
+ Bootstrap.CHECK_ARITY, | |
+ required, opt, rest ? 1 : 0, receivesKeywords ? 1 : 0, restKey); | |
+ } | |
+ | |
+ private void checkArity(Operand keywords, int required, int opt, boolean rest, boolean receivesKeywords, int restKey) { | |
+ jvmMethod().loadContext(); | |
+ jvmMethod().loadStaticScope(); | |
+ jvmMethod().loadArgs(); | |
+ visit(keywords); | |
+ jvmMethod().loadSelfBlock(); | |
+ jvmAdapter().invokedynamic( | |
+ "checkArity", | |
+ sig(void.class, ThreadContext.class, StaticScope.class, Object[].class, Object.class, Block.class), | |
Bootstrap.CHECK_ARITY, | |
required, opt, rest ? 1 : 0, receivesKeywords ? 1 : 0, restKey); | |
} | |
diff --git a/core/src/main/java/org/jruby/ir/targets/indy/Bootstrap.java b/core/src/main/java/org/jruby/ir/targets/indy/Bootstrap.java | |
index 1dd17b87ad..cc2d1db046 100644 | |
--- a/core/src/main/java/org/jruby/ir/targets/indy/Bootstrap.java | |
+++ b/core/src/main/java/org/jruby/ir/targets/indy/Bootstrap.java | |
@@ -38,6 +38,7 @@ import org.jruby.internal.runtime.GlobalVariable; | |
import org.jruby.internal.runtime.methods.*; | |
import org.jruby.ir.JIT; | |
import org.jruby.ir.interpreter.FullInterpreterContext; | |
+import org.jruby.ir.operands.UndefinedValue; | |
import org.jruby.ir.runtime.IRRuntimeHelpers; | |
import org.jruby.java.invokers.SingletonMethodInvoker; | |
import org.jruby.javasupport.JavaUtil; | |
@@ -306,18 +307,17 @@ public class Bootstrap { | |
@JIT | |
public static CallSite checkArity(Lookup lookup, String name, MethodType type, int req, int opt, int rest, int key, int keyrest) { | |
- return new ConstantCallSite(insertArguments(CHECK_ARITY_HANDLE, 4, req, opt, rest == 0 ? false : true, key == 0 ? false : true, keyrest)); | |
+ return new ConstantCallSite(insertArguments(CHECK_ARITY_HANDLE, 5, req, opt, rest == 0 ? false : true, key == 0 ? false : true, keyrest)); | |
} | |
private static final MethodHandle CHECK_ARITY_HANDLE = | |
Binder | |
- .from(void.class, ThreadContext.class, StaticScope.class, Object[].class, Block.class, int.class, int.class, boolean.class, boolean.class, int.class) | |
+ .from(void.class, ThreadContext.class, StaticScope.class, Object[].class, Object.class, Block.class, int.class, int.class, boolean.class, boolean.class, int.class) | |
.invokeStaticQuiet(LOOKUP, Bootstrap.class, "checkArity"); | |
@JIT | |
- public static void checkArity(ThreadContext context, StaticScope scope, Object[] args, Block block, int req, int opt, boolean rest, boolean key, int keyrest) { | |
- // FIXME: Need to get keyword. | |
- IRRuntimeHelpers.checkArity(context, scope, args, null, req, opt, rest, key, keyrest, block); | |
+ public static void checkArity(ThreadContext context, StaticScope scope, Object[] args, Object keywords, Block block, int req, int opt, boolean rest, boolean key, int keyrest) { | |
+ IRRuntimeHelpers.checkArity(context, scope, args, keywords, req, opt, rest, key, keyrest, block); | |
} | |
public static CallSite array(Lookup lookup, String name, MethodType type) { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment