From e3882e2dfbfcbd3a34d14cac1c07b2a7835ddfa9 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Fri, 25 Oct 2013 16:24:52 +0400 Subject: [PATCH] KT-4137: Verify error #KT-4137 Fixed --- .../jet/codegen/context/CodegenContext.java | 20 ++++++++++++++----- .../testData/codegen/box/closures/kt4137.kt | 13 ++++++++++++ .../BlackBoxCodegenTestGenerated.java | 5 +++++ 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/closures/kt4137.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java index ea2c494703a..34129231522 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java @@ -124,6 +124,10 @@ public abstract class CodegenContext { } public StackValue getOuterExpression(@Nullable StackValue prefix, boolean ignoreNoOuter) { + return getOuterExpression(prefix, ignoreNoOuter, true); + } + + private StackValue getOuterExpression(@Nullable StackValue prefix, boolean ignoreNoOuter, boolean captureThis) { if (outerExpression == null) { if (ignoreNoOuter) { return null; @@ -132,8 +136,9 @@ public abstract class CodegenContext { throw new UnsupportedOperationException(); } } - - closure.setCaptureThis(); + if (captureThis) { + closure.setCaptureThis(); + } return prefix != null ? StackValue.composed(prefix, outerExpression) : outerExpression; } @@ -286,6 +291,7 @@ public abstract class CodegenContext { public StackValue lookupInContext(DeclarationDescriptor d, @Nullable StackValue result, GenerationState state, boolean ignoreNoOuter) { MutableClosure top = closure; + StackValue myOuter = null; if (top != null) { EnclosedValueDescriptor answer = closure.getCaptureVariables().get(d); if (answer != null) { @@ -306,11 +312,15 @@ public abstract class CodegenContext { } } - StackValue outer = getOuterExpression(null, ignoreNoOuter); - result = result == null || outer == null ? outer : StackValue.composed(result, outer); + myOuter = getOuterExpression(null, ignoreNoOuter, false); + result = result == null || myOuter == null ? myOuter : StackValue.composed(result, myOuter); } - return parentContext != null ? parentContext.lookupInContext(d, result, state, ignoreNoOuter) : null; + StackValue resultValue = parentContext != null ? parentContext.lookupInContext(d, result, state, ignoreNoOuter) : null; + if (myOuter != null && resultValue != null) { + closure.setCaptureThis(); + } + return resultValue; } @NotNull diff --git a/compiler/testData/codegen/box/closures/kt4137.kt b/compiler/testData/codegen/box/closures/kt4137.kt new file mode 100644 index 00000000000..d438c28788f --- /dev/null +++ b/compiler/testData/codegen/box/closures/kt4137.kt @@ -0,0 +1,13 @@ +open class A(val s: Int) { + +} + +fun Int.foo(s: Int): Int { + return this + s +} + +open class B : A({ 1 foo 2} ()) + +fun box(): String { + return if (B().s == 3) "OK" else "Fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 873b55e1d9c..99cf81aa9b7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -1262,6 +1262,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/closures/kt3905.kt"); } + @TestMetadata("kt4137.kt") + public void testKt4137() throws Exception { + doTest("compiler/testData/codegen/box/closures/kt4137.kt"); + } + @TestMetadata("localFunctionInFunction.kt") public void testLocalFunctionInFunction() throws Exception { doTest("compiler/testData/codegen/box/closures/localFunctionInFunction.kt");