From 0285b26e400ab08079a3a74b564a36be32730a45 Mon Sep 17 00:00:00 2001 From: Kevin Bierhoff Date: Wed, 16 Oct 2019 13:23:57 -0700 Subject: [PATCH] make FunctionCodegen skip method bodies we don't need, which avoids problems with inlining methods inside methods we don't need KT-33604 --- .../kotlin/codegen/FunctionCodegen.java | 4 +++- .../abi/CompileAgainstJvmAbiTestGenerated.java | 5 +++++ .../testData/compile/inlineCapture/app/app.kt | 7 +++++++ .../testData/compile/inlineCapture/lib/lib.kt | 10 ++++++++++ .../testData/content/class/signatures.txt | 16 ---------------- 5 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 plugins/jvm-abi-gen/testData/compile/inlineCapture/app/app.kt create mode 100644 plugins/jvm-abi-gen/testData/compile/inlineCapture/lib/lib.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 4d4f9d615e7..ed3430f07b9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -452,7 +452,9 @@ public class FunctionCodegen { boolean staticInCompanionObject ) { OwnerKind contextKind = methodContext.getContextKind(); - if (!state.getClassBuilderMode().generateBodies || isAbstractMethod(functionDescriptor, contextKind)) { + if (!state.getClassBuilderMode().generateBodies || + isAbstractMethod(functionDescriptor, contextKind) || + (state.getClassBuilderMode() == ClassBuilderMode.ABI && !InlineUtil.isInlineOrContainingInline(origin.getDescriptor()))) { generateLocalVariableTable( mv, jvmSignature, diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java index 51c37d66895..a530228482f 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java @@ -48,6 +48,11 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm runTest("plugins/jvm-abi-gen/testData/compile/inlineAnonymousObject/"); } + @TestMetadata("inlineCapture") + public void testInlineCapture() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/inlineCapture/"); + } + @TestMetadata("inlineReifiedFunction") public void testInlineReifiedFunction() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/inlineReifiedFunction/"); diff --git a/plugins/jvm-abi-gen/testData/compile/inlineCapture/app/app.kt b/plugins/jvm-abi-gen/testData/compile/inlineCapture/app/app.kt new file mode 100644 index 00000000000..ed1c0c023fa --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/inlineCapture/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.* + +fun runAppAndReturnOk(): String { + return inlineCapture("OK") +} \ No newline at end of file diff --git a/plugins/jvm-abi-gen/testData/compile/inlineCapture/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/inlineCapture/lib/lib.kt new file mode 100644 index 00000000000..05c9bb35146 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/inlineCapture/lib/lib.kt @@ -0,0 +1,10 @@ +package lib + +fun inlineCapture(s: String): String { + return with(StringBuilder()) { + val o = object { + override fun toString() = s + } + append(o) + }.toString() +} diff --git a/plugins/jvm-abi-gen/testData/content/class/signatures.txt b/plugins/jvm-abi-gen/testData/content/class/signatures.txt index d116004d13c..fc5e7a19b1d 100644 --- a/plugins/jvm-abi-gen/testData/content/class/signatures.txt +++ b/plugins/jvm-abi-gen/testData/content/class/signatures.txt @@ -29,24 +29,8 @@ final class test/Class$NestedInnerClass { public method (): void } @kotlin.Metadata -final class test/Class$classPublicMethod$publicMethodLambda$1 { - public final static field INSTANCE: test.Class$classPublicMethod$publicMethodLambda$1 - inner class test/Class$classPublicMethod$publicMethodLambda$1 - method (): void - public final method invoke(p0: int): int - public synthetic method invoke(p0: java.lang.Object): java.lang.Object -} -@kotlin.Metadata -public final class test/Class$classPublicMethod$publicMethodLocalClass { - inner class test/Class$classPublicMethod$publicMethodLocalClass - public method (): void - public final method getX(): int -} -@kotlin.Metadata public final class test/Class { inner class test/Class$NestedInnerClass - inner class test/Class$classPublicMethod$publicMethodLambda$1 - inner class test/Class$classPublicMethod$publicMethodLocalClass public method (): void public final method classPublicMethod(): void }