From 094de9fb5eebfa9fd68e773f09e9715ced9f38d1 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Fri, 22 Nov 2019 16:26:06 +0300 Subject: [PATCH] IR: Do not capture variables from method calls in ClosureAnnotator To call a method of a class, you never need to supply any values of local variables (they would always be provided to the constructor). --- .../backend/common/lower/ClosureAnnotator.kt | 4 ++++ .../codegen/box/objects/objectLiteralInClass.kt | 17 +++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 8 files changed, 51 insertions(+) create mode 100644 compiler/testData/codegen/box/objects/objectLiteralInClass.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt index 80f5f28ab3f..b60b2840bbd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt @@ -189,6 +189,10 @@ class ClosureAnnotator(irFile: IrFile) { private fun processMemberAccess(declaration: IrDeclaration) { if (declaration.isLocal) { + if (declaration is IrSimpleFunction && declaration.parent is IrClass) { + return + } + val builder = closureBuilders[declaration] builder?.let { closuresStack.peek()?.include(builder) diff --git a/compiler/testData/codegen/box/objects/objectLiteralInClass.kt b/compiler/testData/codegen/box/objects/objectLiteralInClass.kt new file mode 100644 index 00000000000..28730191e6e --- /dev/null +++ b/compiler/testData/codegen/box/objects/objectLiteralInClass.kt @@ -0,0 +1,17 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +class C { + + val s = "OK" + + private val localObject = object { + fun getS(): String { + return s + } + } + + fun ok(): String = + 33.let { localObject.getS() } +} + +fun box() = C().ok() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a40fcc926f5..6f5c0c689fe 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -17146,6 +17146,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 8b6e950d49c..da486c67a36 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17146,6 +17146,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 08281bc0218..c6596c00216 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -15996,6 +15996,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 992b7b10609..cc646d3867d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -15996,6 +15996,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 01905aeb07b..0363bfa2cb1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -13126,6 +13126,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index b1a1f3387e1..6120f5044a7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -14266,6 +14266,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); } + @TestMetadata("objectLiteralInClass.kt") + public void testObjectLiteralInClass() throws Exception { + runTest("compiler/testData/codegen/box/objects/objectLiteralInClass.kt"); + } + @TestMetadata("objectLiteralInClosure.kt") public void testObjectLiteralInClosure() throws Exception { runTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt");