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()