1   package org.apache.commons.javaflow.bytecode.transformation;
2   
3   import org.objectweb.asm.AnnotationVisitor;
4   import org.objectweb.asm.ClassWriter;
5   import org.objectweb.asm.FieldVisitor;
6   import org.objectweb.asm.Label;
7   import org.objectweb.asm.MethodVisitor;
8   import org.objectweb.asm.Opcodes;
9   
10  
11  public class DefaultConstructorDump implements Opcodes {
12  
13    public static byte[] dump() throws Exception {
14      FieldVisitor fv;
15      MethodVisitor mv;
16      AnnotationVisitor av0;
17  
18      ClassWriter cw = new ClassWriter(true);
19      cw.visit( V1_2, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, "org/apache/commons/javaflow/bytecode/transformation/asm/data/DefaultConstructor", null, "java/lang/Thread", null);
20  
21      cw.visitSource( "DefaultConstructor.java", null);
22  
23      {
24        mv = cw.visitMethod( ACC_PUBLIC, "<init>", "()V", null, null);
25        mv.visitCode();
26        
27        Label l0 = new Label();
28        mv.visitLabel( l0);
29        
30        mv.visitVarInsn( ALOAD, 0);
31        mv.visitMethodInsn( INVOKESPECIAL, "java/lang/Thread", "<init>", "()V");
32  
33        mv.visitMethodInsn( INVOKESTATIC, "org/apache/commons/javaflow/bytecode/StackRecorder", "get", "()Lorg/apache/commons/javaflow/bytecode/StackRecorder;");
34        mv.visitInsn( DUP);
35        mv.visitVarInsn( ASTORE, 1);
36        Label l1 = new Label();
37        mv.visitJumpInsn( IFNULL, l1);
38        mv.visitVarInsn( ALOAD, 1);
39        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "isRestoring", "()Z");
40        mv.visitJumpInsn( IFEQ, l1);
41        mv.visitVarInsn( ALOAD, 1);
42        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "popInt", "()I");
43        Label l2 = new Label();
44        mv.visitTableSwitchInsn( 0, 0, l1, new Label[] { l2});
45        
46        mv.visitLabel( l2);
47        mv.visitLdcInsn( "restore locals");
48        mv.visitInsn( POP);
49        mv.visitVarInsn( ALOAD, 1);
50        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "popObject", "()Ljava/lang/Object;");
51        mv.visitTypeInsn( CHECKCAST, "org/apache/commons/javaflow/bytecode/transformation/asm/data/DefaultConstructor");
52        mv.visitVarInsn( ASTORE, 0);
53        mv.visitLdcInsn( "restore stack");
54        mv.visitInsn( POP);
55        mv.visitLdcInsn( "restore reference");
56        mv.visitInsn( POP);
57        mv.visitVarInsn( ALOAD, 1);
58        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "popReference", "()Ljava/lang/Object;");
59        mv.visitTypeInsn( CHECKCAST, "java/io/PrintStream");
60        mv.visitLdcInsn( "restore params");
61        mv.visitInsn( POP);
62        mv.visitInsn( ACONST_NULL);
63        mv.visitTypeInsn( CHECKCAST, "java/lang/String");
64        Label l3 = new Label();
65        mv.visitJumpInsn( GOTO, l3);
66        
67        mv.visitLabel( l1);
68        
69        mv.visitFieldInsn( GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
70        mv.visitLdcInsn( "aaa");
71        mv.visitLabel( l3);
72        mv.visitMethodInsn( INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
73        mv.visitVarInsn( ALOAD, 1);
74        Label l5 = new Label();
75        mv.visitJumpInsn( IFNULL, l5);
76        mv.visitVarInsn( ALOAD, 1);
77        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "isCapturing", "()Z");
78        mv.visitJumpInsn( IFEQ, l5);
79        mv.visitVarInsn( ALOAD, 1);
80        mv.visitVarInsn( ALOAD, 0);
81        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "pushReference",
82            "(Ljava/lang/Object;)V");
83        mv.visitVarInsn( ALOAD, 1);
84        mv.visitVarInsn( ALOAD, 0);
85        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "pushObject",
86            "(Ljava/lang/Object;)V");
87        mv.visitVarInsn( ALOAD, 1);
88        mv.visitIntInsn( BIPUSH, 0);
89        mv.visitMethodInsn( INVOKEVIRTUAL, "org/apache/commons/javaflow/bytecode/StackRecorder", "pushInt", "(I)V");
90        mv.visitInsn( RETURN);
91        
92        mv.visitLabel( l5);
93        mv.visitInsn( RETURN);
94        
95        Label l6 = new Label();
96        mv.visitLabel( l6);
97        mv.visitLocalVariable( "this", "Lorg/apache/commons/javaflow/bytecode/transformation/asm/data/DefaultConstructor;", null, l1, l6, 0);
98        mv.visitLocalVariable( "__stackRecorder", "Lorg/apache/commons/javaflow/bytecode/StackRecorder;", null, l0, l6, 1);
99        mv.visitMaxs( 2, 2);
100       mv.visitEnd();
101     }
102     cw.visitEnd();
103 
104     return cw.toByteArray();
105   }
106 }
107