Example usage for org.objectweb.asm Opcodes ASM4

List of usage examples for org.objectweb.asm Opcodes ASM4

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes ASM4.

Prototype

int ASM4

To view the source code for org.objectweb.asm Opcodes ASM4.

Click Source Link

Usage

From source file:kilim.tools.DumpClass.java

License:Open Source License

public DumpMethodVisitor() {
    super(Opcodes.ASM4);
}

From source file:lombok.patcher.scripts.AddFieldScript.java

License:Open Source License

@Override
protected ClassVisitor createClassVisitor(ClassWriter writer, String classSpec,
        TransplantMapper transplantMapper) {
    return new ClassVisitor(Opcodes.ASM4, writer) {
        private boolean alreadyAdded = false;

        @Override/*from  w  w  w. ja va2 s. c om*/
        public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
            if (name != null && name.equals(fieldName))
                alreadyAdded = true;
            return super.visitField(access, name, desc, signature, value);
        }

        @Override
        public void visitEnd() {
            if (!alreadyAdded) {
                FieldVisitor fv = cv.visitField(accessFlags, fieldName, fieldType, null, value);
                fv.visitEnd();
            }
            super.visitEnd();
        }
    };
}

From source file:lucee.transformer.bytecode.Page.java

License:Open Source License

public SourceLastModifiedClassAdapter(ClassWriter cw, long lastModified) {
    super(Opcodes.ASM4, cw);
    this.lastModified = lastModified;
}

From source file:net.dv8tion.ClassTransformer.java

License:Apache License

/**
 * Helper method to modify the getAllUsernames method in ServerConfigurationManager.
 * Takes into account obfuscated method names based on boolean.
 * /*from w  w  w . j av a  2s  .com*/
 * Replaces the call "return astring" at the end of ServerConfigurationManager's
 * getAllUsernames method with "return NameLoader.loadNames(astring)"
 * Because of how The JVM and ByteCode work with arrays, we do not need to
 * remove any instructions, only inject code. The array "astring" in the
 * call "return astring" will be provided as the param for the loadNames method.
 * 
 * @param className
 *            The class name, proceeded by the package it is in, if it is in one.
 * @param classData
 *            The byte code of the class.
 * @param obfuscated
 *            Is the code obfuscated?
 * @return
 *         Returns the modified byte code of the class.
 */
public byte[] patchClassWithASM(String className, byte[] classData, boolean obfuscated) {
    String methodName = obfuscated ? "d" : "getAllUsernames";

    ClassNode classNode = new ClassNode(Opcodes.ASM4);
    ClassReader classReader = new ClassReader(classData);
    classReader.accept(classNode, ClassReader.EXPAND_FRAMES);

    Iterator<MethodNode> methods = classNode.methods.iterator();
    while (methods.hasNext()) {
        MethodNode m = methods.next();
        int arrayReturn_index = -1;

        if ((m.name.equals(methodName) && m.desc.equals("()[Ljava/lang/String;"))) {
            AbstractInsnNode currentNode = null;
            Iterator<AbstractInsnNode> iter = m.instructions.iterator();

            int index = -1;

            while (iter.hasNext()) {
                index++;
                currentNode = iter.next();

                if (currentNode.getOpcode() == Opcodes.ARETURN) {
                    arrayReturn_index = index;
                }
            }

            //Calls NameLoader.loadNames(String[]) 
            m.instructions.insertBefore(m.instructions.get(arrayReturn_index),
                    new MethodInsnNode(Opcodes.INVOKESTATIC, "net/dv8tion/NameLoader", "loadNames",
                            "([Ljava/lang/String;)[Ljava/lang/String;"));

            System.out.println("[IRC NameBridge] Patching Complete!");
            break;
        }
    }
    //ASM specific for cleaning up and returning the final bytes for JVM processing.
    //Use 0 here instead of like ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS because
    //We need to have ASM recalculate things.  
    ClassWriter writer = new ClassWriter(0);
    classNode.accept(writer);
    return writer.toByteArray();
}

From source file:net.nexustools.jvm.compiler.Compiler.java

License:Open Source License

public void compile(String rawClassname) throws IOException {
    if (processed.contains(rawClassname))
        return;/* ww  w .jav  a  2s.  c o  m*/
    processed.add(rawClassname);

    System.out.println("Resolving class " + rawClassname);

    final String classname, runtimeClassname = convertRuntime(rawClassname);

    for (String builtin : BUILT_IN)
        if (builtin.equals(runtimeClassname)) {
            usedbuiltins.add(builtin);
            return; // Skip
        }

    if (javaClass.matcher(rawClassname).find())
        classname = "net/nexustools/jvm/runtime/" + rawClassname;
    else
        classname = rawClassname;

    File findFile = resolve(classname + ".class");
    ClassReader reader;

    try {
        if (findFile.exists()) {
            if (!classname.equals(rawClassname)) {
                if (processed.contains(classname))
                    return;

                processed.add(classname);
            }

            reader = new ClassReader(new FileInputStream(findFile));
        } else {
            throw new CompileError("No implementation found: " + classname);
            //reader = new ClassReader(rawClassname);
            //System.err.println("\tUsing system provided class impl");
        }
    } catch (IOException ex) {
        throw new CompileError(ex);
    }

    int offset = outputFolder.getPath().length() + 1;
    File output = resolveOutput(findFile, runtimeClassname + ".js");
    File parentFile = output.getParentFile();
    if (!parentFile.isDirectory() && !parentFile.mkdirs())
        throw new RuntimeException("Cannot create directory: " + parentFile);

    File nativeFile = resolve(classname + ".native.js");
    if (nativeFile.exists()) {
        File outputResolvedPath = new File(parentFile, nativeFile.getName());
        copy(new FileInputStream(nativeFile), new FileOutputStream(outputResolvedPath));
        natives.add(outputResolvedPath.getPath().substring(offset));
    }
    compiled.add(output.getPath().substring(offset));

    final List<String> references = new ArrayList();
    final Referencer referencer = new Referencer() {
        @Override
        public boolean add(String reference) {
            reference = convertRuntime(reference);

            if (references.contains(reference))
                return false;
            references.add(reference);

            return true;
        }
    };
    final SignatureConverter converter = new SignatureConverter() {
        @Override
        public String convert(String input) {
            String ref = input;
            while (ref.startsWith("["))
                ref = ref.substring(1);

            if (ref.startsWith("L") && ref.endsWith(";"))
                referencer.add(ref.substring(1, ref.length() - 1));
            else if (ref.length() > 1)
                referencer.add(ref);

            return convertSignature(input);
        }
    };

    final OutputStreamWriter oSw = new OutputStreamWriter(new FileOutputStream(output));

    final BufferedWriter bw = new BufferedWriter(oSw);

    try {
        bw.append("(function JVM_");
        bw.append(runtimeClassname.replaceAll("\\W", "_"));
        bw.append("($JVM, JVM){\n\t$JVM.ClassLoader.defineClass(\"");
        bw.append(runtimeClassname);
        bw.append("\", [");

        String[] interfaces = reader.getInterfaces();
        references.addAll(Arrays.asList(interfaces));
        for (int i = 0; i < interfaces.length; i++) {
            if (i > 0)
                bw.append(',');
            bw.append('\"');
            bw.append(convertRuntime(interfaces[i]));
            bw.append('\"');
        }

        bw.append("], ");
        String parent = reader.getSuperName();
        if (parent != null && !references.contains(parent)) {
            bw.append('\"');
            bw.append(convertRuntime(parent));
            bw.append('\"');
            references.add(parent);
        } else
            bw.append("null");
        bw.append(", [\n");

        final List<String> fields = new ArrayList();
        final List<String> methods = new ArrayList();
        System.out.println("\tVisiting class " + classname);

        final int[] methodAccess = new int[1];
        final MethodVisitor methodVisitor = new MethodVisitor(Opcodes.ASM4) {

            @Override
            public void visitEnd() {
                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"end\"\n");
                    bw.append("\t\t\t\t}\n");

                    bw.append("\t\t\t],\n");

                    writeAccess(methodAccess[0], bw);

                    bw.append("\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
                System.out.println(
                        "\t\t\tvisitTryCatchBlock: " + start + ", " + end + ", " + handler + ", " + type);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"try\",\n");

                    bw.append("\t\t\t\t\t\"start\": \"");
                    bw.append(start.toString());
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"end\": \"");
                    bw.append(end.toString());
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"handler\": \"");
                    bw.append(handler.toString());
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"catch\": \"");
                    bw.append(type);
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
                System.out.println("\t\t\tvisitMethodInsn: " + nameForOpcode(opcode) + ", " + owner + ", "
                        + name + ", " + desc + ", " + itf);

                /*if(name.equals("<init>") && desc.equals("()V") && runtimeClassname.equals("java/lang/Object")) {
                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"initobject\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
                        
                return;
                }*/

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"method\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"owner\": ");
                    bw.append(converter.convert(owner));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(name);
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"signature\": {\n");
                    bw.append("\t\t\t\t\t\t\"raw\": \"");
                    bw.append(convertRuntime(desc));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\t\"return\": ");

                    Matcher matcher = methodSignature.matcher(desc);
                    if (!matcher.matches())
                        throw new IllegalArgumentException("Corrupt or invalid method signature: " + desc);

                    bw.append(converter.convert(matcher.group(2)));
                    bw.append(",\n");

                    String args = matcher.group(1);
                    if (args != null) {
                        bw.append("\t\t\t\t\t\t\"args\": [\n");

                        String[] argsl = splitArguments(args);
                        /*matcher = classSignature.matcher(args);
                        while(matcher.find())
                        argsl.add(converter.convert(matcher.group(1)));*/

                        for (int i = 0; i < argsl.length; i++) {
                            bw.append("\t\t\t\t\t\t\t");
                            bw.append(converter.convert(argsl[i]));
                            if (i < argsl.length - 1)
                                bw.append(',');
                            bw.append('\n');
                        }

                        bw.append("\t\t\t\t\t\t]\n");
                    } else
                        bw.append("\t\t\t\t\t\t\"args\": []\n");
                    bw.append("\t\t\t\t\t},\n");

                    bw.append("\t\t\t\t\t\"interface\": ");
                    bw.append(itf ? "true" : "false");
                    bw.append("\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
                System.out.println("\t\t\tvisitTableSwitchInsn: " + min + ", " + max + ", " + dflt + ", "
                        + Arrays.toString(labels));

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"tableSwitch\",\n");

                    bw.append("\t\t\t\t\t\"min\": \"");
                    bw.append(String.valueOf(min));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"max\": \"");
                    bw.append(String.valueOf(max));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"default\": \"");
                    bw.append(dflt.toString());
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"jumps\": [\n");
                    for (int i = 0; i < labels.length; i++) {
                        bw.append("\t\t\t\t\t\t\"");
                        bw.append(labels[i].toString());
                        bw.append('"');
                        if (i < labels.length - 1)
                            bw.append(',');
                        bw.append('\n');
                    }
                    bw.append("\t\t\t\t\t]\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitMultiANewArrayInsn(String desc, int dims) {
                System.out.println("\t\t\tvisitMultiANewArrayInsn: " + desc + ", " + dims);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"array\",\n");

                    bw.append("\t\t\t\t\t\"desc\": \"");
                    bw.append(desc);
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"size\": \"");
                    bw.append(String.valueOf(dims));
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitIincInsn(int var, int increment) {
                System.out.println("\t\t\tvisitIincInsn: " + var + ", " + increment);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"iinc\",\n");

                    bw.append("\t\t\t\t\t\"index\": \"");
                    bw.append(String.valueOf(var));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"by\": \"");
                    bw.append(String.valueOf(increment));
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
                System.out.println("\t\t\tvisitLookupSwitchInsn: " + dflt + ", " + Arrays.toString(keys) + ", "
                        + Arrays.toString(labels));

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"switch\",\n");

                    if (dflt != null) {
                        bw.append("\t\t\t\t\t\"default\": \"");
                        bw.append(dflt.toString());
                        bw.append("\",\n");
                    }

                    bw.append("\t\t\t\t\t\"keys\": [\n");
                    for (int i = 0; i < keys.length; i++) {
                        bw.append("\t\t\t\t\t\t");
                        bw.append(String.valueOf(keys[i]));
                        if (i < keys.length - 1)
                            bw.append(',');
                        bw.append('\n');
                    }
                    bw.append("\t\t\t\t\t],\n");

                    bw.append("\t\t\t\t\t\"jumps\": [\n");
                    for (int i = 0; i < labels.length; i++) {
                        bw.append("\t\t\t\t\t\t\"");
                        bw.append(labels[i].toString());
                        bw.append('"');
                        if (i < labels.length - 1)
                            bw.append(',');
                        bw.append('\n');
                    }
                    bw.append("\t\t\t\t\t]\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitLocalVariable(String name, String desc, String signature, Label start, Label end,
                    int index) {
                System.out.println("\t\t\tvisitLocalVariable: " + name + ", " + desc + ", " + start + ", " + end
                        + ", " + index);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"declare\",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(String.valueOf(name));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"signature\": ");
                    bw.append(converter.convert(desc));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"index\": \"");
                    bw.append(String.valueOf(index));
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"start\": \"");
                    bw.append(start.toString());
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"end\": \"");
                    bw.append(end.toString());
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitParameter(String name, int access) {
                System.out.println("\t\t\tvisitParameter: " + name + ", " + access);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"arg\",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(name);
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"access\": \"");
                    bw.append(String.valueOf(access));
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitVarInsn(int opcode, int var) {
                System.out.println("\t\t\tvisitVarInsn: " + nameForOpcode(opcode) + ", " + var);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"var\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"index\": \"");
                    bw.append(String.valueOf(var));
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitTypeInsn(int opcode, String type) {
                System.out.println("\t\t\tvisitTypeInsn: " + nameForOpcode(opcode) + ", " + type);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"type\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"signature\": ");
                    bw.append(converter.convert(type));
                    bw.append('\n');
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitLdcInsn(Object cst) {
                System.out.println("\t\t\tvisitLdcInsn: " + cst);
                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"ldc\",\n");

                    if (cst instanceof String) {
                        bw.append("\t\t\t\t\t\"stringValue\": ");
                        bw.append(new Gson().toJson((String) cst));
                        bw.append("\n");
                    } else if (cst instanceof Number) {
                        bw.append("\t\t\t\t\t\"numericValue\": ");
                        bw.append(String.valueOf((Number) cst));
                        bw.append("\n");
                    } else if (cst instanceof org.objectweb.asm.Type) {
                        org.objectweb.asm.Type type = (org.objectweb.asm.Type) cst;
                        switch (type.getSort()) {
                        case Type.OBJECT:
                            System.out.println("OBJECT REFERENCE");
                            String ref = type.getInternalName();
                            bw.append("\t\t\t\t\t\"objectRef\": ");
                            bw.append(converter.convert(ref));
                            bw.append("\n");
                            break;

                        default:
                            throw new UnsupportedOperationException("Cannot handle type: " + type.getSort());
                        }

                        /*System.out.println("asm type: " + type.getInternalName());
                        System.out.println(type.getReturnType());
                        System.out.println(type.getDescriptor());
                        System.out.println(type.getElementType());
                        System.out.println(type.getDimensions());
                        System.out.println(type.getClassName());
                                
                        throw new UnsupportedOperationException("Cannot handle types yet...");*/
                    } else
                        throw new UnsupportedOperationException(
                                "Unsupported type for LDC: " + cst.getClass().getName());

                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
                throw new UnsupportedOperationException();

                /*System.out.println("\t\t\tvisitInvokeDynamicInsn: " + name + ", " + desc + ", " + bsm + ", " + Arrays.toString(bsmArgs));
                        
                try {
                bw.append("\t\t\t\t{\n");
                bw.append("\t\t\t\t\t\"type\": \"invokeDynamic\",\n");
                        
                bw.append("\t\t\t\t\t\"name\": \"");
                bw.append(name);
                bw.append("\",\n");
                        
                bw.append("\t\t\t\t\t\"signature\": \"");
                bw.append(desc);
                bw.append("\"\n");
                bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                throw new RuntimeException(ex);
                }*/
            }

            @Override
            public void visitLabel(Label label) {
                System.out.println("\t\t\tvisitLabel: " + label.toString());

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"label\",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(label.toString());
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitJumpInsn(int opcode, Label label) {
                System.out.println("\t\t\tvisitJumpInsn: " + nameForOpcode(opcode) + ", " + label.toString());

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"jump\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(label.toString());
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitInsn(int opcode) {
                System.out.println("\t\t\tvisitInsn: " + nameForOpcode(opcode));

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"insn\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append("\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitIntInsn(int opcode, int operand) {
                System.out.println("\t\t\tvisitIntInsn: " + nameForOpcode(opcode) + ", " + operand);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"int\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"operand\": \"");
                    bw.append(String.valueOf(operand));
                    bw.append("\"\n");
                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }

            @Override
            public void visitFieldInsn(int opcode, String owner, String name, String desc) {
                System.out.println("\t\t\tvisitFieldInsn: " + nameForOpcode(opcode) + ", " + owner + ", " + name
                        + ", " + desc);

                try {
                    bw.append("\t\t\t\t{\n");
                    bw.append("\t\t\t\t\t\"type\": \"field\",\n");

                    bw.append("\t\t\t\t\t\"opcode\": JVM.Opcodes.");
                    bw.append(nameForOpcode(opcode));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"class\": ");
                    bw.append(converter.convert(owner));
                    bw.append(",\n");

                    bw.append("\t\t\t\t\t\"name\": \"");
                    bw.append(name);
                    bw.append("\",\n");

                    bw.append("\t\t\t\t\t\"signature\": ");
                    bw.append(converter.convert(desc));
                    bw.append('\n');

                    bw.append("\t\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        };

        final ClassOptimizer[] classOptimizer = new ClassOptimizer[1];
        ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM4) {

            @Override
            public FieldVisitor visitField(int access, String name, String desc, String signature,
                    Object value) {
                System.out.println("\t\tField: " + name + ", " + desc + ", " + value + ", " + access);
                if (!fields.contains(name)) {
                    fields.add(name);
                }

                try {
                    bw.append("\t\t{\n");

                    bw.append("\t\t\t\"type\": \"field\",\n");

                    bw.append("\t\t\t\"name\": \"");
                    bw.append(name);
                    bw.append("\",\n");

                    bw.append("\t\t\t\"signature\": ");
                    bw.append(converter.convert(desc));
                    bw.append(",\n");

                    if (value instanceof String) {
                        bw.append("\t\t\t\"stringValue\": \"");
                        bw.append(((String) value).replace("\n", "\\n").replace("\"", "\\\""));
                        bw.append("\",\n");
                    } else if (value instanceof Number) {
                        bw.append("\t\t\t\"numericValue\": ");
                        bw.append(String.valueOf((Number) value));
                        bw.append(",\n");
                    } else if (value != null)
                        throw new RuntimeException("Unhandled initial value: " + value);

                    writeAccess(access, bw);
                    bw.append("\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }

                //if(signature != null) {
                Matcher matcher = classSignature.matcher(desc);
                if (matcher.matches() && !references.contains(matcher.group(1)))
                    references.add(matcher.group(1));
                //}

                return super.visitField(access, name, desc, signature, value);
            }

            @Override
            public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                    String[] exceptions) {
                System.out.println("\t\tMethod: " + name + ", " + desc + ", " + signature + ", " + access + ", "
                        + Arrays.toString(exceptions));
                if (!methods.contains(name))
                    methods.add(name);

                try {
                    bw.append("\t\t{\n");

                    bw.append("\t\t\t\"type\": \"method\",\n");

                    bw.append("\t\t\t\"name\": \"");
                    bw.append(name);
                    bw.append("\",\n");

                    bw.append("\t\t\t\"signature\": \"");
                    bw.append(convertRuntime(desc));
                    bw.append("\",\n");

                    bw.append("\t\t\t\"sigparts\": {\n");
                    bw.append("\t\t\t\t\"return\": ");

                    Matcher matcher = methodSignature.matcher(desc);
                    if (!matcher.matches())
                        throw new IllegalArgumentException("Corrupt or invalid method signature: " + desc);

                    bw.append(converter.convert(matcher.group(2)));
                    bw.append(",\n");

                    String args = matcher.group(1);
                    if (args != null) {
                        bw.append("\t\t\t\t\"args\": [\n");

                        String[] argsl = splitArguments(args);
                        /*matcher = classSignature.matcher(args);
                        while(matcher.find())
                        argsl.add(converter.convert(matcher.group(1)));*/

                        for (int i = 0; i < argsl.length; i++) {
                            bw.append("\t\t\t\t\t");
                            bw.append(converter.convert(argsl[i]));
                            if (i < argsl.length - 1)
                                bw.append(',');
                            bw.append('\n');
                        }

                        bw.append("\t\t\t\t]\n");
                    } else
                        bw.append("\t\t\t\t\"args\": []\n");
                    bw.append("\t\t\t},\n");
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }

                if (exceptions != null) {
                    try {
                        bw.append("\t\t\t\"exceptions\": [\n");
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    }

                    for (int i = 0; i < exceptions.length; i++) {
                        String exception = exceptions[i];
                        if (!references.contains(exception))
                            references.add(exception);

                        try {
                            bw.append("\t\t\t\t\"");
                            bw.append(convertRuntime(exception));
                            bw.append('"');
                            if (i < exceptions.length - 1)
                                bw.append(',');
                            bw.append('\n');
                        } catch (IOException ex) {
                            throw new RuntimeException(ex);
                        }
                    }

                    try {
                        bw.append("\t\t\t],\n");
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    }
                }

                Matcher matcher = methodSignature.matcher(desc);
                matcher.matches();
                String args = matcher.group(1);
                String ret = matcher.group(2);

                matcher = classSignature.matcher(ret);
                if (matcher.matches() && !references.contains(matcher.group(1)))
                    references.add(matcher.group(1));

                if (args != null) {
                    matcher = classSignature.matcher(args);
                    while (matcher.find())
                        if (!references.contains(matcher.group(1)))
                            references.add(matcher.group(1));
                }

                if ((access & Opcodes.ACC_NATIVE) != 0) {
                    try {
                        bw.append("\t\t\t\"implementation\": \"");
                        bw.append(runtimeClassname + ".native.js");
                        bw.append("\",\n");

                        writeAccess(access, bw);
                        bw.append("\t\t},\n");
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    }

                    return super.visitMethod(access, name, desc, signature, exceptions);
                }

                try {
                    bw.append("\t\t\t\"implementation\": [\n");
                    bw.flush();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }

                methodAccess[0] = access;
                //return new MethodOptimizer(classOptimizer[0], access, desc, methodVisitor, new Remapper() {});
                return methodVisitor;
            }
        };

        //classOptimizer[0] = new ClassOptimizer(classVisitor, new Remapper() {});
        //reader.accept(classOptimizer[0], 0);
        reader.accept(classVisitor, 0);

        bw.append("\t\t{\n");
        bw.append("\t\t\t\"type\": \"references\",\n");
        bw.append("\t\t\t\"value\": [\n");

        List<String> written = new ArrayList();
        for (int i = 0; i < references.size(); i++) {
            String ref = convertRuntime(references.get(i));
            if (written.contains(ref))
                continue;
            written.add(ref);

            bw.append("\t\t\t\t\"");
            bw.append(ref);
            bw.append('"');
            if (i < references.size() - 1)
                bw.append(',');
            bw.append('\n');
        }
        bw.append("\t\t\t]\n");
        bw.append("\t\t}\n");
        bw.append("\t]);\n");
        bw.append("})($currentJVM, JVM);");
    } finally {
        bw.close();
    }

    System.out.println("\tProcessing references: " + references);
    for (String ref : references)
        compile(ref);

    referenceMap.put(runtimeClassname, references);
}

From source file:net.sourceforge.cobertura.instrument.AbstractFindTouchPointsClassInstrumenter.java

License:GNU General Public License

/**
 * @param cv                 - a listener for code-instrumentation events
 * @param ignoreRegexp       - list of patters of method calls that should be ignored from line-coverage-measurement
 * @param duplicatedLinesMap - map of found duplicates in the class. You should use {@link DetectDuplicatedCodeClassVisitor} to find the duplicated lines.
 *//*from w  ww  .  ja  va  2 s  .co  m*/
public AbstractFindTouchPointsClassInstrumenter(ClassVisitor cv, Collection<Pattern> ignoreRegexp,
        Map<Integer, Map<Integer, Integer>> duplicatedLinesMap) {
    super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
    this.ignoreRegexp = ignoreRegexp;
    this.duplicatedLinesMap = duplicatedLinesMap;
}

From source file:net.sourceforge.cobertura.instrument.ContextMethodAwareMethodAdapter.java

License:GNU General Public License

public ContextMethodAwareMethodAdapter(MethodVisitor mv, String className, String methodName,
        String methodSignature, AtomicInteger lineIdGenerator) {
    super(Opcodes.ASM4, mv);
    this.className = className;
    this.methodName = methodName;
    this.methodSignature = methodSignature;
    lastLineId = 0;/*w  w w  .j a v a2s.  c  o  m*/
    this.lineIdGenerator = lineIdGenerator;
}

From source file:net.sourceforge.cobertura.instrument.HistoryMethodAdapter.java

License:GNU General Public License

public HistoryMethodAdapter(MethodVisitor mv, int eventsToTrace) {
    super(Opcodes.ASM4, mv);
    this.eventsToTrace = eventsToTrace;
}

From source file:net.sourceforge.cobertura.instrument.pass1.DetectDuplicatedCodeClassVisitor.java

License:GNU General Public License

public DetectDuplicatedCodeClassVisitor(ClassVisitor cv) {
    super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
}

From source file:net.sourceforge.cobertura.instrument.pass1.DetectIgnoredCodeClassVisitor.java

License:GNU General Public License

public DetectIgnoredCodeClassVisitor(ClassVisitor cv, boolean ignoreTrivial, Set<String> ignoreAnnotations) {
    super(Opcodes.ASM4, new CheckClassAdapter(cv, false));
    this.ignoreTrivial = ignoreTrivial;
    this.ignoreAnnotations = ignoreAnnotations;
}