소스 검색

new: move asm generators to assira
change: adapter does not use array

Mariusz Sieroń 6 년 전
부모
커밋
84257b7ee7

+ 0 - 5
assira.asm/pom.xml

@@ -62,11 +62,6 @@
             <artifactId>asm</artifactId>
             <version>7.1</version>
         </dependency>
-        <dependency>
-            <groupId>cglib</groupId>
-            <artifactId>cglib</artifactId>
-            <version>3.2.4</version>
-        </dependency>
     </dependencies>
     
 </project>

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

@@ -1,35 +0,0 @@
-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;
-
-public interface IClassBuilder {
-
-    static IClassBuilder declare(IAttributes attrs, String name, IClass<?> parent, Iterable<IClass<?>> interfaces) {
-        return new CClassBuilder(attrs, name, parent, interfaces);
-    }
-
-    ClassWriter asm();
-
-    IClass<?> type();
-
-    String name();
-
-    IClassBuilder inner(IClass<?> ref);
-
-    IClassBuilder field(IAttributes attrs, IClass<?> type, String name);
-
-    IMethodBuilder constructor(IAttributes attrs, Iterable<IClass<?>> params, Iterable<IClass<?>> exceptions);
-
-    IMethodBuilder init();
-
-    IMethodBuilder method(IAttributes attrs, String name, IMethod method);
-
-    IMethodBuilder method(IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions);
-
-    byte[] bytecode();
-
-}

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

@@ -1,123 +0,0 @@
-package net.ranides.assira.reflection.asm;
-
-import net.ranides.assira.reflection.*;
-import net.ranides.assira.reflection.asm.impl.AsmSupport;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-
-import static org.objectweb.asm.Opcodes.*;
-import static org.objectweb.asm.Opcodes.IXOR;
-
-public interface IMethodBuilder {
-
-    MethodVisitor asm();
-
-    IClassBuilder end();
-
-    Label label();
-
-    Label label(int line);
-
-    IMethodBuilder var(IClass<?> type, String name);
-
-    IMethodBuilder var(IArgument argument);
-
-    IMethodBuilder var(IArguments arguments);
-
-    IMethodBuilder load(IClass<?> type, int index);
-
-    IMethodBuilder load(IArguments arguments, int index);
-
-    IMethodBuilder loadArray(IClass<?> type);
-
-    IMethodBuilder store(IClass<?> type, int index);
-
-    IMethodBuilder storeArray(IClass<?> type);
-
-    IMethodBuilder returns();
-
-    IMethodBuilder returns(IClass<?> type);
-
-    IMethodBuilder putField(IClass<?> owner, IClass<?> type, String name);
-
-    IMethodBuilder putField(IField field);
-
-    IMethodBuilder getField(IClass<?> owner, IClass<?> type, String name);
-
-    IMethodBuilder getField(IField field);
-
-    IMethodBuilder putStatic(IClass<?> owner, IClass<?> type, String name);
-
-    IMethodBuilder putStatic(IField field);
-
-    IMethodBuilder getStatic(IClass<?> owner, IClass<?> type, String name);
-
-    IMethodBuilder getStatic(IField field);
-
-    IMethodBuilder push(Object value);
-
-    IMethodBuilder push(IClass<?> type, Object value);
-
-    IMethodBuilder invokeInit(IClass<?> owner, Iterable<IClass<?>> params);
-
-    IMethodBuilder invokeSpecial(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret);
-
-    IMethodBuilder invokeSpecial(IClass<?> owner, IMethod method);
-
-    IMethodBuilder invokeSpecial(IMethod method);
-
-    IMethodBuilder invokeVirtual(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret);
-
-    IMethodBuilder invokeVirtual(IClass<?> owner, IMethod method);
-
-    IMethodBuilder invokeVirtual(IMethod method);
-
-    IMethodBuilder invokeStatic(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret);
-
-    IMethodBuilder invokeStatic(IClass<?> owner, IMethod method);
-
-    IMethodBuilder invokeStatic(IMethod method);
-
-    IMethodBuilder invokeDynamic(IMethod bootstrap, String name, Iterable<IClass<?>> params, IClass<?> ret, Object[] args);
-
-    IMethodBuilder newObject(IClass<?> type);
-
-    IMethodBuilder checkCast(IClass<?> type);
-
-    IMethodBuilder isInstance(IClass<?> type);
-
-    IMethodBuilder box(IClass<?> type);
-
-    IMethodBuilder add(IClass<?> type);
-
-    IMethodBuilder sub(IClass<?> type);
-
-    IMethodBuilder div(IClass<?> type);
-
-    IMethodBuilder rem(IClass<?> type);
-
-    IMethodBuilder neg(IClass<?> type);
-
-    IMethodBuilder shl(IClass<?> type);
-
-    IMethodBuilder shr(IClass<?> type);
-
-    IMethodBuilder ushr(IClass<?> type);
-
-    IMethodBuilder and(IClass<?> type);
-
-    IMethodBuilder or(IClass<?> type);
-
-    IMethodBuilder xor(IClass<?> type);
-
-    IMethodBuilder dup();
-
-    IMethodBuilder dup(IClass<?> type);
-
-    IMethodBuilder dup(int x);
-
-    IMethodBuilder dup(IClass<?> type, int x);
-
-    IMethodBuilder convert(IClass<?> source, IClass<?> target);
-
-}

+ 16 - 24
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/cg/CGAdapter.java

@@ -2,15 +2,13 @@ package net.ranides.assira.reflection.asm.cg;
 
 import lombok.extern.slf4j.Slf4j;
 import net.ranides.assira.reflection.*;
-import net.ranides.assira.reflection.asm.IClassBuilder;
 import net.ranides.assira.reflection.IClassLoader;
-import net.ranides.assira.reflection.asm.IMethodBuilder;
-import net.ranides.assira.reflection.asm.impl.AsmSupport;
+import net.ranides.assira.reflection.asm.AsmClassBuilder;
+import net.ranides.assira.reflection.asm.AsmMethodBuilder;
+import net.ranides.assira.reflection.asm.AsmSupport;
 
 import java.util.*;
 
-import static org.objectweb.asm.Opcodes.*;
-
 @Slf4j
 public class CGAdapter {
 
@@ -18,7 +16,7 @@ public class CGAdapter {
 
     private static final String F_THAT = "that";
 
-    private static final String F_METHODS = "methods";
+    private static final String F_METHODS = "method_";
 
     private final IClass<?> adapter;
 
@@ -28,7 +26,7 @@ public class CGAdapter {
 
     private final CGAdapterReflect ci;
 
-    private final IClassBuilder writer;
+    private final AsmClassBuilder writer;
 
     private final byte[] bytecode;
 
@@ -41,7 +39,7 @@ public class CGAdapter {
         this.reflective = new ArrayList<>();
         this.ci = new CGAdapterReflect(adapter, that);
 
-        writer = IClassBuilder.declare(IAttributes.of(IAttribute.PUBLIC), name, IClass.OBJECT, Arrays.asList(adapter));
+        writer = new AsmClassBuilder(IAttributes.of(IAttribute.PUBLIC), name, IClass.OBJECT, Arrays.asList(adapter));
 
         for(IClass<?> c : ci.inner()) {
             writer.inner(c);
@@ -57,17 +55,16 @@ public class CGAdapter {
             putMethod(m);
         }
 
-        if(!reflective.isEmpty()) {
-            writer.field(IAttributes.of(IAttribute.PUBLIC, IAttribute.SYNTHETIC, IAttribute.STATIC), IClass.typeinfo(IMethod[].class), F_METHODS);
+        for(int i=0, n=reflective.size(); i<n; i++) {
+            writer.field(IAttributes.of(IAttribute.PUBLIC, IAttribute.SYNTHETIC, IAttribute.STATIC), IClass.typeinfo(IMethod.class), F_METHODS+i);
         }
-
         this.bytecode = writer.bytecode();
     }
 
     private void init(IClass<?> ic) {
-        ic.field(F_METHODS).ifPresent(field -> {
-            field.set(null, reflective.toArray(new IMethod[0]));
-        });
+        for(int i=0, n=reflective.size(); i<n; i++) {
+            ic.field(F_METHODS+i).get().set(null, reflective.get(i));
+        }
     }
 
     public IClass<?> load(IClassLoader loader) {
@@ -82,7 +79,7 @@ public class CGAdapter {
         ///     this.that = that;
         /// }
 
-        IMethodBuilder m = writer.constructor(IAttributes.of(IAttribute.PUBLIC), Arrays.asList(that), Collections.emptyList());
+        AsmMethodBuilder m = writer.constructor(IAttributes.of(IAttribute.PUBLIC), Arrays.asList(that), Collections.emptyList());
 
         m.load(IClass.OBJECT, 0);
         m.invokeInit(IClass.OBJECT, Collections.emptyList());
@@ -106,7 +103,7 @@ public class CGAdapter {
         String suffix = " => "+adapter.shortname()+"}";
         IClass<StringBuilder> sb = IClass.typeinfo(StringBuilder.class);
 
-        IMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), "toString", Collections.emptyList(), IClass.STRING, Collections.emptyList());
+        AsmMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), "toString", Collections.emptyList(), IClass.STRING, Collections.emptyList());
 
         m.load(IClass.OBJECT, 0);
         m.getField(writer.type(), that, F_THAT);
@@ -150,12 +147,9 @@ public class CGAdapter {
         List<IClass<?>> oargs = target.arguments().types().list();
         List<IClass<?>> iargs = method.arguments().types().list();
 
-        IMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), method.name(), method);
-
-        m.getStatic(writer.type(), IClass.typeinfo(IMethod[].class), F_METHODS);
-        m.push(index);
-        m.loadArray(IClass.OBJECT);
+        AsmMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), method.name(), method);
 
+        m.getStatic(writer.type(), IClass.typeinfo(IMethod.class), F_METHODS+index);
         m.load(IClass.OBJECT, 0);
         m.getField(writer.type(), that, F_THAT);
 
@@ -165,12 +159,10 @@ public class CGAdapter {
         for(int i=0, n=iargs.size(); i<n; i++) {
             m.dup();
             m.push(i);
-
             m.load(iargs.get(i), i+1);
             if(iargs.get(i).attribute(IAttribute.PRIMITIVE)) {
                 m.box(iargs.get(i));
             }
-
             m.storeArray(IClass.OBJECT);
         }
 
@@ -192,7 +184,7 @@ public class CGAdapter {
         List<IClass<?>> oargs = target.arguments().types().list();
         List<IClass<?>> iargs = method.arguments().types().list();
 
-        IMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), method.name(), method);
+        AsmMethodBuilder m = writer.method(IAttributes.of(IAttribute.PUBLIC), method.name(), method);
 
         m.load(IClass.OBJECT, 0);
         m.getField(writer.type(), that, F_THAT);

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

@@ -1,82 +0,0 @@
-package net.ranides.assira.reflection.asm.impl;
-
-import net.ranides.assira.reflection.IAttribute;
-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;
-
-import java.util.Collections;
-
-import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
-import static org.objectweb.asm.Opcodes.ACC_SUPER;
-import static org.objectweb.asm.Opcodes.V11;
-
-public class CClassBuilder implements IClassBuilder {
-
-    private final IClass<?> type;
-
-    private final ClassWriter cv;
-
-    public CClassBuilder(IAttributes attrs, String name, IClass<?> parent, Iterable<IClass<?>> interfaces) {
-        cv = new ClassWriter(COMPUTE_FRAMES);
-        type = IClass.symbolic(name);
-        cv.visit(V11, attrs.reflective() | ACC_SUPER, AsmSupport.path(type), null, AsmSupport.path(parent), AsmSupport.path(interfaces));
-    }
-
-    @Override
-    public ClassWriter asm() {
-        return cv;
-    }
-
-    @Override
-    public IClass<?> type() {
-        return type;
-    }
-
-    @Override
-    public String name() {
-        return type.name();
-    }
-
-    @Override
-    public IClassBuilder inner(IClass<?> ref) {
-        cv.visitInnerClass(AsmSupport.path(ref), AsmSupport.path(ref.outer()), ref.shortname(), ref.attributes().reflective());
-        return this;
-    }
-
-    @Override
-    public IClassBuilder field(IAttributes attrs, IClass<?> type, String name) {
-        cv.visitField(attrs.reflective(), name, AsmSupport.vm(type), AsmSupport.sig(type), null).visitEnd();
-        return this;
-    }
-
-    @Override
-    public IMethodBuilder constructor(IAttributes attrs, Iterable<IClass<?>> params, Iterable<IClass<?>> exceptions) {
-        return method(attrs, "<init>", params, IClass.VOID, exceptions);
-    }
-
-    @Override
-    public IMethodBuilder init() {
-        return method(IAttributes.of(IAttribute.STATIC), "<clinit>", Collections.emptyList(), IClass.VOID, Collections.emptyList());
-    }
-
-    @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);
-    }
-
-    @Override
-    public byte[] bytecode() {
-        cv.visitEnd();
-        return cv.toByteArray();
-    }
-
-}

+ 2 - 0
assira.drafts/src/test/java/net/ranides/assira/reflection/AdapterTest.java

@@ -62,6 +62,8 @@ public class AdapterTest {
 
         assertEquals(new Image0("second", 7, 8), screen1.findImage(7,8));
         assertEquals(new Image0("last", 2, 3), screen1.findImage(2,3));
+
+        assertEquals("Screen0{960x720}", screen1.resize(1.5f).toString());
     }
 
     @Test

+ 8 - 0
assira.drafts/src/test/java/net/ranides/assira/reflection/adapter/model0/Image0.java

@@ -28,6 +28,14 @@ public class Image0 {
         return y;
     }
 
+    void setX(int x) {
+        this.x = x;
+    }
+
+    void setY(int y) {
+        this.y = y;
+    }
+
     public boolean atLocation(Image0 image) {
         return atLocation(image.x, image.y);
     }

+ 14 - 0
assira.drafts/src/test/java/net/ranides/assira/reflection/adapter/model0/Screen0.java

@@ -54,4 +54,18 @@ public class Screen0 extends AbstractScreen0 {
         return images.stream().filter(m -> m.atLocation(x,y)).findFirst().orElse(new Image0("?",0,0));
     }
 
+    protected Screen0 resize(double f) {
+        w *= f;
+        h *= f;
+        for(Image0 i : images) {
+            i.setX((int)(i.getX() * f));
+            i.setY((int)(i.getY() * f));
+        }
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "Screen0{" + w +"x" + h + "}";
+    }
 }

+ 4 - 0
assira.drafts/src/test/java/net/ranides/assira/reflection/adapter/model1/Screen1.java

@@ -1,6 +1,8 @@
 package net.ranides.assira.reflection.adapter.model1;
 
+import javafx.stage.Screen;
 import net.ranides.assira.reflection.adapter.model0.Image0;
+import net.ranides.assira.reflection.adapter.model0.Screen0;
 
 public interface Screen1 {
 
@@ -20,6 +22,8 @@ public interface Screen1 {
 
     Image0 findImage(int x, int y);
 
+    Screen0 resize(double f);
+
     boolean isWide();
 
 }

+ 70 - 0
assira/src/main/java/net/ranides/assira/reflection/asm/AsmClassBuilder.java

@@ -0,0 +1,70 @@
+package net.ranides.assira.reflection.asm;
+
+import net.ranides.assira.reflection.IAttribute;
+import net.ranides.assira.reflection.IAttributes;
+import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IMethod;
+import net.ranides.asm.ClassWriter;
+import net.ranides.asm.Opcodes;
+
+import java.util.Collections;
+
+import static net.ranides.asm.ClassWriter.COMPUTE_FRAMES;
+import static net.ranides.asm.Opcodes.ACC_SUPER;
+
+public class AsmClassBuilder {
+
+    private final IClass<?> type;
+
+    private final ClassWriter cv;
+
+    public AsmClassBuilder(IAttributes attrs, String name, IClass<?> parent, Iterable<IClass<?>> interfaces) {
+        cv = new ClassWriter(COMPUTE_FRAMES);
+        type = IClass.symbolic(name);
+        cv.visit(Opcodes.V11, attrs.reflective() | ACC_SUPER, AsmSupport.path(type), null, AsmSupport.path(parent), AsmSupport.path(interfaces));
+    }
+
+    public ClassWriter asm() {
+        return cv;
+    }
+
+    public IClass<?> type() {
+        return type;
+    }
+
+    public String name() {
+        return type.name();
+    }
+
+    public AsmClassBuilder inner(IClass<?> ref) {
+        cv.visitInnerClass(AsmSupport.path(ref), AsmSupport.path(ref.outer()), ref.shortname(), ref.attributes().reflective());
+        return this;
+    }
+
+    public AsmClassBuilder field(IAttributes attrs, IClass<?> type, String name) {
+        cv.visitField(attrs.reflective(), name, AsmSupport.vm(type), AsmSupport.sig(type), null).visitEnd();
+        return this;
+    }
+
+    public AsmMethodBuilder constructor(IAttributes attrs, Iterable<IClass<?>> params, Iterable<IClass<?>> exceptions) {
+        return method(attrs, "<init>", params, IClass.VOID, exceptions);
+    }
+
+    public AsmMethodBuilder init() {
+        return method(IAttributes.of(IAttribute.STATIC), "<clinit>", Collections.emptyList(), IClass.VOID, Collections.emptyList());
+    }
+
+    public AsmMethodBuilder method(IAttributes attrs, String name, IMethod method) {
+        return method(attrs, name, method.arguments().types(), method.returns(), method.exceptions());
+    }
+
+    public AsmMethodBuilder method(IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions) {
+        return new AsmMethodBuilder(this, attrs, name, params, ret, exceptions);
+    }
+
+    public byte[] bytecode() {
+        cv.visitEnd();
+        return cv.toByteArray();
+    }
+
+}

+ 74 - 121
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/impl/CMethodBuilder.java

@@ -1,19 +1,15 @@
-package net.ranides.assira.reflection.asm.impl;
+package net.ranides.assira.reflection.asm;
 
-import net.ranides.assira.math.MathUtils;
 import net.ranides.assira.reflection.*;
-import net.ranides.assira.reflection.asm.IClassBuilder;
-import net.ranides.assira.reflection.asm.IMethodBuilder;
 import net.ranides.assira.reflection.util.ClassUtils;
-import org.objectweb.asm.*;
-
 import java.util.Arrays;
 
-import static org.objectweb.asm.Opcodes.*;
+import net.ranides.asm.*;
+import static net.ranides.asm.Opcodes.*;
 
-public class CMethodBuilder implements IMethodBuilder {
+public class AsmMethodBuilder {
 
-    private final IClassBuilder parent;
+    private final AsmClassBuilder parent;
 
     private final MethodVisitor mv;
 
@@ -23,32 +19,28 @@ public class CMethodBuilder implements IMethodBuilder {
 
     private int vars;
 
-    CMethodBuilder(IClassBuilder parent, IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions) {
+    AsmMethodBuilder(AsmClassBuilder parent, IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions) {
         this.parent = parent;
         this.mv = parent.asm().visitMethod(attrs.reflective(), name, AsmSupport.vm(params, ret), AsmSupport.sig(params, ret), AsmSupport.path(exceptions));
         this.first = label();
     }
 
-    @Override
     public MethodVisitor asm() {
         return mv;
     }
 
-    @Override
-    public IClassBuilder end() {
+    public AsmClassBuilder end() {
         mv.visitMaxs(0, 0);
         mv.visitEnd();
         return parent;
     }
 
-    @Override
     public Label label() {
         Label out = new Label();
         mv.visitLabel(out);
         return out;
     }
 
-    @Override
     public Label label(int line) {
         Label out = new Label();
         mv.visitLabel(out);
@@ -56,8 +48,7 @@ public class CMethodBuilder implements IMethodBuilder {
         return out;
     }
 
-    @Override
-    public IMethodBuilder var(IClass<?> type, String name) {
+    public AsmMethodBuilder var(IClass<?> type, String name) {
         if(last == null) {
             last = label();
         }
@@ -65,23 +56,20 @@ public class CMethodBuilder implements IMethodBuilder {
         return this;
     }
 
-    @Override
-    public IMethodBuilder var(IArgument argument) {
+    public AsmMethodBuilder var(IArgument argument) {
         return var(argument.type(), argument.name());
     }
 
-    @Override
-    public IMethodBuilder var(IArguments arguments) {
+    public AsmMethodBuilder var(IArguments arguments) {
         arguments.each(this::var);
         return this;
     }
 
-    public IMethodBuilder push(Object value) {
+    public AsmMethodBuilder push(Object value) {
         return push(IClass.typefor(value), value);
     }
 
-    @Override
-    public IMethodBuilder push(IClass<?> type, Object value) {
+    public AsmMethodBuilder push(IClass<?> type, Object value) {
         if(null == value) {
             return ins(ACONST_NULL);
         }
@@ -103,7 +91,7 @@ public class CMethodBuilder implements IMethodBuilder {
         return ldc(value);
     }
 
-    public IMethodBuilder pushDouble(Number value) {
+    public AsmMethodBuilder pushDouble(Number value) {
         if(value.doubleValue() == 0.0) {
             return ins(DCONST_0);
         }
@@ -113,7 +101,7 @@ public class CMethodBuilder implements IMethodBuilder {
         return ldc(value.doubleValue());
     }
 
-    public IMethodBuilder pushFloat(Number value) {
+    public AsmMethodBuilder pushFloat(Number value) {
         if(value.floatValue() == 0.0) {
             return ins(FCONST_0);
         }
@@ -126,7 +114,7 @@ public class CMethodBuilder implements IMethodBuilder {
         return ldc(value.floatValue());
     }
 
-    public IMethodBuilder pushLong(long value) {
+    public AsmMethodBuilder pushLong(long value) {
         if(value == 0) {
             return ins(LCONST_0);
         }
@@ -136,7 +124,7 @@ public class CMethodBuilder implements IMethodBuilder {
         return ldc(value);
     }
 
-    public IMethodBuilder pushInt(Number value) {
+    public AsmMethodBuilder pushInt(Number value) {
         switch (value.intValue()) {
             case -1:
                 return ins(ICONST_M1);
@@ -164,172 +152,145 @@ public class CMethodBuilder implements IMethodBuilder {
         return ldc(value.intValue());
     }
 
-    @Override
-    public IMethodBuilder load(IClass<?> type, int index) {
+    public AsmMethodBuilder load(IClass<?> type, int index) {
         mv.visitVarInsn(AsmSupport.opcode(ILOAD, type), index);
         return this;
     }
 
-    @Override
-    public IMethodBuilder load(IArguments arguments, int index) {
+    public AsmMethodBuilder load(IArguments arguments, int index) {
         for(IArgument a : arguments) {
             load(a.type(), index++);
         }
         return this;
     }
 
-    @Override
-    public IMethodBuilder store(IClass<?> type, int index) {
+    public AsmMethodBuilder store(IClass<?> type, int index) {
         mv.visitVarInsn(AsmSupport.opcode(ISTORE, type), index);
         return this;
     }
 
-    @Override
-    public IMethodBuilder loadArray(IClass<?> type) {
+    public AsmMethodBuilder loadArray(IClass<?> type) {
         return ins(IALOAD, type);
     }
 
-    @Override
-    public IMethodBuilder storeArray(IClass<?> type) {
+    public AsmMethodBuilder storeArray(IClass<?> type) {
         return ins(IASTORE, type);
     }
 
-    @Override
-    public IMethodBuilder returns() {
+    public AsmMethodBuilder returns() {
         mv.visitInsn(Opcodes.RETURN);
         return this;
     }
 
-    @Override
-    public IMethodBuilder returns(IClass<?> type) {
+    public AsmMethodBuilder returns(IClass<?> type) {
         return ins(IRETURN, type);
     }
 
-    @Override
-    public IMethodBuilder putField(IClass<?> owner, IClass<?> type, String name) {
+    public AsmMethodBuilder putField(IClass<?> owner, IClass<?> type, String name) {
         return ocField(PUTFIELD, owner, type, name);
     }
 
-    @Override
-    public IMethodBuilder putField(IField field) {
+    public AsmMethodBuilder putField(IField field) {
         return ocField(PUTFIELD, field);
     }
 
-    @Override
-    public IMethodBuilder getField(IClass<?> owner, IClass<?> type, String name) {
+    public AsmMethodBuilder getField(IClass<?> owner, IClass<?> type, String name) {
         return ocField(GETFIELD, owner, type, name);
     }
 
-    @Override
-    public IMethodBuilder getField(IField field) {
+    public AsmMethodBuilder getField(IField field) {
         return ocField(GETFIELD, field);
     }
 
-    @Override
-    public IMethodBuilder putStatic(IClass<?> owner, IClass<?> type, String name) {
+    public AsmMethodBuilder putStatic(IClass<?> owner, IClass<?> type, String name) {
         return ocField(PUTSTATIC, owner, type, name);
     }
 
-    @Override
-    public IMethodBuilder putStatic(IField field) {
+    public AsmMethodBuilder putStatic(IField field) {
         return ocField(PUTSTATIC, field);
     }
 
-    @Override
-    public IMethodBuilder getStatic(IClass<?> owner, IClass<?> type, String name) {
+    public AsmMethodBuilder getStatic(IClass<?> owner, IClass<?> type, String name) {
         return ocField(GETSTATIC, owner, type, name);
     }
 
-    @Override
-    public IMethodBuilder getStatic(IField field) {
+    public AsmMethodBuilder getStatic(IField field) {
         return ocField(GETSTATIC, field);
     }
 
-    private IMethodBuilder ocField(int oc, IField field) {
+    private AsmMethodBuilder ocField(int oc, IField field) {
         return ocField(oc, field.parent(), field.type(), field.name());
     }
 
-    private IMethodBuilder ocField(int oc, IClass<?> owner, IClass<?> type, String name) {
+    private AsmMethodBuilder ocField(int oc, IClass<?> owner, IClass<?> type, String name) {
         mv.visitFieldInsn(oc, AsmSupport.path(owner), name, AsmSupport.vm(type));
         return this;
     }
 
-    @Override
-    public IMethodBuilder invokeInit(IClass<?> owner, Iterable<IClass<?>> params) {
+    public AsmMethodBuilder invokeInit(IClass<?> owner, Iterable<IClass<?>> params) {
         mv.visitMethodInsn(INVOKESPECIAL, AsmSupport.path(owner), "<init>", AsmSupport.vm(params, IClass.VOID), owner.attributes().has(IAttribute.INTERFACE));
         return this;
     }
 
-    @Override
-    public IMethodBuilder invokeSpecial(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
+    public AsmMethodBuilder invokeSpecial(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
         return invoke(INVOKESPECIAL, owner, name, params, ret);
     }
 
-    @Override
-    public IMethodBuilder invokeSpecial(IClass<?> owner, IMethod method) {
+    public AsmMethodBuilder invokeSpecial(IClass<?> owner, IMethod method) {
         return invoke(INVOKESPECIAL, owner, method);
     }
 
-    @Override
-    public IMethodBuilder invokeSpecial(IMethod method) {
+    public AsmMethodBuilder invokeSpecial(IMethod method) {
         return invoke(INVOKESPECIAL, method);
     }
 
-    @Override
-    public IMethodBuilder invokeVirtual(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
+    public AsmMethodBuilder invokeVirtual(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
         return invoke(AsmSupport.vcall(owner), owner, name, params, ret);
     }
 
-    @Override
-    public IMethodBuilder invokeVirtual(IClass<?> owner, IMethod method) {
+    public AsmMethodBuilder invokeVirtual(IClass<?> owner, IMethod method) {
         return invoke(AsmSupport.vcall(owner, method), owner, method);
     }
 
-    @Override
-    public IMethodBuilder invokeVirtual(IMethod method) {
+    public AsmMethodBuilder invokeVirtual(IMethod method) {
         return invoke(AsmSupport.vcall(method), method);
     }
 
-    @Override
-    public IMethodBuilder invokeStatic(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
+    public AsmMethodBuilder invokeStatic(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
         return invoke(INVOKESTATIC, owner, name, params, ret);
     }
 
-    @Override
-    public IMethodBuilder invokeStatic(IClass<?> owner, IMethod method) {
+    public AsmMethodBuilder invokeStatic(IClass<?> owner, IMethod method) {
         return invoke(INVOKESTATIC, owner, method);
     }
 
-    @Override
-    public IMethodBuilder invokeStatic(IMethod method) {
+    public AsmMethodBuilder invokeStatic(IMethod method) {
         return invoke(INVOKESTATIC, method);
     }
 
-    @Override
-    public IMethodBuilder invokeDynamic(IMethod bootstrap, String name, Iterable<IClass<?>> params, IClass<?> ret, Object[] args) {
+    public AsmMethodBuilder invokeDynamic(IMethod bootstrap, String name, Iterable<IClass<?>> params, IClass<?> ret, Object[] args) {
         Handle bootstrapHandle = new Handle(H_INVOKESTATIC, AsmSupport.path(bootstrap.parent()), bootstrap.name(), AsmSupport.vm(bootstrap), false);
         mv.visitInvokeDynamicInsn(name, AsmSupport.vm(params, ret), bootstrapHandle, args);
         return this;
     }
 
-    private IMethodBuilder invoke(int oc, IMethod method) {
+    private AsmMethodBuilder invoke(int oc, IMethod method) {
         return invoke(oc, method.parent(), method);
     }
 
-    private IMethodBuilder invoke(int oc, IClass<?> owner, IMethod method) {
+    private AsmMethodBuilder invoke(int oc, IClass<?> owner, IMethod method) {
         return invoke(oc, owner, method.name(), method.arguments().types(), method.returns());
     }
 
-    private IMethodBuilder invoke(int oc, IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
+    private AsmMethodBuilder invoke(int oc, IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
         mv.visitMethodInsn(oc, AsmSupport.path(owner), name, AsmSupport.vm(params, ret), owner.attributes().has(IAttribute.INTERFACE));
         return this;
     }
 
-    @Override
-    public IMethodBuilder newObject(IClass<?> type) {
+    public AsmMethodBuilder newObject(IClass<?> type) {
         if(type.attribute(IAttribute.ARRAY)) {
             if(type.component().attribute(IAttribute.PRIMITIVE)) {
-                mv.visitIntInsn(NEWARRAY, AsmSupport.ttype(type.component().raw()));
+                mv.visitIntInsn(NEWARRAY, AsmSupport.arrayType(type.component().raw()));
             } else {
                 mv.visitTypeInsn(ANEWARRAY, AsmSupport.path(type.component()));
             }
@@ -339,110 +300,102 @@ public class CMethodBuilder implements IMethodBuilder {
         return this;
     }
 
-    @Override
-    public IMethodBuilder checkCast(IClass<?> type) {
+    public AsmMethodBuilder checkCast(IClass<?> type) {
         mv.visitTypeInsn(CHECKCAST, AsmSupport.path(type));
         return this;
     }
 
-    @Override
-    public IMethodBuilder isInstance(IClass<?> type) {
+    public AsmMethodBuilder isInstance(IClass<?> type) {
         mv.visitTypeInsn(INSTANCEOF, AsmSupport.path(type));
         return this;
     }
 
-    @Override
-    public IMethodBuilder box(IClass<?> type) {
+    public AsmMethodBuilder box(IClass<?> type) {
         IClass<?> wrapper = ClassUtils.box(type);
         return invokeStatic(wrapper, "valueOf", Arrays.asList(type), wrapper);
     }
 
-    private IMethodBuilder ldc(Object v) {
+    private AsmMethodBuilder ldc(Object v) {
         mv.visitLdcInsn(v);
         return this;
     }
 
-    private IMethodBuilder ins(int oc) {
+    private AsmMethodBuilder ins(int oc) {
         mv.visitInsn(oc);
         return this;
     }
 
-    private IMethodBuilder ins(int oc, IClass<?> type) {
+    private AsmMethodBuilder ins(int oc, IClass<?> type) {
         mv.visitInsn(AsmSupport.opcode(oc, type));
         return this;
     }
 
-    public IMethodBuilder add(IClass<?> type) {
+    public AsmMethodBuilder add(IClass<?> type) {
         return ins(IADD, type);
     }
 
-    public IMethodBuilder sub(IClass<?> type) {
+    public AsmMethodBuilder sub(IClass<?> type) {
         return ins(ISUB, type);
     }
 
-    public IMethodBuilder div(IClass<?> type) {
+    public AsmMethodBuilder div(IClass<?> type) {
         return ins(IDIV, type);
     }
 
-    public IMethodBuilder rem(IClass<?> type) {
+    public AsmMethodBuilder rem(IClass<?> type) {
         return ins(IREM, type);
     }
 
-    public IMethodBuilder neg(IClass<?> type) {
+    public AsmMethodBuilder neg(IClass<?> type) {
         return ins(INEG, type);
     }
 
-    public IMethodBuilder shl(IClass<?> type) {
+    public AsmMethodBuilder shl(IClass<?> type) {
         return ins(ISHR, type);
     }
 
-    public IMethodBuilder shr(IClass<?> type) {
+    public AsmMethodBuilder shr(IClass<?> type) {
         return ins(ISHL, type);
     }
 
-    public IMethodBuilder ushr(IClass<?> type) {
+    public AsmMethodBuilder ushr(IClass<?> type) {
         return ins(IUSHR, type);
     }
 
-    public IMethodBuilder and(IClass<?> type) {
+    public AsmMethodBuilder and(IClass<?> type) {
         return ins(IAND, type);
     }
 
-    public IMethodBuilder or(IClass<?> type) {
+    public AsmMethodBuilder or(IClass<?> type) {
         return ins(IOR, type);
     }
 
-    public IMethodBuilder xor(IClass<?> type) {
+    public AsmMethodBuilder xor(IClass<?> type) {
         return ins(IXOR, type);
     }
 
-    @Override
-    public IMethodBuilder dup() {
+    public AsmMethodBuilder dup() {
         return ins(DUP);
     }
 
-    @Override
-    public IMethodBuilder dup(IClass<?> type) {
+    public AsmMethodBuilder dup(IClass<?> type) {
         return dup(type, 0);
     }
 
-    @Override
-    public IMethodBuilder dup(int x) {
+    public AsmMethodBuilder dup(int x) {
         return dup(IClass.INT, x);
     }
 
-    @Override
-    public IMethodBuilder dup(IClass<?> type, int x) {
+    public AsmMethodBuilder dup(IClass<?> type, int x) {
         switch (x) {
-            case 0: ins(AsmSupport.size(type) == 2 ? DUP2 : DUP);
-            case 1: ins(AsmSupport.size(type) == 2 ? DUP2_X1 : DUP_X1);
-            case 2: ins(AsmSupport.size(type) == 2 ? DUP2_X2 : DUP_X2);
+            case 0: ins(AsmSupport.sizeof(type) == 2 ? DUP2 : DUP);
+            case 1: ins(AsmSupport.sizeof(type) == 2 ? DUP2_X1 : DUP_X1);
+            case 2: ins(AsmSupport.sizeof(type) == 2 ? DUP2_X2 : DUP_X2);
         }
         throw new UnsupportedOperationException("DUP_X"+x + " does not exist.");
     }
 
-    @Override
-    public IMethodBuilder convert(IClass<?> source, IClass<?> target) {
+    public AsmMethodBuilder convert(IClass<?> source, IClass<?> target) {
         if(source.equals(IClass.DOUBLE)) {
             if(target.equals(IClass.FLOAT)) {
                 return ins(D2F);

+ 6 - 10
assira.drafts/src/main/java/net/ranides/assira/reflection/asm/impl/AsmSupport.java

@@ -1,16 +1,16 @@
-package net.ranides.assira.reflection.asm.impl;
+package net.ranides.assira.reflection.asm;
 
 import net.ranides.assira.collection.iterators.IteratorUtils;
 import net.ranides.assira.reflection.*;
 import net.ranides.assira.text.StrBuilder;
 import net.ranides.assira.text.StringUtils;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
+import net.ranides.asm.Opcodes;
+import net.ranides.asm.Type;
 
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.objectweb.asm.Opcodes.*;
+import static net.ranides.asm.Opcodes.*;
 
 public class AsmSupport {
 
@@ -28,10 +28,6 @@ public class AsmSupport {
         }
     }
 
-    public static int opcode(int oc, Class<?> type) {
-        return Type.getType(type).getOpcode(oc);
-    }
-
     public static int vcall(IClass<?> owner, IMethod method) {
         if(method!=null && method.attribute(IAttribute.STATIC)) {
             return INVOKESTATIC;
@@ -143,7 +139,7 @@ public class AsmSupport {
         return element.attributes().has(IAttribute.PARAMETERIZED);
     }
 
-    public static int ttype(Class<?> raw) {
+    public static int arrayType(Class<?> raw) {
         if(boolean.class.equals(raw)) {
             return Opcodes.T_BOOLEAN;
         }
@@ -171,7 +167,7 @@ public class AsmSupport {
         throw new IllegalArgumentException("Invalid array component: " + raw);
     }
 
-    public static int size(IClass<?> type) {
+    public static int sizeof(IClass<?> type) {
         return type.attribute(IAttribute.SYMBOLIC) ? 1 : Type.getType(type.raw()).getSize();
     }
 

+ 1 - 1
assira/src/test/java/net/ranides/assira/reflection/impl/AClassTest.java

@@ -78,7 +78,7 @@ public class AClassTest {
         assertEquals(Collections.emptyList(), ic.interfaces().list());
         assertEquals(Collections.emptyList(), ic.inner().list());
         assertEquals(Collections.emptyList(), ic.annotations().list());
-        assertEquals(of(FINAL, NATIVE, PUBLIC), ic.attributes());
+        assertEquals(of(FINAL, NATIVE, PUBLIC, SYMBOLIC), ic.attributes());
         
         assertEquals(false, ic.attributes().contains(PRIMITIVE));
         assertEquals(true, ic.isInstance(null));