From 4b4d84d4854490e96976835c2924b689f0c072de Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 28 Jan 2012 00:55:47 +0300 Subject: [PATCH 1/3] KT-1168 don't use direct fields from non-final properties --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 4 ++-- compiler/testData/codegen/regressions/kt1168.kt | 15 +++++++++++++++ .../org/jetbrains/jet/codegen/ClassGenTest.java | 4 ---- .../jetbrains/jet/codegen/PropertyGenTest.java | 8 ++++++++ 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt1168.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index fe741a40153..cac967c2cc0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1118,7 +1118,7 @@ public class ExpressionCodegen extends JetVisitor { } else { //noinspection ConstantConditions - if (isInsideClass && (propertyDescriptor.getGetter() == null || propertyDescriptor.getGetter().isDefault())) { + if (isInsideClass && (propertyDescriptor.getGetter() == null || propertyDescriptor.getGetter().isDefault() && propertyDescriptor.getGetter().getModality() == Modality.FINAL)) { getter = null; } else { @@ -1148,7 +1148,7 @@ public class ExpressionCodegen extends JetVisitor { } //noinspection ConstantConditions - if (isInsideClass && (propertyDescriptor.getSetter() == null || propertyDescriptor.getSetter().isDefault())) { + if (isInsideClass && (propertyDescriptor.getSetter() == null || propertyDescriptor.getSetter().isDefault() && propertyDescriptor.getSetter().getModality() == Modality.FINAL)) { setter = null; } else { diff --git a/compiler/testData/codegen/regressions/kt1168.kt b/compiler/testData/codegen/regressions/kt1168.kt new file mode 100644 index 00000000000..fc931784687 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1168.kt @@ -0,0 +1,15 @@ +public abstract class BaseClass() { + protected abstract val kind : String + + protected open val kind2 : String = " kind1" + + fun debug() = kind + kind2 +} + +public class Subclass : BaseClass() { + override val kind : String = "Physical" + + override val kind2 : String = " kind2" +} + +fun box():String = if(Subclass().debug() == "Physical kind2") "OK" else "fail" diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index bec68856d79..b858f6ca318 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -265,8 +265,4 @@ public class ClassGenTest extends CodegenTestCase { public void testKt471() throws Exception { blackBoxFile("regressions/kt471.kt"); } - - public void testKt1165() throws Exception { - blackBoxFile("regressions/kt1165.kt"); - } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index 36c65f6982d..65144a3f477 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -164,4 +164,12 @@ public class PropertyGenTest extends CodegenTestCase { method.setAccessible(true); assertEquals(method.invoke(null), "1.0"); } + + public void testKt1165() throws Exception { + blackBoxFile("regressions/kt1165.kt"); + } + + public void testKt1168() throws Exception { + blackBoxFile("regressions/kt1168.kt"); + } } From e7a1b2ea7220fe59095d732c8b8595b3802b2a16 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 28 Jan 2012 02:47:04 +0300 Subject: [PATCH 2/3] fix for broken tests --- .../jetbrains/jet/codegen/ImplementationBodyCodegen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 87b337ef923..a7f0f9e682a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -308,7 +308,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { //noinspection AssignmentToForLoopParameter reg += argType.getSize(); } - if(original.getVisibility() == Visibility.PRIVATE) + if(original.getVisibility() == Visibility.PRIVATE && original.getModality() == Modality.FINAL) iv.putfield(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION), original.getName(), originalMethod.getArgumentTypes()[0].getDescriptor()); else iv.invokespecial(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION), originalMethod.getName(), originalMethod.getDescriptor()); @@ -879,7 +879,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if(propertyDescriptor.getOutType().isNullable()) type = JetTypeMapper.boxType(type); codegen.gen(initializer, type); - codegen.intermediateValueForProperty(propertyDescriptor, false, null).store(iv); + // @todo write directly to the field. Fix test excloset.jet::test6 + String owner = typeMapper.getOwner(propertyDescriptor, OwnerKind.IMPLEMENTATION); + StackValue.property(propertyDescriptor.getName(), owner, typeMapper.mapType(propertyDescriptor.getOutType()), false, false, false, null, null).store(iv); } } From b3279a6ad5ca0ef9500492278028800b6d1fb403 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 28 Jan 2012 02:53:06 +0300 Subject: [PATCH 3/3] test for KT-1170 --- compiler/testData/codegen/regressions/kt1170.kt | 16 ++++++++++++++++ .../jetbrains/jet/codegen/PropertyGenTest.java | 4 ++++ 2 files changed, 20 insertions(+) create mode 100644 compiler/testData/codegen/regressions/kt1170.kt diff --git a/compiler/testData/codegen/regressions/kt1170.kt b/compiler/testData/codegen/regressions/kt1170.kt new file mode 100644 index 00000000000..aa003bd2a2d --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1170.kt @@ -0,0 +1,16 @@ +public abstract class BaseClass() { + protected open val kind : String = "BaseClass " + + fun getKindValue() : String { + return kind + } +} + +public class Subclass : BaseClass() { + override val kind : String = "Subclass " +} + +fun box(): String { + val r = Subclass().getKindValue() + Subclass().kind + return if(r == "Subclass Subclass ") "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index 65144a3f477..9cd14366834 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -172,4 +172,8 @@ public class PropertyGenTest extends CodegenTestCase { public void testKt1168() throws Exception { blackBoxFile("regressions/kt1168.kt"); } + + public void testKt1170() throws Exception { + blackBoxFile("regressions/kt1170.kt"); + } }