KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > asm > util > ASMifierAbstractVisitor


1 /***
2  * ASM: a very small and fast Java bytecode manipulation framework
3  * Copyright (c) 2000-2005 INRIA, France Telecom
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of the copyright holders nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28  * THE POSSIBILITY OF SUCH DAMAGE.
29  */

30 package com.tc.asm.util;
31
32 import java.util.HashMap JavaDoc;
33
34 import com.tc.asm.AnnotationVisitor;
35 import com.tc.asm.Attribute;
36 import com.tc.asm.Type;
37 import com.tc.asm.util.attrs.ASMifiable;
38
39 /**
40  * An abstract ASMifier visitor.
41  *
42  * @author Eric Bruneton
43  */

44 public class ASMifierAbstractVisitor extends AbstractVisitor {
45
46     /**
47      * The name of the variable for this visitor in the produced code.
48      */

49     protected String JavaDoc name;
50
51     /**
52      * The label names. This map associates String values to Label keys. It is
53      * used only in ASMifierMethodVisitor.
54      */

55     HashMap JavaDoc labelNames;
56
57     /**
58      * Constructs a new {@link ASMifierAbstractVisitor}.
59      *
60      * @param name the name of the variable for this visitor in the produced
61      * code.
62      */

63     protected ASMifierAbstractVisitor(final String JavaDoc name) {
64         this.name = name;
65     }
66
67     /**
68      * Prints the ASM code that generates the given annotation.
69      *
70      * @param desc the class descriptor of the annotation class.
71      * @param visible <tt>true</tt> if the annotation is visible at runtime.
72      * @return a visitor to visit the annotation values.
73      */

74     public AnnotationVisitor visitAnnotation(
75         final String JavaDoc desc,
76         final boolean visible)
77     {
78         buf.setLength(0);
79         buf.append("{\n")
80                 .append("av0 = ")
81                 .append(name)
82                 .append(".visitAnnotation(");
83         appendConstant(desc);
84         buf.append(", ").append(visible).append(");\n");
85         text.add(buf.toString());
86         ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(0);
87         text.add(av.getText());
88         text.add("}\n");
89         return av;
90     }
91
92     /**
93      * Prints the ASM code that generates the given attribute.
94      *
95      * @param attr an attribute.
96      */

97     public void visitAttribute(final Attribute attr) {
98         buf.setLength(0);
99         if (attr instanceof ASMifiable) {
100             buf.append("{\n");
101             buf.append("// ATTRIBUTE\n");
102             ((ASMifiable) attr).asmify(buf, "attr", labelNames);
103             buf.append(name).append(".visitAttribute(attr);\n");
104             buf.append("}\n");
105         } else {
106             buf.append("// WARNING! skipped a non standard attribute of type \"");
107             buf.append(attr.type).append("\"\n");
108         }
109         text.add(buf.toString());
110     }
111
112     /**
113      * Prints the ASM code to end the visit.
114      */

115     public void visitEnd() {
116         buf.setLength(0);
117         buf.append(name).append(".visitEnd();\n");
118         text.add(buf.toString());
119     }
120
121     /**
122      * Appends a string representation of the given constant to the given
123      * buffer.
124      *
125      * @param cst an {@link Integer}, {@link Float}, {@link Long},
126      * {@link Double} or {@link String} object. May be <tt>null</tt>.
127      */

128     void appendConstant(final Object JavaDoc cst) {
129         appendConstant(buf, cst);
130     }
131
132     /**
133      * Appends a string representation of the given constant to the given
134      * buffer.
135      *
136      * @param buf a string buffer.
137      * @param cst an {@link Integer}, {@link Float}, {@link Long},
138      * {@link Double} or {@link String} object. May be <tt>null</tt>.
139      */

140     static void appendConstant(final StringBuffer JavaDoc buf, final Object JavaDoc cst) {
141         if (cst == null) {
142             buf.append("null");
143         } else if (cst instanceof String JavaDoc) {
144             appendString(buf, (String JavaDoc) cst);
145         } else if (cst instanceof Type) {
146             buf.append("Type.getType(\"");
147             buf.append(((Type) cst).getDescriptor());
148             buf.append("\")");
149         } else if (cst instanceof Byte JavaDoc) {
150             buf.append("new Byte((byte)").append(cst).append(")");
151         } else if (cst instanceof Boolean JavaDoc) {
152             buf.append("new Boolean(").append(cst).append(")");
153         } else if (cst instanceof Short JavaDoc) {
154             buf.append("new Short((short)").append(cst).append(")");
155         } else if (cst instanceof Character JavaDoc) {
156             int c = ((Character JavaDoc) cst).charValue();
157             buf.append("new Character((char)").append(c).append(")");
158         } else if (cst instanceof Integer JavaDoc) {
159             buf.append("new Integer(").append(cst).append(")");
160         } else if (cst instanceof Float JavaDoc) {
161             buf.append("new Float(\"").append(cst).append("\")");
162         } else if (cst instanceof Long JavaDoc) {
163             buf.append("new Long(").append(cst).append("L)");
164         } else if (cst instanceof Double JavaDoc) {
165             buf.append("new Double(\"").append(cst).append("\")");
166         } else if (cst instanceof byte[]) {
167             byte[] v = (byte[]) cst;
168             buf.append("new byte[] {");
169             for (int i = 0; i < v.length; i++) {
170                 buf.append(i == 0 ? "" : ",").append(v[i]);
171             }
172             buf.append("}");
173         } else if (cst instanceof boolean[]) {
174             boolean[] v = (boolean[]) cst;
175             buf.append("new boolean[] {");
176             for (int i = 0; i < v.length; i++) {
177                 buf.append(i == 0 ? "" : ",").append(v[i]);
178             }
179             buf.append("}");
180         } else if (cst instanceof short[]) {
181             short[] v = (short[]) cst;
182             buf.append("new short[] {");
183             for (int i = 0; i < v.length; i++) {
184                 buf.append(i == 0 ? "" : ",").append("(short)").append(v[i]);
185             }
186             buf.append("}");
187         } else if (cst instanceof char[]) {
188             char[] v = (char[]) cst;
189             buf.append("new char[] {");
190             for (int i = 0; i < v.length; i++) {
191                 buf.append(i == 0 ? "" : ",")
192                         .append("(char)")
193                         .append((int) v[i]);
194             }
195             buf.append("}");
196         } else if (cst instanceof int[]) {
197             int[] v = (int[]) cst;
198             buf.append("new int[] {");
199             for (int i = 0; i < v.length; i++) {
200                 buf.append(i == 0 ? "" : ",").append(v[i]);
201             }
202             buf.append("}");
203         } else if (cst instanceof long[]) {
204             long[] v = (long[]) cst;
205             buf.append("new long[] {");
206             for (int i = 0; i < v.length; i++) {
207                 buf.append(i == 0 ? "" : ",").append(v[i]).append("L");
208             }
209             buf.append("}");
210         } else if (cst instanceof float[]) {
211             float[] v = (float[]) cst;
212             buf.append("new float[] {");
213             for (int i = 0; i < v.length; i++) {
214                 buf.append(i == 0 ? "" : ",").append(v[i]).append("f");
215             }
216             buf.append("}");
217         } else if (cst instanceof double[]) {
218             double[] v = (double[]) cst;
219             buf.append("new double[] {");
220             for (int i = 0; i < v.length; i++) {
221                 buf.append(i == 0 ? "" : ",").append(v[i]).append("d");
222             }
223             buf.append("}");
224         }
225     }
226 }
227
Popular Tags