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
The following commit(s) were added to refs/heads/master by this push: new a8cb9d9d3 OPENJPA-2911 newEmbeddedPCData in ASM a8cb9d9d3 is described below commit a8cb9d9d3d0ff07032a8d68b2712c2b46daa6d4b Author: Mark Struberg <strub...@apache.org> AuthorDate: Mon Jul 24 10:13:45 2023 +0200 OPENJPA-2911 newEmbeddedPCData in ASM --- .../datacache/DataCachePCDataGenerator.java | 48 +++++++++++++--------- 1 file changed, 28 insertions(+), 20 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 6a65c5e59..c9d3cad0f 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 @@ -44,6 +44,7 @@ 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.TypeInsnNode; import org.apache.xbean.asm9.tree.VarInsnNode; import serp.bytecode.BCClass; @@ -94,12 +95,12 @@ public class DataCachePCDataGenerator extends PCDataGenerator { protected void decorate(ClassNodeTracker cnt, ClassMetaData meta) { enhanceToData(cnt); enhanceToNestedData(cnt); + replaceNewEmbeddedPCData(cnt); //X TODO REMOVE BCClass _bc = new Project().loadClass(cnt.getClassNode().name.replace("/", ".")); AsmHelper.readIntoBCClass(cnt, _bc); - replaceNewEmbeddedPCData(_bc); addSynchronization(_bc); addTimeout(_bc); @@ -216,26 +217,33 @@ public class DataCachePCDataGenerator extends PCDataGenerator { instructions.add(new InsnNode(Opcodes.ARETURN)); } - private void replaceNewEmbeddedPCData(BCClass bc) { - BCMethod meth = bc.declareMethod("newEmbeddedPCData", - AbstractPCData.class, new Class[]{ OpenJPAStateManager.class }); - Code code = meth.getCode(true); - - // return new DataCachePCDataImpl(sm.getObjectId(), sm.getMetaData()); - code.anew().setType(DataCachePCDataImpl.class); - code.dup(); - code.aload().setParam(0); - code.invokeinterface().setMethod(OpenJPAStateManager.class, "getId", - Object.class, null); - code.aload().setParam(0); - code.invokeinterface().setMethod(OpenJPAStateManager.class, - "getMetaData", ClassMetaData.class, null); - code.invokespecial().setMethod(DataCachePCDataImpl.class, "<init>", - void.class, new Class[] { Object.class, ClassMetaData.class }); - code.areturn(); + private void replaceNewEmbeddedPCData(ClassNodeTracker cnt) { + ClassNode classNode = cnt.getClassNode(); + MethodNode meth = new MethodNode(Opcodes.ACC_PUBLIC, + "newEmbeddedPCData", + Type.getMethodDescriptor(Type.getType(AbstractPCData.class), + Type.getType(OpenJPAStateManager.class)), + null, null); + classNode.methods.add(meth); + final InsnList instructions = meth.instructions; - code.calculateMaxLocals(); - code.calculateMaxStack(); + instructions.add(new TypeInsnNode(Opcodes.NEW, Type.getInternalName(DataCachePCDataImpl.class))); + instructions.add(new InsnNode(Opcodes.DUP)); + instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param + instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, + Type.getInternalName(OpenJPAStateManager.class), + "getId", + Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT))); + instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st param + instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, + Type.getInternalName(OpenJPAStateManager.class), + "getMetaData", + Type.getMethodDescriptor(Type.getType(ClassMetaData.class)))); + instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, + Type.getInternalName(DataCachePCDataImpl.class), + "<init>", + Type.getMethodDescriptor(Type.VOID_TYPE, AsmHelper.TYPE_OBJECT, Type.getType(ClassMetaData.class)))); + instructions.add(new InsnNode(Opcodes.ARETURN)); } /**