private ClassNode loadClass(String name) { return Try.apply(() -> { String cname = name.replace("/", "."); ClassNode node = cache.get(cname); if (node == null) { String rname = cname.replace(".", "/") + ".class"; try (InputStream in = loader.getResourceAsStream(rname)) { if (in == null) { throw new FileNotFoundException(rname + " using " + loader); } ClassReader reader = new ClassReader(ByteStreams.toByteArray(in)); node = new ClassNode(); reader.accept(node, 0); cache.put(cname, node); if (log.isDebugEnabled()) { log.info("Source: {}; Class: {}", node.sourceFile, node.name); reader.accept( new TraceClassVisitor(null, new ASMifier(), new PrintWriter(writer(log, name))), 0); } } } return node; }).get(); }
public static void main(String[] args) throws Exception { ASMifier.main(new String[]{"target/classes/groovy/swing/SwingBuilder.class"}); // ASMifierClassVisitor.main(new String[]{"target/classes/org/codehaus/groovy/tools/shell/util/HelpFormatter.class"}); // ASMifierClassVisitor.main(new String[]{"target/classes/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.class"}); // ASMifierClassVisitor.main(new String[]{"target/test-classes/spectralnorm.class"}); // ASMifierClassVisitor.main(new String[]{"target/test-classes/groovy/bugs/CustomMetaClassTest.class"}); } }
public ASMifier visitAnnotation(final String desc, final boolean visible) { buf.setLength(0); buf.append("{\n").append("av0 = ").append(name) .append(".visitAnnotation("); 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 visitLabel(final Label label) { buf.setLength(0); declareLabel(label); buf.append(name).append(".visitLabel("); appendLabel(label); buf.append(");\n"); text.add(buf.toString()); }
@Override public Printer visitModule(final String name, final int flags, final String version) { stringBuilder.setLength(0); stringBuilder.append("ModuleVisitor moduleVisitor = classWriter.visitModule("); appendConstant(name); stringBuilder.append(", "); appendAccessFlags(flags | ACCESS_MODULE); stringBuilder.append(", "); appendConstant(version); stringBuilder.append(END_PARAMETERS); text.add(stringBuilder.toString()); ASMifier asmifier = createASMifier("moduleVisitor", 0); text.add(asmifier.getText()); text.add("}\n"); return asmifier; }
@Override public void visitTryCatchBlock( final Label start, final Label end, final Label handler, final String type) { stringBuilder.setLength(0); declareLabel(start); declareLabel(end); declareLabel(handler); stringBuilder.append(name).append(".visitTryCatchBlock("); appendLabel(start); stringBuilder.append(", "); appendLabel(end); stringBuilder.append(", "); appendLabel(handler); stringBuilder.append(", "); appendConstant(type); stringBuilder.append(");\n"); text.add(stringBuilder.toString()); }
for (int i = 0; i < start.length; ++i) { buf.append(i == 0 ? " " : ", "); appendLabel(start[i]); appendLabel(end[i]); 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 ASMifier visitField(final int access, final String name, final String desc, final String signature, final Object value) { buf.setLength(0); buf.append("{\n"); buf.append("fv = cw.visitField("); appendAccess(access | ACCESS_FIELD); buf.append(", "); appendConstant(name); buf.append(", "); appendConstant(desc); buf.append(", "); appendConstant(signature); buf.append(", "); appendConstant(value); buf.append(");\n"); text.add(buf.toString()); ASMifier a = createASMifier("fv", 0); text.add(a.getText()); text.add("}\n"); return a; }
/** * Appends a string representation of the given constant to the given * buffer. * * @param cst * an {@link Integer}, {@link Float}, {@link Long}, * {@link Double} or {@link String} object. May be <tt>null</tt>. */ protected void appendConstant(final Object cst) { appendConstant(buf, cst); }
/** * Prints the ASM source code to generate the given class to the standard output. * * <p>Usage: ASMifier [-debug] <binary class name or class file name> * * @param args the command line arguments. * @throws IOException if the class cannot be found, or if an IOException occurs. */ public static void main(final String[] args) throws IOException { String usage = "Prints the ASM code to generate the given class.\n" + "Usage: ASMifier [-debug] <fully qualified class name or class file name>"; main(usage, new ASMifier(), args); }
@Override public ASMifier visitAnnotationDefault() { buf.setLength(0); buf.append("{\n").append("av0 = ").append(name) .append(".visitAnnotationDefault();\n"); text.add(buf.toString()); ASMifier a = createASMifier("av", 0); text.add(a.getText()); text.add("}\n"); return a; }
@Override public void visitLocalVariable(final String name, final String desc, final String signature, final Label start, final Label end, final int index) { buf.setLength(0); buf.append(this.name).append(".visitLocalVariable("); appendConstant(name); buf.append(", "); appendConstant(desc); buf.append(", "); appendConstant(signature); buf.append(", "); appendLabel(start); buf.append(", "); appendLabel(end); buf.append(", ").append(index).append(");\n"); text.add(buf.toString()); }
case Opcodes.F_NEW: case Opcodes.F_FULL: declareFrameTypes(nLocal, local); declareFrameTypes(nStack, stack); if (type == Opcodes.F_NEW) { buf.append(name).append(".visitFrame(Opcodes.F_NEW, "); appendFrameTypes(nLocal, local); buf.append("}, ").append(nStack).append(", new Object[] {"); appendFrameTypes(nStack, stack); buf.append('}'); break; case Opcodes.F_APPEND: declareFrameTypes(nLocal, local); buf.append(name).append(".visitFrame(Opcodes.F_APPEND,") .append(nLocal).append(", new Object[] {"); appendFrameTypes(nLocal, local); buf.append("}, 0, null"); break; break; case Opcodes.F_SAME1: declareFrameTypes(1, stack); buf.append(name).append( ".visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"); appendFrameTypes(1, stack); buf.append('}'); break;
stringBuilder.append("null"); } else if (value instanceof String) { appendString(stringBuilder, (String) value); } else if (value instanceof Type) { stringBuilder.append("Type.getType(\""); stringBuilder.append(constantDynamic.getName()).append("\", \""); stringBuilder.append(constantDynamic.getDescriptor()).append("\", "); appendConstant(constantDynamic.getBootstrapMethod()); stringBuilder.append(", new Object[] {"); int bootstrapMethodArgumentCount = constantDynamic.getBootstrapMethodArgumentCount(); for (int i = 0; i < bootstrapMethodArgumentCount; ++i) { appendConstant(constantDynamic.getBootstrapMethodArgument(i)); if (i != bootstrapMethodArgumentCount - 1) { stringBuilder.append(", ");
@Deprecated @Override public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) { if (api >= Opcodes.ASM5) { super.visitMethodInsn(opcode, owner, name, desc); return; } doVisitMethodInsn(opcode, owner, name, desc, opcode == Opcodes.INVOKEINTERFACE); }
@Override public void visitParameter(String parameterName, int access) { buf.setLength(0); buf.append(name).append(".visitParameter("); appendString(buf, parameterName); buf.append(", "); appendAccess(access); text.add(buf.append(");\n").toString()); }
@Override public void visitParameter(final String parameterName, final int access) { stringBuilder.setLength(0); stringBuilder.append(name).append(".visitParameter("); appendString(stringBuilder, parameterName); stringBuilder.append(", "); appendAccessFlags(access); text.add(stringBuilder.append(");\n").toString()); }
@Override public void visitRequire(final String module, final int access, final String version) { stringBuilder.setLength(0); stringBuilder.append("moduleVisitor.visitRequire("); appendConstant(module); stringBuilder.append(", "); appendAccessFlags(access | ACCESS_MODULE); stringBuilder.append(", "); appendConstant(version); stringBuilder.append(");\n"); text.add(stringBuilder.toString()); }
private void declareFrameTypes(final int n, final Object[] o) { for (int i = 0; i < n; ++i) { if (o[i] instanceof Label) { declareLabel((Label) o[i]); } } }
@Override public void visitLineNumber(final int line, final Label start) { buf.setLength(0); buf.append(name).append(".visitLineNumber(").append(line).append(", "); appendLabel(start); buf.append(");\n"); text.add(buf.toString()); }