Skip to content

Instantly share code, notes, and snippets.

@headius

headius/.diff Secret

Last active April 25, 2022 21:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save headius/0fa85000348bc22ede6af60d66cebbda to your computer and use it in GitHub Desktop.
Save headius/0fa85000348bc22ede6af60d66cebbda to your computer and use it in GitHub Desktop.
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