001 package railo.transformer.bytecode.statement.tag; 002 003 import org.objectweb.asm.Label; 004 import org.objectweb.asm.Opcodes; 005 import org.objectweb.asm.Type; 006 import org.objectweb.asm.commons.GeneratorAdapter; 007 import org.objectweb.asm.commons.Method; 008 009 import railo.transformer.bytecode.BytecodeContext; 010 import railo.transformer.bytecode.BytecodeException; 011 import railo.transformer.bytecode.util.Types; 012 import railo.transformer.bytecode.visitor.NotVisitor; 013 import railo.transformer.bytecode.visitor.TryFinallyVisitor; 014 015 public final class TagSilent extends TagBase { 016 017 // boolean setSilent() 018 private static final Method SET_SILENT = new Method( 019 "setSilent", 020 Types.BOOLEAN_VALUE, 021 new Type[]{} 022 ); 023 024 // boolean unsetSilent(); 025 private static final Method UNSET_SILENT = new Method( 026 "unsetSilent", 027 Types.BOOLEAN_VALUE, 028 new Type[]{} 029 ); 030 031 /** 032 * Constructor of the class 033 * @param line 034 */ 035 public TagSilent(int line) { 036 super(line); 037 } 038 public TagSilent(int sl,int el) { 039 super(sl,el); 040 } 041 042 /** 043 * 044 * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter) 045 */ 046 public void _writeOut(BytecodeContext bc) throws BytecodeException { 047 GeneratorAdapter adapter = bc.getAdapter(); 048 049 int silentMode=adapter.newLocal(Types.BOOLEAN_VALUE); 050 051 // boolean silentMode= pc.setSilent(); 052 adapter.loadArg(0); 053 adapter.invokeVirtual(Types.PAGE_CONTEXT, SET_SILENT); 054 adapter.storeLocal(silentMode); 055 056 TryFinallyVisitor tfv=new TryFinallyVisitor(); 057 tfv.visitTryBegin(bc); 058 getBody().writeOut(bc); 059 tfv.visitTryEndFinallyBegin(bc); 060 // if(!silentMode)pc.unsetSilent(); 061 Label _if=new Label(); 062 adapter.loadLocal(silentMode); 063 NotVisitor.visitNot(bc); 064 adapter.ifZCmp(Opcodes.IFEQ, _if); 065 adapter.loadArg(0); 066 adapter.invokeVirtual(Types.PAGE_CONTEXT, UNSET_SILENT); 067 adapter.pop(); 068 069 adapter.visitLabel(_if); 070 071 tfv.visitFinallyEnd(bc); 072 073 } 074 075 }