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    
009    public final class DecisionDoubleVisitor {
010            /*
011            public static final int GT=Opcodes.IF_ICMPGT;
012            public static final int GTE=Opcodes.IF_ICMPGE;
013            public static final int LT=Opcodes.IF_ICMPLT;
014            public static final int LTE=Opcodes.IF_ICMPLE;
015            public static final int EQ=Opcodes.IF_ICMPEQ;
016            public static final int NEQ=Opcodes.IF_ICMPNE;
017            */
018            public static final int GT=Opcodes.IFLE;
019            public static final int GTE=Opcodes.IFLT;
020            public static final int LT=Opcodes.IFGE;
021            public static final int LTE=Opcodes.IFGT;
022            public static final int EQ=Opcodes.IFNE;
023            public static final int NEQ=Opcodes.IFEQ;
024            
025            private int operation;
026            public void visitBegin() {
027    
028            }
029            public void visitMiddle(int operation) {
030                    this.operation=operation;
031            }
032            public void visitGT() {
033                    this.operation=GT;
034            }
035            public void visitGTE() {
036                    this.operation=GTE;
037            }
038            public void visitLT() {
039                    this.operation=LT;
040            }
041            public void visitLTE() {
042                    this.operation=LTE;
043            }
044            public void visitEQ() {
045                    this.operation=EQ;
046            }
047            public void visitNEQ() {
048                    this.operation=NEQ;
049            }
050            public void visitEnd(BytecodeContext bc) {
051                    GeneratorAdapter adapter = bc.getAdapter();
052                    Label l1 = new Label();
053                    Label l2 = new Label();
054                    adapter.visitInsn(Opcodes.DCMPL);
055                    adapter.visitJumpInsn(operation, l1);
056                    adapter.visitInsn(Opcodes.ICONST_1);
057                    adapter.visitJumpInsn(Opcodes.GOTO, l2);
058                    adapter.visitLabel(l1);
059                    adapter.visitInsn(Opcodes.ICONST_0);
060                    adapter.visitLabel(l2);
061            }
062    }