KT-846: better (and correct) names for shared vars

This commit is contained in:
Alex Tkachman
2011-12-16 10:45:46 +02:00
committed by Nikolay Krasko
parent fb27805c68
commit a984b609bc
7 changed files with 31 additions and 10 deletions
@@ -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<VariableDescriptor> variableDescriptors = new ArrayList<VariableDescriptor>();
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++;
}
}
@@ -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++;
}
}
@@ -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);
@@ -0,0 +1,13 @@
fun <T> 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"
}
@@ -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"
@@ -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");
}
+2 -1
View File
@@ -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 <T> Array<T>.binarySearch(key: T, comparator: fun(T,T):Int) = Arrays.binarySearch(this, key, object: java.util.Comparator<T> {
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)