|
|
@@ -0,0 +1,72 @@
|
|
|
+package net.ranides.assira.asm;
|
|
|
+
|
|
|
+import org.objectweb.asm.AnnotationVisitor;
|
|
|
+import org.objectweb.asm.Attribute;
|
|
|
+import org.objectweb.asm.ClassReader;
|
|
|
+import org.objectweb.asm.ClassWriter;
|
|
|
+import org.objectweb.asm.ConstantDynamic;
|
|
|
+import org.objectweb.asm.FieldVisitor;
|
|
|
+import org.objectweb.asm.Handle;
|
|
|
+import org.objectweb.asm.Label;
|
|
|
+import org.objectweb.asm.MethodVisitor;
|
|
|
+import org.objectweb.asm.Opcodes;
|
|
|
+import org.objectweb.asm.Type;
|
|
|
+import org.objectweb.asm.TypePath;
|
|
|
+
|
|
|
+public class PrototypeDump implements Opcodes {
|
|
|
+
|
|
|
+ public static byte[] dump() throws Exception {
|
|
|
+
|
|
|
+ ClassWriter classWriter = new ClassWriter(0);
|
|
|
+ FieldVisitor fieldVisitor;
|
|
|
+ MethodVisitor methodVisitor;
|
|
|
+ AnnotationVisitor annotationVisitor0;
|
|
|
+
|
|
|
+ classWriter.visit(V1_8, ACC_PUBLIC | ACC_SUPER, "net/ranides/assira/asm/Prototype", null, "java/lang/Object", null);
|
|
|
+
|
|
|
+ classWriter.visitSource("Prototype.java", null);
|
|
|
+
|
|
|
+ {
|
|
|
+ fieldVisitor = classWriter.visitField(ACC_PRIVATE, "that", "Ljava/lang/Object;", null, null);
|
|
|
+ fieldVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(6, label0);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
|
|
|
+ methodVisitor.visitInsn(RETURN);
|
|
|
+ Label label1 = new Label();
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/asm/Prototype;", null, label0, label1, 0);
|
|
|
+ methodVisitor.visitMaxs(1, 1);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "writeReplace", "()Ljava/lang/Object;", null, null);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(11, label0);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "net/ranides/assira/asm/PrototypeSForm");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitLdcInsn(Type.getType("Lnet/ranides/assira/reflection/util/PackageScanner;"));
|
|
|
+ methodVisitor.visitLdcInsn(Type.getType("Lnet/ranides/assira/text/IOStrings;"));
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitFieldInsn(GETFIELD, "net/ranides/assira/asm/Prototype", "that", "Ljava/lang/Object;");
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "net/ranides/assira/asm/PrototypeSForm", "<init>", "(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Object;)V", false);
|
|
|
+ methodVisitor.visitInsn(ARETURN);
|
|
|
+ Label label1 = new Label();
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/asm/Prototype;", null, label0, label1, 0);
|
|
|
+ methodVisitor.visitMaxs(5, 1);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ classWriter.visitEnd();
|
|
|
+
|
|
|
+ return classWriter.toByteArray();
|
|
|
+ }
|
|
|
+}
|