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 <strub...@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()

Reply via email to