diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 73822f4d96d..f1b8ab91304 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1928,7 +1928,22 @@ public class ExpressionCodegen extends JetVisitor implem Type functionType = typeMapper.mapType(samInterface.getFunctionTypeForSamInterface()); expression.accept(visitor, StackValue.none()).put(functionType, v); + Label ifNonNull = new Label(); + Label afterAll = new Label(); + + v.dup(); + v.ifnonnull(ifNonNull); + + // if null: pop function value and wrapper objects, put null + v.pop(); + v.pop2(); + v.aconst(null); + v.goTo(afterAll); + + v.mark(ifNonNull); v.invokespecial(className.getInternalName(), "", Type.getMethodDescriptor(Type.VOID_TYPE, functionType)); + + v.mark(afterAll); return StackValue.onStack(className.getAsmType()); } } diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.java b/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.java new file mode 100644 index 00000000000..b0391031c83 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.java @@ -0,0 +1,5 @@ +class JavaClass { + public static String run(Runnable r) { + return r == null ? "OK" : "FAIL"; + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.kt b/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.kt new file mode 100644 index 00000000000..d4f6cb328db --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.kt @@ -0,0 +1,4 @@ +fun box(): String { + val f: (() -> Unit)? = null + return JavaClass.run(f)!! +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 5379eb4a176..5bd761ff775 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -191,6 +191,11 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralInConstructor.kt"); } + @TestMetadata("nonLiteralNull.kt") + public void testNonLiteralNull() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralNull.kt"); + } + @TestMetadata("nonLiteralRunnable.kt") public void testNonLiteralRunnable() throws Exception { doTestWithJava("compiler/testData/codegen/boxWithJava/samAdapters/nonLiteralRunnable.kt");