Skip to content

Commit f044619

Browse files
Crema: un/rebasic for compiled linkTo calls
Signature polymorphic susbsitutions use stack kinds.
1 parent 8c87d18 commit f044619

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import static com.oracle.svm.espresso.classfile.Constants.ACC_SUPER;
4343
import static com.oracle.svm.espresso.classfile.Constants.JVM_ACC_WRITTEN_FLAGS;
4444
import static com.oracle.svm.espresso.shared.meta.SignaturePolymorphicIntrinsic.InvokeGeneric;
45+
import static com.oracle.svm.interpreter.Interpreter.unbasic;
4546
import static com.oracle.svm.interpreter.InterpreterStubSection.getCremaStubForVTableIndex;
4647

4748
import java.lang.invoke.MethodType;
@@ -122,6 +123,7 @@
122123
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaMethod;
123124
import com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaType;
124125
import com.oracle.svm.interpreter.metadata.InterpreterResolvedObjectType;
126+
import com.oracle.svm.interpreter.metadata.InterpreterUnresolvedSignature;
125127

126128
import jdk.graal.compiler.word.Word;
127129
import jdk.vm.ci.meta.ResolvedJavaField;
@@ -1312,12 +1314,15 @@ public Object invokeBasic(Target_java_lang_invoke_MemberName memberName, Object
13121314
@Override
13131315
public Object linkToVirtual(Object[] args) {
13141316
// This is AOT-compiled code calling MethodHandle.linkToVirtual
1317+
// See also PolymorphicSignatureWrapperMethod.buildGraph
13151318
Target_java_lang_invoke_MemberName mnTarget = (Target_java_lang_invoke_MemberName) args[args.length - 1];
13161319
InterpreterResolvedJavaMethod target = InterpreterResolvedJavaMethod.fromMemberName(mnTarget);
1317-
Object[] basicArgs = Arrays.copyOf(args, args.length - 1);
1320+
InterpreterUnresolvedSignature signature = target.getSignature();
1321+
Object[] basicArgs = unbasic(args, signature, true);
13181322
logIntrinsic("[from compiled] linkToVirtual ", target, basicArgs);
13191323
try {
1320-
return InterpreterToVM.dispatchInvocation(target, basicArgs, true, false, false, false, true);
1324+
Object result = InterpreterToVM.dispatchInvocation(target, basicArgs, true, false, false, false, true);
1325+
return Interpreter.rebasic(result, signature.getReturnKind());
13211326
} catch (SemanticJavaException e) {
13221327
throw uncheckedThrow(e.getCause());
13231328
}
@@ -1326,12 +1331,15 @@ public Object linkToVirtual(Object[] args) {
13261331
@Override
13271332
public Object linkToStatic(Object[] args) {
13281333
// This is AOT-compiled code calling MethodHandle.linkToStatic
1334+
// See also PolymorphicSignatureWrapperMethod.buildGraph
13291335
Target_java_lang_invoke_MemberName mnTarget = (Target_java_lang_invoke_MemberName) args[args.length - 1];
13301336
InterpreterResolvedJavaMethod target = InterpreterResolvedJavaMethod.fromMemberName(mnTarget);
1331-
Object[] basicArgs = Arrays.copyOf(args, args.length - 1);
1337+
InterpreterUnresolvedSignature signature = target.getSignature();
1338+
Object[] basicArgs = unbasic(args, signature, false);
13321339
logIntrinsic("[from compiled] linkToStatic ", target, basicArgs);
13331340
try {
1334-
return InterpreterToVM.dispatchInvocation(target, basicArgs, false, false, false, false, true);
1341+
Object result = InterpreterToVM.dispatchInvocation(target, basicArgs, false, false, false, false, true);
1342+
return Interpreter.rebasic(result, signature.getReturnKind());
13351343
} catch (SemanticJavaException e) {
13361344
throw uncheckedThrow(e.getCause());
13371345
}
@@ -1340,12 +1348,15 @@ public Object linkToStatic(Object[] args) {
13401348
@Override
13411349
public Object linkToSpecial(Object[] args) {
13421350
// This is AOT-compiled code calling MethodHandle.linkToSpecial
1351+
// See also PolymorphicSignatureWrapperMethod.buildGraph
13431352
Target_java_lang_invoke_MemberName mnTarget = (Target_java_lang_invoke_MemberName) args[args.length - 1];
13441353
InterpreterResolvedJavaMethod target = InterpreterResolvedJavaMethod.fromMemberName(mnTarget);
1345-
Object[] basicArgs = Arrays.copyOf(args, args.length - 1);
1354+
InterpreterUnresolvedSignature signature = target.getSignature();
1355+
Object[] basicArgs = unbasic(args, signature, true);
13461356
logIntrinsic("[from compiled] linkToSpecial ", target, basicArgs);
13471357
try {
1348-
return InterpreterToVM.dispatchInvocation(target, basicArgs, false, false, false, false, true);
1358+
Object result = InterpreterToVM.dispatchInvocation(target, basicArgs, false, false, false, false, true);
1359+
return Interpreter.rebasic(result, signature.getReturnKind());
13491360
} catch (SemanticJavaException e) {
13501361
throw uncheckedThrow(e.getCause());
13511362
}
@@ -1354,12 +1365,15 @@ public Object linkToSpecial(Object[] args) {
13541365
@Override
13551366
public Object linkToInterface(Object[] args) {
13561367
// This is AOT-compiled code calling MethodHandle.linkToInterface
1368+
// See also PolymorphicSignatureWrapperMethod.buildGraph
13571369
Target_java_lang_invoke_MemberName mnTarget = (Target_java_lang_invoke_MemberName) args[args.length - 1];
13581370
InterpreterResolvedJavaMethod target = InterpreterResolvedJavaMethod.fromMemberName(mnTarget);
1359-
Object[] basicArgs = Arrays.copyOf(args, args.length - 1);
1371+
InterpreterUnresolvedSignature signature = target.getSignature();
1372+
Object[] basicArgs = unbasic(args, signature, true);
13601373
logIntrinsic("[from compiled] linkToInterface ", target, basicArgs);
13611374
try {
1362-
return InterpreterToVM.dispatchInvocation(target, basicArgs, true, false, false, true, true);
1375+
Object result = InterpreterToVM.dispatchInvocation(target, basicArgs, true, false, false, true, true);
1376+
return Interpreter.rebasic(result, signature.getReturnKind());
13631377
} catch (SemanticJavaException e) {
13641378
throw uncheckedThrow(e.getCause());
13651379
}

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,10 @@ private static InterpreterResolvedJavaMethod getLinkToTarget(InterpreterFrame fr
573573
}
574574

575575
private static Object[] unbasic(InterpreterFrame frame, InterpreterUnresolvedSignature targetSig, boolean inclReceiver) {
576-
Object[] arguments = frame.getArguments();
576+
return unbasic(frame.getArguments(), targetSig, inclReceiver);
577+
}
578+
579+
static Object[] unbasic(Object[] arguments, InterpreterUnresolvedSignature targetSig, boolean inclReceiver) {
577580
int parameterCount = targetSig.getParameterCount(inclReceiver);
578581
Object[] res = new Object[parameterCount];
579582
int start = 0;
@@ -588,7 +591,7 @@ private static Object[] unbasic(InterpreterFrame frame, InterpreterUnresolvedSig
588591
}
589592

590593
// Transforms ints to sub-words
591-
public static Object unbasic(Object arg, JavaKind kind) {
594+
private static Object unbasic(Object arg, JavaKind kind) {
592595
return switch (kind) {
593596
case Boolean -> (int) arg != 0;
594597
case Byte -> (byte) (int) arg;
@@ -598,7 +601,7 @@ public static Object unbasic(Object arg, JavaKind kind) {
598601
};
599602
}
600603

601-
private static Object rebasic(Object value, JavaKind returnType) {
604+
static Object rebasic(Object value, JavaKind returnType) {
602605
// @formatter:off
603606
return switch (returnType) {
604607
case Boolean -> stackIntToBoolean((int) value);

0 commit comments

Comments
 (0)