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.util;
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.AnnotationVisitor;
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Label;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.MethodVisitor;
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Opcodes;
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.HashMap;
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A {@link MethodVisitor} that prints the ASM code that generates the methods
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * it visits.
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eugene Kuleshov
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class ASMifierMethodVisitor extends ASMifierAbstractVisitor implements
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        MethodVisitor
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen{
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constructs a new {@link ASMifierMethodVisitor} object.
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public ASMifierMethodVisitor() {
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        super("mv");
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.labelNames = new HashMap();
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AnnotationVisitor visitAnnotationDefault() {
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("{\n").append("av0 = mv.visitAnnotationDefault();\n");
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(av.getText());
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add("}\n");
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return av;
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AnnotationVisitor visitParameterAnnotation(
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int parameter,
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc,
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final boolean visible)
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("{\n")
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append("av0 = mv.visitParameterAnnotation(")
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(parameter)
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ");
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ").append(visible).append(");\n");
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(av.getText());
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add("}\n");
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return av;
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitCode() {
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add("mv.visitCode();\n");
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitFrame(
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int type,
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int nLocal,
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Object[] local,
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int nStack,
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Object[] stack)
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        switch (type) {
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_NEW:
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_FULL:
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                declareFrameTypes(nLocal, local);
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                declareFrameTypes(nStack, stack);
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (type == Opcodes.F_NEW) {
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    buf.append("mv.visitFrame(Opcodes.F_NEW, ");
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    buf.append("mv.visitFrame(Opcodes.F_FULL, ");
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(nLocal).append(", new Object[] {");
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendFrameTypes(nLocal, local);
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("}, ").append(nStack).append(", new Object[] {");
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendFrameTypes(nStack, stack);
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append('}');
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_APPEND:
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                declareFrameTypes(nLocal, local);
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("mv.visitFrame(Opcodes.F_APPEND,")
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append(nLocal)
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append(", new Object[] {");
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendFrameTypes(nLocal, local);
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("}, 0, null");
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_CHOP:
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("mv.visitFrame(Opcodes.F_CHOP,")
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append(nLocal)
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append(", null, 0, null");
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_SAME:
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null");
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F_SAME1:
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                declareFrameTypes(1, stack);
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append("mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {");
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendFrameTypes(1, stack);
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append('}');
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitInsn(final int opcode) {
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitInsn(").append(OPCODES[opcode]).append(");\n");
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitIntInsn(final int opcode, final int operand) {
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitIntInsn(")
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(OPCODES[opcode])
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ")
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(opcode == Opcodes.NEWARRAY
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        ? TYPES[operand]
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        : Integer.toString(operand))
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(");\n");
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitVarInsn(final int opcode, final int var) {
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitVarInsn(")
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(OPCODES[opcode])
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ")
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(var)
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(");\n");
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitTypeInsn(final int opcode, final String type) {
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitTypeInsn(").append(OPCODES[opcode]).append(", ");
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(type);
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitFieldInsn(
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int opcode,
180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String owner,
181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String name,
182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc)
183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitFieldInsn(").append(OPCODES[opcode]).append(", ");
186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(owner);
187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(name);
189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitMethodInsn(
196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int opcode,
197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String owner,
198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String name,
199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc)
200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitMethodInsn(").append(OPCODES[opcode]).append(", ");
203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(owner);
204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(name);
206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitJumpInsn(final int opcode, final Label label) {
213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(label);
215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitJumpInsn(").append(OPCODES[opcode]).append(", ");
216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(label);
217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitLabel(final Label label) {
222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(label);
224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitLabel(");
225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(label);
226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitLdcInsn(final Object cst) {
231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitLdcInsn(");
233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(cst);
234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitIincInsn(final int var, final int increment) {
239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitIincInsn(")
241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(var)
242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ")
243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(increment)
244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(");\n");
245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitTableSwitchInsn(
249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int min,
250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int max,
251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label dflt,
252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label[] labels)
253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < labels.length; ++i) {
256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            declareLabel(labels[i]);
257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(dflt);
259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitTableSwitchInsn(")
261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(min)
262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ")
263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(max)
264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ");
265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(dflt);
266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", new Label[] {");
267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < labels.length; ++i) {
268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(i == 0 ? " " : ", ");
269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            appendLabel(labels[i]);
270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(" });\n");
272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitLookupSwitchInsn(
276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label dflt,
277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int[] keys,
278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label[] labels)
279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < labels.length; ++i) {
282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            declareLabel(labels[i]);
283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(dflt);
285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitLookupSwitchInsn(");
287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(dflt);
288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", new int[] {");
289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < keys.length; ++i) {
290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(i == 0 ? " " : ", ").append(keys[i]);
291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(" }, new Label[] {");
293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < labels.length; ++i) {
294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(i == 0 ? " " : ", ");
295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            appendLabel(labels[i]);
296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(" });\n");
298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitMultiANewArrayInsn(final String desc, final int dims) {
302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitMultiANewArrayInsn(");
304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ").append(dims).append(");\n");
306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitTryCatchBlock(
310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label start,
311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label end,
312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label handler,
313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String type)
314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(start);
317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(end);
318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        declareLabel(handler);
319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitTryCatchBlock(");
320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(start);
321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
322674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(end);
323674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
324674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(handler);
325674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
326674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(type);
327674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
328674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
329674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
330674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
331674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitLocalVariable(
332674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String name,
333674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc,
334674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String signature,
335674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label start,
336674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Label end,
337674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int index)
338674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
339674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
340674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitLocalVariable(");
341674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(name);
342674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
343674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
344674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
345674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(signature);
346674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
347674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(start);
348674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ");
349674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(end);
350674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ").append(index).append(");\n");
351674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
352674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
353674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
354674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitLineNumber(final int line, final Label start) {
355674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
356674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitLineNumber(").append(line).append(", ");
357674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendLabel(start);
358674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(");\n");
359674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
360674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
361674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
362674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitMaxs(final int maxStack, final int maxLocals) {
363674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
364674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("mv.visitMaxs(")
365674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(maxStack)
366674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(", ")
367674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(maxLocals)
368674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(");\n");
369674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
370674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
371674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
372674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void declareFrameTypes(final int n, final Object[] o) {
373674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < n; ++i) {
374674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (o[i] instanceof Label) {
375674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                declareLabel((Label) o[i]);
376674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
377674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
378674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
379674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
380674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void appendFrameTypes(final int n, final Object[] o) {
381674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < n; ++i) {
382674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (i > 0) {
383674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(", ");
384674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
385674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (o[i] instanceof String) {
386674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendConstant(o[i]);
387674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else if (o[i] instanceof Integer) {
388674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                switch (((Integer) o[i]).intValue()) {
389674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 0:
390674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.TOP");
391674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
392674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 1:
393674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.INTEGER");
394674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
395674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 2:
396674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.FLOAT");
397674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
398674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 3:
399674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.DOUBLE");
400674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
401674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 4:
402674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.LONG");
403674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
404674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 5:
405674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.NULL");
406674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
407674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 6:
408674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        buf.append("Opcodes.UNINITIALIZED_THIS");
409674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
410674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
411674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else {
412674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                appendLabel((Label) o[i]);
413674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
414674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
415674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
416674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
417674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
418674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Appends a declaration of the given label to {@link #buf buf}. This
419674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * declaration is of the form "Label lXXX = new Label();". Does nothing if
420674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the given label has already been declared.
421674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
422674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param l a label.
423674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
424674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void declareLabel(final Label l) {
425674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        String name = (String) labelNames.get(l);
426674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (name == null) {
427674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            name = "l" + labelNames.size();
428674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            labelNames.put(l, name);
429674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("Label ").append(name).append(" = new Label();\n");
430674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
431674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
432674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
433674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
434674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Appends the name of the given label to {@link #buf buf}. The given label
435674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * <i>must</i> already have a name. One way to ensure this is to always
436674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * call {@link #declareLabel declared} before calling this method.
437674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
438674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param l a label.
439674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
440674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void appendLabel(final Label l) {
441674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append((String) labelNames.get(l));
442674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
443674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
444