001    package railo.transformer.bytecode.visitor;
002    
003    import org.objectweb.asm.Label;
004    import org.objectweb.asm.Opcodes;
005    import org.objectweb.asm.commons.GeneratorAdapter;
006    
007    import railo.transformer.bytecode.BytecodeContext;
008    import railo.transformer.bytecode.Position;
009    import railo.transformer.bytecode.util.ExpressionUtil;
010    import railo.transformer.bytecode.util.Types;
011    
012    /**
013     * @deprecated replaced with ForIntVisitor
014     */
015    public final class ForConditionIntVisitor implements Opcodes, LoopVisitor {
016    
017            private Label l0;
018            private Label l1;
019            private Label l2;
020            private Label l3;
021            private int i;
022            private Label lend;
023            private Label lbegin;
024            public int visitBegin(GeneratorAdapter adapter, int start, boolean isLocal) {
025                    
026                    lend = new Label();
027                    lbegin = new Label();
028                    
029                    i=adapter.newLocal(Types.INT_VALUE); 
030                    
031                    l0 = new Label();
032                    adapter.visitLabel(l0);
033                    if(isLocal)adapter.loadLocal(start,Types.INT_VALUE);
034                    else adapter.push(start);
035                    //mv.visitInsn(ICONST_1);
036                    adapter.visitVarInsn(ISTORE, i);
037                     l1 = new Label();
038                    adapter.visitLabel(l1);
039                     l2 = new Label();
040                    adapter.visitJumpInsn(GOTO, l2);
041                     l3 = new Label();
042                    adapter.visitLabel(l3);
043                    
044                    return i;
045            }
046            public void visitEndBeforeCondition(BytecodeContext bc, int step, boolean isLocal,Position startline) {
047                    GeneratorAdapter adapter = bc.getAdapter();
048    
049                    
050                    adapter.visitLabel(lbegin);
051                    if(isLocal) {
052                            adapter.visitVarInsn(ILOAD, i);
053                            //adapter.loadLocal(i);
054                            adapter.loadLocal(step);
055                            adapter.visitInsn(IADD);
056                            //adapter.dup();
057                            adapter.visitVarInsn(ISTORE, i);
058                            
059                    }
060                    else adapter.visitIincInsn(i, step);
061                    ExpressionUtil.visitLine(bc, startline);
062                    adapter.visitLabel(l2);
063            }
064            
065            public void visitEndAfterCondition(BytecodeContext bc) {
066                    GeneratorAdapter adapter = bc.getAdapter();
067    
068                    adapter.ifZCmp(Opcodes.IFNE, l3);
069                    
070                    adapter.visitLabel(lend);
071    
072                    adapter.visitLocalVariable("i", "I", null, l1, lend, i);
073    
074            }
075            
076    
077            /**
078             *
079             * @see railo.transformer.bytecode.visitor.LoopVisitor#visitContinue(org.objectweb.asm.commons.GeneratorAdapter)
080             */
081            public void visitContinue(BytecodeContext bc) {
082                    bc.getAdapter().visitJumpInsn(Opcodes.GOTO, lbegin);
083            }
084            
085            /**
086             *
087             * @see railo.transformer.bytecode.visitor.LoopVisitor#visitBreak(org.objectweb.asm.commons.GeneratorAdapter)
088             */
089            public void visitBreak(BytecodeContext bc) {
090                    bc.getAdapter().visitJumpInsn(Opcodes.GOTO, lend);
091            }
092    
093            /**
094             *
095             * @see railo.transformer.bytecode.visitor.LoopVisitor#getContinueLabel()
096             */
097            public Label getContinueLabel() {
098                    return lbegin;
099            }
100    
101            /**
102             *
103             * @see railo.transformer.bytecode.visitor.LoopVisitor#getBreakLabel()
104             */
105            public Label getBreakLabel() {
106                    return lend;
107            }
108    }