Search in sources :

Example 11 with Label

use of org.datanucleus.enhancer.asm.Label in project datanucleus-core by datanucleus.

the class PrimaryKeyGenerator method addMethodHashCode.

/**
 * Method to add a hashCode() method.
 * @param cw The ClassWriter to use
 */
protected void addMethodHashCode(ClassWriter cw) {
    if (DataNucleusEnhancer.LOGGER.isDebugEnabled()) {
        DataNucleusEnhancer.LOGGER.debug(Localiser.msg("005019", "int " + pkClassName + ".hashCode()"));
    }
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "hashCode", "()I", null, null);
    mv.visitCode();
    Label startLabel = new Label();
    mv.visitLabel(startLabel);
    int[] pkPositions = cmd.getPKMemberPositions();
    for (int i = 0; i < pkPositions.length; i++) {
        AbstractMemberMetaData mmd = cmd.getMetaDataForManagedMemberAtRelativePosition(pkPositions[i]);
        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitFieldInsn(Opcodes.GETFIELD, className_ASM, mmd.getName(), EnhanceUtils.getTypeDescriptorForType(mmd.getTypeName()));
        if (mmd.getType() == long.class) {
            // "(int)fieldX"
            mv.visitInsn(Opcodes.L2I);
        } else if (mmd.getType() == int.class || mmd.getType() == short.class || mmd.getType() == char.class) {
        // "fieldX"
        } else {
            // "fieldX.hashCode"
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, mmd.getTypeName().replace('.', '/'), "hashCode", "()I");
        }
        if (i > 0) {
            // "^"
            mv.visitInsn(Opcodes.IXOR);
        }
    }
    mv.visitInsn(Opcodes.IRETURN);
    Label endLabel = new Label();
    mv.visitLabel(endLabel);
    mv.visitLocalVariable("this", className_DescName, null, startLabel, endLabel, 0);
    mv.visitMaxs(3, 1);
    mv.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label) AbstractMemberMetaData(org.datanucleus.metadata.AbstractMemberMetaData) MethodVisitor(org.datanucleus.enhancer.asm.MethodVisitor)

Example 12 with Label

use of org.datanucleus.enhancer.asm.Label in project datanucleus-core by datanucleus.

the class ProvideFields method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    visitor.visitCode();
    Label l0 = new Label();
    visitor.visitLabel(l0);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    Label l1 = new Label();
    visitor.visitJumpInsn(Opcodes.IFNONNULL, l1);
    visitor.visitTypeInsn(Opcodes.NEW, "java/lang/IllegalArgumentException");
    visitor.visitInsn(Opcodes.DUP);
    visitor.visitLdcInsn("argment is null");
    visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
    visitor.visitInsn(Opcodes.ATHROW);
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    visitor.visitInsn(Opcodes.ARRAYLENGTH);
    visitor.visitInsn(Opcodes.ICONST_1);
    visitor.visitInsn(Opcodes.ISUB);
    visitor.visitVarInsn(Opcodes.ISTORE, 2);
    Label l3 = new Label();
    visitor.visitLabel(l3);
    visitor.visitVarInsn(Opcodes.ILOAD, 2);
    Label l4 = new Label();
    visitor.visitJumpInsn(Opcodes.IFLT, l4);
    Label l5 = new Label();
    visitor.visitLabel(l5);
    visitor.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.INTEGER }, 0, null);
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    visitor.visitVarInsn(Opcodes.ILOAD, 2);
    visitor.visitInsn(Opcodes.IALOAD);
    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getProvideFieldMethodName(), "(I)V");
    visitor.visitIincInsn(2, -1);
    visitor.visitVarInsn(Opcodes.ILOAD, 2);
    visitor.visitJumpInsn(Opcodes.IFGE, l5);
    visitor.visitLabel(l4);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    visitor.visitInsn(Opcodes.RETURN);
    Label l7 = new Label();
    visitor.visitLabel(l7);
    visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, l0, l7, 0);
    visitor.visitLocalVariable(argNames[0], "[I", null, l0, l7, 1);
    visitor.visitLocalVariable("i", "I", null, l3, l7, 2);
    visitor.visitMaxs(3, 3);
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Example 13 with Label

use of org.datanucleus.enhancer.asm.Label in project datanucleus-core by datanucleus.

the class ReplaceField method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    AbstractMemberMetaData[] fields = enhancer.getClassMetaData().getManagedMembers();
    String pcSuperclassName = enhancer.getClassMetaData().getPersistableSuperclass();
    visitor.visitCode();
    Label startLabel = new Label();
    visitor.visitLabel(startLabel);
    if (pcSuperclassName != null) {
        if (fields.length > 0) {
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
            Label l1 = new Label();
            visitor.visitJumpInsn(Opcodes.IFNONNULL, l1);
            visitor.visitTypeInsn(Opcodes.NEW, "java/lang/IllegalStateException");
            visitor.visitInsn(Opcodes.DUP);
            visitor.visitLdcInsn("state manager is null");
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/IllegalStateException", "<init>", "(Ljava/lang/String;)V");
            visitor.visitInsn(Opcodes.ATHROW);
            visitor.visitLabel(l1);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitVarInsn(Opcodes.ILOAD, 1);
            visitor.visitFieldInsn(Opcodes.GETSTATIC, getClassEnhancer().getASMClassName(), getNamer().getInheritedFieldCountFieldName(), "I");
            visitor.visitInsn(Opcodes.ISUB);
            Label[] fieldOptions = new Label[fields.length];
            for (int i = 0; i < fields.length; i++) {
                fieldOptions[i] = new Label();
            }
            Label defaultLabel = new Label();
            Label endSwitchLabel = new Label();
            // switch:
            visitor.visitTableSwitchInsn(0, fields.length - 1, defaultLabel, fieldOptions);
            for (int i = 0; i < fields.length; i++) {
                visitor.visitLabel(fieldOptions[i]);
                visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitVarInsn(Opcodes.ILOAD, 1);
                String methodNameType = EnhanceUtils.getTypeNameForPersistableMethod(fields[i].getType());
                visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "replacing" + methodNameType + "Field", "(" + getNamer().getPersistableDescriptor() + "I)" + EnhanceUtils.getTypeDescriptorForEnhanceMethod(fields[i].getType()));
                if (methodNameType.equals("Object")) {
                    // Check any Object types for casting
                    visitor.visitTypeInsn(Opcodes.CHECKCAST, fields[i].getTypeName().replace('.', '/'));
                }
                if (fields[i] instanceof PropertyMetaData) {
                    // Persistent properties so use dnSetXXX(...)
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getSetMethodPrefixMethodName() + fields[i].getName(), "(" + Type.getDescriptor(fields[i].getType()) + ")V");
                } else {
                    // Persistent field so use xxx = ...
                    visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), fields[i].getName(), Type.getDescriptor(fields[i].getType()));
                }
                visitor.visitJumpInsn(Opcodes.GOTO, endSwitchLabel);
            }
            // default:
            visitor.visitLabel(defaultLabel);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitVarInsn(Opcodes.ILOAD, 1);
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, pcSuperclassName.replace('.', '/'), getNamer().getReplaceFieldMethodName(), "(I)V");
            // End of switch
            visitor.visitLabel(endSwitchLabel);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitInsn(Opcodes.RETURN);
            Label endLabel = new Label();
            visitor.visitLabel(endLabel);
            visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
            visitor.visitLocalVariable(argNames[0], "I", null, startLabel, endLabel, 1);
            visitor.visitMaxs(4, 2);
        } else {
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitVarInsn(Opcodes.ILOAD, 1);
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, pcSuperclassName.replace('.', '/'), getNamer().getReplaceFieldMethodName(), "(I)V");
            visitor.visitInsn(Opcodes.RETURN);
            Label endLabel = new Label();
            visitor.visitLabel(endLabel);
            visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
            visitor.visitLocalVariable(argNames[0], "I", null, startLabel, endLabel, 1);
            visitor.visitMaxs(2, 2);
        }
    } else {
        if (fields.length > 0) {
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
            Label l1 = new Label();
            visitor.visitJumpInsn(Opcodes.IFNONNULL, l1);
            visitor.visitTypeInsn(Opcodes.NEW, "java/lang/IllegalStateException");
            visitor.visitInsn(Opcodes.DUP);
            visitor.visitLdcInsn("state manager is null");
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/IllegalStateException", "<init>", "(Ljava/lang/String;)V");
            visitor.visitInsn(Opcodes.ATHROW);
            visitor.visitLabel(l1);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitVarInsn(Opcodes.ILOAD, 1);
            Label[] fieldOptions = new Label[fields.length];
            for (int i = 0; i < fields.length; i++) {
                fieldOptions[i] = new Label();
            }
            Label defaultLabel = new Label();
            Label endSwitchLabel = new Label();
            // switch:
            visitor.visitTableSwitchInsn(0, fields.length - 1, defaultLabel, fieldOptions);
            for (int i = 0; i < fields.length; i++) {
                visitor.visitLabel(fieldOptions[i]);
                visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
                visitor.visitVarInsn(Opcodes.ALOAD, 0);
                visitor.visitVarInsn(Opcodes.ILOAD, 1);
                String methodNameType = EnhanceUtils.getTypeNameForPersistableMethod(fields[i].getType());
                visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "replacing" + methodNameType + "Field", "(" + getNamer().getPersistableDescriptor() + "I)" + EnhanceUtils.getTypeDescriptorForEnhanceMethod(fields[i].getType()));
                if (methodNameType.equals("Object")) {
                    // Check any Object types for casting
                    visitor.visitTypeInsn(Opcodes.CHECKCAST, fields[i].getTypeName().replace('.', '/'));
                }
                if (fields[i] instanceof PropertyMetaData) {
                    // Persistent properties so use dnSetXXX(...)
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getSetMethodPrefixMethodName() + fields[i].getName(), "(" + Type.getDescriptor(fields[i].getType()) + ")V");
                } else {
                    // Persistent field so use xxx = ...
                    visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), fields[i].getName(), Type.getDescriptor(fields[i].getType()));
                }
                visitor.visitJumpInsn(Opcodes.GOTO, endSwitchLabel);
            }
            // default:
            visitor.visitLabel(defaultLabel);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitTypeInsn(Opcodes.NEW, "java/lang/IllegalArgumentException");
            visitor.visitInsn(Opcodes.DUP);
            visitor.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuffer");
            visitor.visitInsn(Opcodes.DUP);
            visitor.visitLdcInsn("out of field index :");
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuffer", "<init>", "(Ljava/lang/String;)V");
            visitor.visitVarInsn(Opcodes.ILOAD, 1);
            visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuffer", "append", "(I)Ljava/lang/StringBuffer;");
            visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;");
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
            visitor.visitInsn(Opcodes.ATHROW);
            // End of switch
            visitor.visitLabel(endSwitchLabel);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitInsn(Opcodes.RETURN);
            Label endLabel = new Label();
            visitor.visitLabel(endLabel);
            visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
            visitor.visitLocalVariable(argNames[0], "I", null, startLabel, endLabel, 1);
            visitor.visitMaxs(5, 2);
        } else {
            visitor.visitInsn(Opcodes.RETURN);
            Label endLabel = new Label();
            visitor.visitLabel(endLabel);
            visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
            visitor.visitLocalVariable(argNames[0], "I", null, startLabel, endLabel, 1);
            visitor.visitMaxs(0, 2);
        }
    }
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label) PropertyMetaData(org.datanucleus.metadata.PropertyMetaData) AbstractMemberMetaData(org.datanucleus.metadata.AbstractMemberMetaData)

Example 14 with Label

use of org.datanucleus.enhancer.asm.Label in project datanucleus-core by datanucleus.

the class ReplaceFields method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    visitor.visitCode();
    Label l0 = new Label();
    visitor.visitLabel(l0);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    Label l1 = new Label();
    visitor.visitJumpInsn(Opcodes.IFNONNULL, l1);
    visitor.visitTypeInsn(Opcodes.NEW, "java/lang/IllegalArgumentException");
    visitor.visitInsn(Opcodes.DUP);
    visitor.visitLdcInsn("argument is null");
    visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
    visitor.visitInsn(Opcodes.ATHROW);
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    visitor.visitInsn(Opcodes.ARRAYLENGTH);
    visitor.visitVarInsn(Opcodes.ISTORE, 2);
    Label l3 = new Label();
    visitor.visitLabel(l3);
    visitor.visitVarInsn(Opcodes.ILOAD, 2);
    Label l4 = new Label();
    visitor.visitJumpInsn(Opcodes.IFLE, l4);
    visitor.visitInsn(Opcodes.ICONST_0);
    visitor.visitVarInsn(Opcodes.ISTORE, 3);
    Label l6 = new Label();
    visitor.visitLabel(l6);
    visitor.visitFrame(Opcodes.F_APPEND, 2, new Object[] { Opcodes.INTEGER, Opcodes.INTEGER }, 0, null);
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    visitor.visitVarInsn(Opcodes.ILOAD, 3);
    visitor.visitInsn(Opcodes.IALOAD);
    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getReplaceFieldMethodName(), "(I)V");
    visitor.visitIincInsn(3, 1);
    visitor.visitVarInsn(Opcodes.ILOAD, 3);
    visitor.visitVarInsn(Opcodes.ILOAD, 2);
    visitor.visitJumpInsn(Opcodes.IF_ICMPLT, l6);
    visitor.visitLabel(l4);
    visitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
    visitor.visitInsn(Opcodes.RETURN);
    Label l8 = new Label();
    visitor.visitLabel(l8);
    visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, l0, l8, 0);
    visitor.visitLocalVariable(argNames[0], "[I", null, l0, l8, 1);
    visitor.visitLocalVariable("i", "I", null, l3, l8, 2);
    visitor.visitLocalVariable("j", "I", null, l6, l4, 3);
    visitor.visitMaxs(3, 4);
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Example 15 with Label

use of org.datanucleus.enhancer.asm.Label in project datanucleus-core by datanucleus.

the class ReplaceFlags method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    visitor.visitCode();
    Label startLabel = new Label();
    visitor.visitLabel(startLabel);
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
    Label l1 = new Label();
    visitor.visitJumpInsn(Opcodes.IFNULL, l1);
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "replacingFlags", "(" + getNamer().getPersistableDescriptor() + ")B");
    visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), getNamer().getFlagsFieldName(), "B");
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    visitor.visitInsn(Opcodes.RETURN);
    Label endLabel = new Label();
    visitor.visitLabel(endLabel);
    visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
    visitor.visitMaxs(3, 1);
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Aggregations

Label (org.datanucleus.enhancer.asm.Label)48 AbstractMemberMetaData (org.datanucleus.metadata.AbstractMemberMetaData)13 MethodVisitor (org.datanucleus.enhancer.asm.MethodVisitor)9 PropertyMetaData (org.datanucleus.metadata.PropertyMetaData)8 AbstractClassMetaData (org.datanucleus.metadata.AbstractClassMetaData)7 ClassMetaData (org.datanucleus.metadata.ClassMetaData)6 Date (java.util.Date)2 TimeZone (java.util.TimeZone)2 InterfaceMetaData (org.datanucleus.metadata.InterfaceMetaData)2 ClassWriter (org.datanucleus.enhancer.asm.ClassWriter)1 FieldVisitor (org.datanucleus.enhancer.asm.FieldVisitor)1