|
|
@@ -1,7 +1,6 @@
|
|
|
package net.ranides.assira.reflection.asm.impl;
|
|
|
|
|
|
import net.ranides.assira.reflection.*;
|
|
|
-import net.ranides.assira.reflection.asm.FQPName;
|
|
|
import net.ranides.assira.reflection.asm.IClassBuilder;
|
|
|
import net.ranides.assira.reflection.asm.IMethodBuilder;
|
|
|
import org.objectweb.asm.Label;
|
|
|
@@ -24,7 +23,7 @@ public class CMethodBuilder implements IMethodBuilder {
|
|
|
|
|
|
CMethodBuilder(IClassBuilder parent, IAttributes attrs, String name, Iterable<IClass<?>> params, IClass<?> ret, Iterable<IClass<?>> exceptions) {
|
|
|
this.parent = parent;
|
|
|
- this.mv = parent.asm().visitMethod(attrs.reflective(), name, VMNames.vm(params, ret), VMNames.sig(params, ret), VMNames.fqp(exceptions));
|
|
|
+ this.mv = parent.asm().visitMethod(attrs.reflective(), name, AsmSupport.vm(params, ret), AsmSupport.sig(params, ret), AsmSupport.path(exceptions));
|
|
|
this.first = label();
|
|
|
}
|
|
|
|
|
|
@@ -48,12 +47,11 @@ public class CMethodBuilder implements IMethodBuilder {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder var(FQPName type, String name) {
|
|
|
- if(last == null) {
|
|
|
- last = label();
|
|
|
- }
|
|
|
- mv.visitLocalVariable(name, VMNames.vm(type), VMNames.sig(type), first, last, vars++);;
|
|
|
- return this;
|
|
|
+ public Label label(int line) {
|
|
|
+ Label out = new Label();
|
|
|
+ mv.visitLabel(out);
|
|
|
+ mv.visitLineNumber(line, out);
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -61,7 +59,7 @@ public class CMethodBuilder implements IMethodBuilder {
|
|
|
if(last == null) {
|
|
|
last = label();
|
|
|
}
|
|
|
- mv.visitLocalVariable(name, VMNames.vm(type), VMNames.sig(type), first, last, vars++);;
|
|
|
+ mv.visitLocalVariable(name, AsmSupport.vm(type), AsmSupport.sig(type), first, last, vars++);;
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@@ -78,92 +76,156 @@ public class CMethodBuilder implements IMethodBuilder {
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder load(IClass<?> type, int index) {
|
|
|
- mv.visitVarInsn(ASMOpcodes.OC_LOAD(type), index);
|
|
|
+ mv.visitVarInsn(AsmSupport.opcode(ILOAD, type), index);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder returns() {
|
|
|
- mv.visitInsn(Opcodes.RETURN);
|
|
|
+ public IMethodBuilder store(IClass<?> type, int index) {
|
|
|
+ mv.visitVarInsn(AsmSupport.opcode(ISTORE, type), index);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder returns(IClass<?> type) {
|
|
|
- mv.visitInsn(ASMOpcodes.OC_RETURN(type));
|
|
|
+ public IMethodBuilder returns() {
|
|
|
+ mv.visitInsn(Opcodes.RETURN);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder putField(FQPName owner, IClass<?> type, String name) {
|
|
|
- mv.visitFieldInsn(PUTFIELD, VMNames.fqp(owner), name, VMNames.vm(type));
|
|
|
+ public IMethodBuilder returns(IClass<?> type) {
|
|
|
+ mv.visitInsn(AsmSupport.opcode(IRETURN, type));
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder putField(IClass<?> owner, IClass<?> type, String name) {
|
|
|
- mv.visitFieldInsn(PUTFIELD, VMNames.fqp(owner), name, VMNames.vm(type));
|
|
|
- return this;
|
|
|
+ return ocField(PUTFIELD, owner, type, name);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder putField(IField field) {
|
|
|
- return putField(field.parent(), field.type(), field.name());
|
|
|
+ return ocField(PUTFIELD, field);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder getField(FQPName owner, IClass<?> type, String name) {
|
|
|
- mv.visitFieldInsn(GETFIELD, VMNames.fqp(owner), name, VMNames.vm(type));
|
|
|
- return this;
|
|
|
+ public IMethodBuilder getField(IClass<?> owner, IClass<?> type, String name) {
|
|
|
+ return ocField(GETFIELD, owner, type, name);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder getField(IClass<?> owner, IClass<?> type, String name) {
|
|
|
- mv.visitFieldInsn(GETFIELD, VMNames.fqp(owner), name, VMNames.vm(type));
|
|
|
- return this;
|
|
|
+ public IMethodBuilder getField(IField field) {
|
|
|
+ return ocField(GETFIELD, field);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder getField(IField field) {
|
|
|
- return getField(field.parent(), field.type(), field.name());
|
|
|
+ public IMethodBuilder putStatic(IClass<?> owner, IClass<?> type, String name) {
|
|
|
+ return ocField(PUTSTATIC, owner, type, name);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder putStatic(IField field) {
|
|
|
+ return ocField(PUTSTATIC, field);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder getStatic(IClass<?> owner, IClass<?> type, String name) {
|
|
|
+ return ocField(GETSTATIC, owner, type, name);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder invokeSpecial(FQPName owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
|
|
|
- mv.visitMethodInsn(INVOKESPECIAL, VMNames.fqp(owner), name, VMNames.vm(params, ret), false);
|
|
|
+ public IMethodBuilder getStatic(IField field) {
|
|
|
+ return ocField(GETSTATIC, field);
|
|
|
+ }
|
|
|
+
|
|
|
+ private IMethodBuilder 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) {
|
|
|
+ mv.visitFieldInsn(oc, AsmSupport.path(owner), name, AsmSupport.vm(type));
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder invokeSpecial(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
|
|
|
- mv.visitMethodInsn(INVOKESPECIAL, VMNames.fqp(owner), name, VMNames.vm(params, ret), owner.attributes().has(IAttribute.INTERFACE));
|
|
|
+ public IMethodBuilder 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(IMethod method) {
|
|
|
- return invokeSpecial(method.parent(), method.name(), method.arguments().types(), method.returns());
|
|
|
+ public IMethodBuilder invokeSpecial(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
|
|
|
+ return invoke(INVOKESPECIAL, owner, name, params, ret);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IMethodBuilder invokeVirtual(FQPName owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
|
|
|
- mv.visitMethodInsn(INVOKEVIRTUAL, VMNames.fqp(owner), name, VMNames.vm(params, ret), false);
|
|
|
- return this;
|
|
|
+ public IMethodBuilder invokeSpecial(IClass<?> owner, IMethod method) {
|
|
|
+ return invoke(INVOKESPECIAL, owner, method);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder invokeSpecial(IMethod method) {
|
|
|
+ return invoke(INVOKESPECIAL, method);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder invokeVirtual(IClass<?> owner, String name, Iterable<IClass<?>> params, IClass<?> ret) {
|
|
|
- mv.visitMethodInsn(INVOKEVIRTUAL, VMNames.fqp(owner), name, VMNames.vm(params, ret), owner.attributes().has(IAttribute.INTERFACE));
|
|
|
- return this;
|
|
|
+ return invoke(AsmSupport.vcall(owner), owner, name, params, ret);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder invokeVirtual(IClass<?> owner, IMethod method) {
|
|
|
- return invokeVirtual(owner, method.name(), method.arguments().types(), method.returns());
|
|
|
+ return invoke(AsmSupport.vcall(owner, method), owner, method);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public IMethodBuilder invokeVirtual(IMethod method) {
|
|
|
- return invokeVirtual(method.parent(), method.name(), method.arguments().types(), method.returns());
|
|
|
+ return invoke(AsmSupport.vcall(method), method);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder 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) {
|
|
|
+ return invoke(INVOKESTATIC, owner, method);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder invokeStatic(IMethod method) {
|
|
|
+ return invoke(INVOKESTATIC, method);
|
|
|
+ }
|
|
|
+
|
|
|
+ private IMethodBuilder invoke(int oc, IMethod method) {
|
|
|
+ return invoke(oc, method.parent(), method);
|
|
|
+ }
|
|
|
+
|
|
|
+ private IMethodBuilder 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) {
|
|
|
+ mv.visitMethodInsn(oc, AsmSupport.path(owner), name, AsmSupport.vm(params, ret), owner.attributes().has(IAttribute.INTERFACE));
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder newObject(IClass<?> type) {
|
|
|
+ mv.visitTypeInsn(type.attributes().has(IAttribute.ARRAY) ? NEWARRAY : NEW, AsmSupport.path(type));
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder checkCast(IClass<?> type) {
|
|
|
+ mv.visitTypeInsn(CHECKCAST, AsmSupport.path(type));
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IMethodBuilder isInstance(IClass<?> type) {
|
|
|
+ mv.visitTypeInsn(INSTANCEOF, AsmSupport.path(type));
|
|
|
+ return this;
|
|
|
}
|
|
|
}
|