Sfoglia il codice sorgente

draft: adapter (util methods)

Mariusz Sieroń 6 anni fa
parent
commit
5fba3adbc6

+ 20 - 14
assira.drafts/src/main/java/net/ranides/assira/reflection/Adapter.java

@@ -13,6 +13,12 @@ public class Adapter {
 
     private static final String FIELD_THAT = "that";
 
+    private static final String FIELD_THIS = "this";
+
+    private static final IAttributes PUBLIC = IAttributes.of(IAttribute.PUBLIC);
+
+    private static final IAttributes PRIVATE = IAttributes.of(IAttribute.PRIVATE);
+
     public static <T> T cast(Class<T> type, Object that) {
         return cast(IClass.typeinfo(type), that);
     }
@@ -23,19 +29,17 @@ public class Adapter {
 
         String adapterName = "net.ranides.asm.generated." + type.name();
 
-        IClass<?> vmiAdapter = IClass.symbolic(adapterName);
-
         Set<IClass<?>> classInners = new HashSet<>();
         scanForInners1(classInners, vmcDelegate);
         scanForInners(classInners, type);
 
-        IClassBuilder writer = IClassBuilder.declare(IAttributes.of(IAttribute.PUBLIC), adapterName, IClass.OBJECT, Arrays.asList(type));
+        IClassBuilder writer = IClassBuilder.declare(PUBLIC, adapterName, IClass.OBJECT, Arrays.asList(type));
 
         for(IClass<?> ci : classInners) {
             writer.inner(ci);
         }
 
-        writer.field(IAttributes.of(IAttribute.PRIVATE), vmcDelegate, FIELD_THAT);
+        writer.field(PRIVATE, vmcDelegate, FIELD_THAT);
 
         putConstructor(writer, vmcDelegate);
 
@@ -49,8 +53,12 @@ public class Adapter {
     }
 
     private static void putConstructor(IClassBuilder writer, IClass<?> delegate) {
-        IMethodBuilder m = writer.constructor(IAttributes.of(IAttribute.PUBLIC), Arrays.asList(delegate), Collections.emptyList());
+        IMethodBuilder m = writer.constructor(PUBLIC, Arrays.asList(delegate), Collections.emptyList());
 
+        // Constructor(T that) {
+        //      super();
+        //      this.that = that;
+        // }
         m.load(IClass.OBJECT, 0);
         m.invokeInit(IClass.OBJECT, Collections.emptyList());
         m.load(IClass.OBJECT, 0);
@@ -58,26 +66,24 @@ public class Adapter {
         m.putField(writer.type(), delegate, FIELD_THAT);
         m.returns();
 
-        m.var(writer.type(), "this");
+        m.var(writer.type(), FIELD_THIS);
         m.var(delegate, FIELD_THAT);
         m.end();
     }
 
     private static void putMethod(IClassBuilder writer, IClass<?> delegate, IMethod method) {
-        IMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), method.name(), method.arguments().types().list(), method.returns(), method.exceptions());
+        IMethodBuilder m = writer.method(PUBLIC, method.name(), method);
 
+        // T method_name(args...) {
+        //      return this.that.method_name(args...);
+        // }
         m.load(IClass.OBJECT, 0);
         m.getField(writer.type(), delegate, FIELD_THAT);
-
-        int index = 1;
-        for(IClass<?> type : method.arguments().types()) {
-            m.load(type, index++);
-        }
-
+        m.load(method.arguments(), 1);
         m.invokeVirtual(delegate, method);
         m.returns(method.returns());
 
-        m.var(writer.type(), "this");
+        m.var(writer.type(), FIELD_THIS);
         m.var(method.arguments());
         m.end();
     }

+ 3 - 0
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/IClassBuilder.java

@@ -2,6 +2,7 @@ package net.ranides.assira.reflection.asm;
 
 import net.ranides.assira.reflection.IAttributes;
 import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IMethod;
 import net.ranides.assira.reflection.asm.impl.CClassBuilder;
 import org.objectweb.asm.ClassWriter;
 
@@ -21,6 +22,8 @@ public interface IClassBuilder {
 
     IMethodBuilder constructor(IAttributes attrs, Iterable<IClass<?>> params, Iterable<IClass<?>> exceptions);
 
+    IMethodBuilder method(IAttributes attrs, String name, IMethod method);
+
     IMethodBuilder method(IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions);
 
     byte[] bytecode();

+ 2 - 0
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/IMethodBuilder.java

@@ -22,6 +22,8 @@ public interface IMethodBuilder {
 
     IMethodBuilder load(IClass<?> type, int index);
 
+    IMethodBuilder load(IArguments arguments, int index);
+
     IMethodBuilder store(IClass<?> type, int index);
 
     IMethodBuilder returns();

+ 6 - 0
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/impl/CClassBuilder.java

@@ -2,6 +2,7 @@ package net.ranides.assira.reflection.asm.impl;
 
 import net.ranides.assira.reflection.IAttributes;
 import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IMethod;
 import net.ranides.assira.reflection.asm.IClassBuilder;
 import net.ranides.assira.reflection.asm.IMethodBuilder;
 import org.objectweb.asm.ClassWriter;
@@ -50,6 +51,11 @@ public class CClassBuilder implements IClassBuilder {
         return method(attrs, "<init>", params, IClass.VOID, exceptions);
     }
 
+    @Override
+    public IMethodBuilder method(IAttributes attrs, String name, IMethod method) {
+        return method(attrs, name, method.arguments().types(), method.returns(), method.exceptions());
+    }
+
     @Override
     public IMethodBuilder method(IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions) {
         return new CMethodBuilder(this, attrs, name, params, ret, exceptions);

+ 8 - 0
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/impl/CMethodBuilder.java

@@ -80,6 +80,14 @@ public class CMethodBuilder implements IMethodBuilder {
         return this;
     }
 
+    @Override
+    public IMethodBuilder load(IArguments arguments, int index) {
+        for(IArgument a : arguments) {
+            load(a.type(), index++);
+        }
+        return this;
+    }
+
     @Override
     public IMethodBuilder store(IClass<?> type, int index) {
         mv.visitVarInsn(AsmSupport.opcode(ISTORE, type), index);