@@ -727,7 +727,7 @@ private void generateMethod(ClassWriter cw) {
727
727
Label throwableHandler = new Label ();
728
728
729
729
List <Klass > catchList = computeUniqueCatchList (exceptionTypes );
730
- if (catchList .size () > 0 ) {
730
+ if (! catchList .isEmpty () ) {
731
731
for (Klass ex : catchList ) {
732
732
mv .visitTryCatchBlock (startBlock , endBlock , runtimeHandler ,
733
733
dotToSlash (ex .getNameAsString ()));
@@ -738,11 +738,26 @@ private void generateMethod(ClassWriter cw) {
738
738
}
739
739
mv .visitLabel (startBlock );
740
740
741
+ String invokeName ;
742
+ String invokeSig ;
743
+
741
744
if (returnType .isPrimitive ()) {
742
745
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
+ }
744
756
} else {
745
757
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;" ;
746
761
}
747
762
748
763
mv .visitVarInsn (ALOAD , 0 );
@@ -764,9 +779,8 @@ private void generateMethod(ClassWriter cw) {
764
779
mv .visitTypeInsn (ANEWARRAY , JL_OBJECT );
765
780
}
766
781
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 ,
770
784
false );
771
785
772
786
if (returnType == meta ._void ) {
@@ -839,27 +853,42 @@ private void codeWrapArgument(MethodVisitor mv, Klass type, int slot) {
839
853
private void codeUnwrapReturnValue (MethodVisitor mv , Klass type ) {
840
854
if (type .isPrimitive ()) {
841
855
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 );
847
856
848
857
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 ;
849
866
case Int :
867
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asInt" , "(Ljava/lang/Object;)I" , false );
868
+ mv .visitInsn (IRETURN );
869
+ break ;
850
870
case Boolean :
871
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asBoolean" , "(Ljava/lang/Object;)Z" , false );
872
+ mv .visitInsn (IRETURN );
873
+ break ;
851
874
case Byte :
875
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asByte" , "(Ljava/lang/Object;)B" , false );
876
+ mv .visitInsn (IRETURN );
877
+ break ;
852
878
case Short :
853
- case Char :
879
+ mv . visitMethodInsn ( INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asShort" , "(Ljava/lang/Object;)S" , false );
854
880
mv .visitInsn (IRETURN );
855
881
break ;
856
882
case Long :
883
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asLong" , "(Ljava/lang/Object;)J" , false );
857
884
mv .visitInsn (LRETURN );
858
885
break ;
859
886
case Float :
887
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asFloat" , "(Ljava/lang/Object;)F" , false );
860
888
mv .visitInsn (FRETURN );
861
889
break ;
862
890
case Double :
891
+ mv .visitMethodInsn (INVOKESTATIC , "com/oracle/truffle/espresso/polyglot/Interop" , "asDouble" , "(Ljava/lang/Object;)D" , false );
863
892
mv .visitInsn (DRETURN );
864
893
break ;
865
894
default :
0 commit comments