From 61674fb3d976a003dc3d6d28b599212331957865 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 14 Oct 2014 19:42:25 +0400 Subject: [PATCH] Don't put outer instance twice for anonymous object extending inner #KT-5343 In Progress --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 6 +++++- .../localExtendsInnerAndReferencesOuterMember.kt | 14 ++++++++++++++ .../objectExtendsInnerAndReferencesOuterMember.kt | 12 ++++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/localClasses/localExtendsInnerAndReferencesOuterMember.kt create mode 100644 compiler/testData/codegen/box/objects/objectExtendsInnerAndReferencesOuterMember.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 75dc650b73d..3a68e09db25 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1413,7 +1413,11 @@ public class ExpressionCodegen extends JetVisitor implem ResolvedCall superCall = closure.getSuperCall(); if (superCall != null) { - pushClosureOnStack(superCall.getResultingDescriptor().getContainingDeclaration(), putThis, callGenerator); + pushClosureOnStack( + superCall.getResultingDescriptor().getContainingDeclaration(), + putThis && closure.getCaptureThis() == null, + callGenerator + ); } } diff --git a/compiler/testData/codegen/box/localClasses/localExtendsInnerAndReferencesOuterMember.kt b/compiler/testData/codegen/box/localClasses/localExtendsInnerAndReferencesOuterMember.kt new file mode 100644 index 00000000000..f5520406363 --- /dev/null +++ b/compiler/testData/codegen/box/localClasses/localExtendsInnerAndReferencesOuterMember.kt @@ -0,0 +1,14 @@ +class A { + fun box(): String { + class Local : Inner() { + val u = foo() + } + val u = Local().u + return if (u == 42) "OK" else "Fail $u" + } + + open inner class Inner + fun foo() = 42 +} + +fun box() = A().box() diff --git a/compiler/testData/codegen/box/objects/objectExtendsInnerAndReferencesOuterMember.kt b/compiler/testData/codegen/box/objects/objectExtendsInnerAndReferencesOuterMember.kt new file mode 100644 index 00000000000..def3f9f7616 --- /dev/null +++ b/compiler/testData/codegen/box/objects/objectExtendsInnerAndReferencesOuterMember.kt @@ -0,0 +1,12 @@ +class A { + val x: Any get() { + return object : Inner() { + override fun toString() = foo() + } + } + + open inner class Inner + fun foo() = "OK" +} + +fun box(): String = A().x.toString() diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 61fd9a3d4f6..e208aa26d70 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -4251,6 +4251,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("localExtendsInnerAndReferencesOuterMember.kt") + public void testLocalExtendsInnerAndReferencesOuterMember() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/localClasses/localExtendsInnerAndReferencesOuterMember.kt"); + doTest(fileName); + } + @TestMetadata("noclosure.kt") public void testNoclosure() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/localClasses/noclosure.kt"); @@ -5005,6 +5011,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("objectExtendsInnerAndReferencesOuterMember.kt") + public void testObjectExtendsInnerAndReferencesOuterMember() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/objectExtendsInnerAndReferencesOuterMember.kt"); + doTest(fileName); + } + @TestMetadata("objectInLocalAnonymousObject.kt") public void testObjectInLocalAnonymousObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/objectInLocalAnonymousObject.kt");