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 }