From bfd571b7eecd7d307b13dd8d584deba357522530 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 13 Jul 2011 20:05:32 +0200 Subject: [PATCH] string plus is an intrinsic --- .../jet/codegen/ExpressionCodegen.java | 19 +++------------ .../jet/codegen/intrinsics/Concat.java | 24 +++++++++++++++++++ .../codegen/intrinsics/IntrinsicMethods.java | 5 ++-- 3 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/codegen/intrinsics/Concat.java diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index ac3baabc7c8..2c4c3709a7f 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -35,7 +35,7 @@ import java.util.*; public class ExpressionCodegen extends JetVisitor { private static final String CLASS_OBJECT = "java/lang/Object"; private static final String CLASS_STRING = "java/lang/String"; - private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder"; + public static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder"; private static final String CLASS_COMPARABLE = "java/lang/Comparable"; private static final String CLASS_ITERABLE = "java/lang/Iterable"; private static final String CLASS_ITERATOR = "java/util/Iterator"; @@ -1085,11 +1085,6 @@ public class ExpressionCodegen extends JetVisitor { Arrays.asList(expression.getLeft(), expression.getRight()))); return; } - DeclarationDescriptor cls = op.getContainingDeclaration(); - if (isClass(cls, "String") && op.getName().equals("plus")) { - generateConcatenation(expression); - return; - } } throw new UnsupportedOperationException("Don't know how to generate binary op " + expression); } @@ -1289,15 +1284,7 @@ public class ExpressionCodegen extends JetVisitor { } } - private void generateConcatenation(JetBinaryExpression expression) { - generateStringBuilderConstructor(); - invokeAppend(expression.getLeft()); - invokeAppend(expression.getRight()); - v.invokevirtual(CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;"); - myStack.push(StackValue.onStack(Type.getObjectType(CLASS_STRING))); - } - - private void generateStringBuilderConstructor() { + public void generateStringBuilderConstructor() { Type type = Type.getObjectType(CLASS_STRING_BUILDER); v.anew(type); v.dup(); @@ -1305,7 +1292,7 @@ public class ExpressionCodegen extends JetVisitor { v.invokespecial(CLASS_STRING_BUILDER, method.getName(), method.getDescriptor()); } - private void invokeAppend(final JetExpression expr) { + public void invokeAppend(final JetExpression expr) { if (expr instanceof JetBinaryExpression) { final JetBinaryExpression binaryExpression = (JetBinaryExpression) expr; if (binaryExpression.getOperationToken() == JetTokens.PLUS) { diff --git a/idea/src/org/jetbrains/jet/codegen/intrinsics/Concat.java b/idea/src/org/jetbrains/jet/codegen/intrinsics/Concat.java new file mode 100644 index 00000000000..d12581bf619 --- /dev/null +++ b/idea/src/org/jetbrains/jet/codegen/intrinsics/Concat.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.codegen.intrinsics; + +import com.intellij.psi.PsiElement; +import org.jetbrains.jet.codegen.ExpressionCodegen; +import org.jetbrains.jet.codegen.StackValue; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.objectweb.asm.Type; +import org.objectweb.asm.commons.InstructionAdapter; + +import java.util.List; + +/** + * @author yole + */ +public class Concat implements IntrinsicMethod { + @Override + public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments) { + codegen.generateStringBuilderConstructor(); + codegen.invokeAppend(arguments.get(0)); + codegen.invokeAppend(arguments.get(1)); + v.invokevirtual(ExpressionCodegen.CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;"); + return StackValue.onStack(Type.getObjectType("java/lang/String")); + } +} diff --git a/idea/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/idea/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 47280c57ffe..9045645ed61 100644 --- a/idea/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/idea/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -19,7 +19,6 @@ import java.util.Map; public class IntrinsicMethods { private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus(); private static final IntrinsicMethod NUMBER_CAST = new NumberCast(); - private static final IntrinsicMethod ARRAY_SIZE = new ArraySize(); private static final IntrinsicMethod INV = new Inv(); private static final IntrinsicMethod TYPEINFO = new TypeInfo(); private static final IntrinsicMethod VALUE_TYPEINFO = new ValueTypeInfo(); @@ -35,7 +34,7 @@ public class IntrinsicMethods { for (String method : primitiveCastMethods) { declareIntrinsicProperty("Number", method, NUMBER_CAST); } - declareIntrinsicProperty("Array", "size", ARRAY_SIZE); + declareIntrinsicProperty("Array", "size", new ArraySize()); for (String primitiveNumberType : PRIMITIVE_NUMBER_TYPES) { declareIntrinsicFunction(primitiveNumberType, "minus", 0, UNARY_MINUS); @@ -57,6 +56,8 @@ public class IntrinsicMethods { declareBinaryOp("and", Opcodes.IAND); declareBinaryOp("or", Opcodes.IOR); declareBinaryOp("xor", Opcodes.IXOR); + + declareIntrinsicFunction("String", "plus", 1, new Concat()); } private void declareBinaryOp(String methodName, int opcode) {