Skip to content

Commit 99c1ca9

Browse files
committed
[GR-53405] Type mapping perf improvements.
PullRequest: graal/17480
2 parents 4e002c8 + 91344c9 commit 99c1ca9

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/EspressoForeignProxyGenerator.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ private void generateMethod(ClassWriter cw) {
727727
Label throwableHandler = new Label();
728728

729729
List<Klass> catchList = computeUniqueCatchList(exceptionTypes);
730-
if (catchList.size() > 0) {
730+
if (!catchList.isEmpty()) {
731731
for (Klass ex : catchList) {
732732
mv.visitTryCatchBlock(startBlock, endBlock, runtimeHandler,
733733
dotToSlash(ex.getNameAsString()));
@@ -738,11 +738,26 @@ private void generateMethod(ClassWriter cw) {
738738
}
739739
mv.visitLabel(startBlock);
740740

741+
String invokeName;
742+
String invokeSig;
743+
741744
if (returnType.isPrimitive()) {
742745
JavaKind kind = returnType.getJavaKind();
743-
mv.visitLdcInsn(Type.getType(kind.toBoxedJavaClass()));
746+
if (kind == JavaKind.Char) {
747+
mv.visitLdcInsn(Type.getType(kind.toBoxedJavaClass()));
748+
invokeName = "invokeMemberWithCast";
749+
invokeSig = "(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;" +
750+
"[Ljava/lang/Object;)Ljava/lang/Object;";
751+
} else {
752+
invokeName = "invokeMember";
753+
invokeSig = "(Ljava/lang/Object;Ljava/lang/String;" +
754+
"[Ljava/lang/Object;)Ljava/lang/Object;";
755+
}
744756
} else {
745757
mv.visitLdcInsn(Type.getType(returnType.getTypeAsString()));
758+
invokeName = "invokeMemberWithCast";
759+
invokeSig = "(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;" +
760+
"[Ljava/lang/Object;)Ljava/lang/Object;";
746761
}
747762

748763
mv.visitVarInsn(ALOAD, 0);
@@ -764,9 +779,8 @@ private void generateMethod(ClassWriter cw) {
764779
mv.visitTypeInsn(ANEWARRAY, JL_OBJECT);
765780
}
766781
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop",
767-
"invokeMemberWithCast",
768-
"(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;" +
769-
"[Ljava/lang/Object;)Ljava/lang/Object;",
782+
invokeName,
783+
invokeSig,
770784
false);
771785

772786
if (returnType == meta._void) {
@@ -839,27 +853,42 @@ private void codeWrapArgument(MethodVisitor mv, Klass type, int slot) {
839853
private void codeUnwrapReturnValue(MethodVisitor mv, Klass type) {
840854
if (type.isPrimitive()) {
841855
JavaKind kind = JavaKind.fromTypeString(type.getTypeAsString());
842-
String wrapperClassName = dotToSlash(kind.toBoxedJavaClass().getName());
843-
mv.visitTypeInsn(CHECKCAST, wrapperClassName);
844-
mv.visitMethodInsn(INVOKEVIRTUAL,
845-
wrapperClassName,
846-
kind.getUnwrapMethodName(), kind.getUnwrapMethodDesc(), false);
847856

848857
switch (kind) {
858+
case Char:
859+
String wrapperClassName = dotToSlash(kind.toBoxedJavaClass().getName());
860+
mv.visitTypeInsn(CHECKCAST, wrapperClassName);
861+
mv.visitMethodInsn(INVOKEVIRTUAL,
862+
wrapperClassName,
863+
kind.getUnwrapMethodName(), kind.getUnwrapMethodDesc(), false);
864+
mv.visitInsn(IRETURN);
865+
break;
849866
case Int:
867+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asInt", "(Ljava/lang/Object;)I", false);
868+
mv.visitInsn(IRETURN);
869+
break;
850870
case Boolean:
871+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asBoolean", "(Ljava/lang/Object;)Z", false);
872+
mv.visitInsn(IRETURN);
873+
break;
851874
case Byte:
875+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asByte", "(Ljava/lang/Object;)B", false);
876+
mv.visitInsn(IRETURN);
877+
break;
852878
case Short:
853-
case Char:
879+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asShort", "(Ljava/lang/Object;)S", false);
854880
mv.visitInsn(IRETURN);
855881
break;
856882
case Long:
883+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asLong", "(Ljava/lang/Object;)J", false);
857884
mv.visitInsn(LRETURN);
858885
break;
859886
case Float:
887+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asFloat", "(Ljava/lang/Object;)F", false);
860888
mv.visitInsn(FRETURN);
861889
break;
862890
case Double:
891+
mv.visitMethodInsn(INVOKESTATIC, "com/oracle/truffle/espresso/polyglot/Interop", "asDouble", "(Ljava/lang/Object;)D", false);
863892
mv.visitInsn(DRETURN);
864893
break;
865894
default:

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_com_oracle_truffle_espresso_polyglot_Interop.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,6 +2088,10 @@ StaticObject doCached(
20882088
@Cached LookupTypeConverterNode lookupTypeConverterNode,
20892089
@Cached LookupInternalTypeConverterNode lookupInternalTypeConverterNode,
20902090
@Cached BranchProfile exceptionProfile) {
2091+
if (StaticObject.isNull(targetClass)) {
2092+
exceptionProfile.enter();
2093+
throw meta.throwNullPointerException();
2094+
}
20912095
assert InteropLibrary.getUncached().isString(member);
20922096
String hostMember = getMeta().toHostString(member);
20932097
try {

0 commit comments

Comments
 (0)