package railo.transformer.bytecode.op;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.Method;
import railo.transformer.bytecode.BytecodeContext;
import railo.transformer.bytecode.BytecodeException;
import railo.transformer.bytecode.Literal;
import railo.transformer.bytecode.cast.CastString;
import railo.transformer.bytecode.expression.ExprString;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.expression.ExpressionBase;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.util.Types;
public final class OpString extends ExpressionBase implements ExprString {
private ExprString right;
private ExprString left;
// String concat (String)
private final static Method METHOD_CONCAT = new Method("concat",
Types.STRING,
new Type[]{Types.STRING});
private OpString(Expression left, Expression right) {
super(left.getStart(),right.getEnd());
this.left=CastString.toExprString(left);
this.right=CastString.toExprString(right);
}
/**
* Create a String expression from a Expression
* @param left
* @param right
*
* @return String expression
*/
public static ExprString toExprString(Expression left, Expression right) {
return toExprString(left, right, true);
}
public static ExprString toExprString(Expression left, Expression right, boolean concatStatic) {
if(concatStatic && left instanceof Literal && right instanceof Literal) {
String l = ((Literal)left).getString();
String r = ((Literal)right).getString();
if((l.length()+r.length())<=LitString.MAX_SIZE)return new LitString(l.concat(r),left.getStart(),right.getEnd());
}
return new OpString(left,right);
}
/**
*
* @see railo.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int)
*/
public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException {
left.writeOut(bc,MODE_REF);
right.writeOut(bc,MODE_REF);
bc.getAdapter().invokeVirtual(Types.STRING,METHOD_CONCAT);
return Types.STRING;
}
/* *
* @see railo.transformer.bytecode.expression.Expression#getType()
* /
public int getType() {
return Types._STRING;
}*/
}