001 package railo.transformer.bytecode.cast; 002 003 import org.objectweb.asm.Type; 004 import org.objectweb.asm.commons.GeneratorAdapter; 005 006 import railo.transformer.bytecode.BytecodeContext; 007 import railo.transformer.bytecode.BytecodeException; 008 import railo.transformer.bytecode.Literal; 009 import railo.transformer.bytecode.expression.ExprBoolean; 010 import railo.transformer.bytecode.expression.ExprDouble; 011 import railo.transformer.bytecode.expression.ExprString; 012 import railo.transformer.bytecode.expression.Expression; 013 import railo.transformer.bytecode.expression.ExpressionBase; 014 import railo.transformer.bytecode.literal.LitString; 015 import railo.transformer.bytecode.util.Methods; 016 import railo.transformer.bytecode.util.Types; 017 018 /** 019 * Cast to a String 020 */ 021 public final class CastString extends ExpressionBase implements ExprString { 022 023 private Expression expr; 024 025 /** 026 * constructor of the class 027 * @param expr 028 */ 029 private CastString(Expression expr) { 030 super(expr.getLine()); 031 this.expr=expr; 032 } 033 034 /** 035 * Create a String expression from a Expression 036 * @param expr 037 * @param pos 038 * @return String expression 039 */ 040 public static ExprString toExprString(Expression expr) { 041 if(expr instanceof ExprString) return (ExprString) expr; 042 if(expr instanceof Literal) return new LitString(((Literal)expr).getString(),expr.getLine()); 043 return new CastString(expr); 044 } 045 046 /** 047 * @see railo.transformer.bytecode.expression.Expression#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int) 048 */ 049 public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException { 050 051 GeneratorAdapter adapter = bc.getAdapter(); 052 if(expr instanceof ExprBoolean) { 053 expr.writeOut(bc,MODE_VALUE); 054 adapter.invokeStatic(Types.CASTER,Methods.METHOD_TO_STRING_FROM_BOOLEAN); 055 } 056 else if(expr instanceof ExprDouble) { 057 expr.writeOut(bc,MODE_VALUE); 058 adapter.invokeStatic(Types.CASTER,Methods.METHOD_TO_STRING_FROM_DOUBLE); 059 } 060 else { 061 Type rtn = expr.writeOut(bc,MODE_REF); 062 if(rtn.equals(Types.STRING)) return Types.STRING; 063 adapter.invokeStatic(Types.CASTER,Methods.METHOD_TO_STRING); 064 } 065 066 return Types.STRING; 067 } 068 069 /** 070 * @return the expr 071 */ 072 public Expression getExpr() { 073 return expr; 074 } 075 076 }