1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/*** 2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ASM: a very small and fast Java bytecode manipulation framework 3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright (c) 2000-2007 INRIA, France Telecom 4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * All rights reserved. 5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Redistribution and use in source and binary forms, with or without 7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * modification, are permitted provided that the following conditions 8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * are met: 9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 1. Redistributions of source code must retain the above copyright 10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * notice, this list of conditions and the following disclaimer. 11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 2. Redistributions in binary form must reproduce the above copyright 12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * notice, this list of conditions and the following disclaimer in the 13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * documentation and/or other materials provided with the distribution. 14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 3. Neither the name of the copyright holders nor the names of its 15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * contributors may be used to endorse or promote products derived from 16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * this software without specific prior written permission. 17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THE POSSIBILITY OF SUCH DAMAGE. 29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.asm.tree; 31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.AnnotationVisitor; 33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Attribute; 34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.ClassVisitor; 35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Label; 36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.MethodVisitor; 37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Opcodes; 38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Type; 39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.List; 41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.ArrayList; 42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.Arrays; 43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/** 45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A node that represents a method. 46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton 48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class MethodNode extends MemberNode implements MethodVisitor { 50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The method's access flags (see {@link Opcodes}). This field also 53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * indicates if the method is synthetic and/or deprecated. 54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int access; 56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The method's name. 59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String name; 61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The method's descriptor (see {@link Type}). 64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String desc; 66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The method's signature. May be <tt>null</tt>. 69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String signature; 71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The internal names of the method's exception classes (see 74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link Type#getInternalName() getInternalName}). This list is a list of 75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link String} objects. 76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public List exceptions; 78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The default value of this annotation interface method. This field must be 81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * a {@link Byte}, {@link Boolean}, {@link Character}, {@link Short}, 82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link Integer}, {@link Long}, {@link Float}, {@link Double}, 83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link String} or {@link Type}, or an two elements String array (for 84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * enumeration values), a {@link AnnotationNode}, or a {@link List} of 85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * values of one of the preceding types. May be <tt>null</tt>. 86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Object annotationDefault; 88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The runtime visible parameter annotations of this method. These lists are 91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * lists of {@link AnnotationNode} objects. May be <tt>null</tt>. 92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @associates org.mockito.asm.tree.AnnotationNode 94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @label invisible parameters 95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public List[] visibleParameterAnnotations; 97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The runtime invisible parameter annotations of this method. These lists 100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * are lists of {@link AnnotationNode} objects. May be <tt>null</tt>. 101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @associates org.mockito.asm.tree.AnnotationNode 103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @label visible parameters 104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public List[] invisibleParameterAnnotations; 106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The instructions of this method. This list is a list of 109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link AbstractInsnNode} objects. 110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @associates org.mockito.asm.tree.AbstractInsnNode 112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @label instructions 113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public InsnList instructions; 115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The try catch blocks of this method. This list is a list of 118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link TryCatchBlockNode} objects. 119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @associates org.mockito.asm.tree.TryCatchBlockNode 121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public List tryCatchBlocks; 123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The maximum stack size of this method. 126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int maxStack; 128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The maximum number of local variables of this method. 131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int maxLocals; 133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The local variables of this method. This list is a list of 136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link LocalVariableNode} objects. May be <tt>null</tt> 137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @associates org.mockito.asm.tree.LocalVariableNode 139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public List localVariables; 141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Constructs an unitialized {@link MethodNode}. 144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public MethodNode() { 146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.instructions = new InsnList(); 147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Constructs a new {@link MethodNode}. 151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param access the method's access flags (see {@link Opcodes}). This 153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * parameter also indicates if the method is synthetic and/or 154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * deprecated. 155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param name the method's name. 156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param desc the method's descriptor (see {@link Type}). 157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param signature the method's signature. May be <tt>null</tt>. 158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param exceptions the internal names of the method's exception classes 159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * (see {@link Type#getInternalName() getInternalName}). May be 160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * <tt>null</tt>. 161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public MethodNode( 163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int access, 164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String name, 165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String desc, 166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String signature, 167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String[] exceptions) 168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this(); 170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.access = access; 171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.name = name; 172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.desc = desc; 173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.signature = signature; 174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.exceptions = new ArrayList(exceptions == null 175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ? 0 176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen : exceptions.length); 177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen boolean isAbstract = (access & Opcodes.ACC_ABSTRACT) != 0; 178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (!isAbstract) { 179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.localVariables = new ArrayList(5); 180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.tryCatchBlocks = new ArrayList(); 182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (exceptions != null) { 183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.exceptions.addAll(Arrays.asList(exceptions)); 184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Implementation of the MethodVisitor interface 189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public AnnotationVisitor visitAnnotationDefault() { 192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new AnnotationNode(new ArrayList(0) { 193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public boolean add(final Object o) { 194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen annotationDefault = o; 195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return super.add(o); 196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen }); 198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public AnnotationVisitor visitParameterAnnotation( 201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int parameter, 202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String desc, 203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final boolean visible) 204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode an = new AnnotationNode(desc); 206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (visible) { 207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (visibleParameterAnnotations == null) { 208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int params = Type.getArgumentTypes(this.desc).length; 209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen visibleParameterAnnotations = new List[params]; 210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (visibleParameterAnnotations[parameter] == null) { 212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen visibleParameterAnnotations[parameter] = new ArrayList(1); 213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen visibleParameterAnnotations[parameter].add(an); 215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (invisibleParameterAnnotations == null) { 217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int params = Type.getArgumentTypes(this.desc).length; 218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen invisibleParameterAnnotations = new List[params]; 219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (invisibleParameterAnnotations[parameter] == null) { 221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen invisibleParameterAnnotations[parameter] = new ArrayList(1); 222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen invisibleParameterAnnotations[parameter].add(an); 224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return an; 226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitCode() { 229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitFrame( 232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int type, 233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int nLocal, 234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Object[] local, 235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int nStack, 236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Object[] stack) 237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new FrameNode(type, nLocal, local == null 239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ? null 240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen : getLabelNodes(local), nStack, stack == null 241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ? null 242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen : getLabelNodes(stack))); 243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitInsn(final int opcode) { 246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new InsnNode(opcode)); 247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitIntInsn(final int opcode, final int operand) { 250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new IntInsnNode(opcode, operand)); 251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitVarInsn(final int opcode, final int var) { 254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new VarInsnNode(opcode, var)); 255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitTypeInsn(final int opcode, final String type) { 258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new TypeInsnNode(opcode, type)); 259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitFieldInsn( 262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int opcode, 263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String owner, 264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String name, 265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String desc) 266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new FieldInsnNode(opcode, owner, name, desc)); 268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitMethodInsn( 271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int opcode, 272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String owner, 273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String name, 274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String desc) 275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new MethodInsnNode(opcode, owner, name, desc)); 277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitJumpInsn(final int opcode, final Label label) { 280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new JumpInsnNode(opcode, getLabelNode(label))); 281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitLabel(final Label label) { 284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(getLabelNode(label)); 285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitLdcInsn(final Object cst) { 288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new LdcInsnNode(cst)); 289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitIincInsn(final int var, final int increment) { 292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new IincInsnNode(var, increment)); 293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitTableSwitchInsn( 296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int min, 297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int max, 298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label dflt, 299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label[] labels) 300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new TableSwitchInsnNode(min, 302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen max, 303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNode(dflt), 304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNodes(labels))); 305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitLookupSwitchInsn( 308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label dflt, 309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int[] keys, 310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label[] labels) 311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new LookupSwitchInsnNode(getLabelNode(dflt), 313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen keys, 314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNodes(labels))); 315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitMultiANewArrayInsn(final String desc, final int dims) { 318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new MultiANewArrayInsnNode(desc, dims)); 319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitTryCatchBlock( 322674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label start, 323674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label end, 324674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label handler, 325674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String type) 326674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 327674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), 328674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNode(end), 329674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNode(handler), 330674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen type)); 331674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 332674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 333674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitLocalVariable( 334674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String name, 335674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String desc, 336674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final String signature, 337674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label start, 338674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Label end, 339674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final int index) 340674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 341674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen localVariables.add(new LocalVariableNode(name, 342674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen desc, 343674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen signature, 344674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNode(start), 345674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getLabelNode(end), 346674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen index)); 347674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 348674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 349674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitLineNumber(final int line, final Label start) { 350674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.add(new LineNumberNode(line, getLabelNode(start))); 351674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 352674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 353674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void visitMaxs(final int maxStack, final int maxLocals) { 354674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.maxStack = maxStack; 355674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.maxLocals = maxLocals; 356674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 357674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 358674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 359674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the LabelNode corresponding to the given Label. Creates a new 360674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * LabelNode if necessary. The default implementation of this method uses 361674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * the {@link Label#info} field to store associations between labels and 362674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * label nodes. 363674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 364674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param l a Label. 365674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the LabelNode corresponding to l. 366674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 367674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen protected LabelNode getLabelNode(final Label l) { 368674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (!(l.info instanceof LabelNode)) { 369674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen l.info = new LabelNode(l); 370674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 371674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return (LabelNode) l.info; 372674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 373674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 374674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private LabelNode[] getLabelNodes(final Label[] l) { 375674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen LabelNode[] nodes = new LabelNode[l.length]; 376674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < l.length; ++i) { 377674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen nodes[i] = getLabelNode(l[i]); 378674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 379674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return nodes; 380674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 381674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 382674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private Object[] getLabelNodes(final Object[] objs) { 383674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Object[] nodes = new Object[objs.length]; 384674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < objs.length; ++i) { 385674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Object o = objs[i]; 386674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (o instanceof Label) { 387674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen o = getLabelNode((Label) o); 388674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 389674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen nodes[i] = o; 390674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 391674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return nodes; 392674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 393674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 394674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 395674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Accept method 396674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 397674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 398674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 399674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Makes the given class visitor visit this method. 400674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 401674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param cv a class visitor. 402674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 403674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void accept(final ClassVisitor cv) { 404674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen String[] exceptions = new String[this.exceptions.size()]; 405674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.exceptions.toArray(exceptions); 406674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen MethodVisitor mv = cv.visitMethod(access, 407674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen name, 408674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen desc, 409674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen signature, 410674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen exceptions); 411674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (mv != null) { 412674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen accept(mv); 413674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 414674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 415674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 416674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 417674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Makes the given method visitor visit this method. 418674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 419674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param mv a method visitor. 420674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 421674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public void accept(final MethodVisitor mv) { 422674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits the method attributes 423674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int i, j, n; 424674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (annotationDefault != null) { 425674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationVisitor av = mv.visitAnnotationDefault(); 426674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode.accept(av, null, annotationDefault); 427674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (av != null) { 428674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen av.visitEnd(); 429674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 430674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 431674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = visibleAnnotations == null ? 0 : visibleAnnotations.size(); 432674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 433674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode an = (AnnotationNode) visibleAnnotations.get(i); 434674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen an.accept(mv.visitAnnotation(an.desc, true)); 435674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 436674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size(); 437674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 438674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode an = (AnnotationNode) invisibleAnnotations.get(i); 439674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen an.accept(mv.visitAnnotation(an.desc, false)); 440674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 441674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = visibleParameterAnnotations == null 442674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ? 0 443674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen : visibleParameterAnnotations.length; 444674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 445674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen List l = visibleParameterAnnotations[i]; 446674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (l == null) { 447674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen continue; 448674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 449674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (j = 0; j < l.size(); ++j) { 450674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode an = (AnnotationNode) l.get(j); 451674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen an.accept(mv.visitParameterAnnotation(i, an.desc, true)); 452674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 453674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 454674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = invisibleParameterAnnotations == null 455674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ? 0 456674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen : invisibleParameterAnnotations.length; 457674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 458674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen List l = invisibleParameterAnnotations[i]; 459674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (l == null) { 460674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen continue; 461674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 462674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (j = 0; j < l.size(); ++j) { 463674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen AnnotationNode an = (AnnotationNode) l.get(j); 464674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen an.accept(mv.visitParameterAnnotation(i, an.desc, false)); 465674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 466674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 467674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = attrs == null ? 0 : attrs.size(); 468674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 469674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen mv.visitAttribute((Attribute) attrs.get(i)); 470674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 471674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits the method's code 472674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (instructions.size() > 0) { 473674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen mv.visitCode(); 474674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits try catch blocks 475674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < tryCatchBlocks.size(); ++i) { 476674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ((TryCatchBlockNode) tryCatchBlocks.get(i)).accept(mv); 477674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 478674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits instructions 479674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen instructions.accept(mv); 480674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits local variables 481674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen n = localVariables == null ? 0 : localVariables.size(); 482674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (i = 0; i < n; ++i) { 483674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ((LocalVariableNode) localVariables.get(i)).accept(mv); 484674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 485674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // visits maxs 486674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen mv.visitMaxs(maxStack, maxLocals); 487674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 488674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen mv.visitEnd(); 489674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 490674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen} 491