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 71b0f0b2c63d1f84b88c9598f996fd9258eabec1 Author: Mark Struberg <strub...@apache.org> AuthorDate: Mon Jul 24 10:30:17 2023 +0200 OPENJPA-2911 isLoaded via ASM --- .../datacache/DataCachePCDataGenerator.java | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 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 c9d3cad0f..3dd0ae3f2 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 @@ -96,12 +96,12 @@ public class DataCachePCDataGenerator extends PCDataGenerator { enhanceToData(cnt); enhanceToNestedData(cnt); replaceNewEmbeddedPCData(cnt); + addSynchronization(cnt); //X TODO REMOVE BCClass _bc = new Project().loadClass(cnt.getClassNode().name.replace("/", ".")); AsmHelper.readIntoBCClass(cnt, _bc); - addSynchronization(_bc); addTimeout(_bc); cnt.setClassNode(AsmHelper.toClassNode(cnt.getProject(), _bc).getClassNode()); @@ -322,12 +322,12 @@ public class DataCachePCDataGenerator extends PCDataGenerator { code.calculateMaxLocals(); } - private void addSynchronization(BCClass bc) { - BCMethod[] methods = bc.getDeclaredMethods(); - for (BCMethod bcMethod : methods) { - if (bcMethod.isPublic() - && _synchs.contains(bcMethod.getName())) - bcMethod.setSynchronized(true); + private void addSynchronization(ClassNodeTracker cnt) { + final ClassNode classNode = cnt.getClassNode(); + for (MethodNode m : classNode.methods) { + if ((m.access & Opcodes.ACC_PUBLIC) > 0 && _synchs.contains(m.name)) { + m.access |= Opcodes.ACC_SYNCHRONIZED; + } } // add synchronized isLoaded call. @@ -335,17 +335,20 @@ public class DataCachePCDataGenerator extends PCDataGenerator { // { // return super.isLoaded (field); // } - BCMethod method = bc.declareMethod("isLoaded", boolean.class, - new Class[]{ int.class }); - method.setSynchronized(true); - Code code = method.getCode(true); - code.aload().setThis(); - code.iload().setParam(0); - code.invokespecial().setMethod(AbstractPCData.class, "isLoaded", - boolean.class, new Class[]{ int.class }); - code.calculateMaxLocals(); - code.calculateMaxStack(); - code.ireturn(); + MethodNode meth = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNCHRONIZED, + "isLoaded", + Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.INT_TYPE), + null, null); + classNode.methods.add(meth); + InsnList instructions = meth.instructions; + + instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this + instructions.add(new VarInsnNode(Opcodes.ILOAD, 1)); // 1st parameter int + instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, + Type.getInternalName(AbstractPCData.class), + "isLoaded", + Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.INT_TYPE))); + instructions.add(new InsnNode(Opcodes.IRETURN)); } /**