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