optimization of toString for primitive types and "$expr"

- intrinsic toString for promitive types added to stdlib
- utility method added to CodegenUtil
- optimization logic added to generation of interpolating string
This commit is contained in:
Alex Tkachman
2012-09-17 13:00:02 +03:00
parent 7a00dd1551
commit a4e272d7c6
8 changed files with 98 additions and 25 deletions
@@ -382,4 +382,15 @@ public class CodegenUtil {
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 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;
receiver.put(type, v);
v.invokestatic("java/lang/String", "valueOf", "(" + type.getDescriptor() + ")Ljava/lang/String;");
return StackValue.onStack(JAVA_STRING_TYPE);
}
}
@@ -968,7 +968,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@Override
public StackValue visitStringTemplateExpression(JetStringTemplateExpression expression, StackValue receiver) {
StringBuilder constantValue = new StringBuilder("");
for (JetStringTemplateEntry entry : expression.getEntries()) {
final JetStringTemplateEntry[] entries = expression.getEntries();
if (entries.length == 1 && entries[0] instanceof JetStringTemplateEntryWithExpression) {
return genToString(v, gen(entries[0].getExpression()));
}
for (JetStringTemplateEntry entry : entries) {
if (entry instanceof JetLiteralStringTemplateEntry) {
constantValue.append(entry.getText());
}
@@ -986,7 +992,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
else {
generateStringBuilderConstructor(v);
for (JetStringTemplateEntry entry : expression.getEntries()) {
for (JetStringTemplateEntry entry : entries) {
if (entry instanceof JetStringTemplateEntryWithExpression) {
invokeAppend(entry.getExpression());
}
@@ -62,8 +62,11 @@ public class IntrinsicMethods {
public static final String KOTLIN_JAVA_CLASS_FUNCTION = "kotlin.javaClass.function";
public static final String KOTLIN_ARRAYS_ARRAY = "kotlin.arrays.array";
private static final String KOTLIN_JAVA_CLASS_PROPERTY = "kotlin.javaClass.property";
private static final String KOTLIN_TO_STRING = "kotlin.toString";
private static final String KOTLIN_HASH_CODE = "kotlin.hashCode";
private static final EnumValues ENUM_VALUES = new EnumValues();
private static final EnumValueOf ENUM_VALUE_OF = new EnumValueOf();
public static final ToString TO_STRING = new ToString();
private final Map<String, IntrinsicMethod> namedMethods = new HashMap<String, IntrinsicMethod>();
private static final IntrinsicMethod ARRAY_ITERATOR = new ArrayIterator();
@@ -75,6 +78,8 @@ public class IntrinsicMethods {
namedMethods.put(KOTLIN_JAVA_CLASS_FUNCTION, new JavaClassFunction());
namedMethods.put(KOTLIN_JAVA_CLASS_PROPERTY, new JavaClassProperty());
namedMethods.put(KOTLIN_ARRAYS_ARRAY, new JavaClassArray());
namedMethods.put(KOTLIN_HASH_CODE, HASH_CODE);
namedMethods.put(KOTLIN_TO_STRING, TO_STRING);
ImmutableList<Name> primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList();
for (Name method : primitiveCastMethods) {
@@ -117,7 +122,7 @@ public class IntrinsicMethods {
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("name"), 0, new EnumName());
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("ordinal"), 0, new EnumOrdinal());
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("toString"), 0, new ToString());
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("toString"), 0, TO_STRING);
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("equals"), 1, EQUALS);
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("identityEquals"), 1, IDENTITY_EQUALS);
intrinsicsMap.registerIntrinsic(JetStandardClasses.STANDARD_CLASSES_FQNAME, Name.identifier("plus"), 1, STRING_PLUS);
@@ -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.codegen.CodegenUtil;
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,14 +42,6 @@ public class ToString implements IntrinsicMethod {
StackValue receiver,
@NotNull GenerationState state
) {
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);
return CodegenUtil.genToString(v, receiver);
}
}