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.Attribute;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Type;
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.Map;
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * An abstract ASMifier visitor.
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class ASMifierAbstractVisitor extends AbstractVisitor {
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The name of the variable for this visitor in the produced code.
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected String name;
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The label names. This map associates String values to Label keys. It is
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * used only in ASMifierMethodVisitor.
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    Map labelNames;
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constructs a new {@link ASMifierAbstractVisitor}.
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param name the name of the variable for this visitor in the produced
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        code.
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected ASMifierAbstractVisitor(final String name) {
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.name = name;
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Prints the ASM code that generates the given annotation.
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc the class descriptor of the annotation class.
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param visible <tt>true</tt> if the annotation is visible at runtime.
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return a visitor to visit the annotation values.
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AnnotationVisitor visitAnnotation(
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final String desc,
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final boolean visible)
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("{\n")
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append("av0 = ")
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(name)
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                .append(".visitAnnotation(");
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(desc);
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(", ").append(visible).append(");\n");
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(av.getText());
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add("}\n");
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return av;
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Prints the ASM code that generates the given attribute.
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param attr an attribute.
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitAttribute(final Attribute attr) {
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append("// ATTRIBUTE ").append(attr.type).append('\n');
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (attr instanceof ASMifiable) {
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("{\n");
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            ((ASMifiable) attr).asmify(buf, "attr", labelNames);
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(name).append(".visitAttribute(attr);\n");
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("}\n");
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Prints the ASM code to end the visit.
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void visitEnd() {
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.setLength(0);
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        buf.append(name).append(".visitEnd();\n");
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        text.add(buf.toString());
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Appends a string representation of the given constant to the given
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * buffer.
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cst an {@link Integer}, {@link Float}, {@link Long},
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        {@link Double} or {@link String} object. May be <tt>null</tt>.
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    void appendConstant(final Object cst) {
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        appendConstant(buf, cst);
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Appends a string representation of the given constant to the given
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * buffer.
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param buf a string buffer.
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cst an {@link Integer}, {@link Float}, {@link Long},
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        {@link Double} or {@link String} object. May be <tt>null</tt>.
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static void appendConstant(final StringBuffer buf, final Object cst) {
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (cst == null) {
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("null");
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof String) {
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            appendString(buf, (String) cst);
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Type) {
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("Type.getType(\"");
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(((Type) cst).getDescriptor());
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("\")");
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Byte) {
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Byte((byte)").append(cst).append(')');
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Boolean) {
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append(((Boolean) cst).booleanValue() ? "Boolean.TRUE" : "Boolean.FALSE");
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Short) {
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Short((short)").append(cst).append(')');
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Character) {
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int c = ((Character) cst).charValue();
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Character((char)").append(c).append(')');
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Integer) {
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Integer(").append(cst).append(')');
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Float) {
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Float(\"").append(cst).append("\")");
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Long) {
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Long(").append(cst).append("L)");
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof Double) {
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new Double(\"").append(cst).append("\")");
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof byte[]) {
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            byte[] v = (byte[]) cst;
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new byte[] {");
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]);
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof boolean[]) {
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            boolean[] v = (boolean[]) cst;
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new boolean[] {");
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]);
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof short[]) {
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            short[] v = (short[]) cst;
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new short[] {");
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append("(short)").append(v[i]);
181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof char[]) {
184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            char[] v = (char[]) cst;
185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new char[] {");
186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",")
188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append("(char)")
189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        .append((int) v[i]);
190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof int[]) {
193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int[] v = (int[]) cst;
194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new int[] {");
195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]);
197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof long[]) {
200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            long[] v = (long[]) cst;
201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new long[] {");
202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]).append('L');
204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof float[]) {
207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            float[] v = (float[]) cst;
208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new float[] {");
209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]).append('f');
211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (cst instanceof double[]) {
214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            double[] v = (double[]) cst;
215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append("new double[] {");
216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (int i = 0; i < v.length; i++) {
217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                buf.append(i == 0 ? "" : ",").append(v[i]).append('d');
218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            buf.append('}');
220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
223