From a984b609bc9b89f79c3f3e6ce734d28d5ece361e Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Fri, 16 Dec 2011 10:45:46 +0200 Subject: [PATCH] KT-846: better (and correct) names for shared vars --- .../org/jetbrains/jet/codegen/ClosureCodegen.java | 7 ++++++- .../jet/codegen/ImplementationBodyCodegen.java | 2 +- .../jet/codegen/ObjectOrClosureCodegen.java | 2 +- .../testData/codegen/extensionFunctions/shared.kt | 13 +++++++++++++ compiler/testData/codegen/regressions/kt344.jet | 9 +++------ .../jet/codegen/ExtensionFunctionsTest.java | 5 +++++ stdlib/ktSrc/Arrays.kt | 3 ++- 7 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/extensionFunctions/shared.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 6ace88a728b..feced45f382 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -23,6 +23,7 @@ import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.Method; import org.objectweb.asm.signature.SignatureWriter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -213,9 +214,12 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { int argCount = captureThis ? 1 : 0; argCount += (captureReceiver != null ? 1 : 0); + ArrayList variableDescriptors = new ArrayList(); + for (DeclarationDescriptor descriptor : closure.keySet()) { if(descriptor instanceof VariableDescriptor && !(descriptor instanceof PropertyDescriptor)) { argCount++; + variableDescriptors.add((VariableDescriptor) descriptor); } else if(descriptor instanceof FunctionDescriptor) { assert captureReceiver != null; @@ -271,7 +275,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { k++; } else { - fieldName = "$" + (i-k); + VariableDescriptor removed = variableDescriptors.remove(0); + fieldName = "$" + removed.getName(); i++; } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 2d36920442d..77c65e1c4d4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -494,7 +494,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(k, StackValue.refType(sharedVarType)); k += StackValue.refType(sharedVarType).getSize(); - iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$" + (l+1), sharedVarType.getDescriptor()); + iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$" + varDescr.getName(), sharedVarType.getDescriptor()); l++; } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java index c1982e6167d..4259f9ee41e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java @@ -45,7 +45,7 @@ public class ObjectOrClosureCodegen { final Type type = sharedVarType != null ? sharedVarType : localType; StackValue outerValue = StackValue.local(idx, type); - final String fieldName = "$" + (closure.size() + 1); // + "$" + vd.getName(); + final String fieldName = "$" + vd.getName(); StackValue innerValue = sharedVarType != null ? StackValue.fieldForSharedVar(localType, name, fieldName) : StackValue.field(type, name, fieldName, false); cv.newField(null, Opcodes.ACC_PUBLIC, fieldName, type.getDescriptor(), null, null); diff --git a/compiler/testData/codegen/extensionFunctions/shared.kt b/compiler/testData/codegen/extensionFunctions/shared.kt new file mode 100644 index 00000000000..216ba549ba3 --- /dev/null +++ b/compiler/testData/codegen/extensionFunctions/shared.kt @@ -0,0 +1,13 @@ +fun T.mustBe(t : T) { + assert("$this must be $t") {this == t} +} + +inline fun assert(message : String, condition : fun() : Boolean) { + if (!condition()) + throw AssertionError(message) +} + +fun box() : String { + "lala" mustBe "lala" + return "OK" +} diff --git a/compiler/testData/codegen/regressions/kt344.jet b/compiler/testData/codegen/regressions/kt344.jet index db228754a3e..39a8f550b74 100644 --- a/compiler/testData/codegen/regressions/kt344.jet +++ b/compiler/testData/codegen/regressions/kt344.jet @@ -1,4 +1,3 @@ -/* fun s0() : Boolean { val y = "222" val foo = { @@ -127,7 +126,7 @@ fun t8() : Boolean { return x == 30.sht } -fun t9(x: Int) : Boolean { +fun t9(var x: Int) : Boolean { while(x < 100) { x++ } @@ -146,7 +145,7 @@ fun t10() : Boolean { return y == 2 } -fun t11(x: Int) : Int { +fun t11(var x: Int) : Int { val foo = { x = x + 1 val bar = { @@ -160,7 +159,7 @@ fun t11(x: Int) : Int { } return x } -*/ + fun t12(x: Int) : Int { var y = x val runnable = object : Runnable { @@ -175,7 +174,6 @@ fun t12(x: Int) : Int { } fun box(): String { -/* if (!s0()) return "s0 fail" if (!s1()) return "s1 fail" if (!t1()) return "t1 fail" @@ -189,7 +187,6 @@ fun box(): String { if (!t9(0)) return "t9 fail" if (!t10()) return "t10 fail" if (t11(1) != 104) return "t11 fail" -*/ if (t12(0) != 100) return "t12 fail" return "OK" diff --git a/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java b/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java index fc63c1de423..e26bd1b88ae 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java @@ -34,6 +34,11 @@ public class ExtensionFunctionsTest extends CodegenTestCase { blackBoxFile("extensionFunctions/virtual.jet"); } + public void testShared() throws Exception { + blackBoxFile("extensionFunctions/shared.kt"); + System.out.println(generateToText()); + } + public void testKt475() throws Exception { blackBoxFile("regressions/kt475.jet"); } diff --git a/stdlib/ktSrc/Arrays.kt b/stdlib/ktSrc/Arrays.kt index 0c55b8f2406..68f2234c716 100644 --- a/stdlib/ktSrc/Arrays.kt +++ b/stdlib/ktSrc/Arrays.kt @@ -40,12 +40,13 @@ inline fun FloatArray.binarySearch(fromIndex: Int, toIndex: Int, key: Float) = inline fun DoubleArray.binarySearch(fromIndex: Int, toIndex: Int, key: Double) = Arrays.binarySearch(this, fromIndex, toIndex, key) inline fun CharArray.binarySearch(fromIndex: Int, toIndex: Int, key: Char) = Arrays.binarySearch(this, fromIndex, toIndex, key) +/* inline fun Array.binarySearch(key: T, comparator: fun(T,T):Int) = Arrays.binarySearch(this, key, object: java.util.Comparator { override fun compare(a: T, b: T) = comparator(a, b) override fun equals(obj: Any?) = obj.identityEquals(this) }) - +*/ inline fun BooleanArray.fill(value: Boolean) = Arrays.fill(this, value) inline fun ByteArray.fill(value: Byte) = Arrays.fill(this, value) inline fun ShortArray.fill(value: Short) = Arrays.fill(this, value)