Skip to content

Commit

Permalink
Showing 14 changed files with 66 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -30,14 +30,14 @@
* Created by headius on 10/23/14.
*/
public class ArrayDerefInvokeSite extends NormalInvokeSite {
public ArrayDerefInvokeSite(MethodType type) {
super(type, "[]");
public ArrayDerefInvokeSite(MethodType type, String file, int line) {
super(type, "[]", file, line);
}

public static final Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(ArrayDerefInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class));
public static final Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(ArrayDerefInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class, int.class));

public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
InvokeSite site = new ArrayDerefInvokeSite(type);
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String file, int line) {
InvokeSite site = new ArrayDerefInvokeSite(type, file, line);

return InvokeSite.bootstrap(site, lookup);
}
Original file line number Diff line number Diff line change
@@ -21,8 +21,8 @@
* Created by headius on 10/23/14.
*/
public class ClassSuperInvokeSite extends ResolvedSuperInvokeSite {
public ClassSuperInvokeSite(MethodType type, String name, String splatmapString) {
super(type, name, splatmapString);
public ClassSuperInvokeSite(MethodType type, String name, String splatmapString, String file, int line) {
super(type, name, splatmapString, file, line);
}

@Override
Original file line number Diff line number Diff line change
@@ -9,11 +9,9 @@
import org.jruby.Ruby;
import org.jruby.RubyClass;
import org.jruby.compiler.impl.SkinnyMethodAdapter;
import org.jruby.ir.IRScope;
import org.jruby.ir.operands.UndefinedValue;
import org.jruby.ir.runtime.IRRuntimeHelpers;
import org.jruby.runtime.CallType;
import org.jruby.runtime.CompiledIRBlockBody;
import org.jruby.runtime.Helpers;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
@@ -374,8 +372,10 @@ public org.objectweb.asm.Label newLabel() {
* If this invokes against a Hash with a frozen string, it will follow an optimized path.
*
* Stack required: context, self, target, arg0
* @param file
* @param line
*/
public abstract void invokeArrayDeref();
public abstract void invokeArrayDeref(String file, int line);

/**
* Invoke a fixnum-receiving method on an object other than self.
Original file line number Diff line number Diff line change
@@ -390,7 +390,7 @@ public void invokeOther(String file, int line, String name, int arity, boolean h
invoke(file, line, name, arity, hasClosure, CallType.NORMAL, isPotentiallyRefined);
}

public void invokeArrayDeref() {
public void invokeArrayDeref(String file, int line) {
SkinnyMethodAdapter adapter2;
String incomingSig = sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyString.class));

37 changes: 18 additions & 19 deletions core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter7.java
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
import org.jruby.compiler.impl.SkinnyMethodAdapter;
import org.jruby.ir.IRScope;
import org.jruby.ir.runtime.IRRuntimeHelpers;
import org.jruby.parser.StaticScope;
import org.jruby.runtime.Block;
import org.jruby.runtime.CallType;
import org.jruby.runtime.DynamicScope;
@@ -135,22 +134,22 @@ public void invokeOther(String file, int line, String name, int arity, boolean h

if (hasClosure) {
if (arity == -1) {
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY, Block.class)), NormalInvokeSite.BOOTSTRAP);
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY, Block.class)), NormalInvokeSite.BOOTSTRAP, file, line);
} else {
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, arity + 2, Block.class)), NormalInvokeSite.BOOTSTRAP);
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, arity + 2, Block.class)), NormalInvokeSite.BOOTSTRAP, file, line);
}
} else {
if (arity == -1) {
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY)), NormalInvokeSite.BOOTSTRAP);
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY)), NormalInvokeSite.BOOTSTRAP, file, line);
} else {
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, arity)), NormalInvokeSite.BOOTSTRAP);
adapter.invokedynamic("invoke:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, arity)), NormalInvokeSite.BOOTSTRAP, file, line);
}
}
}

@Override
public void invokeArrayDeref() {
adapter.invokedynamic("aref", sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, 1)), ArrayDerefInvokeSite.BOOTSTRAP);
public void invokeArrayDeref(String file, int line) {
adapter.invokedynamic("aref", sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, 1)), ArrayDerefInvokeSite.BOOTSTRAP, file, line);
}

public void invokeOtherOneFixnum(String file, int line, String name, long fixnum, CallType callType) {
@@ -209,15 +208,15 @@ public void invokeSelf(String file, int line, String name, int arity, boolean ha
String action = callType == CallType.FUNCTIONAL ? "callFunctional" : "callVariable";
if (hasClosure) {
if (arity == -1) {
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY, Block.class)), SelfInvokeSite.BOOTSTRAP);
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY, Block.class)), SelfInvokeSite.BOOTSTRAP, file, line);
} else {
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, arity + 2, Block.class)), SelfInvokeSite.BOOTSTRAP);
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, arity + 2, Block.class)), SelfInvokeSite.BOOTSTRAP, file, line);
}
} else {
if (arity == -1) {
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY)), SelfInvokeSite.BOOTSTRAP);
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT_ARRAY)), SelfInvokeSite.BOOTSTRAP, file, line);
} else {
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, arity)), SelfInvokeSite.BOOTSTRAP);
adapter.invokedynamic(action + ":" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, JVM.OBJECT, arity)), SelfInvokeSite.BOOTSTRAP, file, line);
}
}
}
@@ -227,9 +226,9 @@ public void invokeInstanceSuper(String file, int line, String name, int arity, b

String splatmapString = IRRuntimeHelpers.encodeSplatmap(splatmap);
if (hasClosure) {
adapter.invokedynamic("invokeInstanceSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeInstanceSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString, file, line);
} else {
adapter.invokedynamic("invokeInstanceSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeInstanceSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString, file, line);
}
}

@@ -238,9 +237,9 @@ public void invokeClassSuper(String file, int line, String name, int arity, bool

String splatmapString = IRRuntimeHelpers.encodeSplatmap(splatmap);
if (hasClosure) {
adapter.invokedynamic("invokeClassSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeClassSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString, file, line);
} else {
adapter.invokedynamic("invokeClassSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeClassSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString, file, line);
}
}

@@ -249,9 +248,9 @@ public void invokeUnresolvedSuper(String file, int line, String name, int arity,

String splatmapString = IRRuntimeHelpers.encodeSplatmap(splatmap);
if (hasClosure) {
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString, file, line);
} else {
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString, file, line);
}
}

@@ -260,9 +259,9 @@ public void invokeZSuper(String file, int line, String name, int arity, boolean

String splatmapString = IRRuntimeHelpers.encodeSplatmap(splatmap);
if (hasClosure) {
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity, Block.class)), Bootstrap.invokeSuper(), splatmapString, file, line);
} else {
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString);
adapter.invokedynamic("invokeUnresolvedSuper:" + JavaNameMangler.mangleMethodName(name), sig(JVM.OBJECT, params(ThreadContext.class, JVM.OBJECT, JVM.OBJECT, RubyClass.class, JVM.OBJECT, arity)), Bootstrap.invokeSuper(), splatmapString, file, line);
}
}

Original file line number Diff line number Diff line change
@@ -22,8 +22,8 @@
* Created by headius on 10/23/14.
*/
public class InstanceSuperInvokeSite extends ResolvedSuperInvokeSite {
public InstanceSuperInvokeSite(MethodType type, String name, String splatmapString) {
super(type, name, splatmapString);
public InstanceSuperInvokeSite(MethodType type, String name, String splatmapString, String file, int line) {
super(type, name, splatmapString, file, line);
}

@Override
10 changes: 7 additions & 3 deletions core/src/main/java/org/jruby/ir/targets/InvokeSite.java
Original file line number Diff line number Diff line change
@@ -53,6 +53,8 @@ public abstract class InvokeSite extends MutableCallSite {
private static final AtomicLong SITE_ID = new AtomicLong(1);
private final long siteID = SITE_ID.getAndIncrement();
private final int argOffset;
protected final String file;
protected final int line;
private boolean boundOnce;
CacheEntry cache = CacheEntry.NULL_CACHE;

@@ -64,10 +66,12 @@ public String name() {

public final CallType callType;

public InvokeSite(MethodType type, String name, CallType callType) {
public InvokeSite(MethodType type, String name, CallType callType, String file, int line) {
super(type);
this.methodName = name;
this.callType = callType;
this.file = file;
this.line = line;

Signature startSig;

@@ -206,7 +210,7 @@ MethodHandle buildNewInstanceHandle(DynamicMethod method, IRubyObject self, bool
RubyClass recvClass = (RubyClass) self;

// Bind a second site as a dynamic invoker to guard against changes in new object's type
CallSite initSite = SelfInvokeSite.bootstrap(lookup(), "callFunctional:initialize", type());
CallSite initSite = SelfInvokeSite.bootstrap(lookup(), "callFunctional:initialize", type(), file, line);
MethodHandle initHandle = initSite.dynamicInvoker();

MethodHandle allocFilter = Binder.from(IRubyObject.class, IRubyObject.class)
@@ -248,7 +252,7 @@ && seenTypesCount() + 1 > Options.INVOKEDYNAMIC_MAXPOLY.load())) {
} else {
// wipe out site with this new type and method
String bind = boundOnce ? "rebind" : "bind";
if (Options.INVOKEDYNAMIC_LOG_BINDING.load()) LOG.info(methodName + "\ttriggered site #" + siteID + " " + bind);// + " (" + file() + ":" + line() + ")");
if (Options.INVOKEDYNAMIC_LOG_BINDING.load()) LOG.info(methodName + "\ttriggered site #" + siteID + " " + bind + " (" + file + ":" + line + ")");
fallback = this.fallback;
clearTypes();
}
4 changes: 1 addition & 3 deletions core/src/main/java/org/jruby/ir/targets/JVMVisitor.java
Original file line number Diff line number Diff line change
@@ -16,8 +16,6 @@
import org.jruby.ir.instructions.defined.RestoreErrorInfoInstr;
import org.jruby.ir.instructions.specialized.OneFixnumArgNoBlockCallInstr;
import org.jruby.ir.instructions.specialized.OneFloatArgNoBlockCallInstr;
import org.jruby.ir.instructions.specialized.OneOperandArgNoBlockCallInstr;
import org.jruby.ir.instructions.specialized.ZeroOperandArgNoBlockCallInstr;
import org.jruby.ir.operands.*;
import org.jruby.ir.operands.Boolean;
import org.jruby.ir.operands.Float;
@@ -575,7 +573,7 @@ public void ArrayDerefInstr(ArrayDerefInstr arrayderefinstr) {
jvmMethod().loadSelf();
visit(arrayderefinstr.getReceiver());
visit(arrayderefinstr.getKey());
jvmMethod().invokeArrayDeref();
jvmMethod().invokeArrayDeref(file, lastLine);
jvmStoreLocal(arrayderefinstr.getResult());
}

10 changes: 5 additions & 5 deletions core/src/main/java/org/jruby/ir/targets/NormalInvokeSite.java
Original file line number Diff line number Diff line change
@@ -24,15 +24,15 @@
public class NormalInvokeSite extends InvokeSite {
CacheEntry cache;

public NormalInvokeSite(MethodType type, String name) {
super(type, name, CallType.NORMAL);
public NormalInvokeSite(MethodType type, String name, String file, int line) {
super(type, name, CallType.NORMAL, file, line);
}

public static Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(NormalInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class));
public static Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(NormalInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class, int.class));

public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String file, int line) {
String methodName = StringSupport.split(name, ':').get(1);
InvokeSite site = new NormalInvokeSite(type, JavaNameMangler.demangleMethodName(methodName));
InvokeSite site = new NormalInvokeSite(type, JavaNameMangler.demangleMethodName(methodName), file, line);

return InvokeSite.bootstrap(site, lookup);
}
Original file line number Diff line number Diff line change
@@ -30,27 +30,25 @@ public abstract class ResolvedSuperInvokeSite extends SelfInvokeSite {
protected final String superName;
protected final boolean[] splatMap;

public ResolvedSuperInvokeSite(MethodType type, String superName, String splatmapString) {
super(type, superName, CallType.SUPER);
public ResolvedSuperInvokeSite(MethodType type, String superName, String splatmapString, String file, int line) {
super(type, superName, CallType.SUPER, file, line);

this.superName = superName;
this.splatMap = IRRuntimeHelpers.decodeSplatmap(splatmapString);
}

public static final Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(ResolvedSuperInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class));

public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String splatmapString) {
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String splatmapString, String file, int line) {
String[] targetAndMethod = name.split(":");
String superName = JavaNameMangler.demangleMethodName(targetAndMethod[1]);

InvokeSite site;

switch (targetAndMethod[0]) {
case "invokeInstanceSuper":
site = new InstanceSuperInvokeSite(type, superName, splatmapString);
site = new InstanceSuperInvokeSite(type, superName, splatmapString, file, line);
break;
case "invokeClassSuper":
site = new ClassSuperInvokeSite(type, superName, splatmapString);
site = new ClassSuperInvokeSite(type, superName, splatmapString, file, line);
break;
default:
throw new RuntimeException("invalid super call: " + name);
10 changes: 5 additions & 5 deletions core/src/main/java/org/jruby/ir/targets/SelfInvokeSite.java
Original file line number Diff line number Diff line change
@@ -23,17 +23,17 @@
* Created by headius on 10/23/14.
*/
public class SelfInvokeSite extends InvokeSite {
public SelfInvokeSite(MethodType type, String name, CallType callType) {
super(type, name, callType);
public SelfInvokeSite(MethodType type, String name, CallType callType, String file, int line) {
super(type, name, callType, file, line);
}

public static Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(SelfInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class));
public static Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(SelfInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class, int.class));

public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String file, int line) {
List<String> nameComponents = StringSupport.split(name, ':');
String methodName = JavaNameMangler.demangleMethodName(nameComponents.get(1));
CallType callType = nameComponents.get(0).equals("callFunctional") ? CallType.FUNCTIONAL : CallType.VARIABLE;
InvokeSite site = new SelfInvokeSite(type, methodName, callType);
InvokeSite site = new SelfInvokeSite(type, methodName, callType, file, line);

return InvokeSite.bootstrap(site, lookup);
}
16 changes: 8 additions & 8 deletions core/src/main/java/org/jruby/ir/targets/SuperInvokeSite.java
Original file line number Diff line number Diff line change
@@ -28,33 +28,33 @@ public abstract class SuperInvokeSite extends SelfInvokeSite {
protected final String superName;
protected final boolean[] splatMap;

public SuperInvokeSite(MethodType type, String superName, String splatmapString) {
super(type, superName, CallType.SUPER);
public SuperInvokeSite(MethodType type, String superName, String splatmapString, String file, int line) {
super(type, superName, CallType.SUPER, file, line);

this.superName = superName;
this.splatMap = IRRuntimeHelpers.decodeSplatmap(splatmapString);
}

public static final Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(SuperInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class));
public static final Handle BOOTSTRAP = new Handle(Opcodes.H_INVOKESTATIC, p(SuperInvokeSite.class), "bootstrap", sig(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, String.class, String.class, int.class));

public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String splatmapString) {
public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, String splatmapString, String file, int line) {
List<String> targetAndMethod = StringSupport.split(name, ':');
String superName = JavaNameMangler.demangleMethodName(targetAndMethod.get(1));

InvokeSite site;

switch (targetAndMethod.get(0)) {
case "invokeInstanceSuper":
site = new InstanceSuperInvokeSite(type, superName, splatmapString);
site = new InstanceSuperInvokeSite(type, superName, splatmapString, file, line);
break;
case "invokeClassSuper":
site = new ClassSuperInvokeSite(type, superName, splatmapString);
site = new ClassSuperInvokeSite(type, superName, splatmapString, file, line);
break;
case "invokeUnresolvedSuper":
site = new UnresolvedSuperInvokeSite(type, superName, splatmapString);
site = new UnresolvedSuperInvokeSite(type, superName, splatmapString, file, line);
break;
case "invokeZSuper":
site = new ZSuperInvokeSite(type, superName, splatmapString);
site = new ZSuperInvokeSite(type, superName, splatmapString, file, line);
break;
default:
throw new RuntimeException("invalid super call: " + name);
Original file line number Diff line number Diff line change
@@ -12,8 +12,8 @@
* Created by headius on 10/23/14.
*/
public class UnresolvedSuperInvokeSite extends SuperInvokeSite {
public UnresolvedSuperInvokeSite(MethodType type, String name, String splatmapString) {
super(type, name, splatmapString);
public UnresolvedSuperInvokeSite(MethodType type, String name, String splatmapString, String file, int line) {
super(type, name, splatmapString, file, line);
}

public IRubyObject invoke(ThreadContext context, IRubyObject caller, IRubyObject self, RubyClass definingModule, IRubyObject[] args, Block block) throws Throwable {
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/ir/targets/ZSuperInvokeSite.java
Original file line number Diff line number Diff line change
@@ -12,8 +12,8 @@
* Created by headius on 10/23/14.
*/
public class ZSuperInvokeSite extends SuperInvokeSite {
public ZSuperInvokeSite(MethodType type, String name, String splatmapString) {
super(type, name, splatmapString);
public ZSuperInvokeSite(MethodType type, String name, String splatmapString, String file, int line) {
super(type, name, splatmapString, file, line);
}

public IRubyObject invoke(ThreadContext context, IRubyObject caller, IRubyObject self, RubyClass definingModule, IRubyObject[] args, Block block) throws Throwable {

0 comments on commit 7f32928

Please sign in to comment.