From 16afe74dc12922a9712223d4c0c802b84b32aa1e Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 29 Feb 2016 10:04:35 +0300 Subject: [PATCH] Fix for KT-11117: Android Kotlin DEX transformation error when I use arrayOf as an anonymous object property #KT-11117 Fixed --- .../kotlin/codegen/FunctionCodegen.java | 3 +++ .../checkLocalVariablesTable/kt11117.kt | 18 ++++++++++++++++++ .../testData/codegen/box/objects/kt11117.kt | 16 ++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../CheckLocalVariablesTableTestGenerated.java | 6 ++++++ 5 files changed, 49 insertions(+) create mode 100644 compiler/testData/checkLocalVariablesTable/kt11117.kt create mode 100644 compiler/testData/codegen/box/objects/kt11117.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 4ea91e8f02e..a3484f12399 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -795,6 +795,9 @@ public class FunctionCodegen { if (receiverParameter != null) { frameMap.enter(receiverParameter, state.getTypeMapper().mapType(receiverParameter)); } + else { + frameMap.enterTemp(parameter.getAsmType()); + } } else if (parameter.getKind() != JvmMethodParameterKind.VALUE) { frameMap.enterTemp(parameter.getAsmType()); diff --git a/compiler/testData/checkLocalVariablesTable/kt11117.kt b/compiler/testData/checkLocalVariablesTable/kt11117.kt new file mode 100644 index 00000000000..6a6351cdfaf --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/kt11117.kt @@ -0,0 +1,18 @@ +class A(val value: String) + +fun A.test(): String { + val o = object { + val z: String + init { + val x = value + "K" + z = x + } + } + return o.z +} + +// METHOD : Kt11117Kt$test$o$1.(LA;)V +// VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=2 +// VARIABLE : NAME=this TYPE=LKt11117Kt$test$o$1; INDEX=0 +// VARIABLE : NAME=$receiver TYPE=LA; INDEX=1 + diff --git a/compiler/testData/codegen/box/objects/kt11117.kt b/compiler/testData/codegen/box/objects/kt11117.kt new file mode 100644 index 00000000000..439f80a6723 --- /dev/null +++ b/compiler/testData/codegen/box/objects/kt11117.kt @@ -0,0 +1,16 @@ +class A(val value: String) + +fun A.test(): String { + val o = object { + val z: String + init { + val x = value + "K" + z = x + } + } + return o.z +} + +fun box(): String { + return A("O").test() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 63daee5266f..c964a886a6e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -5677,6 +5677,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt11117.kt") + public void testKt11117() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/kt11117.kt"); + doTest(fileName); + } + @TestMetadata("kt1136.kt") public void testKt1136() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/kt1136.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java index 2c57df9fe15..35c54ad1269 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java @@ -89,6 +89,12 @@ public class CheckLocalVariablesTableTestGenerated extends AbstractCheckLocalVar doTest(fileName); } + @TestMetadata("kt11117.kt") + public void testKt11117() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/checkLocalVariablesTable/kt11117.kt"); + doTest(fileName); + } + @TestMetadata("lambdaAsVar.kt") public void testLambdaAsVar() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/checkLocalVariablesTable/lambdaAsVar.kt");