fix for several (unlikely all) closely related problems with handling of byte/short/char on Delvik #KT-2251 fixed

This commit is contained in:
Alex Tkachman
2012-09-18 16:50:06 +03:00
parent 75a504e7b2
commit ae93018546
6 changed files with 40 additions and 38 deletions
@@ -535,4 +535,33 @@ public class CodegenUtil {
} }
} }
} }
public static Type genIncrement(Type expectedType, int myDelta, InstructionAdapter v) {
if (expectedType == Type.LONG_TYPE) {
//noinspection UnnecessaryBoxing
v.lconst(myDelta);
}
else if (expectedType == Type.FLOAT_TYPE) {
//noinspection UnnecessaryBoxing
v.fconst(myDelta);
}
else if (expectedType == Type.DOUBLE_TYPE) {
//noinspection UnnecessaryBoxing
v.dconst(myDelta);
}
else {
v.iconst(myDelta);
expectedType = Type.INT_TYPE;
}
v.add(expectedType);
return expectedType;
}
public static Type genNegate(Type expectedType, InstructionAdapter v) {
if (expectedType == Type.BYTE_TYPE || expectedType == Type.SHORT_TYPE || expectedType == Type.CHAR_TYPE) {
expectedType = Type.INT_TYPE;
}
v.neg(expectedType);
return expectedType;
}
} }
@@ -2683,23 +2683,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
StackValue value = genQualified(receiver, operand); StackValue value = genQualified(receiver, operand);
value.dupReceiver(v); value.dupReceiver(v);
value.put(asmType, v); value.put(asmType, v);
if (asmType == Type.LONG_TYPE) { asmType = genIncrement(asmType, increment, v);
//noinspection UnnecessaryBoxing
v.lconst(increment);
}
else if (asmType == Type.FLOAT_TYPE) {
//noinspection UnnecessaryBoxing
v.fconst(increment);
}
else if (asmType == Type.DOUBLE_TYPE) {
//noinspection UnnecessaryBoxing
v.dconst(increment);
}
else {
v.iconst(increment);
asmType = Type.INT_TYPE;
}
v.add(asmType);
value.store(asmType, v); value.store(asmType, v);
} }
@@ -252,7 +252,7 @@ public abstract class StackValue {
coerce(topOfStackType, this.type, v); coerce(topOfStackType, this.type, v);
} }
protected static void coerce(Type fromType, Type toType, InstructionAdapter v) { public static void coerce(Type fromType, Type toType, InstructionAdapter v) {
if (toType.equals(fromType)) return; if (toType.equals(fromType)) return;
if (toType.getSort() == Type.VOID && fromType.getSort() != Type.VOID) { if (toType.getSort() == Type.VOID && fromType.getSort() != Type.VOID) {
@@ -70,30 +70,13 @@ public class Increment implements IntrinsicMethod {
value.dupReceiver(v); value.dupReceiver(v);
value.put(expectedType, v); value.put(expectedType, v);
plusMinus(v, expectedType); value.store(CodegenUtil.genIncrement(expectedType, myDelta, v), v);
value.store(expectedType, v);
value.put(expectedType, v); value.put(expectedType, v);
} }
else { else {
receiver.put(expectedType, v); receiver.put(expectedType, v);
plusMinus(v, expectedType); StackValue.coerce(CodegenUtil.genIncrement(expectedType, myDelta, v), expectedType, v);
} }
return StackValue.onStack(expectedType); return StackValue.onStack(expectedType);
} }
private void plusMinus(InstructionAdapter v, Type expectedType) {
if (expectedType == Type.LONG_TYPE) {
v.lconst(myDelta);
}
else if (expectedType == Type.FLOAT_TYPE) {
v.fconst(myDelta);
}
else if (expectedType == Type.DOUBLE_TYPE) {
v.dconst(myDelta);
}
else {
v.iconst(myDelta);
}
v.add(expectedType);
}
} }
@@ -52,7 +52,7 @@ public class UnaryMinus implements IntrinsicMethod {
else { else {
receiver.put(expectedType, v); receiver.put(expectedType, v);
} }
v.neg(expectedType); StackValue.coerce(CodegenUtil.genNegate(expectedType, v), expectedType, v);
return StackValue.onStack(expectedType); return StackValue.onStack(expectedType);
} }
} }
@@ -1,4 +1,10 @@
class A(var b: Byte) {
fun c(d: Short) = (b + d.toByte()).toChar()
}
fun box() : String { fun box() : String {
if(A(10.toByte()).c(20.toShort()) != 30.toByte().toChar()) return "plus failed"
var x = 20.toByte() var x = 20.toByte()
var y = 20.toByte() var y = 20.toByte()
val foo = { val foo = {