From b022eec0fa9d7725302fb643e060dd1217b391e5 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 20 Sep 2012 11:46:40 +0300 Subject: [PATCH] call correct methods String.valueOf/StringBuilder.append in case of byte/short. #KT-2794 fixed --- .../jetbrains/jet/codegen/CodegenUtil.java | 24 ++++++++++--------- .../testData/codegen/regressions/kt2794.kt | 6 +++++ .../jet/codegen/PrimitiveTypesTest.java | 5 +++- 3 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2794.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index c7add487473..6d92972a1a9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -28,7 +28,6 @@ import org.jetbrains.asm4.Label; import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.asm4.commons.Method; import org.jetbrains.jet.codegen.binding.CalculatedClosure; import org.jetbrains.jet.codegen.signature.BothSignatureWriter; import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; @@ -51,7 +50,8 @@ import java.util.*; import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; /** * @author abreslav @@ -380,23 +380,25 @@ public class CodegenUtil { v.invokespecial("java/lang/StringBuilder", "", "()V"); } - public static void invokeAppendMethod(InstructionAdapter v, Type exprType) { - Method appendDescriptor = new Method("append", getType(StringBuilder.class), - new Type[] {exprType.getSort() == Type.OBJECT ? (exprType.equals(JAVA_STRING_TYPE) ? JAVA_STRING_TYPE : OBJECT_TYPE) : exprType}); - v.invokevirtual("java/lang/StringBuilder", "append", appendDescriptor.getDescriptor()); + public static void invokeAppendMethod(InstructionAdapter v, Type type) { + type = getStringValueOfOrStringBuilderAppendType(type); + v.invokevirtual("java/lang/StringBuilder", "append", "(" + type.getDescriptor() + ")Ljava/lang/StringBuilder;"); } public static StackValue genToString(InstructionAdapter v, StackValue receiver) { - final int sort = receiver.type.getSort(); - - final Type type = sort == Type.OBJECT || sort == Type.ARRAY - ? AsmTypeConstants.OBJECT_TYPE - : sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : receiver.type; + final Type type = getStringValueOfOrStringBuilderAppendType(receiver.type); receiver.put(type, v); v.invokestatic("java/lang/String", "valueOf", "(" + type.getDescriptor() + ")Ljava/lang/String;"); return StackValue.onStack(JAVA_STRING_TYPE); } + private static Type getStringValueOfOrStringBuilderAppendType(Type type) { + final int sort = type.getSort(); + return sort == Type.OBJECT || sort == Type.ARRAY + ? AsmTypeConstants.OBJECT_TYPE + : sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : type; + } + static void genHashCode(MethodVisitor mv, InstructionAdapter iv, Type type) { if (type.getSort() == Type.ARRAY) { final Type elementType = correctElementType(type); diff --git a/compiler/testData/codegen/regressions/kt2794.kt b/compiler/testData/codegen/regressions/kt2794.kt new file mode 100644 index 00000000000..3e086f682b5 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2794.kt @@ -0,0 +1,6 @@ +fun box () : String { + val b = 4.toByte() + val s = 5.toShort() + val c: Char = 'A' + return if( "$b" == "4" && " $b" == " 4" && "$s" == "5" && " $s" == " 5" && "$c" == "A" && " $c" == " A") "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 51e237e692c..6fcdf26c62a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -451,6 +451,9 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void test2251() throws Exception { blackBoxFile("regressions/kt2251.kt"); - System.out.println(generateToText()); + } + + public void test2794() throws Exception { + blackBoxFile("regressions/kt2794.kt"); } }