Skip to content

Commit daeee99

Browse files
committed
Further indy optimizations for sub calls.
1 parent 3151ce1 commit daeee99

File tree

1 file changed

+47
-11
lines changed

1 file changed

+47
-11
lines changed

src/vm/jvm/runtime/org/perl6/nqp/runtime/IndyBootstrap.java

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -231,16 +231,52 @@ public static void subcallstaticResolve_noa(Lookup caller, MutableCallSite cs, S
231231
* it's a compiler stub, though. */
232232
if (!cr.isCompilerStub && !shared) {
233233
try {
234-
MethodType invType = MethodType.methodType(void.class,
235-
MethodHandle.class, String.class, CallSiteDescriptor.class,
236-
CodeRef.class, ThreadContext.class, Object[].class);
237-
MethodHandle inv = caller.findStatic(IndyBootstrap.class, "substaticInvoker", invType);
238-
cs.setTarget(MethodHandles
239-
.dropArguments(
240-
MethodHandles.insertArguments(inv, 0, cr.staticInfo.mh, name, csdOrig, cr),
241-
0, String.class, int.class)
242-
.asVarargsCollector(Object[].class)
243-
.asType(cs.getTarget().type()));
234+
boolean updated = false;
235+
switch (cr.staticInfo.argsExpectation) {
236+
case ArgsExpectation.NO_ARGS:
237+
if (csd.argFlags.length == 0) {
238+
cs.setTarget(MethodHandles
239+
.dropArguments(
240+
MethodHandles.insertArguments(cr.staticInfo.mh, 1, cr, csdOrig),
241+
0, String.class, int.class)
242+
.asType(cs.getTarget().type()));
243+
updated = true;
244+
}
245+
break;
246+
case ArgsExpectation.OBJ:
247+
if (csd.argFlags.length == 1 && csd.argFlags[0] == CallSiteDescriptor.ARG_OBJ) {
248+
cs.setTarget(MethodHandles
249+
.dropArguments(
250+
MethodHandles.insertArguments(cr.staticInfo.mh, 1, cr, csdOrig),
251+
0, String.class, int.class)
252+
.asType(cs.getTarget().type()));
253+
updated = true;
254+
}
255+
break;
256+
case ArgsExpectation.OBJ_OBJ:
257+
if (csd.argFlags.length == 2 && csd.argFlags[0] == CallSiteDescriptor.ARG_OBJ &&
258+
csd.argFlags[1] == CallSiteDescriptor.ARG_OBJ) {
259+
cs.setTarget(MethodHandles
260+
.dropArguments(
261+
MethodHandles.insertArguments(cr.staticInfo.mh, 1, cr, csdOrig),
262+
0, String.class, int.class)
263+
.asType(cs.getTarget().type()));
264+
updated = true;
265+
}
266+
break;
267+
}
268+
if (!updated) {
269+
MethodType invType = MethodType.methodType(void.class,
270+
CallSiteDescriptor.class, CodeRef.class, ThreadContext.class,
271+
Object[].class);
272+
MethodHandle inv = caller.findStatic(IndyBootstrap.class, "substaticInvoker", invType);
273+
cs.setTarget(MethodHandles
274+
.dropArguments(
275+
MethodHandles.insertArguments(inv, 0, csdOrig, cr),
276+
0, String.class, int.class)
277+
.asVarargsCollector(Object[].class)
278+
.asType(cs.getTarget().type()));
279+
}
244280
}
245281
catch (Throwable t) {
246282
throw ExceptionHandling.dieInternal(tc, t);
@@ -259,7 +295,7 @@ public static void subcallstaticResolve_noa(Lookup caller, MutableCallSite cs, S
259295
}
260296
}
261297

262-
public static void substaticInvoker(MethodHandle mh, String name, CallSiteDescriptor csd, CodeRef cr, ThreadContext tc, Object[] args) throws Throwable {
298+
public static void substaticInvoker(CallSiteDescriptor csd, CodeRef cr, ThreadContext tc, Object[] args) throws Throwable {
263299
ArgsExpectation.invokeByExpectation(tc, cr, csd, args);
264300
}
265301

0 commit comments

Comments
 (0)