use of dyvilx.tools.asm.MethodVisitor in project Dyvil by Dyvil.
the class PropertyReferenceMetafactory method generateFactory.
private void generateFactory(@NonNull ClassWriter classWriter) {
final MethodVisitor factory = classWriter.visitMethod(PRIVATE | STATIC, FACTORY_NAME, this.factoryType.toMethodDescriptorString(), null, null);
factory.visitCode();
factory.visitTypeInsn(Opcodes.NEW, this.className);
factory.visitInsn(Opcodes.DUP);
factory.visitVarInsn(ALOAD, 0);
factory.visitMethodInsn(INVOKESPECIAL, this.className, "<init>", this.constructorType.toMethodDescriptorString(), false);
factory.visitInsn(ARETURN);
factory.visitMaxs(-1, -1);
factory.visitEnd();
}
use of dyvilx.tools.asm.MethodVisitor in project Dyvil by Dyvil.
the class PropertyReferenceMetafactory method generateGetter.
private void generateGetter(@NonNull ClassWriter classWriter) {
MethodVisitor getter = classWriter.visitMethod(PUBLIC, "get", "()" + this.refTargetType, null, null);
getter.visitCode();
this.writeReceiver(getter);
this.writeMethod(getter, this.getterInfo);
TypeConverter.convertType(getter, this.getterInfo.getMethodType().returnType(), this.refTargetClass, this.refTargetClass);
getter.visitInsn(TypeConverter.getReturnOpcode(this.refTargetClass));
getter.visitMaxs(-1, -1);
getter.visitEnd();
}
use of dyvilx.tools.asm.MethodVisitor in project Dyvil by Dyvil.
the class AnnotationProxyFactory method generateAnnotationType.
private void generateAnnotationType(@NonNull ClassWriter classWriter) {
final MethodVisitor annotationType = classWriter.visitMethod(PUBLIC, "annotationType", "()Ljava/lang/Class;", null, null);
annotationType.visitCode();
annotationType.visitLdcInsn(Type.getType(this.annotationType));
annotationType.visitInsn(Opcodes.ARETURN);
annotationType.visitMaxs(-1, -1);
annotationType.visitEnd();
}
use of dyvilx.tools.asm.MethodVisitor in project Dyvil by Dyvil.
the class AnnotationProxyFactory method generateMethods.
private void generateMethods(@NonNull ClassWriter classWriter) {
for (int i = 0; i < this.parameterCount; i++) {
final MethodVisitor methodVisitor = classWriter.visitMethod(PUBLIC, this.argNames[i], "()" + this.argDescs[i], null, null);
methodVisitor.visitCode();
methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
methodVisitor.visitFieldInsn(Opcodes.GETFIELD, this.className, this.argNames[i], this.argDescs[i]);
methodVisitor.visitInsn(getReturnOpcode(this.invokedType.parameterType(i)));
methodVisitor.visitMaxs(-1, -1);
methodVisitor.visitEnd();
}
}
use of dyvilx.tools.asm.MethodVisitor in project Dyvil by Dyvil.
the class AnnotationProxyFactory method generateConstructor.
private void generateConstructor(@NonNull ClassWriter classWriter) {
// Generate constructor
final MethodVisitor ctor = classWriter.visitMethod(PRIVATE, "<init>", this.constructorType.toMethodDescriptorString(), null, null);
ctor.visitCode();
ctor.visitVarInsn(ALOAD, 0);
ctor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
for (int i = 0, localIndex = 0; i < this.parameterCount; i++) {
ctor.visitVarInsn(ALOAD, 0);
Class<?> argType = this.invokedType.parameterType(i);
ctor.visitVarInsn(getLoadOpcode(argType), localIndex + 1);
localIndex += getParameterSize(argType);
ctor.visitFieldInsn(PUTFIELD, this.className, this.argNames[i], this.argDescs[i]);
}
ctor.visitInsn(RETURN);
// Maxs computed by ClassWriter.COMPUTE_MAXS, these arguments ignored
ctor.visitMaxs(-1, -1);
ctor.visitEnd();
}
Aggregations