From ace7bd9bc89995db8b378c93ea6b9fc3ed2ef6fb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 22 Apr 2013 12:13:58 +0400 Subject: [PATCH] Fix StackValue.coerce void to Object We can only put Unit.VALUE on stack if we're requested an instance of Object or Unit. In other cases (arbitrary objects / arrays) we put null instead --- .../org/jetbrains/jet/codegen/StackValue.java | 5 ++++- .../codegen/box/functions/coerceVoidToArray.kt | 16 ++++++++++++++++ .../codegen/box/functions/coerceVoidToObject.kt | 16 ++++++++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 10 ++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/functions/coerceVoidToArray.kt create mode 100644 compiler/testData/codegen/box/functions/coerceVoidToObject.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 20f812e59f9..1c7728aa3dd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -230,9 +230,12 @@ public abstract class StackValue { pop(fromType, v); } else if (fromType.getSort() == Type.VOID) { - if (toType.getSort() == Type.OBJECT) { + if (toType.equals(JET_UNIT_TYPE) || toType.equals(OBJECT_TYPE)) { putUnitInstance(v); } + else if (toType.getSort() == Type.OBJECT || toType.getSort() == Type.ARRAY) { + v.aconst(null); + } else { pushDefaultPrimitiveValueOnStack(toType, v); } diff --git a/compiler/testData/codegen/box/functions/coerceVoidToArray.kt b/compiler/testData/codegen/box/functions/coerceVoidToArray.kt new file mode 100644 index 00000000000..4bb9e7bbad5 --- /dev/null +++ b/compiler/testData/codegen/box/functions/coerceVoidToArray.kt @@ -0,0 +1,16 @@ +fun a(): IntArray? = null + +fun b() = throw Exception() + +fun foo(): IntArray = a() ?: b() + + +fun box(): String { + try { + foo() + } catch (e: Exception) { + return "OK" + } + + return "Fail" +} diff --git a/compiler/testData/codegen/box/functions/coerceVoidToObject.kt b/compiler/testData/codegen/box/functions/coerceVoidToObject.kt new file mode 100644 index 00000000000..94ac2c84b4f --- /dev/null +++ b/compiler/testData/codegen/box/functions/coerceVoidToObject.kt @@ -0,0 +1,16 @@ +fun a(): String? = null + +fun b() = throw Exception() + +fun foo(): String = a() ?: b() + + +fun box(): String { + try { + foo() + } catch (e: Exception) { + return "OK" + } + + return "Fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index a8b9f8d9c16..2bec24f153a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1897,6 +1897,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/functions"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("coerceVoidToArray.kt") + public void testCoerceVoidToArray() throws Exception { + doTest("compiler/testData/codegen/box/functions/coerceVoidToArray.kt"); + } + + @TestMetadata("coerceVoidToObject.kt") + public void testCoerceVoidToObject() throws Exception { + doTest("compiler/testData/codegen/box/functions/coerceVoidToObject.kt"); + } + @TestMetadata("defaultargs.kt") public void testDefaultargs() throws Exception { doTest("compiler/testData/codegen/box/functions/defaultargs.kt");