Search in sources :

Example 21 with Label

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

the class MakeDirty method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    AbstractClassMetaData cmd = getClassEnhancer().getClassMetaData();
    String pcSuperclassName = cmd.getPersistableSuperclass();
    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.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitVarInsn(Opcodes.ALOAD, 1);
    visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "makeDirty", "(" + getNamer().getPersistableDescriptor() + "Ljava/lang/String;" + ")V");
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    if (cmd.isDetachable()) {
        // if (dnIsDetached())
        visitor.visitVarInsn(Opcodes.ALOAD, 0);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getIsDetachedMethodName(), "()Z");
        Label l3 = new Label();
        visitor.visitJumpInsn(Opcodes.IFEQ, l3);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitJumpInsn(Opcodes.IFNULL, l3);
        visitor.visitInsn(Opcodes.ACONST_NULL);
        visitor.visitVarInsn(Opcodes.ASTORE, 2);
        Label l5 = new Label();
        visitor.visitLabel(l5);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitIntInsn(Opcodes.BIPUSH, 46);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "indexOf", "(I)I");
        Label l6 = new Label();
        visitor.visitJumpInsn(Opcodes.IFLT, l6);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitIntInsn(Opcodes.BIPUSH, 46);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "lastIndexOf", "(I)I");
        visitor.visitInsn(Opcodes.ICONST_1);
        visitor.visitInsn(Opcodes.IADD);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "substring", "(I)Ljava/lang/String;");
        visitor.visitVarInsn(Opcodes.ASTORE, 2);
        Label l8 = new Label();
        visitor.visitJumpInsn(Opcodes.GOTO, l8);
        visitor.visitLabel(l6);
        visitor.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitVarInsn(Opcodes.ASTORE, 2);
        visitor.visitLabel(l8);
        visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        visitor.visitInsn(Opcodes.ICONST_0);
        visitor.visitVarInsn(Opcodes.ISTORE, 3);
        Label l9 = new Label();
        visitor.visitLabel(l9);
        Label l10 = new Label();
        visitor.visitJumpInsn(Opcodes.GOTO, l10);
        Label l11 = new Label();
        visitor.visitLabel(l11);
        visitor.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.INTEGER }, 0, null);
        visitor.visitFieldInsn(Opcodes.GETSTATIC, getClassEnhancer().getASMClassName(), getNamer().getFieldNamesFieldName(), "[Ljava/lang/String;");
        visitor.visitVarInsn(Opcodes.ILOAD, 3);
        visitor.visitInsn(Opcodes.AALOAD);
        visitor.visitVarInsn(Opcodes.ALOAD, 2);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z");
        Label l12 = new Label();
        visitor.visitJumpInsn(Opcodes.IFEQ, l12);
        visitor.visitVarInsn(Opcodes.ALOAD, 0);
        visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getDetachedStateFieldName(), "[Ljava/lang/Object;");
        visitor.visitInsn(Opcodes.ICONST_2);
        visitor.visitInsn(Opcodes.AALOAD);
        visitor.visitTypeInsn(Opcodes.CHECKCAST, "java/util/BitSet");
        visitor.visitVarInsn(Opcodes.ILOAD, 3);
        visitor.visitFieldInsn(Opcodes.GETSTATIC, getClassEnhancer().getASMClassName(), getNamer().getInheritedFieldCountFieldName(), "I");
        visitor.visitInsn(Opcodes.IADD);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/BitSet", "get", "(I)Z");
        Label l14 = new Label();
        visitor.visitJumpInsn(Opcodes.IFEQ, l14);
        visitor.visitVarInsn(Opcodes.ALOAD, 0);
        visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getDetachedStateFieldName(), "[Ljava/lang/Object;");
        visitor.visitInsn(Opcodes.ICONST_3);
        visitor.visitInsn(Opcodes.AALOAD);
        visitor.visitTypeInsn(Opcodes.CHECKCAST, "java/util/BitSet");
        visitor.visitVarInsn(Opcodes.ILOAD, 3);
        visitor.visitFieldInsn(Opcodes.GETSTATIC, getClassEnhancer().getASMClassName(), getNamer().getInheritedFieldCountFieldName(), "I");
        visitor.visitInsn(Opcodes.IADD);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/BitSet", "set", "(I)V");
        visitor.visitInsn(Opcodes.RETURN);
        visitor.visitLabel(l14);
        visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        if (enhancer.hasOption(ClassEnhancer.OPTION_GENERATE_DETACH_LISTENER)) {
            // TODO Check this bytecode
            visitor.visitMethodInsn(Opcodes.INVOKESTATIC, getNamer().getDetachListenerAsmClassName(), "getInstance", "()L" + getNamer().getDetachListenerAsmClassName() + ";");
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitLdcInsn("field/property");
            visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getNamer().getDetachListenerAsmClassName(), "undetachedFieldAccess", "(Ljava/lang/Object;Ljava/lang/String;)V");
        } else {
            visitor.visitTypeInsn(Opcodes.NEW, getNamer().getDetachedFieldAccessExceptionAsmClassName());
            visitor.visitInsn(Opcodes.DUP);
            visitor.visitLdcInsn("You have just attempted to access a field/property that hasn't been detached. Please detach it first before performing this operation");
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getNamer().getDetachedFieldAccessExceptionAsmClassName(), "<init>", "(Ljava/lang/String;)V");
            visitor.visitInsn(Opcodes.ATHROW);
        }
        visitor.visitLabel(l12);
        visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        visitor.visitIincInsn(3, 1);
        visitor.visitLabel(l10);
        visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        visitor.visitVarInsn(Opcodes.ILOAD, 3);
        visitor.visitFieldInsn(Opcodes.GETSTATIC, getClassEnhancer().getASMClassName(), getNamer().getFieldNamesFieldName(), "[Ljava/lang/String;");
        visitor.visitInsn(Opcodes.ARRAYLENGTH);
        visitor.visitJumpInsn(Opcodes.IF_ICMPLT, l11);
        visitor.visitLabel(l3);
        visitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
        if (pcSuperclassName != null) {
            // Relay to the superclass to see if it has this field
            visitor.visitVarInsn(Opcodes.ALOAD, 0);
            visitor.visitVarInsn(Opcodes.ALOAD, 1);
            visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, pcSuperclassName.replace('.', '/'), getNamer().getMakeDirtyMethodName(), "(Ljava/lang/String;)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], "Ljava/lang/String;", null, startLabel, endLabel, 1);
        visitor.visitLocalVariable("fldName", "Ljava/lang/String;", null, l5, l3, 2);
        visitor.visitLocalVariable("i", "I", null, l9, l3, 3);
        visitor.visitMaxs(3, 4);
    } else {
        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], "Ljava/lang/String;", null, startLabel, endLabel, 1);
        visitor.visitMaxs(3, 2);
    }
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label) AbstractClassMetaData(org.datanucleus.metadata.AbstractClassMetaData)

Example 22 with Label

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

the class NewInstance1 method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    visitor.visitCode();
    Label startLabel = new Label();
    visitor.visitLabel(startLabel);
    if (enhancer.getClassMetaData().isAbstract()) {
        visitor.visitTypeInsn(Opcodes.NEW, getNamer().getFatalInternalExceptionAsmClassName());
        visitor.visitInsn(Opcodes.DUP);
        visitor.visitLdcInsn("Cannot instantiate abstract class.");
        visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getNamer().getFatalInternalExceptionAsmClassName(), "<init>", "(Ljava/lang/String;)V");
        visitor.visitInsn(Opcodes.ATHROW);
        Label endLabel = new Label();
        visitor.visitLabel(endLabel);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
        visitor.visitLocalVariable(argNames[0], getNamer().getStateManagerDescriptor(), null, startLabel, endLabel, 1);
        visitor.visitMaxs(3, 2);
    } else {
        visitor.visitTypeInsn(Opcodes.NEW, getClassEnhancer().getASMClassName());
        visitor.visitInsn(Opcodes.DUP);
        visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getClassEnhancer().getASMClassName(), "<init>", "()V");
        visitor.visitVarInsn(Opcodes.ASTORE, 2);
        Label l1 = new Label();
        visitor.visitLabel(l1);
        visitor.visitVarInsn(Opcodes.ALOAD, 2);
        visitor.visitInsn(Opcodes.ICONST_1);
        visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), getNamer().getFlagsFieldName(), "B");
        visitor.visitVarInsn(Opcodes.ALOAD, 2);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
        visitor.visitVarInsn(Opcodes.ALOAD, 2);
        visitor.visitInsn(Opcodes.ARETURN);
        Label endLabel = new Label();
        visitor.visitLabel(endLabel);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
        visitor.visitLocalVariable(argNames[0], getNamer().getStateManagerDescriptor(), null, startLabel, endLabel, 1);
        visitor.visitLocalVariable("result", getClassEnhancer().getClassDescriptor(), null, l1, endLabel, 2);
        visitor.visitMaxs(2, 3);
    }
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Example 23 with Label

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

the class NewInstance2 method execute.

/**
 * Method to add the contents of the class method.
 */
public void execute() {
    visitor.visitCode();
    Label startLabel = new Label();
    visitor.visitLabel(startLabel);
    if (enhancer.getClassMetaData().isAbstract()) {
        visitor.visitTypeInsn(Opcodes.NEW, getNamer().getFatalInternalExceptionAsmClassName());
        visitor.visitInsn(Opcodes.DUP);
        visitor.visitLdcInsn("Cannot instantiate abstract class.");
        visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getNamer().getFatalInternalExceptionAsmClassName(), "<init>", "(Ljava/lang/String;)V");
        visitor.visitInsn(Opcodes.ATHROW);
        Label endLabel = new Label();
        visitor.visitLabel(endLabel);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
        visitor.visitLocalVariable(argNames[0], getNamer().getStateManagerDescriptor(), null, startLabel, endLabel, 1);
        visitor.visitLocalVariable(argNames[1], EnhanceUtils.CD_Object, null, startLabel, endLabel, 2);
        visitor.visitMaxs(3, 3);
    } else {
        visitor.visitTypeInsn(Opcodes.NEW, getClassEnhancer().getASMClassName());
        visitor.visitInsn(Opcodes.DUP);
        visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, getClassEnhancer().getASMClassName(), "<init>", "()V");
        visitor.visitVarInsn(Opcodes.ASTORE, 3);
        Label l1 = new Label();
        visitor.visitLabel(l1);
        visitor.visitVarInsn(Opcodes.ALOAD, 3);
        visitor.visitInsn(Opcodes.ICONST_1);
        visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), getNamer().getFlagsFieldName(), "B");
        visitor.visitVarInsn(Opcodes.ALOAD, 3);
        visitor.visitVarInsn(Opcodes.ALOAD, 1);
        visitor.visitFieldInsn(Opcodes.PUTFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
        visitor.visitVarInsn(Opcodes.ALOAD, 3);
        visitor.visitVarInsn(Opcodes.ALOAD, 2);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getCopyKeyFieldsFromObjectIdMethodName(), "(" + EnhanceUtils.CD_Object + ")V");
        visitor.visitVarInsn(Opcodes.ALOAD, 3);
        visitor.visitInsn(Opcodes.ARETURN);
        Label endLabel = new Label();
        visitor.visitLabel(endLabel);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, startLabel, endLabel, 0);
        visitor.visitLocalVariable(argNames[0], getNamer().getStateManagerDescriptor(), null, startLabel, endLabel, 1);
        visitor.visitLocalVariable(argNames[1], EnhanceUtils.CD_Object, null, startLabel, endLabel, 2);
        visitor.visitLocalVariable("result", getClassEnhancer().getClassDescriptor(), null, l1, endLabel, 3);
        visitor.visitMaxs(2, 4);
    }
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Example 24 with Label

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

the class GetTransactionalObjectId 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, 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.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "getTransactionalObjectId", "(" + getNamer().getPersistableDescriptor() + ")" + EnhanceUtils.CD_Object);
    Label l2 = new Label();
    visitor.visitJumpInsn(Opcodes.GOTO, l2);
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    visitor.visitInsn(Opcodes.ACONST_NULL);
    visitor.visitLabel(l2);
    visitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Object" });
    visitor.visitInsn(Opcodes.ARETURN);
    Label l3 = new Label();
    visitor.visitLabel(l3);
    visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, l0, l3, 0);
    visitor.visitMaxs(2, 1);
    visitor.visitEnd();
}
Also used : Label(org.datanucleus.enhancer.asm.Label)

Example 25 with Label

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

the class GetVersion 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, 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.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getStateManagerFieldName(), getNamer().getStateManagerDescriptor());
    visitor.visitVarInsn(Opcodes.ALOAD, 0);
    visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, getNamer().getStateManagerAsmClassName(), "getVersion", "(" + getNamer().getPersistableDescriptor() + ")" + EnhanceUtils.CD_Object);
    visitor.visitInsn(Opcodes.ARETURN);
    visitor.visitLabel(l1);
    visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    if (!enhancer.getClassMetaData().isDetachable()) {
        visitor.visitInsn(Opcodes.ACONST_NULL);
        visitor.visitInsn(Opcodes.ARETURN);
        Label l3 = new Label();
        visitor.visitLabel(l3);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, l0, l3, 0);
        visitor.visitMaxs(2, 1);
    } else {
        visitor.visitVarInsn(Opcodes.ALOAD, 0);
        visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getClassEnhancer().getASMClassName(), getNamer().getIsDetachedMethodName(), "()Z");
        Label l3 = new Label();
        visitor.visitJumpInsn(Opcodes.IFNE, l3);
        visitor.visitInsn(Opcodes.ACONST_NULL);
        visitor.visitInsn(Opcodes.ARETURN);
        visitor.visitLabel(l3);
        visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        visitor.visitVarInsn(Opcodes.ALOAD, 0);
        visitor.visitFieldInsn(Opcodes.GETFIELD, getClassEnhancer().getASMClassName(), getNamer().getDetachedStateFieldName(), "[" + EnhanceUtils.CD_Object);
        visitor.visitInsn(Opcodes.ICONST_1);
        visitor.visitInsn(Opcodes.AALOAD);
        visitor.visitInsn(Opcodes.ARETURN);
        Label l4 = new Label();
        visitor.visitLabel(l4);
        visitor.visitLocalVariable("this", getClassEnhancer().getClassDescriptor(), null, l0, l4, 0);
        visitor.visitMaxs(2, 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