From bf16783fb7253e98991059b6f6702f32c8a90b1b Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 21 Jan 2016 15:04:58 +0300 Subject: [PATCH] Fix for KT-9591: Exception on inlining #KT-9591 Fixed --- .../kotlin/codegen/inline/InlineCodegenUtil.java | 4 +++- .../boxInline/anonymousObject/kt9591.1.kt | 16 ++++++++++++++++ .../boxInline/anonymousObject/kt9591.2.kt | 7 +++++++ .../BlackBoxInlineCodegenTestGenerated.java | 6 ++++++ ...leKotlinAgainstInlineKotlinTestGenerated.java | 6 ++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt create mode 100644 compiler/testData/codegen/boxInline/anonymousObject/kt9591.2.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index b992cee6f80..0a6dadc5fce 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -62,6 +62,7 @@ public class InlineCodegenUtil { public static final int API = Opcodes.ASM5; public static final String CAPTURED_FIELD_PREFIX = "$"; + public static final String NON_CAPTURED_FIELD_PREFIX = "$$"; public static final String THIS$0 = "this$0"; public static final String THIS = "this"; public static final String RECEIVER$0 = "receiver$0"; @@ -286,7 +287,8 @@ public class InlineCodegenUtil { public static boolean isCapturedFieldName(@NotNull String fieldName) { // TODO: improve this heuristic - return fieldName.startsWith(CAPTURED_FIELD_PREFIX) || + return fieldName.startsWith(CAPTURED_FIELD_PREFIX) && + !fieldName.startsWith(NON_CAPTURED_FIELD_PREFIX) || THIS$0.equals(fieldName) || RECEIVER$0.equals(fieldName); } diff --git a/compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt b/compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt new file mode 100644 index 00000000000..f03e39abaae --- /dev/null +++ b/compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt @@ -0,0 +1,16 @@ +import test.* + +public fun box(): String { + var z = "fail" + inlineFun { + val obj = object { + val _delegate by lazy { + z = "OK" + } + } + + obj._delegate + } + + return z; +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/anonymousObject/kt9591.2.kt b/compiler/testData/codegen/boxInline/anonymousObject/kt9591.2.kt new file mode 100644 index 00000000000..08ba53edfee --- /dev/null +++ b/compiler/testData/codegen/boxInline/anonymousObject/kt9591.2.kt @@ -0,0 +1,7 @@ +package test + + + +inline fun inlineFun(p: () -> Unit) { + p() +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java index ec0b302566f..98e54763255 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java @@ -139,6 +139,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTestMultiFileWithInlineCheck(fileName); } + @TestMetadata("kt9591.1.kt") + public void testKt9591() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt"); + doTestMultiFileWithInlineCheck(fileName); + } + @TestMetadata("kt9877.1.kt") public void testKt9877() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877.1.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java index f2fe8cd69db..ab6eecfdd2e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -139,6 +139,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doBoxTestWithInlineCheck(fileName); } + @TestMetadata("kt9591.1.kt") + public void testKt9591() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9591.1.kt"); + doBoxTestWithInlineCheck(fileName); + } + @TestMetadata("kt9877.1.kt") public void testKt9877() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt9877.1.kt");