xref: /aosp_15_r20/external/ow2-asm/asm-test/src/resources/java/jdk8/DumpArtificialStructures.java (revision 2835e6bb194a25e32dae2cc0628d8f988b82bfc0)
1 // ASM: a very small and fast Java bytecode manipulation framework
2 // Copyright (c) 2000-2011 INRIA, France Telecom
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions
7 // are met:
8 // 1. Redistributions of source code must retain the above copyright
9 //    notice, this list of conditions and the following disclaimer.
10 // 2. Redistributions in binary form must reproduce the above copyright
11 //    notice, this list of conditions and the following disclaimer in the
12 //    documentation and/or other materials provided with the distribution.
13 // 3. Neither the name of the copyright holders nor the names of its
14 //    contributors may be used to endorse or promote products derived from
15 //    this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 // THE POSSIBILITY OF SUCH DAMAGE.
28 package jdk8;
29 
30 import java.io.FileOutputStream;
31 import java.io.IOException;
32 import org.objectweb.asm.ClassWriter;
33 import org.objectweb.asm.MethodVisitor;
34 import org.objectweb.asm.Label;
35 import org.objectweb.asm.Opcodes;
36 import org.objectweb.asm.Type;
37 
38 /**
39  * Generates a class with structures, instructions and patterns that cannot be produced by compiling
40  * a Java source file with the javac compiler. This includes LDC instructions with MethodType
41  * constants.
42  *
43  * <p>Ideally we should not use ASM to generate this class (which is later used to test ASM), but
44  * this would be hard to do.
45  *
46  * @author Eric Bruneton
47  */
48 public class DumpArtificialStructures implements Opcodes {
49 
main(String[] args)50   public static void main(String[] args) throws IOException {
51     FileOutputStream fileOutputStream = new FileOutputStream("Artificial$()$Structures.class");
52     fileOutputStream.write(dump());
53     fileOutputStream.close();
54   }
55 
dump()56   private static byte[] dump() {
57     ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
58     MethodVisitor methodVisitor;
59 
60     final String INTERNAL_NAME = "jdk8/Artificial$()$Structures";
61     classWriter.visit(
62         V1_8,
63         ACC_PUBLIC + ACC_SUPER,
64         INTERNAL_NAME,
65         null,
66         "java/lang/Object",
67         null);
68 
69     classWriter.visitField(ACC_PUBLIC, "value", "I", null, null).visitEnd();
70 
71     methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "(I)V", null, null);
72     methodVisitor.visitCode();
73     methodVisitor.visitVarInsn(ALOAD, 0);
74     methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
75     methodVisitor.visitVarInsn(ALOAD, 0);
76     methodVisitor.visitVarInsn(ILOAD, 1);
77     methodVisitor.visitFieldInsn(PUTFIELD, INTERNAL_NAME, "value", "I");
78     methodVisitor.visitInsn(RETURN);
79     methodVisitor.visitMaxs(0, 0);
80     methodVisitor.visitEnd();
81 
82     methodVisitor =
83         classWriter.visitMethod(
84             ACC_PRIVATE, "<init>", "(Ljdk8/Artificial$()$Structures;)V", null, null);
85     methodVisitor.visitCode();
86     methodVisitor.visitVarInsn(ALOAD, 0);
87     methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
88     methodVisitor.visitVarInsn(ALOAD, 0);
89     methodVisitor.visitVarInsn(ALOAD, 1);
90     Label elseLabel = new Label();
91     methodVisitor.visitJumpInsn(IFNULL, elseLabel);
92     methodVisitor.visitVarInsn(ALOAD, 1);
93     methodVisitor.visitFieldInsn(GETFIELD, INTERNAL_NAME, "value", "I");
94     Label endIfLabel = new Label();
95     methodVisitor.visitJumpInsn(GOTO, endIfLabel);
96     methodVisitor.visitLabel(elseLabel);
97     methodVisitor.visitInsn(ICONST_0);
98     methodVisitor.visitLabel(endIfLabel);
99     methodVisitor.visitFieldInsn(PUTFIELD, INTERNAL_NAME, "value", "I");
100     methodVisitor.visitInsn(RETURN);
101     methodVisitor.visitMaxs(0, 0);
102     methodVisitor.visitEnd();
103 
104     methodVisitor =
105         classWriter.visitMethod(
106             ACC_PUBLIC, "clone", "()Ljdk8/Artificial$()$Structures;", null, null);
107     methodVisitor.visitCode();
108     methodVisitor.visitTypeInsn(NEW, INTERNAL_NAME);
109     methodVisitor.visitInsn(DUP);
110     methodVisitor.visitVarInsn(ALOAD, 0);
111     methodVisitor.visitMethodInsn(
112         INVOKESPECIAL,
113         INTERNAL_NAME,
114         "<init>",
115         "(Ljdk8/Artificial$()$Structures;)V",
116         false);
117     methodVisitor.visitInsn(ARETURN);
118     methodVisitor.visitMaxs(0, 0);
119     methodVisitor.visitEnd();
120 
121     methodVisitor =
122         classWriter.visitMethod(
123             ACC_PUBLIC + ACC_STATIC, "methodType", "()Ljava/lang/invoke/MethodType;", null, null);
124     methodVisitor.visitCode();
125     methodVisitor.visitLdcInsn(Type.getMethodType("(I)I"));
126     methodVisitor.visitInsn(ARETURN);
127     methodVisitor.visitMaxs(0, 0);
128     methodVisitor.visitEnd();
129 
130     methodVisitor =
131         classWriter.visitMethod(
132             ACC_PUBLIC | ACC_STATIC, "frameWithForwardLabelReferences", "([Ljava/lang/String;)V", null, null);
133     methodVisitor.visitCode();
134     methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
135     Label labelNew = new Label();
136     methodVisitor.visitJumpInsn(GOTO, labelNew);
137 
138     Label labelInit = new Label();
139     methodVisitor.visitLabel(labelInit);
140     methodVisitor.visitFrame(
141         Opcodes.F_NEW,
142         1,
143         new Object[] {"[Ljava/lang/String;"},
144         3,
145         new Object[] {"java/io/PrintStream", labelNew, labelNew});
146     methodVisitor.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "<init>", "()V", false);
147     Label labelAfterInit = new Label();
148     methodVisitor.visitJumpInsn(GOTO, labelAfterInit);
149 
150     methodVisitor.visitLabel(labelNew);
151     methodVisitor.visitFrame(
152         Opcodes.F_NEW,
153         1,
154         new Object[] {"[Ljava/lang/String;"},
155         1,
156         new Object[] {"java/io/PrintStream"});
157     methodVisitor.visitTypeInsn(NEW, INTERNAL_NAME);
158     methodVisitor.visitInsn(DUP);
159     methodVisitor.visitJumpInsn(GOTO, labelInit);
160 
161     methodVisitor.visitLabel(labelAfterInit);
162     methodVisitor.visitFrame(
163         Opcodes.F_NEW,
164         1,
165         new Object[] {"[Ljava/lang/String;"},
166         2,
167         new Object[] {"java/io/PrintStream", INTERNAL_NAME});
168     methodVisitor.visitMethodInsn(
169         INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V", false);
170     methodVisitor.visitInsn(RETURN);
171     methodVisitor.visitMaxs(3, 1);
172     methodVisitor.visitEnd();
173 
174     classWriter.visitEnd();
175     return classWriter.toByteArray();
176   }
177 }
178