001    package railo.transformer.bytecode.statement;
002    
003    import org.objectweb.asm.Type;
004    import org.objectweb.asm.commons.GeneratorAdapter;
005    import org.objectweb.asm.commons.Method;
006    
007    import railo.transformer.bytecode.BytecodeContext;
008    import railo.transformer.bytecode.BytecodeException;
009    import railo.transformer.bytecode.Position;
010    import railo.transformer.bytecode.cast.CastString;
011    import railo.transformer.bytecode.expression.ExprString;
012    import railo.transformer.bytecode.expression.Expression;
013    import railo.transformer.bytecode.util.Types;
014    
015    public final class PrintOut extends StatementBaseNoFinal {
016    
017            // void write (String)
018        private final static Method METHOD_WRITE =  new Method("write",
019                            Types.VOID,
020                            new Type[]{Types.STRING});
021        // void writePSQ (Object) TODO muss param 1 wirklich objekt sein
022        private final static Method METHOD_WRITE_PSQ = new Method("writePSQ",
023                            Types.VOID,
024                            new Type[]{Types.OBJECT}); 
025        
026        Expression expr;
027    
028            private boolean checkPSQ;
029    
030      
031        
032        /**
033         * constructor of the class
034         * @param expr
035         * @param line 
036         */
037        public PrintOut(Expression expr, Position start,Position end) {
038            super(start,end);
039            this.expr=CastString.toExprString(expr);
040        }
041    
042    
043        /**
044         * @see railo.transformer.bytecode.Statement#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
045         */
046        public void _writeOut(BytecodeContext bc) throws BytecodeException {
047            GeneratorAdapter adapter = bc.getAdapter();
048            adapter.loadArg(0);
049            ExprString es=CastString.toExprString(expr);
050            boolean usedExternalizer=false;
051            
052            /*if(es instanceof LitString) {
053                    String str=((LitString)es).getString();
054                    if(str.length()>10) {
055                            StringExternalizerWriter writer=bc.getStringExternalizerWriter();
056                            if(writer!=null){
057                                    Range range=writer.write(str);
058                                    //reader.read(range.from, range.to);
059                                    //usedExternalizer=true;
060                            }
061                    }
062            }*/
063            
064            if(!usedExternalizer)es.writeOut(bc,Expression.MODE_REF);
065            adapter.invokeVirtual(Types.PAGE_CONTEXT,checkPSQ?METHOD_WRITE_PSQ:METHOD_WRITE);
066        }
067    
068    
069            /**
070             * @return the expr
071             */
072            public Expression getExpr() {
073                    return expr;
074            }
075    
076            /**
077             * @param expr the expr to set
078             */
079            public void setExpr(Expression expr) {
080                    this.expr = expr;
081            }
082    
083    
084            /**
085             * @param preserveSingleQuote the preserveSingleQuote to set
086             */
087            public void setCheckPSQ(boolean checkPSQ) {
088                    this.checkPSQ = checkPSQ;
089            }
090    }