001: /***
002: * ASM tests
003: * Copyright (c) 2002-2005 France Telecom
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: * 2. Redistributions in binary form must reproduce the above copyright
012: * notice, this list of conditions and the following disclaimer in the
013: * documentation and/or other materials provided with the distribution.
014: * 3. Neither the name of the copyright holders nor the names of its
015: * contributors may be used to endorse or promote products derived from
016: * this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028: * THE POSSIBILITY OF SUCH DAMAGE.
029: */package org.objectweb.asm.test.cases;
030:
031: import java.io.IOException;
032:
033: import org.objectweb.asm.ClassWriter;
034: import org.objectweb.asm.FieldVisitor;
035: import org.objectweb.asm.MethodVisitor;
036: import org.objectweb.asm.Type;
037:
038: /**
039: * Generates an enum class.
040: *
041: * @author Eric Bruneton
042: */
043: public class Enum extends Generator {
044:
045: public void generate(final String dir) throws IOException {
046: generate(dir, "pkg/Enum.class", dump());
047: }
048:
049: public byte[] dump() {
050: ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
051: FieldVisitor fv;
052: MethodVisitor mv;
053:
054: cw.visit(V1_5, ACC_PUBLIC + ACC_FINAL + ACC_SUPER + ACC_ENUM,
055: "pkg/Enum", "Ljava/lang/Enum<Lpkg/Enum;>;",
056: "java/lang/Enum", null);
057:
058: fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC
059: + ACC_ENUM, "V0", "Lpkg/Enum;", null, null);
060: fv.visitEnd();
061:
062: fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC
063: + ACC_ENUM, "V1", "Lpkg/Enum;", null, null);
064: fv.visitEnd();
065:
066: fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC
067: + ACC_ENUM, "V2", "Lpkg/Enum;", null, null);
068: fv.visitEnd();
069:
070: fv = cw.visitField(ACC_PRIVATE + ACC_FINAL + ACC_STATIC
071: + ACC_SYNTHETIC, "$VALUES", "[Lpkg/Enum;", null, null);
072: fv.visitEnd();
073:
074: mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL + ACC_STATIC,
075: "values", "()[Lpkg/Enum;", null, null);
076: mv.visitCode();
077: mv.visitFieldInsn(GETSTATIC, "pkg/Enum", "$VALUES",
078: "[Lpkg/Enum;");
079: mv.visitMethodInsn(INVOKEVIRTUAL, "[Lpkg/Enum;", "clone",
080: "()Ljava/lang/Object;");
081: mv.visitTypeInsn(CHECKCAST, "[Lpkg/Enum;");
082: mv.visitInsn(ARETURN);
083: mv.visitMaxs(0, 0);
084: mv.visitEnd();
085:
086: mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "valueOf",
087: "(Ljava/lang/String;)Lpkg/Enum;", null, null);
088: mv.visitCode();
089: mv.visitLdcInsn(Type.getType("Lpkg/Enum;"));
090: mv.visitVarInsn(ALOAD, 0);
091: mv
092: .visitMethodInsn(INVOKESTATIC, "java/lang/Enum",
093: "valueOf",
094: "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;");
095: mv.visitTypeInsn(CHECKCAST, "pkg/Enum");
096: mv.visitInsn(ARETURN);
097: mv.visitMaxs(0, 0);
098: mv.visitEnd();
099:
100: mv = cw.visitMethod(ACC_PRIVATE, "<init>",
101: "(Ljava/lang/String;I)V", "()V", null);
102: mv.visitCode();
103: mv.visitVarInsn(ALOAD, 0);
104: mv.visitVarInsn(ALOAD, 1);
105: mv.visitVarInsn(ILOAD, 2);
106: mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Enum", "<init>",
107: "(Ljava/lang/String;I)V");
108: mv.visitInsn(RETURN);
109: mv.visitMaxs(0, 0);
110: mv.visitEnd();
111:
112: mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
113: mv.visitCode();
114: mv.visitTypeInsn(NEW, "pkg/Enum");
115: mv.visitInsn(DUP);
116: mv.visitLdcInsn("V0");
117: mv.visitInsn(ICONST_0);
118: mv.visitMethodInsn(INVOKESPECIAL, "pkg/Enum", "<init>",
119: "(Ljava/lang/String;I)V");
120: mv.visitFieldInsn(PUTSTATIC, "pkg/Enum", "V0", "Lpkg/Enum;");
121: mv.visitTypeInsn(NEW, "pkg/Enum");
122: mv.visitInsn(DUP);
123: mv.visitLdcInsn("V1");
124: mv.visitInsn(ICONST_1);
125: mv.visitMethodInsn(INVOKESPECIAL, "pkg/Enum", "<init>",
126: "(Ljava/lang/String;I)V");
127: mv.visitFieldInsn(PUTSTATIC, "pkg/Enum", "V1", "Lpkg/Enum;");
128: mv.visitTypeInsn(NEW, "pkg/Enum");
129: mv.visitInsn(DUP);
130: mv.visitLdcInsn("V2");
131: mv.visitInsn(ICONST_2);
132: mv.visitMethodInsn(INVOKESPECIAL, "pkg/Enum", "<init>",
133: "(Ljava/lang/String;I)V");
134: mv.visitFieldInsn(PUTSTATIC, "pkg/Enum", "V2", "Lpkg/Enum;");
135: mv.visitInsn(ICONST_3);
136: mv.visitTypeInsn(ANEWARRAY, "pkg/Enum");
137: mv.visitInsn(DUP);
138: mv.visitInsn(ICONST_0);
139: mv.visitFieldInsn(GETSTATIC, "pkg/Enum", "V0", "Lpkg/Enum;");
140: mv.visitInsn(AASTORE);
141: mv.visitInsn(DUP);
142: mv.visitInsn(ICONST_1);
143: mv.visitFieldInsn(GETSTATIC, "pkg/Enum", "V1", "Lpkg/Enum;");
144: mv.visitInsn(AASTORE);
145: mv.visitInsn(DUP);
146: mv.visitInsn(ICONST_2);
147: mv.visitFieldInsn(GETSTATIC, "pkg/Enum", "V2", "Lpkg/Enum;");
148: mv.visitInsn(AASTORE);
149: mv.visitFieldInsn(PUTSTATIC, "pkg/Enum", "$VALUES",
150: "[Lpkg/Enum;");
151: mv.visitInsn(RETURN);
152: mv.visitMaxs(0, 0);
153: mv.visitEnd();
154:
155: cw.visitEnd();
156:
157: return cw.toByteArray();
158: }
159: }
|