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,Cast {
022        
023        private Expression expr;
024    
025        /**
026         * constructor of the class
027         * @param expr
028         */
029        private CastString(Expression expr) {
030            super(expr.getStart(),expr.getEnd());
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.getStart(),expr.getEnd());
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            @Override
070            public Expression getExpr() {
071                    return expr;
072            }
073    
074    }