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