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