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 <[email protected]>
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));
}
/**