You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by st...@apache.org on 2023/07/25 09:31:39 UTC
[openjpa] branch master updated (1f8db2ade -> bb11f022d)
This is an automated email from the ASF dual-hosted git repository.
struberg pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git
from 1f8db2ade OPENJPA-2911 remove unused methods
new 0ea92f44a OPENJPA-2911 newEmbeddedPCData via ASM
new bb11f022d OPENJPA-2911 addGetData via ASM
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../apache/openjpa/enhance/PCDataGenerator.java | 91 +++++++++++-----------
.../org/apache/openjpa/util/asm/AsmHelper.java | 45 -----------
2 files changed, 47 insertions(+), 89 deletions(-)
[openjpa] 02/02: OPENJPA-2911 addGetData via ASM
Posted by st...@apache.org.
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 bb11f022d8ad03c1289d0d65d08201969132ca46
Author: Mark Struberg <st...@apache.org>
AuthorDate: Tue Jul 25 11:09:50 2023 +0200
OPENJPA-2911 addGetData via ASM
---
.../apache/openjpa/enhance/PCDataGenerator.java | 43 +++++++++------------
.../org/apache/openjpa/util/asm/AsmHelper.java | 45 ----------------------
2 files changed, 19 insertions(+), 69 deletions(-)
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 c704dd6d6..5a0fbb1ff 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
@@ -52,11 +52,6 @@ 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;
-import serp.bytecode.BCMethod;
-import serp.bytecode.Code;
-import serp.bytecode.Constants;
-import serp.bytecode.Project;
/**
* Generates {@link PCData} instances which avoid primitive wrappers
@@ -173,13 +168,7 @@ public class PCDataGenerator extends DynamicStorageGenerator {
addLoadWithFieldsMethod(bc, meta);
addStoreMethods(bc, meta);
addNewEmbedded(bc);
-
- BCClass _bc = new Project().loadClass(bc.getClassNode().name.replace("/", "."));
- AsmHelper.readIntoBCClass(bc, _bc);
-
- addGetData(_bc);
-
- bc = AsmHelper.toClassNode(bc.getProject(), _bc);
+ addGetData(bc);
decorate(bc, meta);
}
@@ -277,7 +266,7 @@ public class PCDataGenerator extends DynamicStorageGenerator {
private void addBaseFields(ClassNodeTracker bc) {
addBeanField(bc, "id", Object.class);
FieldNode field = addBeanField(bc, "storageGenerator", PCDataGenerator.class);
- field.access |= Constants.ACCESS_TRANSIENT;
+ field.access |= Opcodes.ACC_TRANSIENT;
}
/**
@@ -1236,18 +1225,24 @@ public class PCDataGenerator extends DynamicStorageGenerator {
instructions.add(new InsnNode(Opcodes.ARETURN));
}
- private void addGetData(BCClass bc) {
+ private void addGetData(ClassNodeTracker cnt) {
+ ClassNode classNode = cnt.getClassNode();
+
+ MethodNode meth = new MethodNode(Opcodes.ACC_PUBLIC,
+ "getData",
+ Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, Type.INT_TYPE),
+ null, null);
+ classNode.methods.add(meth);
+ InsnList instructions = meth.instructions;
+
// return getObjectField(i);
- BCMethod method = bc.declareMethod("getData", Object.class,
- new Class[]{ int.class });
- Code code = method.getCode(true);
- code.aload().setThis();
- code.iload().setParam(0);
- code.invokevirtual().setMethod("getObject", Object.class,
- new Class[]{ int.class });
- code.areturn();
- code.calculateMaxLocals();
- code.calculateMaxStack();
+ instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this
+ instructions.add(new VarInsnNode(Opcodes.ILOAD, 1)); // 1st parameter int
+ instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
+ classNode.name,
+ "getObject",
+ Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT, Type.INT_TYPE)));
+ instructions.add(new InsnNode(Opcodes.ARETURN));
}
/////////////
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 532fa09d6..4627924a5 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
@@ -43,8 +43,6 @@ 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;
-
/**
* Utility methods to deal with ASM bytecode
*
@@ -137,49 +135,6 @@ public final class AsmHelper {
return cw.toByteArray();
}
- /**
- * temporary helper class to convert BCClass to ASM ClassNode
- * @deprecated must get removed when done with migrating from Serp to ASM
- */
- public static ClassNodeTracker toClassNode(EnhancementProject project, BCClass bcClass) {
- ClassReader cr = new ClassReader(bcClass.toByteArray());
- ClassNode classNode = new ClassNode(Opcodes.ASM9);
- cr.accept(classNode, ATTRS, 0);
-
- if ((classNode.version & 0xffff) < 49) {
- classNode.version = 49;
- }
-
- final ClassNodeTracker cnt = new ClassNodeTracker(project, classNode, bcClass.getClassLoader());
- return cnt;
- }
-
- /**
- * Take the changes from ClassNodeTracker and read it into the given BCClass instance.
- * Effectively replace all the content of BCClass with the content from our ClassNode
- */
- public static void readIntoBCClass(ClassNodeTracker cnt, BCClass bcClass) {
- // sadly package scoped
- try {
- if (bcClass.getMajorVersion() < 49) {
- bcClass.setMajorVersion(49);
- }
-
- Method readMethod = BCClass.class.getDeclaredMethod("read", InputStream.class, ClassLoader.class);
-
- ClassWriter cw = new BCClassWriter(ClassWriter.COMPUTE_FRAMES, bcClass.getClassLoader());
- cnt.getClassNode().accept(cw);
- final byte[] classBytes = cw.toByteArray();
- ByteArrayInputStream bais = new ByteArrayInputStream(classBytes);
-
- readMethod.setAccessible(true);
- readMethod.invoke(bcClass, bais, bcClass.getClassLoader());
- }
- catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }
-
public static Optional<MethodNode> getMethodNode(ClassNode classNode, Method meth) {
final String mDesc = Type.getMethodDescriptor(meth);
return classNode.methods.stream()
[openjpa] 01/02: OPENJPA-2911 newEmbeddedPCData via ASM
Posted by st...@apache.org.
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 0ea92f44a4e2044d6c76461a3396f66f741ffc6e
Author: Mark Struberg <st...@apache.org>
AuthorDate: Tue Jul 25 11:04:47 2023 +0200
OPENJPA-2911 newEmbeddedPCData via ASM
---
.../apache/openjpa/enhance/PCDataGenerator.java | 48 +++++++++++++---------
1 file changed, 28 insertions(+), 20 deletions(-)
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 60405ea15..c704dd6d6 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
@@ -172,11 +172,11 @@ public class PCDataGenerator extends DynamicStorageGenerator {
addLoadMethod(bc, meta);
addLoadWithFieldsMethod(bc, meta);
addStoreMethods(bc, meta);
+ addNewEmbedded(bc);
BCClass _bc = new Project().loadClass(bc.getClassNode().name.replace("/", "."));
AsmHelper.readIntoBCClass(bc, _bc);
- addNewEmbedded(_bc);
addGetData(_bc);
bc = AsmHelper.toClassNode(bc.getProject(), _bc);
@@ -1205,27 +1205,35 @@ public class PCDataGenerator extends DynamicStorageGenerator {
Type.getType(OpenJPAStateManager.class), Type.INT_TYPE, Type.BOOLEAN_TYPE)));
}
- private void addNewEmbedded(BCClass bc) {
- // void newEmbeddedPCData(OpenJPAStateManager embedded)
- BCMethod meth = bc.declareMethod("newEmbeddedPCData", PCData.class,
- new Class[]{ OpenJPAStateManager.class });
- Code code = meth.getCode(true);
+ private void addNewEmbedded(ClassNodeTracker cnt) {
+ ClassNode classNode = cnt.getClassNode();
+ MethodNode meth = new MethodNode(Opcodes.ACC_PUBLIC,
+ "newEmbeddedPCData",
+ Type.getMethodDescriptor(Type.getType(PCData.class), Type.getType(OpenJPAStateManager.class)),
+ null, null);
+ classNode.methods.add(meth);
+ InsnList instructions = meth.instructions;
+
// return getStorageGenerator().generatePCData
// (sm.getId(), sm.getMetaData());
- code.aload().setThis();
- code.getfield().setField("storageGenerator", PCDataGenerator.class);
- 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.invokevirtual().setMethod(PCDataGenerator.class,
- "generatePCData", PCData.class, new Class[]
- { Object.class, ClassMetaData.class });
- code.areturn();
- code.calculateMaxLocals();
- code.calculateMaxStack();
+ instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this
+ instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, "storageGenerator", Type.getDescriptor(PCDataGenerator.class)));
+ instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st parameter OpenJPAStateManager
+ instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE,
+ Type.getInternalName(OpenJPAStateManager.class),
+ "getId",
+ Type.getMethodDescriptor(AsmHelper.TYPE_OBJECT)));
+ instructions.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 1st parameter OpenJPAStateManager
+ instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE,
+ Type.getInternalName(OpenJPAStateManager.class),
+ "getMetaData",
+ Type.getMethodDescriptor(Type.getType(ClassMetaData.class))));
+ instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
+ Type.getInternalName(PCDataGenerator.class),
+ "generatePCData",
+ Type.getMethodDescriptor(Type.getType(PCData.class),
+ AsmHelper.TYPE_OBJECT, Type.getType(ClassMetaData.class))));
+ instructions.add(new InsnNode(Opcodes.ARETURN));
}
private void addGetData(BCClass bc) {