diff --git a/test/build.xml b/test/build.xml index dc98a258de9dd56f3ed27f1dab1007962637568c..1f59ab9d81664f7c1db4497f14c010fa190d8386 100644 --- a/test/build.xml +++ b/test/build.xml @@ -171,7 +171,6 @@ - diff --git a/test/conform/gasmifier.xml b/test/conform/gasmifier.xml deleted file mode 100644 index b29b5ed1bd70eb8018351248d078d30102be6338..0000000000000000000000000000000000000000 --- a/test/conform/gasmifier.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/conform/org/objectweb/asm/commons/GASMifier.java b/test/conform/org/objectweb/asm/commons/GASMifier.java deleted file mode 100644 index 599e338151f5bc90fcc67c0e07c2eebb002e0c4d..0000000000000000000000000000000000000000 --- a/test/conform/org/objectweb/asm/commons/GASMifier.java +++ /dev/null @@ -1,1001 +0,0 @@ -// ASM: a very small and fast Java bytecode manipulation framework -// Copyright (c) 2000-2011 INRIA, France Telecom -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. Neither the name of the copyright holders nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -// THE POSSIBILITY OF SUCH DAMAGE. -package org.objectweb.asm.commons; - -import java.io.FileInputStream; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.Handle; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.objectweb.asm.TypePath; -import org.objectweb.asm.util.ASMifier; -import org.objectweb.asm.util.Printer; -import org.objectweb.asm.util.TraceClassVisitor; - -/** - * A {@link MethodVisitor} that prints the ASM code that generates the methods it visits by using - * the GeneratorAdapter class. - * - * @author Eric Bruneton - * @author Eugene Kuleshov - */ -public class GASMifier extends ASMifier implements Opcodes { - - int access; - - Type[] argumentTypes; - - int firstLocal; - - Map locals; - - List localTypes; - - public GASMifier() { - super(Opcodes.ASM5, "cw", 0); - } - - public GASMifier(final String name, final int id) { - super(Opcodes.ASM5, name, id); - } - - public GASMifier(final int access, final String desc) { - super(Opcodes.ASM5, "mg", 0); - this.access = access; - this.argumentTypes = Type.getArgumentTypes(desc); - int nextLocal = (Opcodes.ACC_STATIC & access) != 0 ? 0 : 1; - for (int i = 0; i < argumentTypes.length; i++) { - nextLocal += argumentTypes[i].getSize(); - } - this.firstLocal = nextLocal; - this.locals = new HashMap(); - this.localTypes = new ArrayList(); - } - - /** - * Prints the ASM source code to generate the given class to the standard output. - * - *

Usage: ASMifierClassVisitor [-debug] <fully qualified class name or class file name> - * - * @param args the command line arguments. - * @throws Exception if the class cannot be found, or if an IO exception occurs. - */ - public static void main(final String[] args) throws Exception { - int i = 0; - int flags = ClassReader.SKIP_DEBUG; - - boolean ok = true; - if (args.length < 1 || args.length > 2) { - ok = false; - } - if (ok && args[0].equals("-debug")) { - i = 1; - flags = 0; - if (args.length != 2) { - ok = false; - } - } - if (!ok) { - System.err.println("Prints the ASM code to generate the given class."); - System.err.println( - "Usage: GASMifierClassVisitor [-debug] " - + ""); - System.exit(-1); - } - ClassReader cr; - if (args[i].endsWith(".class")) { - cr = new ClassReader(new FileInputStream(args[i])); - } else { - cr = new ClassReader(args[i]); - } - cr.accept( - new TraceClassVisitor(null, new GASMifier(), new PrintWriter(System.out)), - ClassReader.EXPAND_FRAMES | flags); - } - - @Override - public void visit( - final int version, - final int access, - final String name, - final String signature, - final String superName, - final String[] interfaces) { - super.visit(version, access, name, signature, superName, interfaces); - int n; - if (name.lastIndexOf('/') != -1) { - n = 1; - } else { - n = 0; - } - text.set(n + 5, "ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);\n"); - text.set(n + 7, "TestGeneratorAdapter mg;\n"); - text.add(n + 1, "import org.objectweb.asm.commons.*;\n"); - } - - @Override - public ASMifier visitMethod( - final int access, - final String name, - final String desc, - final String signature, - final String[] exceptions) { - buf.setLength(0); - buf.append("{\n"); - buf.append("mg = new TestGeneratorAdapter("); - buf.append(access); - buf.append(", "); - buf.append(getMethod(name, desc)); - buf.append(", "); - if (signature == null) { - buf.append("null"); - } else { - buf.append('"').append(signature).append('"'); - } - buf.append(", "); - if (exceptions != null && exceptions.length > 0) { - buf.append("new Type[] {"); - for (int i = 0; i < exceptions.length; ++i) { - buf.append(i == 0 ? " " : ", "); - buf.append(getType(exceptions[i])); - } - buf.append(" }"); - } else { - buf.append("null"); - } - buf.append(", cw);\n"); - text.add(buf.toString()); - GASMifier av = new GASMifier(access, desc); - text.add(av.getText()); - text.add("}\n"); - return av; - } - - @Override - public void visitInsn(final int opcode) { - buf.setLength(0); - switch (opcode) { - case IRETURN: - case LRETURN: - case FRETURN: - case DRETURN: - case ARETURN: - case RETURN: - buf.append("mg.returnValue();\n"); - break; - case NOP: - buf.append("mg.visitInsn(Opcodes.NOP);\n"); - break; - case ACONST_NULL: - buf.append("mg.push((String)null);\n"); - break; - case ICONST_M1: - case ICONST_0: - case ICONST_1: - case ICONST_2: - case ICONST_3: - case ICONST_4: - case ICONST_5: - buf.append("mg.push(").append(opcode - ICONST_0).append(");\n"); - break; - case LCONST_0: - case LCONST_1: - buf.append("mg.push(").append(opcode - LCONST_0).append("L);\n"); - break; - case FCONST_0: - case FCONST_1: - case FCONST_2: - buf.append("mg.push(").append(opcode - FCONST_0).append("f);\n"); - break; - case DCONST_0: - case DCONST_1: - buf.append("mg.push(").append(opcode - DCONST_0).append("d);\n"); - break; - case POP: - buf.append("mg.pop();\n"); - break; - case POP2: - buf.append("mg.pop2();\n"); - break; - case DUP: - buf.append("mg.dup();\n"); - break; - case DUP_X1: - buf.append("mg.dupX1();\n"); - break; - case DUP_X2: - buf.append("mg.dupX2();\n"); - break; - case DUP2: - buf.append("mg.dup2();\n"); - break; - case DUP2_X1: - buf.append("mg.dup2X1();\n"); - break; - case DUP2_X2: - buf.append("mg.dup2X2();\n"); - break; - case SWAP: - buf.append("mg.swap();\n"); - break; - case MONITORENTER: - buf.append("mg.monitorEnter();\n"); - break; - case MONITOREXIT: - buf.append("mg.monitorExit();\n"); - break; - case ARRAYLENGTH: - buf.append("mg.arrayLength();\n"); - break; - case IALOAD: - buf.append("mg.arrayLoad(Type.INT_TYPE);\n"); - break; - case LALOAD: - buf.append("mg.arrayLoad(Type.LONG_TYPE);\n"); - break; - case FALOAD: - buf.append("mg.arrayLoad(Type.FLOAT_TYPE);\n"); - break; - case DALOAD: - buf.append("mg.arrayLoad(Type.DOUBLE_TYPE);\n"); - break; - case AALOAD: - buf.append("mg.arrayLoad(" + getType("java/lang/Object") + ");\n"); - break; - case BALOAD: - buf.append("mg.arrayLoad(Type.BYTE_TYPE);\n"); - break; - case CALOAD: - buf.append("mg.arrayLoad(Type.CHAR_TYPE);\n"); - break; - case SALOAD: - buf.append("mg.arrayLoad(Type.SHORT_TYPE);\n"); - break; - case IASTORE: - buf.append("mg.arrayStore(Type.INT_TYPE);\n"); - break; - case LASTORE: - buf.append("mg.arrayStore(Type.LONG_TYPE);\n"); - break; - case FASTORE: - buf.append("mg.arrayStore(Type.FLOAT_TYPE);\n"); - break; - case DASTORE: - buf.append("mg.arrayStore(Type.DOUBLE_TYPE);\n"); - break; - case AASTORE: - buf.append("mg.arrayStore(" + getType("java/lang/Object") + ");\n"); - break; - case BASTORE: - buf.append("mg.arrayStore(Type.BYTE_TYPE);\n"); - break; - case CASTORE: - buf.append("mg.arrayStore(Type.CHAR_TYPE);\n"); - break; - case SASTORE: - buf.append("mg.arrayStore(Type.SHORT_TYPE);\n"); - break; - case IADD: - buf.append("mg.math(GeneratorAdapter.ADD, Type.INT_TYPE);\n"); - break; - case LADD: - buf.append("mg.math(GeneratorAdapter.ADD, Type.LONG_TYPE);\n"); - break; - case FADD: - buf.append("mg.math(GeneratorAdapter.ADD, Type.FLOAT_TYPE);\n"); - break; - case DADD: - buf.append("mg.math(GeneratorAdapter.ADD, Type.DOUBLE_TYPE);\n"); - break; - case ISUB: - buf.append("mg.math(GeneratorAdapter.SUB, Type.INT_TYPE);\n"); - break; - case LSUB: - buf.append("mg.math(GeneratorAdapter.SUB, Type.LONG_TYPE);\n"); - break; - case FSUB: - buf.append("mg.math(GeneratorAdapter.SUB, Type.FLOAT_TYPE);\n"); - break; - case DSUB: - buf.append("mg.math(GeneratorAdapter.SUB, Type.DOUBLE_TYPE);\n"); - break; - case IMUL: - buf.append("mg.math(GeneratorAdapter.MUL, Type.INT_TYPE);\n"); - break; - case LMUL: - buf.append("mg.math(GeneratorAdapter.MUL, Type.LONG_TYPE);\n"); - break; - case FMUL: - buf.append("mg.math(GeneratorAdapter.MUL, Type.FLOAT_TYPE);\n"); - break; - case DMUL: - buf.append("mg.math(GeneratorAdapter.MUL, Type.DOUBLE_TYPE);\n"); - break; - case IDIV: - buf.append("mg.math(GeneratorAdapter.DIV, Type.INT_TYPE);\n"); - break; - case LDIV: - buf.append("mg.math(GeneratorAdapter.DIV, Type.LONG_TYPE);\n"); - break; - case FDIV: - buf.append("mg.math(GeneratorAdapter.DIV, Type.FLOAT_TYPE);\n"); - break; - case DDIV: - buf.append("mg.math(GeneratorAdapter.DIV, Type.DOUBLE_TYPE);\n"); - break; - case IREM: - buf.append("mg.math(GeneratorAdapter.REM, Type.INT_TYPE);\n"); - break; - case LREM: - buf.append("mg.math(GeneratorAdapter.REM, Type.LONG_TYPE);\n"); - break; - case FREM: - buf.append("mg.math(GeneratorAdapter.REM, Type.FLOAT_TYPE);\n"); - break; - case DREM: - buf.append("mg.math(GeneratorAdapter.REM, Type.DOUBLE_TYPE);\n"); - break; - case INEG: - buf.append("mg.math(GeneratorAdapter.NEG, Type.INT_TYPE);\n"); - break; - case LNEG: - buf.append("mg.math(GeneratorAdapter.NEG, Type.LONG_TYPE);\n"); - break; - case FNEG: - buf.append("mg.math(GeneratorAdapter.NEG, Type.FLOAT_TYPE);\n"); - break; - case DNEG: - buf.append("mg.math(GeneratorAdapter.NEG, Type.DOUBLE_TYPE);\n"); - break; - case ISHL: - buf.append("mg.math(GeneratorAdapter.SHL, Type.INT_TYPE);\n"); - break; - case LSHL: - buf.append("mg.math(GeneratorAdapter.SHL, Type.LONG_TYPE);\n"); - break; - case ISHR: - buf.append("mg.math(GeneratorAdapter.SHR, Type.INT_TYPE);\n"); - break; - case LSHR: - buf.append("mg.math(GeneratorAdapter.SHR, Type.LONG_TYPE);\n"); - break; - case IUSHR: - buf.append("mg.math(GeneratorAdapter.USHR, Type.INT_TYPE);\n"); - break; - case LUSHR: - buf.append("mg.math(GeneratorAdapter.USHR, Type.LONG_TYPE);\n"); - break; - case IAND: - buf.append("mg.math(GeneratorAdapter.AND, Type.INT_TYPE);\n"); - break; - case LAND: - buf.append("mg.math(GeneratorAdapter.AND, Type.LONG_TYPE);\n"); - break; - case IOR: - buf.append("mg.math(GeneratorAdapter.OR, Type.INT_TYPE);\n"); - break; - case LOR: - buf.append("mg.math(GeneratorAdapter.OR, Type.LONG_TYPE);\n"); - break; - case IXOR: - buf.append("mg.math(GeneratorAdapter.XOR, Type.INT_TYPE);\n"); - break; - case LXOR: - buf.append("mg.math(GeneratorAdapter.XOR, Type.LONG_TYPE);\n"); - break; - case ATHROW: - buf.append("mg.throwException();\n"); - break; - case I2L: - buf.append("mg.cast(Type.INT_TYPE, Type.LONG_TYPE);\n"); - break; - case I2F: - buf.append("mg.cast(Type.INT_TYPE, Type.FLOAT_TYPE);\n"); - break; - case I2D: - buf.append("mg.cast(Type.INT_TYPE, Type.DOUBLE_TYPE);\n"); - break; - case L2I: - buf.append("mg.cast(Type.LONG_TYPE, Type.INT_TYPE);\n"); - break; - case L2F: - buf.append("mg.cast(Type.LONG_TYPE, Type.FLOAT_TYPE);\n"); - break; - case L2D: - buf.append("mg.cast(Type.LONG_TYPE, Type.DOUBLE_TYPE);\n"); - break; - case F2I: - buf.append("mg.cast(Type.FLOAT_TYPE, Type.INT_TYPE);\n"); - break; - case F2L: - buf.append("mg.cast(Type.FLOAT_TYPE, Type.LONG_TYPE);\n"); - break; - case F2D: - buf.append("mg.cast(Type.FLOAT_TYPE, Type.DOUBLE_TYPE);\n"); - break; - case D2I: - buf.append("mg.cast(Type.DOUBLE_TYPE, Type.INT_TYPE);\n"); - break; - case D2L: - buf.append("mg.cast(Type.DOUBLE_TYPE, Type.LONG_TYPE);\n"); - break; - case D2F: - buf.append("mg.cast(Type.DOUBLE_TYPE, Type.FLOAT_TYPE);\n"); - break; - case I2B: - // TODO detect if previous element in 'text' is a cast, - // for possible optimisations (e.g. cast(F,I) cast(I,B) = - // cast(F,B)) - buf.append("mg.cast(Type.INT_TYPE, Type.BYTE_TYPE);\n"); - break; - case I2C: // idem - buf.append("mg.cast(Type.INT_TYPE, Type.CHAR_TYPE);\n"); - break; - case I2S: // idem - buf.append("mg.cast(Type.INT_TYPE, Type.SHORT_TYPE);\n"); - break; - case LCMP: - case FCMPL: - case FCMPG: - case DCMPL: - case DCMPG: - // TODO detect xCMPy IF_ICMP -> ifCmp(..., ..., label) - buf.append("mg.visitInsn(").append(OPCODES[opcode]).append(");\n"); - break; - default: - throw new RuntimeException("unexpected case"); - } - text.add(buf.toString()); - } - - @Override - public void visitIntInsn(final int opcode, final int operand) { - buf.setLength(0); - if (opcode == NEWARRAY) { - String type; - switch (operand) { - case T_BOOLEAN: - type = "Type.BOOLEAN_TYPE"; - break; - case T_CHAR: - type = "Type.CHAR_TYPE"; - break; - case T_FLOAT: - type = "Type.FLOAT_TYPE"; - break; - case T_DOUBLE: - type = "Type.DOUBLE_TYPE"; - break; - case T_BYTE: - type = "Type.BYTE_TYPE"; - break; - case T_SHORT: - type = "Type.SHORT_TYPE"; - break; - case T_INT: - type = "Type.INT_TYPE"; - break; - case T_LONG: - type = "Type.LONG_TYPE"; - break; - default: - throw new RuntimeException("unexpected case"); - } - buf.append("mg.newArray(").append(type).append(");\n"); - } else { - buf.append("mg.push(").append(operand).append(");\n"); - } - text.add(buf.toString()); - } - - @Override - public void visitVarInsn(final int opcode, final int var) { - buf.setLength(0); - try { - switch (opcode) { - case RET: - if (var < firstLocal) { - buf.append("mg.ret("); - buf.append(var); - buf.append(");\n"); - } else { - int v = generateNewLocal(var, "Type.INT_TYPE"); - buf.append("mg.ret("); - buf.append("local").append(v); - buf.append(");\n"); - } - break; - - case ILOAD: - generateLoadLocal(var, "Type.INT_TYPE"); - break; - case LLOAD: - generateLoadLocal(var, "Type.LONG_TYPE"); - break; - case FLOAD: - generateLoadLocal(var, "Type.FLOAT_TYPE"); - break; - case DLOAD: - generateLoadLocal(var, "Type.DOUBLE_TYPE"); - break; - case ALOAD: - generateLoadLocal(var, getType("java/lang/Object")); - break; - - case ISTORE: - generateStoreLocal(var, "Type.INT_TYPE"); - break; - case LSTORE: - generateStoreLocal(var, "Type.LONG_TYPE"); - break; - case FSTORE: - generateStoreLocal(var, "Type.FLOAT_TYPE"); - break; - case DSTORE: - generateStoreLocal(var, "Type.DOUBLE_TYPE"); - break; - case ASTORE: - generateStoreLocal(var, getType("java/lang/Object")); - break; - - default: - throw new RuntimeException("unexpected case"); - } - } catch (RuntimeException e) { - buf.append("mg.visitVarInsn(" + OPCODES[opcode] + ", " + var + ");\n"); - } - text.add(buf.toString()); - } - - private void generateLoadLocal(final int var, final String type) { - if (var < firstLocal) { - if (var == 0 && (access & ACC_STATIC) == 0) { - buf.append("mg.loadThis();\n"); - } else { - int index = getArgIndex(var); - buf.append("mg.loadArg(").append(index).append(");\n"); - } - } else { - int local = generateNewLocal(var, type); - buf.append("mg.loadLocal(local").append(local); - if (!type.equals(localTypes.get(local))) { - localTypes.set(local, type); - buf.append(", ").append(type); - } - buf.append(");\n"); - } - } - - private void generateStoreLocal(final int var, final String type) { - if (var < firstLocal) { - if (var == 0 && (access & ACC_STATIC) == 0) { - buf.append("mg.visitVarInsn(ASTORE, " + var + ");\n"); - } else { - int index = getArgIndex(var); - buf.append("mg.storeArg(").append(index).append(");\n"); - } - } else { - int local = generateNewLocal(var, type); - buf.append("mg.storeLocal(local").append(local); - if (!type.equals(localTypes.get(local))) { - localTypes.set(local, type); - buf.append(", ").append(type); - } - buf.append(");\n"); - } - } - - private int generateNewLocal(final int var, final String type) { - Integer i = locals.get(new Integer(var)); - if (i == null) { - int local = locals.size(); - locals.put(new Integer(var), new Integer(local)); - localTypes.add(type); - buf.append("int local" + local + " = mg.newLocal(" + type + ");\n"); - return local; - } - return i.intValue(); - } - - private int getArgIndex(final int var) { - int nextLocal = (Opcodes.ACC_STATIC & access) != 0 ? 0 : 1; - int i = 0; - while (nextLocal != var) { - nextLocal += argumentTypes[i++].getSize(); - } - return i; - } - - @Override - public void visitTypeInsn(final int opcode, final String type) { - String typ = getType(type); - buf.setLength(0); - if (opcode == NEW) { - buf.append("mg.newInstance(").append(typ).append(");\n"); - } else if (opcode == ANEWARRAY) { - buf.append("mg.newArray(").append(typ).append(");\n"); - } else if (opcode == CHECKCAST) { - buf.append("mg.checkCast(").append(typ).append(");\n"); - } else if (opcode == INSTANCEOF) { - buf.append("mg.instanceOf(").append(typ).append(");\n"); - } - text.add(buf.toString()); - } - - @Override - public void visitFieldInsn( - final int opcode, final String owner, final String name, final String desc) { - buf.setLength(0); - switch (opcode) { - case GETFIELD: - buf.append("mg.getField("); - break; - case PUTFIELD: - buf.append("mg.putField("); - break; - case GETSTATIC: - buf.append("mg.getStatic("); - break; - case PUTSTATIC: - buf.append("mg.putStatic("); - break; - default: - throw new RuntimeException("unexpected case"); - } - buf.append(getType(owner)); - buf.append(", \""); - buf.append(name); - buf.append("\", "); - buf.append(getDescType(desc)); - buf.append(");\n"); - text.add(buf.toString()); - } - - @Override - public void visitMethodInsn( - final int opcode, - final String owner, - final String name, - final String desc, - final boolean itf) { - buf.setLength(0); - switch (opcode) { - case INVOKEVIRTUAL: - buf.append("mg.invokeVirtual("); - break; - case INVOKESPECIAL: - buf.append("mg.invokeConstructor("); - break; - case INVOKESTATIC: - buf.append("mg.invokeStatic("); - break; - case INVOKEINTERFACE: - buf.append("mg.invokeInterface("); - break; - default: - throw new RuntimeException("unexpected case"); - } - if (owner.charAt(0) == '[') { - buf.append(getDescType(owner)); - } else { - buf.append(getType(owner)); - } - buf.append(", "); - buf.append(getMethod(name, desc)); - buf.append(");\n"); - text.add(buf.toString()); - } - - @Override - public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { - buf.setLength(0); - buf.append("mg.invokeDynamic("); - appendConstant(name); - buf.append(", "); - appendConstant(desc); - buf.append(", "); - appendConstant(bsm); - buf.append(", new Object[] {"); - for (int i = 0; i < bsmArgs.length; ++i) { - appendConstant(bsmArgs[i]); - if (i != bsmArgs.length - 1) { - buf.append(", "); - } - } - buf.append("});\n"); - text.add(buf.toString()); - } - - @Override - public void visitJumpInsn(final int opcode, final Label label) { - buf.setLength(0); - declareLabel(label); - if (opcode == GOTO || opcode == IFNULL || opcode == IFNONNULL) { - if (opcode == GOTO) { - buf.append("mg.goTo("); - } - if (opcode == IFNULL) { - buf.append("mg.ifNull("); - } - if (opcode == IFNONNULL) { - buf.append("mg.ifNonNull("); - } - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPEQ) { - buf.append("mg.ifICmp(GeneratorAdapter.EQ, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPNE) { - buf.append("mg.ifICmp(GeneratorAdapter.NE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPLT) { - buf.append("mg.ifICmp(GeneratorAdapter.LT, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPGE) { - buf.append("mg.ifICmp(GeneratorAdapter.GE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPGT) { - buf.append("mg.ifICmp(GeneratorAdapter.GT, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ICMPLE) { - buf.append("mg.ifICmp(GeneratorAdapter.LE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ACMPEQ) { - buf.append("mg.ifCmp("); - buf.append(getType("java/lang/Object")).append(", ").append("GeneratorAdapter.EQ, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IF_ACMPNE) { - buf.append("mg.ifCmp("); - buf.append(getType("java/lang/Object")).append(", ").append("GeneratorAdapter.NE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFEQ) { - buf.append("mg.ifZCmp(GeneratorAdapter.EQ, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFNE) { - buf.append("mg.ifZCmp(GeneratorAdapter.NE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFLT) { - buf.append("mg.ifZCmp(GeneratorAdapter.LT, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFGE) { - buf.append("mg.ifZCmp(GeneratorAdapter.GE, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFGT) { - buf.append("mg.ifZCmp(GeneratorAdapter.GT, "); - appendLabel(label); - buf.append(");\n"); - } else if (opcode == IFLE) { - buf.append("mg.ifZCmp(GeneratorAdapter.LE, "); - appendLabel(label); - buf.append(");\n"); - } else { - buf.append("mg.visitJumpInsn(").append(OPCODES[opcode]).append(", "); - appendLabel(label); - buf.append(");\n"); - } - text.add(buf.toString()); - } - - @Override - public void visitLabel(final Label label) { - buf.setLength(0); - declareLabel(label); - buf.append("mg.mark("); - appendLabel(label); - buf.append(");\n"); - text.add(buf.toString()); - } - - @Override - public void visitLdcInsn(final Object cst) { - buf.setLength(0); - buf.append("mg.push("); - appendConstant(cst); - buf.append(");\n"); - text.add(buf.toString()); - } - - @Override - public void visitIincInsn(final int var, final int increment) { - buf.setLength(0); - if (var < firstLocal) { - buf.append("mg.iinc(").append(var); - } else { - int v = generateNewLocal(var, "Type.INT_TYPE"); - buf.append("mg.iinc(local").append(v); - } - buf.append(", ").append(increment).append(");\n"); - text.add(buf.toString()); - } - - @Override - public void visitLocalVariable( - final String name, - final String desc, - final String signature, - final Label start, - final Label end, - final int index) { - String idx = - index < firstLocal - ? new Integer(index).toString() - : "local" + locals.get(new Integer(index)); - buf.setLength(0); - buf.append(this.name).append(".getNext().visitLocalVariable("); - appendConstant(name); - buf.append(", "); - appendConstant(desc); - buf.append(", "); - appendConstant(signature); - buf.append(", "); - appendLabel(start); - buf.append(", "); - appendLabel(end); - buf.append(", ").append(idx).append(");\n"); - text.add(buf.toString()); - } - - @Override - public Printer visitLocalVariableAnnotation( - int typeRef, - TypePath typePath, - Label[] start, - Label[] end, - int[] index, - String desc, - boolean visible) { - buf.setLength(0); - buf.append("{\n") - .append("av0 = ") - .append(name) - .append(".getNext().visitLocalVariableAnnotation("); - buf.append(typeRef); - buf.append(", TypePath.fromString(\"").append(typePath).append("\"), "); - buf.append("new Label[] {"); - for (int i = 0; i < start.length; ++i) { - buf.append(i == 0 ? " " : ", "); - appendLabel(start[i]); - } - buf.append(" }, new Label[] {"); - for (int i = 0; i < end.length; ++i) { - buf.append(i == 0 ? " " : ", "); - appendLabel(end[i]); - } - buf.append(" }, new int[] {"); - for (int i = 0; i < index.length; ++i) { - String idx = - index[i] < firstLocal - ? new Integer(index[i]).toString() - : "local" + locals.get(new Integer(index[i])); - buf.append(i == 0 ? " " : ", ").append(idx); - } - buf.append(" }, "); - appendConstant(desc); - buf.append(", ").append(visible).append(");\n"); - text.add(buf.toString()); - ASMifier a = createASMifier("av", 0); - text.add(a.getText()); - text.add("}\n"); - return a; - } - - @Override - public void visitMaxs(final int maxStack, final int maxLocals) { - text.add("mg.endMethod();\n"); - } - - @Override - protected ASMifier createASMifier(final String name, final int id) { - return new GASMifier(name, id); - } - - static String getType(final String internalName) { - return "Type.getObjectType(\"" + internalName + "\")"; - } - - static String getDescType(final String desc) { - if (desc.equals("Z")) { - return "Type.BOOLEAN_TYPE"; - } - if (desc.equals("B")) { - return "Type.BYTE_TYPE"; - } - if (desc.equals("C")) { - return "Type.CHAR_TYPE"; - } - if (desc.equals("D")) { - return "Type.DOUBLE_TYPE"; - } - if (desc.equals("F")) { - return "Type.FLOAT_TYPE"; - } - if (desc.equals("I")) { - return "Type.INT_TYPE"; - } - if (desc.equals("J")) { - return "Type.LONG_TYPE"; - } - if (desc.equals("S")) { - return "Type.SHORT_TYPE"; - } - if (desc.equals("V")) { - return "Type.VOID_TYPE"; - } - return "Type.getType(\"" + desc + "\")"; - } - - static String getMethod(final String name, final String desc) { - Type rt = Type.getReturnType(desc); - Type[] argt = Type.getArgumentTypes(desc); - StringBuilder buf = new StringBuilder(); - buf.append("Method.getMethod(\""); - buf.append(rt.getClassName()).append(' '); - buf.append(name).append('('); - for (int i = 0; i < argt.length; ++i) { - if (i > 0) { - buf.append(','); - } - buf.append(argt[i].getClassName()); - } - buf.append(")\")"); - return buf.toString(); - } - - @Override - protected void declareLabel(final Label l) { - if (labelNames == null) { - labelNames = new HashMap(); - } - String name = labelNames.get(l); - if (name == null) { - name = "label" + labelNames.size(); - labelNames.put(l, name); - buf.append("Label ").append(name).append(" = mg.newLabel();\n"); - } - } -} diff --git a/test/conform/org/objectweb/asm/commons/GASMifierTest.java b/test/conform/org/objectweb/asm/commons/GASMifierTest.java deleted file mode 100644 index 1a4cc4d692b1e168f7bbf0b496586f280d7d6d65..0000000000000000000000000000000000000000 --- a/test/conform/org/objectweb/asm/commons/GASMifierTest.java +++ /dev/null @@ -1,191 +0,0 @@ -// ASM: a very small and fast Java bytecode manipulation framework -// Copyright (c) 2000-2011 INRIA, France Telecom -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. Neither the name of the copyright holders nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -// THE POSSIBILITY OF SUCH DAMAGE. -package org.objectweb.asm.commons; - -import java.io.PrintWriter; -import java.io.StringReader; -import java.io.StringWriter; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; - -import junit.framework.TestSuite; - -import org.codehaus.janino.ClassLoaderIClassLoader; -import org.codehaus.janino.IClassLoader; -import org.codehaus.janino.Parser; -import org.codehaus.janino.Scanner; -import org.codehaus.janino.UnitCompiler; -import org.objectweb.asm.AbstractTest; -import org.objectweb.asm.Attribute; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.attrs.CodeComment; -import org.objectweb.asm.attrs.Comment; -import org.objectweb.asm.util.TraceClassVisitor; - -/** - * GASMifier tests. - * - * @author Eugene Kuleshov - * @author Eric Bruneton - */ -public class GASMifierTest extends AbstractTest { - - public static final Compiler COMPILER = new Compiler(); - - private static final TestClassLoader LOADER = new TestClassLoader(); - - public static TestSuite suite() throws Exception { - return new GASMifierTest().getSuite(); - } - - @Override - public void test() throws Exception { - ClassReader cr = new ClassReader(is); - - if (cr.b.length > 20000) { - return; - } - - StringWriter sw = new StringWriter(); - TraceClassVisitor cv = new TraceClassVisitor(null, new GASMifier(), new PrintWriter(sw)); - cr.accept( - new ClassLocalVariablesSorter(cv), - new Attribute[] {new Comment(), new CodeComment()}, - ClassReader.EXPAND_FRAMES); - - String generated = sw.toString(); - - byte[] generatorClassData; - try { - generatorClassData = COMPILER.compile(n, generated); - } catch (Exception ex) { - trace(generated); - throw ex; - } - - ClassWriter cw = new ClassWriter(0); - cr.accept( - new ClassLocalVariablesSorter(cw), - new Attribute[] {new Comment(), new CodeComment()}, - ClassReader.EXPAND_FRAMES); - cr = new ClassReader(cw.toByteArray()); - - String nd = n + "Dump"; - if (n.indexOf('.') != -1) { - nd = "asm." + nd; - } - - Class c = LOADER.defineClass(nd, generatorClassData); - Method m = c.getMethod("dump", new Class[0]); - byte[] b; - try { - b = (byte[]) m.invoke(null, new Object[0]); - } catch (InvocationTargetException ex) { - trace(generated); - throw (Exception) ex.getTargetException(); - } - - try { - assertEquals(cr, new ClassReader(b), new Filter(), new Filter()); - } catch (Throwable e) { - trace(generated); - assertEquals(cr, new ClassReader(b), new Filter(), new Filter()); - } - } - - private void trace(final String generated) { - if (System.getProperty("asm.test.class") != null) { - System.err.println(generated); - } - } - - static class TestClassLoader extends ClassLoader { - - public Class defineClass(final String name, final byte[] b) { - return defineClass(name, b, 0, b.length); - } - } - - static class Compiler { - - static final IClassLoader CL = new ClassLoaderIClassLoader(new URLClassLoader(new URL[0])); - - public byte[] compile(final String name, final String source) throws Exception { - Parser p = new Parser(new Scanner(name, new StringReader(source))); - UnitCompiler uc = new UnitCompiler(p.parseCompilationUnit(), CL); - return uc.compileUnit(true, true, true)[0].toByteArray(); - } - } - - static class ClassLocalVariablesSorter extends ClassVisitor { - - public ClassLocalVariablesSorter(final ClassVisitor cv) { - super(Opcodes.ASM5, cv); - } - - @Override - public MethodVisitor visitMethod( - final int access, - final String name, - final String desc, - final String signature, - final String[] exceptions) { - return new LocalVariablesSorter( - access, desc, super.visitMethod(access, name, desc, signature, exceptions)); - } - } - - static class Filter extends ClassVisitor { - - public Filter() { - super(Opcodes.ASM5); - } - - @Override - public MethodVisitor visitMethod( - final int access, - final String name, - final String desc, - final String signature, - final String[] exceptions) { - return new MethodVisitor( - Opcodes.ASM5, super.visitMethod(access, name, desc, signature, exceptions)) { - @Override - public void visitMaxs(final int maxStack, final int maxLocals) { - super.visitMaxs(0, 0); - } - }; - } - } -} diff --git a/test/conform/org/objectweb/asm/commons/TestGeneratorAdapter.java b/test/conform/org/objectweb/asm/commons/TestGeneratorAdapter.java deleted file mode 100644 index 1dc4de4ca06f147c5ee1c948f7d6147023173fdc..0000000000000000000000000000000000000000 --- a/test/conform/org/objectweb/asm/commons/TestGeneratorAdapter.java +++ /dev/null @@ -1,73 +0,0 @@ -// ASM: a very small and fast Java bytecode manipulation framework -// Copyright (c) 2000-2011 INRIA, France Telecom -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. Neither the name of the copyright holders nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -// THE POSSIBILITY OF SUCH DAMAGE. - -package org.objectweb.asm.commons; - -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; - -public class TestGeneratorAdapter extends GeneratorAdapter { - - public TestGeneratorAdapter( - int access, Method method, String signature, Type[] exceptions, ClassVisitor cv) { - super( - Opcodes.ASM5, - cv.visitMethod( - access, - method.getName(), - method.getDescriptor(), - signature, - getInternalNames(exceptions)), - access, - method.getName(), - method.getDescriptor()); - } - - /** - * Returns the internal names of the given types. - * - * @param types a set of types. - * @return the internal names of the given types. - */ - private static String[] getInternalNames(final Type[] types) { - if (types == null) { - return null; - } - String[] names = new String[types.length]; - for (int i = 0; i < names.length; ++i) { - names[i] = types[i].getInternalName(); - } - return names; - } - - public MethodVisitor getNext() { - return mv; - } -}