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();
}
Aggregations