From 3b96624c818e575b5c227390318b07a619750fcb Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Mon, 17 Sep 2012 09:07:08 +0300 Subject: [PATCH] small optimizaton of toString for primitive types (no boxing needed) --- .../org/jetbrains/jet/codegen/ExpressionCodegen.java | 3 ++- .../jetbrains/jet/codegen/intrinsics/ToString.java | 12 +++++++++--- compiler/testData/codegen/intrinsics/tostring.kt | 11 +++++++++++ .../jetbrains/jet/codegen/PrimitiveTypesTest.java | 4 ++++ 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/intrinsics/tostring.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 079631ff225..71b7a052b25 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -48,6 +48,7 @@ import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.*; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.scopes.receivers.*; @@ -998,7 +999,7 @@ public class ExpressionCodegen extends JetVisitor implem } } v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); - return StackValue.onStack(expressionType(expression)); + return StackValue.onStack(AsmTypeConstants.JAVA_STRING_TYPE); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java index f40e381c185..35fe44d2e60 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ToString.java @@ -20,11 +20,11 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import java.util.List; @@ -42,8 +42,14 @@ public class ToString implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); - v.invokestatic("java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;"); + if (receiver.type.getSort() == Type.OBJECT || receiver.type.getSort() == Type.ARRAY) { + receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + v.invokestatic("java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;"); + } + else { + receiver.put(receiver.type, v); + v.invokestatic("java/lang/String", "valueOf", "(" + receiver.type.getDescriptor() + ")Ljava/lang/String;"); + } return StackValue.onStack(AsmTypeConstants.JAVA_STRING_TYPE); } } diff --git a/compiler/testData/codegen/intrinsics/tostring.kt b/compiler/testData/codegen/intrinsics/tostring.kt new file mode 100644 index 00000000000..c3294b9d81a --- /dev/null +++ b/compiler/testData/codegen/intrinsics/tostring.kt @@ -0,0 +1,11 @@ +fun box(): String { + if (239.toByte().toString() != (239.toByte() as Byte?).toString()) return "byte failed" + if (239.toShort().toString() != (239.toShort() as Short?).toString()) return "short failed" + if (239.toInt().toString() != (239.toInt() as Int?).toString()) return "int failed" + if (239.toLong().toString() != (239.toLong() as Long?).toString()) return "long failed" + if (239.toDouble().toString() != (239.toDouble() as Double?).toString()) return "double failed" + if (true.toString() != (true as Boolean?).toString()) return "boolean failed" + if ('a'.toChar().toString() != ('a'.toChar() as Char?).toString()) return "char failed" + + return "OK" +} \ 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 1d0296ef61e..b086dfd3407 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -448,4 +448,8 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testEmptyRanges() throws Exception { blackBoxFile("emptyRanges.kt"); } + + public void testToString() throws Exception { + blackBoxFile("intrinsics/tostring.kt"); + } }