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    }