Search in sources :

Example 11 with MethodVisitor

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();
}
Also used : MethodVisitor(dyvilx.tools.asm.MethodVisitor)

Example 12 with MethodVisitor

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();
}
Also used : MethodVisitor(dyvilx.tools.asm.MethodVisitor)

Example 13 with MethodVisitor

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();
}
Also used : MethodVisitor(dyvilx.tools.asm.MethodVisitor)

Example 14 with MethodVisitor

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();
    }
}
Also used : MethodVisitor(dyvilx.tools.asm.MethodVisitor)

Example 15 with MethodVisitor

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();
}
Also used : MethodVisitor(dyvilx.tools.asm.MethodVisitor)

Aggregations

MethodVisitor (dyvilx.tools.asm.MethodVisitor)15 AnnotationVisitor (dyvilx.tools.asm.AnnotationVisitor)1 IValue (dyvilx.tools.compiler.ast.expression.IValue)1 IParameter (dyvilx.tools.compiler.ast.parameter.IParameter)1