@Override public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { MethodNode mn = new MethodNode(access, name, desc, signature, exceptions); methods.add(mn); return mn; }
@Override public void visitEnd() { super.visitEnd(); ((MethodNode)this.mv).accept(this.finalMv); }
@Override public void visitTableSwitchInsn(final int min, final int max, final Label dflt, final Label... labels) { instructions.add(new TableSwitchInsnNode(min, max, getLabelNode(dflt), getLabelNodes(labels))); }
private LabelNode[] getLabelNodes(final Label[] l) { LabelNode[] nodes = new LabelNode[l.length]; for (int i = 0; i < l.length; ++i) { nodes[i] = getLabelNode(l[i]); } return nodes; }
@Override public void visitFrame(final int type, final int nLocal, final Object[] local, final int nStack, final Object[] stack) { instructions.add(new FrameNode(type, nLocal, local == null ? null : getLabelNodes(local), nStack, stack == null ? null : getLabelNodes(stack))); }
/** * Detects a JSR instruction and sets a flag to indicate we will need to do * inlining. */ @Override public void visitJumpInsn(final int opcode, final Label lbl) { super.visitJumpInsn(opcode, lbl); LabelNode ln = ((JumpInsnNode) instructions.getLast()).label; if (opcode == JSR && !subroutineHeads.containsKey(ln)) { subroutineHeads.put(ln, new BitSet()); } }
private Object[] getLabelNodes(final Object[] objs) { Object[] nodes = new Object[objs.length]; for (int i = 0; i < objs.length; ++i) { Object o = objs[i]; if (o instanceof Label) { o = getLabelNode((Label) o); } nodes[i] = o; } return nodes; }
@Override public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, String desc, boolean visible) { LocalVariableAnnotationNode an = new LocalVariableAnnotationNode( typeRef, typePath, getLabelNodes(start), getLabelNodes(end), index, desc); if (visible) { if (visibleLocalVariableAnnotations == null) { visibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>( 1); } visibleLocalVariableAnnotations.add(an); } else { if (invisibleLocalVariableAnnotations == null) { invisibleLocalVariableAnnotations = new ArrayList<LocalVariableAnnotationNode>( 1); } invisibleLocalVariableAnnotations.add(an); } return an; }
public void consumeInstanceMethods(Consumer<MethodNode> consumer) { for (MethodNode methodNode : this.classNode.methods) { if ((methodNode.access & Opcodes.ACC_STATIC) == 0) { String[] exceptions = null; if (methodNode.exceptions != null) { exceptions = methodNode.exceptions.toArray( new String[methodNode.exceptions.size()] ); } MethodNode clonedMethodNode = new MethodNode( Opcodes.ASM5, methodNode.access, methodNode.name, methodNode.desc, methodNode.signature, exceptions ); consumer.accept(clonedMethodNode); } } }
/** * Makes the given class visitor visit this method. * * @param cv * a class visitor. */ public void accept(final ClassVisitor cv) { String[] exceptions = new String[this.exceptions.size()]; this.exceptions.toArray(exceptions); MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions); if (mv != null) { accept(mv); } }
@Override public void visitLookupSwitchInsn(final Label dflt, final int[] keys, final Label[] labels) { instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), keys, getLabelNodes(labels))); }
@Override public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type) { tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), getLabelNode(end), getLabelNode(handler), type)); }
name, desc, new MethodNode(Opcodes.ASM5, access, name, desc, signature, exceptions) ); this.finalMv = mv;
methods.get(i).accept(cv);
@Override public void visitLocalVariable(final String name, final String desc, final String signature, final Label start, final Label end, final int index) { localVariables.add(new LocalVariableNode(name, desc, signature, getLabelNode(start), getLabelNode(end), index)); }
protected static MethodNode createMethodNode( int access, String name, String desc, String signature, List<String> exceptions) { MethodNode methodNode = new MethodNode(Opcodes.ASM5); methodNode.access = access; methodNode.name = name; methodNode.desc = desc; methodNode.signature = signature; methodNode.exceptions = exceptions != null ? new ArrayList<String>() : new ArrayList<String>(); methodNode.localVariables = new ArrayList<LocalVariableNode>(); methodNode.tryCatchBlocks = new ArrayList<TryCatchBlockNode>(); return methodNode; }
@Override public void visitLabel(final Label label) { instructions.add(getLabelNode(label)); }
protected static MethodNode createMethodNode( int access, String name, String desc, String signatrue, String ... exceptions) { ArrayList<String> exceptionList = new ArrayList<String>(); for (String exception : exceptions) { exceptionList.add(exception); } MethodNode methodNode = new MethodNode(Opcodes.ASM5); methodNode.access = access; methodNode.name = name; methodNode.desc = desc; methodNode.signature = signatrue; methodNode.exceptions = exceptionList; methodNode.tryCatchBlocks = new ArrayList<TryCatchBlockNode>(); methodNode.localVariables = new ArrayList<LocalVariableNode>(); return methodNode; }
@Override public void visitJumpInsn(final int opcode, final Label label) { instructions.add(new JumpInsnNode(opcode, getLabelNode(label))); }