diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java index d8d94add8..41d3e068d 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java @@ -1341,12 +1341,14 @@ public class PCEnhancer { */ private void addPCMethods(ClassNodeTracker classNodeTracker) throws NoSuchMethodException { addClearFieldsMethod(classNodeTracker.getClassNode()); + addNewInstanceMethod(classNodeTracker.getClassNode(), true); addNewInstanceMethod(classNodeTracker.getClassNode(), false); + addManagedFieldCountMethod(classNodeTracker.getClassNode()); + AsmHelper.readIntoBCClass(classNodeTracker, _pc); - addManagedFieldCountMethod(); addReplaceFieldsMethods(); addProvideFieldsMethods(); addCopyFieldsMethod(); @@ -1512,19 +1514,18 @@ public class PCEnhancer { instructions.add(new VarInsnNode(Opcodes.ALOAD, newPcVarPos)); instructions.add(new InsnNode(Opcodes.ARETURN)); } - + /** * Adds the protected static int pcGetManagedFieldCount () * method to the bytecode, returning the inherited field count added * to the number of managed fields in the current PersistenceCapable class. */ - private void addManagedFieldCountMethod() { - // protected static int pcGetManagedFieldCount () - BCMethod method = _pc.declareMethod(PRE + "GetManagedFieldCount", - int.class, null); - method.setStatic(true); - method.makeProtected(); - Code code = method.getCode(true); + private void addManagedFieldCountMethod(ClassNode classNode) { + MethodNode getFieldCountMeth = new MethodNode(Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC, + PRE + "GetManagedFieldCount", + Type.getMethodDescriptor(Type.INT_TYPE), + null, null); + classNode.methods.add(getFieldCountMeth); // return + pcInheritedFieldCount // awhite: the above should work, but I'm seeing a messed up situation @@ -1532,18 +1533,21 @@ public class PCEnhancer { // happens before is ever invoked, and so our // pcInheritedFieldCount field isn't initialized! so instead, // return + .pcGetManagedFieldCount () - code.constant().setValue(_meta.getDeclaredFields().length); + final InsnList instructions = getFieldCountMeth.instructions; + instructions.add(new LdcInsnNode(_meta.getDeclaredFields().length)); if (_meta.getPCSuperclass() != null) { Class superClass = getType(_meta.getPCSuperclassMetaData()); String superName = getCreateSubclass() ? - PCEnhancer.toPCSubclassName(superClass) : - superClass.getName(); - code.invokestatic().setMethod(superName, - PRE + "GetManagedFieldCount", int.class.getName(), null); - code.iadd(); + PCEnhancer.toPCSubclassName(superClass).replace(".", "/") : + Type.getInternalName(superClass); + instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + superName, + PRE + "GetManagedFieldCount", + Type.getMethodDescriptor(Type.INT_TYPE))); + instructions.add(new InsnNode(Opcodes.IADD)); } - code.ireturn(); - code.calculateMaxStack(); + + instructions.add(new InsnNode(Opcodes.IRETURN)); } /**