Mariusz Sieroń 6 lat temu
rodzic
commit
6085ca9130

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

@@ -0,0 +1,13 @@
+package net.ranides.assira.asm;
+
+import net.ranides.assira.reflection.util.PackageScanner;
+import net.ranides.assira.text.IOStrings;
+
+public class Prototype {
+
+    private Object that;
+
+    private Object writeReplace() {
+        return new PrototypeSForm(PackageScanner.class, IOStrings.class, that);
+    }
+}

+ 12 - 0
assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeAsmifier.java

@@ -0,0 +1,12 @@
+package net.ranides.assira.asm;
+
+import org.objectweb.asm.util.ASMifier;
+
+import java.io.IOException;
+
+public class PrototypeAsmifier {
+
+    public static void main(String[] args) throws IOException {
+        ASMifier.main(new String[]{Prototype.class.getName()});
+    }
+}

+ 72 - 0
assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeDump.java

@@ -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();
+    }
+}

+ 22 - 0
assira.drafts/src/test/java/net/ranides/assira/asm/PrototypeSForm.java

@@ -0,0 +1,22 @@
+package net.ranides.assira.asm;
+
+import net.ranides.assira.reflection.AdapterFactory;
+
+public class PrototypeSForm {
+
+    private final Class<?> source;
+
+    private final Class<?> target;
+
+    private final Object that;
+
+    public PrototypeSForm(Class<?> source, Class<?> target, Object that) {
+        this.source = source;
+        this.target = target;
+        this.that = that;
+    }
+
+    Object readResolve() {
+        return AdapterFactory.getSystem().cast(target, that);
+    }
+}