Search in sources :

Example 26 with PropertyMetaData

use of org.datanucleus.metadata.PropertyMetaData in project datanucleus-core by datanucleus.

the class CopyField 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) {
        Class supercls = enhancer.getClassLoaderResolver().classForName(pcSuperclassName);
        String superclsDescriptor = Type.getDescriptor(supercls);
        if (fields.length > 0) {
            visitor.visitVarInsn(Opcodes.ILOAD, 2);
            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, 1);
                if (fields[i] instanceof PropertyMetaData) {
                    // Persistent property so use dnSetXXX(obj.dnGetXXX())
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getGetMethodPrefixMethodName() + fields[i].getName(), "()" + Type.getDescriptor(fields[i].getType()));
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getSetMethodPrefixMethodName() + fields[i].getName(), "(" + Type.getDescriptor(fields[i].getType()) + ")V");
                } else {
                    // Persistent field so use xxx = obj.xxx
                    visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), fields[i].getName(), Type.getDescriptor(fields[i].getType()));
                    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);
            // super.dnCopyField(obj, index);
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitVarInsn(Opcodes.ALOAD, 1);
            visitor.visitVarInsn(Opcodes.ILOAD, 2);
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, pcSuperclassName.replace('.', '/'), getNamer().getCopyFieldMethodName(), "(" + superclsDescriptor + "I)V");
            // End of switch
            visitor.visitLabel(endSwitchLabel);
            visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            visitor.visitInsn(Opcodes.RETURN);
        } else {
            // super.dnCopyField(obj, index);
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitVarInsn(Opcodes.ALOAD, 1);
            visitor.visitVarInsn(Opcodes.ILOAD, 2);
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, pcSuperclassName.replace('.', '/'), getNamer().getCopyFieldMethodName(), "(" + superclsDescriptor + "I)V");
            visitor.visitInsn(Opcodes.RETURN);
        }
    } else {
        if (fields.length > 0) {
            visitor.visitVarInsn(Opcodes.ILOAD, 2);
            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, 1);
                if (fields[i] instanceof PropertyMetaData) {
                    // Persistent property so use dnSetXXX(obj.dnGetXXX())
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getGetMethodPrefixMethodName() + fields[i].getName(), "()" + Type.getDescriptor(fields[i].getType()));
                    visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getSetMethodPrefixMethodName() + fields[i].getName(), "(" + Type.getDescriptor(fields[i].getType()) + ")V");
                } else {
                    // Persistent field so use xxx = obj.xxx
                    visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), fields[i].getName(), Type.getDescriptor(fields[i].getType()));
                    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);
            // throw new IllegalArgumentException("out of field index :" + index);
            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, 2);
            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);
        } else {
            // throw new IllegalArgumentException("out of field index :" + index);
            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, 2);
            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);
        }
    }
    // Set parameter names
    Label endLabel = new Label();
    visitor.visitLabel(endLabel);
    visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
    visitor.visitLocalVariable(argNames[0], getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 1);
    visitor.visitLocalVariable(argNames[1], "I", null, startLabel, endLabel, 2);
    if (pcSuperclassName != null) {
        visitor.visitMaxs(3, 3);
    } else {
        visitor.visitMaxs(5, 3);
    }
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label) PropertyMetaData(org.datanucleus.metadata.PropertyMetaData) AbstractMemberMetaData(org.datanucleus.metadata.AbstractMemberMetaData)

Aggregations

PropertyMetaData (org.datanucleus.metadata.PropertyMetaData)26 AbstractMemberMetaData (org.datanucleus.metadata.AbstractMemberMetaData)18 AbstractClassMetaData (org.datanucleus.metadata.AbstractClassMetaData)9 Label (org.datanucleus.enhancer.asm.Label)8 ClassMetaData (org.datanucleus.metadata.ClassMetaData)6 FieldMetaData (org.datanucleus.metadata.FieldMetaData)5 AttributeConverter (javax.jdo.AttributeConverter)3 PersistenceNucleusContext (org.datanucleus.PersistenceNucleusContext)3 JDOTypeConverter (org.datanucleus.api.jdo.JDOTypeConverter)3 FieldPersistenceModifier (org.datanucleus.metadata.FieldPersistenceModifier)3 InvalidMetaDataException (org.datanucleus.metadata.InvalidMetaDataException)3 Iterator (java.util.Iterator)2 Column (javax.jdo.annotations.Column)2 ClassLoaderResolver (org.datanucleus.ClassLoaderResolver)2 ArrayMetaData (org.datanucleus.metadata.ArrayMetaData)2 CollectionMetaData (org.datanucleus.metadata.CollectionMetaData)2 ColumnMetaData (org.datanucleus.metadata.ColumnMetaData)2 InterfaceMetaData (org.datanucleus.metadata.InterfaceMetaData)2 MapMetaData (org.datanucleus.metadata.MapMetaData)2 TypeManager (org.datanucleus.store.types.TypeManager)2