Search in sources :

Example 21 with MethodVisitor

use of jodd.asm5.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createSelectMethod.

/**
 * Generate a concrete implementation of an abstract
 * ejbSelectxxxx method.
 *
 * @param selectMethod The abstract definition for the method we're generating.
 */
private void createSelectMethod(final Method selectMethod) {
    final Class<?> returnType = selectMethod.getReturnType();
    final Method executeMethod = EjbSelect.getSelectMethod(returnType);
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, selectMethod.getName(), Type.getMethodDescriptor(selectMethod), null, getExceptionTypes(selectMethod));
    mv.visitCode();
    // push deploymentInfo
    mv.visitFieldInsn(GETSTATIC, implClassName, "deploymentInfo", "Ljava/lang/Object;");
    // push method signature
    mv.visitLdcInsn(getSelectMethodSignature(selectMethod));
    // one of the primitives.
    if (!returnType.isPrimitive()) {
        mv.visitLdcInsn(returnType.getName());
    }
    // new Object[]
    mv.visitIntInsn(BIPUSH, selectMethod.getParameterTypes().length);
    mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
    // object[i] = arg${i}
    int i = 0;
    for (final Class<?> parameterType : selectMethod.getParameterTypes()) {
        // push arguement i on stack
        mv.visitInsn(DUP);
        bipush(mv, i);
        mv.visitVarInsn(Type.getType(parameterType).getOpcode(ILOAD), i + 1);
        // convert argument on stack to an Object
        Convert.toObjectFrom(mv, parameterType);
        // store it into the array
        mv.visitInsn(AASTORE);
        if (long.class.equals(parameterType) || double.class.equals(parameterType)) {
            // longs and doubles are double wide
            i = i + 2;
        } else {
            i++;
        }
    }
    // EjbSelect.execute_xxxx(deploymentInfo, signature, [returnType.] args[]);
    mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(executeMethod.getDeclaringClass()), executeMethod.getName(), Type.getMethodDescriptor(executeMethod), false);
    // needs to match the type returned from the method call
    if (!Void.TYPE.equals(returnType)) {
        // stack already
        if (!returnType.isPrimitive()) {
            // convert return type
            Convert.fromObjectTo(mv, returnType);
        }
        // And generate the appropriate return for the type
        mv.visitInsn(Type.getReturnType(selectMethod).getOpcode(IRETURN));
    } else {
        // void return is just a RETURN.
        mv.visitInsn(RETURN);
    }
    // close method
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Method(java.lang.reflect.Method) MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 22 with MethodVisitor

use of jodd.asm5.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createOpenEJB_addCmr.

private void createOpenEJB_addCmr() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "OpenEJB_addCmr", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    mv.visitCode();
    // if (deleted) return null;
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, DELETED, "Z");
    final Label notDeleted = new Label();
    mv.visitJumpInsn(IFEQ, notDeleted);
    mv.visitInsn(ACONST_NULL);
    mv.visitInsn(ARETURN);
    mv.visitLabel(notDeleted);
    for (final CmrField cmrField : cmrFields) {
        // if ("${cmrField.name}".equals(name)) {
        // ${cmrField.name}.add((${cmrField.type})value);
        // return null;
        // }
        // 
        // OR
        // 
        // if ("${cmrField.name}".equals(name)) {
        // Object oldValue = ${cmrField.name};
        // ${cmrField.name} = (${cmrField.type}) bean;
        // return oldValue;
        // }
        createOpenEJB_addCmr(mv, cmrField);
    }
    // throw new IllegalArgumentException("Unknown cmr field " + name + " on entity bean of type " + getClass().getName());
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
    mv.visitLdcInsn("Unknown cmr field ");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitLdcInsn(" on entity bean of type ");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitInsn(ATHROW);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Label(org.apache.xbean.asm5.Label) MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 23 with MethodVisitor

use of jodd.asm5.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createConstructor.

private void createConstructor() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, beanClassName, "<init>", "()V", false);
    for (final CmrField cmrField : cmrFields) {
        initCmrFields(mv, cmrField);
    }
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 24 with MethodVisitor

use of jodd.asm5.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createEjbLoad.

public void createEjbLoad() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "ejbLoad", "()V", null, null);
    mv.visitCode();
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 1);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 25 with MethodVisitor

use of jodd.asm5.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createCmrGetter.

/**
 * Create a getter method for the CMR field.  This
 * will used the accessor object initialized into the
 * name + "Cmr" field that was already generated and
 * initialized at object creation.  The accessor
 * object manages the object relationship.
 *
 * @param cmrField The field we're generating.
 */
private void createCmrGetter(final CmrField cmrField) {
    // no back reference.  We don't generate a getter method for this
    if (cmrField.isSynthetic()) {
        return;
    }
    final String methodName = getterName(cmrField.getName());
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "()" + cmrField.getProxyDescriptor(), null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName() + "Cmr", cmrField.getAccessorDescriptor());
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
    // return this.${cmrField.name}Cmr.get(this.${cmdField.name});
    // this takes the value stored in the CMR field (which might be a single value or
    // a Set or Collection), and hands it to the appropriate accessor.
    mv.visitMethodInsn(INVOKEVIRTUAL, cmrField.getAccessorInternalName(), "get", cmrField.getCmrStyle().getGetterDescriptor(), false);
    // to the target class before returning.
    if (cmrField.getCmrStyle() == CmrStyle.SINGLE) {
        mv.visitTypeInsn(CHECKCAST, cmrField.getProxyType().getInternalName());
    }
    mv.visitInsn(ARETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Aggregations

MethodVisitor (org.apache.xbean.asm5.MethodVisitor)28 MethodVisitor (jodd.asm5.MethodVisitor)6 ClassWriter (org.apache.xbean.asm5.ClassWriter)6 Label (org.apache.xbean.asm5.Label)5 Method (java.lang.reflect.Method)3 ArrayList (java.util.ArrayList)2 Arrays.asList (java.util.Arrays.asList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 EmptyClassVisitor (jodd.asm.EmptyClassVisitor)2 EmptyMethodVisitor (jodd.asm.EmptyMethodVisitor)2 Label (jodd.asm5.Label)2 Field (java.lang.reflect.Field)1 MethodAdapter (jodd.asm.MethodAdapter)1 FieldVisitor (jodd.asm5.FieldVisitor)1 Type (jodd.asm5.Type)1 ProxettaException (jodd.proxetta.ProxettaException)1 Type (org.apache.xbean.asm5.Type)1