Mariusz Sieroń 6 年之前
父節點
當前提交
05bb0d454b

+ 4 - 0
assira.drafts/src/test/java/net/ranides/assira/asm/Prototype.java

@@ -7,6 +7,10 @@ public class Prototype {
 
     private Object that;
 
+    public Prototype(Object that) {
+        this.that = that;
+    }
+
     private Object writeReplace() {
         return new PrototypeSForm(PackageScanner.class, IOStrings.class, that);
     }

+ 24 - 2
assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeAsmifier.java

@@ -1,12 +1,34 @@
 package net.ranides.assira.asm;
 
+import net.ranides.assira.text.IOStrings;
+import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.util.ASMifier;
+import org.objectweb.asm.util.TraceClassVisitor;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 public class PrototypeAsmifier {
 
-    public static void main(String[] args) throws IOException {
-        ASMifier.main(new String[]{Prototype.class.getName()});
+    public static void main(String[] args2) throws IOException {
+        ASMifier asmifier = new ASMifier();
+
+        Path out = Paths.get("assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeDump.java");
+        System.out.println(out.toFile().exists());
+
+        StringWriter out1 = new StringWriter();
+
+        TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, asmifier, new PrintWriter(out1));
+        new ClassReader(Prototype.class.getName()).accept(traceClassVisitor, 0);
+
+        String text = out1.toString().replace("package asm.", "package ");
+
+        IOStrings.write(out, text, StandardCharsets.UTF_8);
+
     }
+
 }

+ 16 - 6
assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeDump.java

@@ -31,18 +31,28 @@ public class PrototypeDump implements Opcodes {
             fieldVisitor.visitEnd();
         }
         {
-            methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+            methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/Object;)V", null, null);
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(6, label0);
+            methodVisitor.visitLineNumber(10, 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.visitLineNumber(11, label1);
+            methodVisitor.visitVarInsn(ALOAD, 0);
+            methodVisitor.visitVarInsn(ALOAD, 1);
+            methodVisitor.visitFieldInsn(PUTFIELD, "net/ranides/assira/asm/Prototype", "that", "Ljava/lang/Object;");
+            Label label2 = new Label();
+            methodVisitor.visitLabel(label2);
+            methodVisitor.visitLineNumber(12, label2);
+            methodVisitor.visitInsn(RETURN);
+            Label label3 = new Label();
+            methodVisitor.visitLabel(label3);
+            methodVisitor.visitLocalVariable("this", "Lnet/ranides/assira/asm/Prototype;", null, label0, label3, 0);
+            methodVisitor.visitLocalVariable("that", "Ljava/lang/Object;", null, label0, label3, 1);
+            methodVisitor.visitMaxs(2, 2);
             methodVisitor.visitEnd();
         }
         {
@@ -50,7 +60,7 @@ public class PrototypeDump implements Opcodes {
             methodVisitor.visitCode();
             Label label0 = new Label();
             methodVisitor.visitLabel(label0);
-            methodVisitor.visitLineNumber(11, label0);
+            methodVisitor.visitLineNumber(15, label0);
             methodVisitor.visitTypeInsn(NEW, "net/ranides/assira/asm/PrototypeSForm");
             methodVisitor.visitInsn(DUP);
             methodVisitor.visitLdcInsn(Type.getType("Lnet/ranides/assira/reflection/util/PackageScanner;"));