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