From 90038fda02b8e80135b86406d68d598e44c72020 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 22 Jun 2011 21:26:01 +0400 Subject: [PATCH] Closure and boxing return value --- idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java | 5 ++++- idea/src/org/jetbrains/jet/codegen/StackValue.java | 3 +++ idea/testData/codegen/classes/simplestClosureAndBoxing.jet | 7 +++++++ idea/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java | 4 ++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 idea/testData/codegen/classes/simplestClosureAndBoxing.jet diff --git a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 26b020119ff..6b3aef3db84 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -104,6 +104,7 @@ public class ClosureCodegen { private void generateBridge(String className, FunctionDescriptor funDescriptor, ClassVisitor cv) { final Method bridge = erasedInvokeSignature(funDescriptor); + final Method delegate = invokeSignature(funDescriptor); final MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "invoke", bridge.getDescriptor(), typeMapper.genericSignature(funDescriptor), new String[0]); mv.visitCode(); @@ -120,7 +121,9 @@ public class ClosureCodegen { count++; } - iv.invokespecial(className, "invoke", invokeSignature(funDescriptor).getDescriptor()); + iv.invokespecial(className, "invoke", delegate.getDescriptor()); + StackValue.onStack(delegate.getReturnType()).put(JetTypeMapper.TYPE_OBJECT, iv); + iv.areturn(JetTypeMapper.TYPE_OBJECT); mv.visitMaxs(0, 0); diff --git a/idea/src/org/jetbrains/jet/codegen/StackValue.java b/idea/src/org/jetbrains/jet/codegen/StackValue.java index 35132cddfaf..8c99986ed4c 100644 --- a/idea/src/org/jetbrains/jet/codegen/StackValue.java +++ b/idea/src/org/jetbrains/jet/codegen/StackValue.java @@ -140,6 +140,9 @@ public abstract class StackValue { box(this.type, type, v); } else if (this.type.getSort() == Type.OBJECT && type.getSort() <= Type.DOUBLE) { + if (this.type.equals(JetTypeMapper.TYPE_OBJECT)) { + v.checkcast(Type.getObjectType("java/lang/Number")); + } unbox(type, v); } else { diff --git a/idea/testData/codegen/classes/simplestClosureAndBoxing.jet b/idea/testData/codegen/classes/simplestClosureAndBoxing.jet new file mode 100644 index 00000000000..af60d4fed5c --- /dev/null +++ b/idea/testData/codegen/classes/simplestClosureAndBoxing.jet @@ -0,0 +1,7 @@ +fun box() : String { + return if (int_invoker( { 7 } ) == 7) "OK" else "fail" +} + +fun int_invoker(gen : {() : Int}) : Int { + return gen() +} diff --git a/idea/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java b/idea/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java index be84866f774..bebdd171d41 100644 --- a/idea/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/ClosuresGenTest.java @@ -7,4 +7,8 @@ public class ClosuresGenTest extends CodegenTestCase { public void testSimplestClosure() throws Exception { blackBoxFile("classes/simplestClosure.jet"); } + + public void testSimplestClosureAndBoxing() throws Exception { + blackBoxFile("classes/simplestClosureAndBoxing.jet"); + } }