This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openjpa.git
commit 9244250865277711aa95f6a9a379c1a3acc4fe4d Author: Mark Struberg <strub...@apache.org> AuthorDate: Sun Jul 23 21:15:17 2023 +0200 OPENJPA-2911 enhanceToData in ASM --- .../datacache/DataCachePCDataGenerator.java | 71 ++++++++---- .../apache/openjpa/enhance/PCDataGenerator.java | 14 +-- .../org/apache/openjpa/enhance/PCEnhancer.java | 125 ++++++++++----------- .../org/apache/openjpa/util/asm/AsmHelper.java | 1 + 4 files changed, 119 insertions(+), 92 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCachePCDataGenerator.java b/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCachePCDataGenerator.java index 3d560aa60..35aadd372 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCachePCDataGenerator.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCachePCDataGenerator.java @@ -36,6 +36,17 @@ import org.apache.openjpa.meta.JavaTypes; import org.apache.openjpa.meta.ValueMetaData; import org.apache.openjpa.util.asm.AsmHelper; import org.apache.openjpa.util.asm.ClassNodeTracker; +import org.apache.xbean.asm9.Opcodes; +import org.apache.xbean.asm9.Type; +import org.apache.xbean.asm9.tree.ClassNode; +import org.apache.xbean.asm9.tree.FieldInsnNode; +import org.apache.xbean.asm9.tree.InsnList; +import org.apache.xbean.asm9.tree.InsnNode; +import org.apache.xbean.asm9.tree.JumpInsnNode; +import org.apache.xbean.asm9.tree.LabelNode; +import org.apache.xbean.asm9.tree.MethodInsnNode; +import org.apache.xbean.asm9.tree.MethodNode; +import org.apache.xbean.asm9.tree.VarInsnNode; import serp.bytecode.BCClass; import serp.bytecode.BCField; @@ -83,11 +94,12 @@ public class DataCachePCDataGenerator extends PCDataGenerator { @Override protected void decorate(ClassNodeTracker cnt, ClassMetaData meta) { + enhanceToData(cnt); + //X TODO REMOVE BCClass _bc = new Project().loadClass(cnt.getClassNode().name.replace("/", ".")); AsmHelper.readIntoBCClass(cnt, _bc); - enhanceToData(_bc); enhanceToNestedData(_bc); replaceNewEmbeddedPCData(_bc); addSynchronization(_bc); @@ -96,30 +108,45 @@ public class DataCachePCDataGenerator extends PCDataGenerator { cnt.setClassNode(AsmHelper.toClassNode(cnt.getProject(), _bc).getClassNode()); } - private void enhanceToData(BCClass bc) { - BCMethod meth = bc.declareMethod("toData", Object.class, - new Class []{ FieldMetaData.class, Object.class, - StoreContext.class }); - Code code = meth.getCode(true); + private void enhanceToData(ClassNodeTracker cnt) { + ClassNode classNode = cnt.getClassNode(); + MethodNode meth = new MethodNode(Opcodes.ACC_PUBLIC, + "toData", + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, + Type.getType(FieldMetaData.class), + AsmHelper.TYPE_OBJECT, + Type.getType(StoreContext.class)), + null, null); + classNode.methods.add(meth); + final InsnList instructions = meth.instructions; + // if (fmd.isLRS ())) // return NULL; - code.aload().setParam(0); - code.invokevirtual().setMethod(FieldMetaData.class, "isLRS", - boolean.class, null); - JumpInstruction ifins = code.ifeq(); - code.getstatic().setField(AbstractPCData.class, "NULL", Object.class); - code.areturn(); + instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param, FieldMetaData + instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, + Type.getInternalName(FieldMetaData.class), + "isLRS", + Type.getMethodDescriptor(Type.BOOLEAN_TYPE))); + LabelNode lblEndIfEq = new LabelNode(); + instructions.add(new JumpInsnNode(Opcodes.IFEQ, lblEndIfEq)); + instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, Type.getInternalName(AbstractPCData.class), + "NULL", AsmHelper.TYPE_OBJECT.getDescriptor())); + instructions.add(new InsnNode(Opcodes.ARETURN)); + + instructions.add(lblEndIfEq); // super.toData (fmd, val, ctx); - ifins.setTarget(code.aload().setThis()); - code.aload().setParam(0); - code.aload().setParam(1); - code.aload().setParam(2); - code.invokespecial().setMethod(AbstractPCData.class, "toData", - Object.class, new Class[]{ FieldMetaData.class, Object.class, - StoreContext.class }); - code.areturn(); - code.calculateMaxStack(); - code.calculateMaxLocals(); + instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); + instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param, FieldMetaData + instructions.add(new VarInsnNode(Opcodes.ALOAD, 2)); // 2nd param, Object + instructions.add(new VarInsnNode(Opcodes.ALOAD, 3)); // 3rd param, StoreContext + instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, + Type.getInternalName(AbstractPCData.class), + "toData", + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, + Type.getType(FieldMetaData.class), + AsmHelper.TYPE_OBJECT, + Type.getType(StoreContext.class)))); + instructions.add(new InsnNode(Opcodes.ARETURN)); } private void enhanceToNestedData(BCClass bc) { diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCDataGenerator.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCDataGenerator.java index 86ebf6c72..2a1d5dc96 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCDataGenerator.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCDataGenerator.java @@ -319,12 +319,12 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "getImplData", - Type.getMethodDescriptor(Type.getType(Object.class)))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, "setImplData", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(Object.class)))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); instructions.add(lblEndIfEq); instructions.add(new InsnNode(Opcodes.RETURN)); @@ -348,7 +348,7 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "getImplData", - Type.getMethodDescriptor(Type.getType(Object.class)))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); LabelNode lblEndIf = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IFNONNULL, lblEndIf)); instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this @@ -363,7 +363,7 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "setImplData", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(Object.class), Type.BOOLEAN_TYPE))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.BOOLEAN_TYPE))); instructions.add(lblEndIf); instructions.add(lblEndIf2); instructions.add(new InsnNode(Opcodes.RETURN)); @@ -556,7 +556,7 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "getVersion", - Type.getMethodDescriptor(Type.getType(Object.class)))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, versionField.name, versionField.desc)); instructions.add(new InsnNode(Opcodes.RETURN)); } @@ -576,7 +576,7 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "getVersion", - Type.getMethodDescriptor(Type.getType(Object.class)))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); LabelNode lblEndIf = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IFNONNULL, lblEndIf)); @@ -586,7 +586,7 @@ public class PCDataGenerator extends DynamicStorageGenerator { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(OpenJPAStateManager.class), "setVersion", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(Object.class)))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); instructions.add(lblEndIf); instructions.add(new InsnNode(Opcodes.RETURN)); 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 2937b484e..18fa20718 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 @@ -121,7 +121,6 @@ public class PCEnhancer { // Each enhanced class will return the value of this field via // public int getEnhancementContractVersion() public static final int ENHANCER_VERSION; - public static final Type TYPE_OBJECT = Type.getType(Object.class); public static final int ENHANCE_NONE = 0; public static final int ENHANCE_AWARE = 2 << 0; @@ -1177,7 +1176,7 @@ public class PCEnhancer { insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(RedefinitionHelper.class), "accessingField", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT, Type.INT_TYPE))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.INT_TYPE))); if (methodNode.instructions.size() == 0) { methodNode.instructions.add(insns); @@ -1221,7 +1220,8 @@ public class PCEnhancer { insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(RedefinitionHelper.class), "settingField", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT, Type.INT_TYPE, Type.getType(type), Type.getType(type)))); + Type.getMethodDescriptor(Type.VOID_TYPE, + AsmHelper.TYPE_OBJECT, Type.INT_TYPE, Type.getType(type), Type.getType(type)))); methodNode.instructions.insert(currentInsn, insns); return insns.getLast(); @@ -1336,8 +1336,9 @@ public class PCEnhancer { PRE + "ClearFields", Type.getMethodDescriptor(Type.VOID_TYPE), null, null); - + classNode.methods.add(clearFieldMethod); final InsnList instructions = clearFieldMethod.instructions; + if (_meta.getPCSuperclass() != null && !getCreateSubclass()) { instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, @@ -1375,9 +1376,6 @@ public class PCEnhancer { } } instructions.add(new InsnNode(Opcodes.RETURN)); - - classNode.methods.add(clearFieldMethod); - } /** @@ -1391,7 +1389,7 @@ public class PCEnhancer { private void addNewInstanceMethod(ClassNode classNode, boolean oid) { // public PersistenceCapable pcNewInstance (...) String desc = oid - ? Type.getMethodDescriptor(Type.getType(PCTYPE), Type.getType(SMTYPE), TYPE_OBJECT, Type.BOOLEAN_TYPE) + ? Type.getMethodDescriptor(Type.getType(PCTYPE), Type.getType(SMTYPE), AsmHelper.TYPE_OBJECT, Type.BOOLEAN_TYPE) : Type.getMethodDescriptor(Type.getType(PCTYPE), Type.getType(SMTYPE), Type.BOOLEAN_TYPE); MethodNode newInstance = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "NewInstance", @@ -1443,7 +1441,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "CopyKeyFieldsFromObjectId", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); } instructions.add(new VarInsnNode(Opcodes.ALOAD, newPcVarPos)); @@ -1736,7 +1734,7 @@ public class PCEnhancer { */ private void addMultipleFieldsMethodVersion(ClassNode classNode, MethodNode single, boolean copy) { String desc = copy - ? Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT, Type.getType(int[].class)) + ? Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.getType(int[].class)) : Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(int[].class)); MethodNode multiMeth = new MethodNode(Opcodes.ACC_PUBLIC, @@ -1757,7 +1755,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ImplHelper.class), "getManagedInstance", - Type.getMethodDescriptor(TYPE_OBJECT, TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, AsmHelper.TYPE_OBJECT))); instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, managedType.getClassNode().name)); instructions.add(new VarInsnNode(Opcodes.ASTORE, instVarPos)); @@ -1772,8 +1770,8 @@ public class PCEnhancer { Type.getInternalName(ImplHelper.class), "toPersistenceCapable", Type.getMethodDescriptor(Type.getType(PersistenceCapable.class), - TYPE_OBJECT, - TYPE_OBJECT))); + AsmHelper.TYPE_OBJECT, + AsmHelper.TYPE_OBJECT))); // now we get the StateManager from the other instance instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, @@ -1973,7 +1971,7 @@ public class PCEnhancer { final ClassNode classNode = pc.getClassNode(); MethodNode getVersionMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "GetVersion", - Type.getMethodDescriptor(TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(getVersionMeth); InsnList instructions = getVersionMeth.instructions; @@ -2014,7 +2012,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(SMTYPE), "getVersion", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new InsnNode(Opcodes.ARETURN)); } @@ -2099,7 +2097,7 @@ public class PCEnhancer { // public void pcCopyKeyFieldsToObjectId (ObjectIdFieldSupplier fs, Object oid) MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsToObjectId", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFSTYPE), TYPE_OBJECT), + Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFSTYPE), AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.RETURN)); @@ -2109,7 +2107,7 @@ public class PCEnhancer { // public void pcCopyKeyFieldsToObjectId (Object oid) MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsToObjectId", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT), + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.RETURN)); @@ -2119,7 +2117,7 @@ public class PCEnhancer { // public void pcCopyKeyFieldsFromObjectId (ObjectIdFieldConsumer fc, Object oid) MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsFromObjectId", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFCTYPE), TYPE_OBJECT), + Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFCTYPE), AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.RETURN)); @@ -2129,7 +2127,7 @@ public class PCEnhancer { // public void pcCopyKeyFieldsFromObjectId (Object oid) MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsFromObjectId", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT), + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.RETURN)); @@ -2139,7 +2137,7 @@ public class PCEnhancer { // public Object pcNewObjectIdInstance () MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "NewObjectIdInstance", - Type.getMethodDescriptor(TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.ACONST_NULL)); @@ -2150,7 +2148,7 @@ public class PCEnhancer { // public Object pcNewObjectIdInstance (Object obj) MethodNode copyKeyMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "NewObjectIdInstance", - Type.getMethodDescriptor(TYPE_OBJECT, TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(copyKeyMeth); copyKeyMeth.instructions.add(new InsnNode(Opcodes.ACONST_NULL)); @@ -2167,8 +2165,8 @@ public class PCEnhancer { // public void pcCopyKeyFieldsToObjectId (ObjectIdFieldSupplier fs, Object oid) String mDesc = fieldManager - ? Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFSTYPE), TYPE_OBJECT) - : Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT); + ? Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFSTYPE), AsmHelper.TYPE_OBJECT) + : Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT); MethodNode copyKFMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsToObjectId", mDesc, @@ -2210,7 +2208,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ObjectId.class), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } // <oid type> id = (<oid type>) oid; @@ -2290,7 +2288,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ObjectId.class), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } // if the type of this field meta data is @@ -2323,7 +2321,8 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ApplicationIds.class), "setAppId", - Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(ObjectId.class), TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, + Type.getType(ObjectId.class), AsmHelper.TYPE_OBJECT))); instructions.add(new InsnNode(Opcodes.RETURN)); return; } @@ -2394,7 +2393,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ObjectId.class), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } // if the type of this field meta data is @@ -2418,16 +2417,16 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(Reflection.class), "set", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT, Type.getType(Field.class), - (type.isPrimitive()) ? Type.getType(type) : TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.getType(Field.class), + (type.isPrimitive()) ? Type.getType(type) : AsmHelper.TYPE_OBJECT))); } else if (reflect) { instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(Reflection.class), "set", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT, Type.getType(Method.class), - (type.isPrimitive()) ? Type.getType(type) : TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.getType(Method.class), + (type.isPrimitive()) ? Type.getType(type) : AsmHelper.TYPE_OBJECT))); } else if (field != null) { instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, @@ -2466,13 +2465,13 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(PersistenceCapable.class), PRE + "FetchObjectId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } else { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(PersistenceCapable.class), PRE + "NewObjectIdInstance", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } int oidVarPos = nextFreeVarPos++; @@ -2679,7 +2678,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ObjectId.class), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(pktype))); } @@ -2735,8 +2734,8 @@ public class PCEnhancer { private void addCopyKeyFieldsFromObjectIdMethod(boolean fieldManager) throws NoSuchMethodException { // public void pcCopyKeyFieldsFromObjectId (ObjectIdFieldConsumer fc, Object oid) String mDesc = fieldManager - ? Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFCTYPE), TYPE_OBJECT) - : Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT); + ? Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(OIDFCTYPE), AsmHelper.TYPE_OBJECT) + : Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT); MethodNode copyKFMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "CopyKeyFieldsFromObjectId", mDesc, @@ -2773,7 +2772,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ObjectId.class), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); } // <oid type> id = (<oid type>) oid; @@ -2819,7 +2818,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(SMTYPE), "getPCPrimaryKey", - Type.getMethodDescriptor(TYPE_OBJECT, TYPE_OBJECT, Type.INT_TYPE))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, AsmHelper.TYPE_OBJECT, Type.INT_TYPE))); instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(fmds[i].getDeclaredType()))); } else { @@ -2845,7 +2844,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(oidType), "getId", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); if (!fieldManager && type != Object.class) { instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(fmds[i].getDeclaredType()))); } @@ -3061,8 +3060,8 @@ public class PCEnhancer { private void addNewObjectIdInstanceMethod(boolean obj) throws NoSuchMethodException { // public Object pcNewObjectIdInstance () String mDesc = obj - ? Type.getMethodDescriptor(TYPE_OBJECT, TYPE_OBJECT) - : Type.getMethodDescriptor(TYPE_OBJECT); + ? Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, AsmHelper.TYPE_OBJECT) + : Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT); MethodNode newOidMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "NewObjectIdInstance", @@ -3581,7 +3580,7 @@ public class PCEnhancer { // private Object writeReplace() throws ObjectStreamException MethodNode writeReplaceMeth = new MethodNode(Opcodes.ACC_PRIVATE, "writeReplace", - Type.getMethodDescriptor(TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT), null, new String[]{Type.getInternalName(ObjectStreamException.class)}); final ClassNode classNode = pc.getClassNode(); @@ -3696,7 +3695,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "SetDetachedState", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); } if (full) { @@ -3799,7 +3798,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "GetDetachedState", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); lblEndIfNull = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IFNULL, lblEndIfNull)); @@ -3807,11 +3806,11 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "GetDetachedState", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, Type.getInternalName(PersistenceCapable.class), "DESERIALIZED", - TYPE_OBJECT.getDescriptor())); + AsmHelper.TYPE_OBJECT.getDescriptor())); lblNotDeser = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IF_ACMPEQ, lblNotDeser)); @@ -3912,7 +3911,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(String.class), "equals", - Type.getMethodDescriptor(Type.BOOLEAN_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.BOOLEAN_TYPE, AsmHelper.TYPE_OBJECT))); ifIns2 = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IFNE, ifIns2)); } @@ -3967,7 +3966,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "GetDetachedState", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); LabelNode lblIfNn = new LabelNode(); instructions.add(new JumpInsnNode(Opcodes.IFNONNULL, lblIfNn)); instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, Type.getInternalName(Boolean.class), @@ -4085,7 +4084,7 @@ public class PCEnhancer { // protected Object clone () throws CloneNotSupportedException cloneMeth = new MethodNode(0, "clone", - Type.getMethodDescriptor(TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT), null, new String[]{Type.getInternalName(CloneNotSupportedException.class)}); if (!setVisibilityToSuperMethod(cloneMeth)) { @@ -4097,7 +4096,7 @@ public class PCEnhancer { cloneMeth.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, superName, "clone", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); cloneMeth.instructions.add(new InsnNode(Opcodes.ARETURN)); } else { @@ -4458,7 +4457,7 @@ public class PCEnhancer { name = PRE + "DetachedState"; FieldNode field = new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_TRANSIENT, name, - TYPE_OBJECT.getDescriptor(), + AsmHelper.TYPE_OBJECT.getDescriptor(), null, null); classNode.fields.add(field); } @@ -4470,7 +4469,7 @@ public class PCEnhancer { // public Object pcGetDetachedState () MethodNode getDetachedStateMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "GetDetachedState", - Type.getMethodDescriptor(TYPE_OBJECT), + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(getDetachedStateMeth); @@ -4488,7 +4487,7 @@ public class PCEnhancer { // public void pcSetDetachedState (Object state) MethodNode setDetachedStateMeth = new MethodNode(Opcodes.ACC_PUBLIC, PRE + "SetDetachedState", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT), + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT), null, null); classNode.methods.add(setDetachedStateMeth); @@ -4609,10 +4608,10 @@ public class PCEnhancer { Type.getInternalName(Reflection.class), "set", Type.getMethodDescriptor(Type.VOID_TYPE, - TYPE_OBJECT, + AsmHelper.TYPE_OBJECT, fieldType.isPrimitive() ? Type.getType(fieldType) - : TYPE_OBJECT, + : AsmHelper.TYPE_OBJECT, Type.getType(Field.class)))); } @@ -4766,11 +4765,11 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(ObjectInput.class), "readObject", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "SetDetachedState", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); // pcReplaceStateManager ((StateManager) in.readObject ()); instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this @@ -4778,7 +4777,7 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(ObjectInput.class), "readObject", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(StateManager.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, @@ -4890,7 +4889,7 @@ public class PCEnhancer { // <field> = in.read<type> (); instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param - Type retType = isPrimitive ? fieldType : TYPE_OBJECT; + Type retType = isPrimitive ? fieldType : AsmHelper.TYPE_OBJECT; instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(ObjectInput.class), methName, @@ -5001,18 +5000,18 @@ public class PCEnhancer { instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, PRE + "GetDetachedState", - Type.getMethodDescriptor(TYPE_OBJECT))); + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(ObjectOutput.class), "writeObject", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param instructions.add(AsmHelper.getLoadConstantInsn(null)); instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, Type.getInternalName(ObjectOutput.class), "writeObject", - Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT))); + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT))); } if (go2 != null) { instructions.add(go2); @@ -5133,7 +5132,7 @@ public class PCEnhancer { mdesc = Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE); } else if (!isPrimitive) { - mdesc = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_OBJECT); + mdesc = Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT); } else { mdesc = Type.getMethodDescriptor(Type.VOID_TYPE, fieldType); diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/util/asm/AsmHelper.java b/openjpa-kernel/src/main/java/org/apache/openjpa/util/asm/AsmHelper.java index d1ec64140..4e7bc8ef8 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/util/asm/AsmHelper.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/util/asm/AsmHelper.java @@ -51,6 +51,7 @@ import serp.bytecode.BCClass; * @author <a href="mailto:strub...@apache.org">Mark Struberg</a> */ public final class AsmHelper { + public static final Type TYPE_OBJECT = Type.getType(Object.class); private static final char[] PRIMITIVE_DESCRIPTORS = {'V','Z','C','B','S','I','F','J','D'}; public static final Attribute[] ATTRS = new Attribute[] { new RedefinedAttribute()