110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali/***
210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * ASM: a very small and fast Java bytecode manipulation framework
310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * Copyright (c) 2000-2005 INRIA, France Telecom
410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * All rights reserved.
510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *
610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * Redistribution and use in source and binary forms, with or without
710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * modification, are permitted provided that the following conditions
810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * are met:
910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * 1. Redistributions of source code must retain the above copyright
1010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *    notice, this list of conditions and the following disclaimer.
1110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * 2. Redistributions in binary form must reproduce the above copyright
1210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *    notice, this list of conditions and the following disclaimer in the
1310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *    documentation and/or other materials provided with the distribution.
1410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * 3. Neither the name of the copyright holders nor the names of its
1510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *    contributors may be used to endorse or promote products derived from
1610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *    this software without specific prior written permission.
1710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *
1810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * THE POSSIBILITY OF SUCH DAMAGE.
2910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali */
3010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Alipackage org.objectweb.asm.commons;
3110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
3210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.AnnotationVisitor;
3310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.MethodVisitor;
3410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.Label;
3510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.Opcodes;
3610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.Type;
3710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.util.ASMifierAbstractVisitor;
3810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport org.objectweb.asm.util.ASMifierAnnotationVisitor;
3910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
4010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport java.util.ArrayList;
4110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport java.util.HashMap;
4210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport java.util.List;
4310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport java.util.Map;
4410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
4510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali/**
4610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * A {@link MethodVisitor} that prints the ASM code that generates the methods
4710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * it visits.
4810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali *
4910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * @author Eric Bruneton
5010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali * @author Eugene Kuleshov
5110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali */
5210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Alipublic class GASMifierMethodVisitor extends ASMifierAbstractVisitor implements
5310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        MethodVisitor,
5410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        Opcodes
5510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali{
5610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
5710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    int access;
5810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
5910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    Type[] argumentTypes;
6010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
6110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    int firstLocal;
6210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
6310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    Map locals;
6410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
6510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    List localTypes;
6610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
6710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    int lastOpcode = -1;
6810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
6910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    HashMap labelNames;
7010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
7110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public GASMifierMethodVisitor(int access, String desc) {
7210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        super("mg");
7310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.access = access;
7410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.labelNames = new HashMap();
7510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.argumentTypes = Type.getArgumentTypes(desc);
7610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        int nextLocal = ((Opcodes.ACC_STATIC & access) != 0) ? 0 : 1;
7710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < argumentTypes.length; i++) {
7810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            nextLocal += argumentTypes[i].getSize();
7910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
8010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.firstLocal = nextLocal;
8110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.locals = new HashMap();
8210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        this.localTypes = new ArrayList();
8310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
8410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
8510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public AnnotationVisitor visitAnnotationDefault() {
8610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
8710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("{\n").append("av0 = mg.visitAnnotationDefault();\n");
8810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
8910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
9010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(av.getText());
9110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add("}\n");
9210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return av;
9310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
9410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
9510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public AnnotationVisitor visitParameterAnnotation(
9610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int parameter,
9710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String desc,
9810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final boolean visible)
9910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
10010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
10110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("{\n")
10210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append("av0 = mg.visitParameterAnnotation(")
10310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(parameter)
10410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(", \"");
10510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(desc);
10610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("\", ").append(visible).append(");\n");
10710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
10810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
10910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(av.getText());
11010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add("}\n");
11110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return av;
11210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
11310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
11410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitCode() {
11510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        /* text.add("mg.visitCode();\n"); */
11610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
11710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
11810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitInsn(final int opcode) {
11910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
12010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        switch (opcode) {
12110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IRETURN:
12210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LRETURN:
12310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FRETURN:
12410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DRETURN:
12510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ARETURN:
12610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case RETURN:
12710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.returnValue();\n");
12810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
12910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case NOP:
13010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
13110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ACONST_NULL:
13210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.push((String)null);\n");
13310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
13410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_M1:
13510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_0:
13610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_1:
13710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_2:
13810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_3:
13910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_4:
14010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ICONST_5:
14110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.push(").append(opcode - ICONST_0).append(");\n");
14210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
14310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LCONST_0:
14410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LCONST_1:
14510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.push(")
14610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(opcode - LCONST_0)
14710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append("L);\n");
14810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
14910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FCONST_0:
15010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FCONST_1:
15110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FCONST_2:
15210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.push(")
15310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(opcode - FCONST_0)
15410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append("f);\n");
15510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
15610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DCONST_0:
15710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DCONST_1:
15810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.push(")
15910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(opcode - DCONST_0)
16010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append("d);\n");
16110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
16210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case POP:
16310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.pop();\n");
16410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
16510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case POP2:
16610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.pop2();\n");
16710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
16810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP:
16910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dup();\n");
17010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
17110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP_X1:
17210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dupX1();\n");
17310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
17410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP_X2:
17510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dupX2();\n");
17610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
17710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP2:
17810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dup2();\n");
17910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
18010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP2_X1:
18110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dup2X1();\n");
18210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
18310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DUP2_X2:
18410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.dup2X2();\n");
18510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
18610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case SWAP:
18710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.swap();\n");
18810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
18910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case MONITORENTER:
19010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.monitorEnter();\n");
19110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
19210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case MONITOREXIT:
19310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.monitorExit();\n");
19410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
19510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ARRAYLENGTH:
19610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLength();\n");
19710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
19810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IALOAD:
19910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.INT_TYPE);\n");
20010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
20110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LALOAD:
20210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.LONG_TYPE);\n");
20310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
20410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FALOAD:
20510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.FLOAT_TYPE);\n");
20610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
20710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DALOAD:
20810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.DOUBLE_TYPE);\n");
20910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
21010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case AALOAD:
21110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(" + getType("java/lang/Object")
21210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        + ");\n");
21310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
21410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case BALOAD:
21510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.BYTE_TYPE);\n");
21610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
21710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case CALOAD:
21810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.CHAR_TYPE);\n");
21910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
22010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case SALOAD:
22110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayLoad(Type.SHORT_TYPE);\n");
22210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
22310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IASTORE:
22410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.INT_TYPE);\n");
22510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
22610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LASTORE:
22710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.LONG_TYPE);\n");
22810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
22910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FASTORE:
23010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.FLOAT_TYPE);\n");
23110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
23210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DASTORE:
23310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.DOUBLE_TYPE);\n");
23410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
23510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case AASTORE:
23610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(" + getType("java/lang/Object")
23710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        + ");\n");
23810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
23910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case BASTORE:
24010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.BYTE_TYPE);\n");
24110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
24210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case CASTORE:
24310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.CHAR_TYPE);\n");
24410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
24510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case SASTORE:
24610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.arrayStore(Type.SHORT_TYPE);\n");
24710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
24810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IADD:
24910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.ADD, Type.INT_TYPE);\n");
25010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
25110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LADD:
25210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.ADD, Type.LONG_TYPE);\n");
25310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
25410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FADD:
25510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.ADD, Type.FLOAT_TYPE);\n");
25610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
25710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DADD:
25810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.ADD, Type.DOUBLE_TYPE);\n");
25910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
26010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ISUB:
26110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SUB, Type.INT_TYPE);\n");
26210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
26310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LSUB:
26410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SUB, Type.LONG_TYPE);\n");
26510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
26610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FSUB:
26710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SUB, Type.FLOAT_TYPE);\n");
26810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
26910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DSUB:
27010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SUB, Type.DOUBLE_TYPE);\n");
27110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
27210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IMUL:
27310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.MUL, Type.INT_TYPE);\n");
27410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
27510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LMUL:
27610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.MUL, Type.LONG_TYPE);\n");
27710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
27810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FMUL:
27910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.MUL, Type.FLOAT_TYPE);\n");
28010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
28110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DMUL:
28210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.MUL, Type.DOUBLE_TYPE);\n");
28310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
28410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IDIV:
28510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.DIV, Type.INT_TYPE);\n");
28610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
28710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LDIV:
28810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.DIV, Type.LONG_TYPE);\n");
28910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
29010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FDIV:
29110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.DIV, Type.FLOAT_TYPE);\n");
29210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
29310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DDIV:
29410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.DIV, Type.DOUBLE_TYPE);\n");
29510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
29610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IREM:
29710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.REM, Type.INT_TYPE);\n");
29810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
29910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LREM:
30010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.REM, Type.LONG_TYPE);\n");
30110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
30210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FREM:
30310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.REM, Type.FLOAT_TYPE);\n");
30410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
30510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DREM:
30610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.REM, Type.DOUBLE_TYPE);\n");
30710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
30810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case INEG:
30910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.NEG, Type.INT_TYPE);\n");
31010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
31110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LNEG:
31210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.NEG, Type.LONG_TYPE);\n");
31310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
31410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FNEG:
31510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.NEG, Type.FLOAT_TYPE);\n");
31610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
31710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DNEG:
31810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.NEG, Type.DOUBLE_TYPE);\n");
31910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
32010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ISHL:
32110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SHL, Type.INT_TYPE);\n");
32210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
32310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LSHL:
32410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SHL, Type.LONG_TYPE);\n");
32510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
32610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ISHR:
32710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SHR, Type.INT_TYPE);\n");
32810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
32910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LSHR:
33010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.SHR, Type.LONG_TYPE);\n");
33110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
33210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IUSHR:
33310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.USHR, Type.INT_TYPE);\n");
33410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
33510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LUSHR:
33610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.USHR, Type.LONG_TYPE);\n");
33710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
33810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IAND:
33910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.AND, Type.INT_TYPE);\n");
34010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
34110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LAND:
34210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.AND, Type.LONG_TYPE);\n");
34310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
34410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IOR:
34510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.OR, Type.INT_TYPE);\n");
34610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
34710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LOR:
34810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.OR, Type.LONG_TYPE);\n");
34910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
35010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case IXOR:
35110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.XOR, Type.INT_TYPE);\n");
35210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
35310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LXOR:
35410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.math(GeneratorAdapter.XOR, Type.LONG_TYPE);\n");
35510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
35610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ATHROW:
35710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.throwException();\n");
35810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
35910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2L:
36010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.LONG_TYPE);\n");
36110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
36210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2F:
36310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.FLOAT_TYPE);\n");
36410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
36510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2D:
36610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.DOUBLE_TYPE);\n");
36710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
36810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case L2I:
36910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.LONG_TYPE, Type.INT_TYPE);\n");
37010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
37110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case L2F:
37210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.LONG_TYPE, Type.FLOAT_TYPE);\n");
37310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
37410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case L2D:
37510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.LONG_TYPE, Type.DOUBLE_TYPE);\n");
37610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
37710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case F2I:
37810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.FLOAT_TYPE, Type.INT_TYPE);\n");
37910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
38010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case F2L:
38110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.FLOAT_TYPE, Type.LONG_TYPE);\n");
38210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
38310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case F2D:
38410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.FLOAT_TYPE, Type.DOUBLE_TYPE);\n");
38510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
38610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case D2I:
38710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.DOUBLE_TYPE, Type.INT_TYPE);\n");
38810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
38910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case D2L:
39010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.DOUBLE_TYPE, Type.LONG_TYPE);\n");
39110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
39210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case D2F:
39310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.DOUBLE_TYPE, Type.FLOAT_TYPE);\n");
39410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
39510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2B:
39610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                // TODO detect if previous element in 'text' is a cast,
39710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                // for possible optimisations (e.g. cast(F,I) cast(I,B) =
39810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                // cast(F,B))
39910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.BYTE_TYPE);\n");
40010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
40110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2C: // idem
40210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.CHAR_TYPE);\n");
40310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
40410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case I2S: // idem
40510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.cast(Type.INT_TYPE, Type.SHORT_TYPE);\n");
40610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
40710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LCMP:
40810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FCMPL:
40910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FCMPG:
41010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DCMPL:
41110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DCMPG:
41210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                // TODO detect xCMPy IF_ICMP -> ifCmp(..., ..., label)
41310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.visitInsn(")
41410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(OPCODES[opcode])
41510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(");\n");
41610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
41710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            default:
41810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                throw new RuntimeException("unexpected case");
41910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
42010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
42110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
42210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
42310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
42410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitIntInsn(final int opcode, final int operand) {
42510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
42610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (opcode == NEWARRAY) {
42710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            String type;
42810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            switch (operand) {
42910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_BOOLEAN:
43010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.BOOLEAN_TYPE";
43110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
43210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_CHAR:
43310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.CHAR_TYPE";
43410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
43510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_FLOAT:
43610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.FLOAT_TYPE";
43710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
43810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_DOUBLE:
43910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.DOUBLE_TYPE";
44010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
44110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_BYTE:
44210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.BYTE_TYPE";
44310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
44410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_SHORT:
44510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.SHORT_TYPE";
44610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
44710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_INT:
44810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.INT_TYPE";
44910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
45010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                case T_LONG:
45110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    type = "Type.LONG_TYPE";
45210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    break;
45310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                default:
45410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    throw new RuntimeException("unexpected case");
45510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
45610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.newArray(").append(type).append(");\n");
45710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
45810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.push(").append(operand).append(");\n");
45910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
46010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
46110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
46210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
46310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
46410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitVarInsn(final int opcode, int var) {
46510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
46610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        switch (opcode) {
46710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case RET:
46810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.ret(");
46910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                if (var < firstLocal) {
47010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    buf.append(var);
47110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                } else {
47210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    int v = generateNewLocal(var, "Type.INT_TYPE");
47310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    buf.append("local").append(v);
47410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                }
47510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(");\n");
47610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
47710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
47810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ILOAD:
47910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateLoadLocal(var, "Type.INT_TYPE");
48010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
48110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LLOAD:
48210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateLoadLocal(var, "Type.LONG_TYPE");
48310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
48410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FLOAD:
48510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateLoadLocal(var, "Type.FLOAT_TYPE");
48610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
48710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DLOAD:
48810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateLoadLocal(var, "Type.DOUBLE_TYPE");
48910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
49010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ALOAD:
49110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateLoadLocal(var, getType("java/lang/Object"));
49210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
49310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
49410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ISTORE:
49510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateStoreLocal(var, "Type.INT_TYPE");
49610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
49710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case LSTORE:
49810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateStoreLocal(var, "Type.LONG_TYPE");
49910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
50010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case FSTORE:
50110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateStoreLocal(var, "Type.FLOAT_TYPE");
50210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
50310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case DSTORE:
50410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateStoreLocal(var, "Type.DOUBLE_TYPE");
50510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
50610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case ASTORE:
50710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                generateStoreLocal(var, getType("java/lang/Object"));
50810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
50910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
51010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            default:
51110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                throw new RuntimeException("unexpected case");
51210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
51310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
51410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
51510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
51610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
51710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
51810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private void generateLoadLocal(int var, String type) {
51910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (var < firstLocal) {
52010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (var == 0 && (access & ACC_STATIC) == 0) {
52110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.loadThis();\n");
52210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            } else {
52310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.loadArg(")
52410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(getArgIndex(var))
52510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        .append(");\n");
52610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
52710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
52810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            int local = generateNewLocal(var, type);
52910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.loadLocal(local").append(local);
53010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (!type.equals(localTypes.get(local))) {
53110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                localTypes.set(local, type);
53210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(", ").append(type);
53310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
53410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
53510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
53610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
53710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
53810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private void generateStoreLocal(int var, String type) {
53910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (var < firstLocal) {
54010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.storeArg(").append(getArgIndex(var)).append(");\n");
54110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
54210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            int local = generateNewLocal(var, type);
54310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.storeLocal(local").append(local);
54410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (!type.equals(localTypes.get(local))) {
54510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                localTypes.set(local, type);
54610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(", ").append(type);
54710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
54810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
54910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
55010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
55110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
55210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private int generateNewLocal(int var, String type) {
55310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        Integer i = (Integer) locals.get(new Integer(var));
55410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (i == null) {
55510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            int local = locals.size();
55610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            locals.put(new Integer(var), new Integer(local));
55710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            localTypes.add(type);
55810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("int local" + local + " = mg.newLocal(" + type + ");\n");
55910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return local;
56010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
56110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return i.intValue();
56210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
56310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
56410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private int getArgIndex(int var) {
56510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        int nextLocal = ((Opcodes.ACC_STATIC & access) != 0) ? 0 : 1;
56610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        int i = 0;
56710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        while (nextLocal != var) {
56810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            nextLocal += argumentTypes[i++].getSize();
56910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
57010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return i;
57110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
57210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
57310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitTypeInsn(final int opcode, final String desc) {
57410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        String type;
57510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.charAt(0) == '[') {
57610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            type = getDescType(desc);
57710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
57810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            type = getType(desc);
57910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
58010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
58110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (opcode == NEW) {
58210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.newInstance(").append(type).append(");\n");
58310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == ANEWARRAY) {
58410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.newArray(").append(type).append(");\n");
58510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == CHECKCAST) {
58610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.checkCast(").append(type).append(");\n");
58710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == INSTANCEOF) {
58810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.instanceOf(").append(type).append(");\n");
58910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
59010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
59110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
59210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
59310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
59410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitFieldInsn(
59510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int opcode,
59610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String owner,
59710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String name,
59810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String desc)
59910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
60010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
60110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        switch (opcode) {
60210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case GETFIELD:
60310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.getField(");
60410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
60510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case PUTFIELD:
60610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.putField(");
60710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
60810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case GETSTATIC:
60910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.getStatic(");
61010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
61110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case PUTSTATIC:
61210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.putStatic(");
61310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
61410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            default:
61510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                throw new RuntimeException("unexpected case");
61610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
61710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(getType(owner));
61810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", \"");
61910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(name);
62010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("\", ");
62110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(getDescType(desc));
62210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(");\n");
62310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
62410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
62510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
62610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
62710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitMethodInsn(
62810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int opcode,
62910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String owner,
63010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String name,
63110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String desc)
63210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
63310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
63410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        switch (opcode) {
63510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case INVOKEVIRTUAL:
63610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.invokeVirtual(");
63710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
63810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case INVOKESPECIAL:
63910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.invokeConstructor(");
64010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
64110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case INVOKESTATIC:
64210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.invokeStatic(");
64310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
64410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            case INVOKEINTERFACE:
64510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.invokeInterface(");
64610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                break;
64710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            default:
64810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                throw new RuntimeException("unexpected case");
64910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
65010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (owner.charAt(0) == '[') {
65110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(getDescType(owner));
65210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
65310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(getType(owner));
65410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
65510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
65610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(getMethod(name, desc));
65710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(");\n");
65810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
65910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
66010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
66110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
66210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitJumpInsn(final int opcode, final Label label) {
66310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
66410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(label);
66510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (opcode == GOTO || opcode == IFNULL || opcode == IFNONNULL) {
66610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (opcode == GOTO)
66710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.goTo(");
66810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (opcode == IFNULL)
66910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.ifNull(");
67010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (opcode == IFNONNULL)
67110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("mg.ifNonNull(");
67210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
67310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
67410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPEQ) {
67510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.EQ, ");
67610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
67710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
67810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPNE) {
67910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.NE, ");
68010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
68110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
68210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPLT) {
68310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.LT, ");
68410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
68510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
68610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPGE) {
68710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.GE, ");
68810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
68910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
69010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPGT) {
69110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.GT, ");
69210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
69310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
69410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ICMPLE) {
69510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifICmp(GeneratorAdapter.LE, ");
69610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
69710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
69810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ACMPEQ) {
69910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifCmp(");
70010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(getType("java/lang/Object"))
70110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append(", ")
70210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append("GeneratorAdapter.EQ, ");
70310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
70410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
70510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IF_ACMPNE) {
70610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifCmp(");
70710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(getType("java/lang/Object"))
70810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append(", ")
70910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append("GeneratorAdapter.NE, ");
71010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
71110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
71210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFEQ) {
71310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.EQ, ");
71410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
71510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
71610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFNE) {
71710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.NE, ");
71810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
71910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
72010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFLT) {
72110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.LT, ");
72210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
72310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
72410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFGE) {
72510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.GE, ");
72610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
72710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
72810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFGT) {
72910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.GT, ");
73010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
73110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
73210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (opcode == IFLE) {
73310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.ifZCmp(GeneratorAdapter.LE, ");
73410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
73510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
73610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
73710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.visitJumpInsn(")
73810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append(OPCODES[opcode])
73910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                    .append(", ");
74010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(label);
74110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(");\n");
74210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
74310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
74410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = opcode;
74510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
74610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
74710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitLabel(final Label label) {
74810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
74910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(label);
75010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.mark(");
75110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(label);
75210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(");\n");
75310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
75410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = -1;
75510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
75610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
75710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitLdcInsn(final Object cst) {
75810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
75910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.push(");
76010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (cst == null) {
76110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("(String)null");
76210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (cst instanceof Long) {
76310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(cst + "L");
76410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (cst instanceof Float) {
76510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            float f = ((Float) cst).floatValue();
76610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (Float.isNaN(f)) {
76710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("Float.NaN");
76810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            } else if (Float.isInfinite(f)) {
76910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(f > 0
77010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        ? "Float.POSITIVE_INFINITY"
77110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        : "Float.NEGATIVE_INFINITY");
77210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            } else {
77310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(cst + "f");
77410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
77510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (cst instanceof Double) {
77610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            double d = ((Double) cst).doubleValue();
77710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (Double.isNaN(d)) {
77810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append("Double.NaN");
77910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            } else if (Double.isInfinite(d)) {
78010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(d > 0
78110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        ? "Double.POSITIVE_INFINITY"
78210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                        : "Double.NEGATIVE_INFINITY");
78310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            } else {
78410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(cst + "d");
78510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            }
78610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (cst instanceof String) {
78710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendString(buf, (String) cst);
78810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (cst instanceof Type) {
78910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("Type.getType(\"").append(cst).append("\")");
79010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
79110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(cst);
79210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
79310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(");\n");
79410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
79510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = LDC;
79610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
79710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
79810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitIincInsn(final int var, final int increment) {
79910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
80010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (var < firstLocal) {
80110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.iinc(").append(var);
80210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
80310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            int v = generateNewLocal(var, "Type.INT_TYPE");
80410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("mg.iinc(local").append(v);
80510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
80610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ").append(increment).append(");\n");
80710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
80810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = IINC;
80910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
81010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
81110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitTableSwitchInsn(
81210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int min,
81310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int max,
81410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label dflt,
81510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label labels[])
81610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
81710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
81810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < labels.length; ++i) {
81910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            declareLabel(labels[i]);
82010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
82110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(dflt);
82210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
82310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitTableSwitchInsn(")
82410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(min)
82510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(", ")
82610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(max)
82710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                .append(", ");
82810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(dflt);
82910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", new Label[] {");
83010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < labels.length; ++i) {
83110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(i == 0 ? " " : ", ");
83210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(labels[i]);
83310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
83410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(" }); // TODO\n");
83510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
83610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = TABLESWITCH;
83710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
83810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
83910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitLookupSwitchInsn(
84010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label dflt,
84110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int keys[],
84210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label labels[])
84310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
84410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
84510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < labels.length; ++i) {
84610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            declareLabel(labels[i]);
84710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
84810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(dflt);
84910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
85010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitLookupSwitchInsn(");
85110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(dflt);
85210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", new int[] {");
85310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < keys.length; ++i) {
85410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(i == 0 ? " " : ", ").append(keys[i]);
85510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
85610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(" }, new Label[] {");
85710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < labels.length; ++i) {
85810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(i == 0 ? " " : ", ");
85910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            appendLabel(labels[i]);
86010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
86110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(" }); // TODO\n");
86210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
86310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = LOOKUPSWITCH;
86410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
86510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
86610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitMultiANewArrayInsn(final String desc, final int dims) {
86710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
86810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitMultiANewArrayInsn(\"");
86910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(desc);
87010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("\", ").append(dims).append(");\n");
87110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
87210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = MULTIANEWARRAY;
87310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
87410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
87510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitTryCatchBlock(
87610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label start,
87710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label end,
87810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label handler,
87910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String type)
88010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
88110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
88210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(start);
88310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(end);
88410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        declareLabel(handler);
88510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitTryCatchBlock(");
88610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(start);
88710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
88810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(end);
88910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
89010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(handler);
89110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
89210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (type == null) {
89310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("null");
89410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
89510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append('"').append(type).append('"');
89610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
89710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("); // TODO\n");
89810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
89910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = -1;
90010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
90110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
90210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitLocalVariable(
90310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String name,
90410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String desc,
90510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final String signature,
90610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label start,
90710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final Label end,
90810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        final int index)
90910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    {
91010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
91110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitLocalVariable(\"");
91210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(name);
91310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("\", \"");
91410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(desc);
91510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("\", ");
91610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (signature == null) {
91710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("null");
91810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else {
91910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append('"').append(signature).append('"');
92010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
92110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
92210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(start);
92310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ");
92410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(end);
92510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(", ").append(index).append(");\n");
92610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
92710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = -1;
92810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
92910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
93010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitLineNumber(final int line, final Label start) {
93110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.setLength(0);
93210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("mg.visitLineNumber(").append(line).append(", ");
93310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        appendLabel(start);
93410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(");\n");
93510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add(buf.toString());
93610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = -1;
93710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
93810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
93910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitMaxs(final int maxStack, final int maxLocals) {
94010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        text.add("mg.endMethod();\n");
94110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        lastOpcode = -1;
94210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
94310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
94410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    public void visitEnd() {
94510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        // does nothing
94610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
94710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
94810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    static String getType(String internalName) {
94910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return "Type.getType(\"L" + internalName + ";\")";
95010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
95110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
95210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    static String getDescType(String desc) {
95310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("Z"))
95410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.BOOLEAN_TYPE";
95510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("B"))
95610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.BYTE_TYPE";
95710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("C"))
95810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.CHAR_TYPE";
95910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("D"))
96010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.DOUBLE_TYPE";
96110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("F"))
96210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.FLOAT_TYPE";
96310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("I"))
96410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.INT_TYPE";
96510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("J"))
96610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.LONG_TYPE";
96710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("S"))
96810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.SHORT_TYPE";
96910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (desc.equals("V"))
97010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            return "Type.VOID_TYPE";
97110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return "Type.getType(\"" + desc + "\")";
97210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
97310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
97410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    static String getMethod(String name, String desc) {
97510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        Type rt = Type.getReturnType(desc);
97610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        Type[] argt = Type.getArgumentTypes(desc);
97710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        StringBuffer buf = new StringBuffer();
97810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append("Method.getMethod(\"");
97910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(rt.getClassName()).append(" ");
98010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(name).append("(");
98110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        for (int i = 0; i < argt.length; ++i) {
98210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            if (i > 0)
98310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali                buf.append(',');
98410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append(argt[i].getClassName());
98510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
98610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append(")\")");
98710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        return buf.toString();
98810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
98910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
99010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    /**
99110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * Appends a declaration of the given label to {@link #buf buf}. This
99210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * declaration is of the form "Label lXXX = new Label();". Does nothing if
99310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * the given label has already been declared.
99410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     *
99510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * @param l a label.
99610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     */
99710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private void declareLabel(final Label l) {
99810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        String name = (String) labelNames.get(l);
99910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (name == null) {
100010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            name = "label" + labelNames.size();
100110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            labelNames.put(l, name);
100210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            buf.append("Label ").append(name).append(" = mg.newLabel();\n");
100310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
100410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
100510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
100610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    /**
100710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * Appends the name of the given label to {@link #buf buf}. The given label
100810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * <i>must</i> already have a name. One way to ensure this is to always
100910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * call {@link #declareLabel declared} before calling this method.
101010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     *
101110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     * @param l a label.
101210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali     */
101310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    private void appendLabel(final Label l) {
101410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        buf.append((String) labelNames.get(l));
101510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
101610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali}
1017