From fb39217dc339ceced4064a8e97893c1c559ec9e5 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 29 Oct 2013 12:21:50 +0400 Subject: [PATCH] KT-4140 VerifyError: Property in class object #KT-4140 Fixed --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 13 ++++++++----- .../org/jetbrains/jet/codegen/StackValue.java | 4 ++++ .../testData/codegen/box/properties/kt4140.kt | 16 ++++++++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 5 +++++ 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/properties/kt4140.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 66ea495f31e..995c62fcfe0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1661,12 +1661,14 @@ public class ExpressionCodegen extends JetVisitor implem JetExpression r = getReceiverForSelector(expression); boolean isSuper = r instanceof JetSuperExpression; propertyDescriptor = accessiblePropertyDescriptor(propertyDescriptor); - StackValue iValue = + StackValue.Property iValue = intermediateValueForProperty(propertyDescriptor, directToField, isSuper ? (JetSuperExpression) r : null); if (directToField) { receiver = StackValue.receiverWithoutReceiverArgument(receiver); } - receiver.put(receiver.type, v); + + //pop receiver via put(VOID_TYPE) in case of access to backing field that moved to outer class!!! + receiver.put(!iValue.isPropertyWithBackingFieldInOuterClass() ? receiver.type : Type.VOID_TYPE, v); return iValue; } @@ -1770,7 +1772,7 @@ public class ExpressionCodegen extends JetVisitor implem } @NotNull - public StackValue intermediateValueForProperty( + public StackValue.Property intermediateValueForProperty( @NotNull PropertyDescriptor propertyDescriptor, boolean forceField, @Nullable JetSuperExpression superExpression @@ -1778,7 +1780,7 @@ public class ExpressionCodegen extends JetVisitor implem return intermediateValueForProperty(propertyDescriptor, forceField, superExpression, MethodKind.GENERAL); } - public StackValue.StackValueWithSimpleReceiver intermediateValueForProperty( + public StackValue.Property intermediateValueForProperty( @NotNull PropertyDescriptor propertyDescriptor, boolean forceField, @Nullable JetSuperExpression superExpression, @@ -1789,7 +1791,7 @@ public class ExpressionCodegen extends JetVisitor implem DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); boolean isBackingFieldInAnotherClass = AsmUtil.isPropertyWithBackingFieldInOuterClass(propertyDescriptor); - boolean isStatic = containingDeclaration instanceof NamespaceDescriptor || isBackingFieldInAnotherClass; + boolean isStatic = containingDeclaration instanceof NamespaceDescriptor; boolean isSuper = superExpression != null; boolean isInsideClass = isCallInsideSameClassAsDeclared(propertyDescriptor, context); boolean isInsideModule = isCallInsideSameModuleAsDeclared(propertyDescriptor, context); @@ -1813,6 +1815,7 @@ public class ExpressionCodegen extends JetVisitor implem if (!skipPropertyAccessors) { propertyDescriptor = (PropertyDescriptor) backingFieldContext.getAccessor(propertyDescriptor, true, delegateType); } + isStatic = true; } if (!skipPropertyAccessors) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index d5b1748358c..c616d2ec323 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -905,6 +905,10 @@ public abstract class StackValue { private String getPropertyName() { return name; } + + public boolean isPropertyWithBackingFieldInOuterClass() { + return descriptor instanceof AccessorForPropertyBackingFieldInOuterClass; + } } private static class Expression extends StackValue { diff --git a/compiler/testData/codegen/box/properties/kt4140.kt b/compiler/testData/codegen/box/properties/kt4140.kt new file mode 100644 index 00000000000..a7cc2e88e8d --- /dev/null +++ b/compiler/testData/codegen/box/properties/kt4140.kt @@ -0,0 +1,16 @@ +class TestObject() +{ + class object { + var prop: Int = 1 + get() = $prop++ + } +} + +fun box(): String { + + if (TestObject.prop != 1) return "fail 1" + + if (TestObject.prop != 2) return "fail 2" + + return "OK" +} \ 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 7b066a985d0..714cfbc3e8e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3905,6 +3905,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/properties/kt3556.kt"); } + @TestMetadata("kt4140.kt") + public void testKt4140() throws Exception { + doTest("compiler/testData/codegen/box/properties/kt4140.kt"); + } + @TestMetadata("kt613.kt") public void testKt613() throws Exception { doTest("compiler/testData/codegen/box/properties/kt613.kt");