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 f2d27aa15fca7c04f47dfca3770948f3015e17ad Author: Mark Struberg <strub...@apache.org> AuthorDate: Thu Jun 1 17:12:16 2023 +0200 OPENJPA-2911 move from Serp to ASM --- .../org/apache/openjpa/enhance/PCEnhancer.java | 107 ++++++++++----------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java index aef244847..927a7a11b 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java @@ -105,6 +105,7 @@ import org.apache.xbean.asm9.tree.ClassNode; import org.apache.xbean.asm9.tree.FieldInsnNode; import org.apache.xbean.asm9.tree.InsnNode; import org.apache.xbean.asm9.tree.LdcInsnNode; +import org.apache.xbean.asm9.tree.MethodInsnNode; import org.apache.xbean.asm9.tree.MethodNode; import org.apache.xbean.asm9.tree.VarInsnNode; @@ -1795,7 +1796,7 @@ public class PCEnhancer { } // if (other.pcStateManager != pcStateManager) - // throw new IllegalArgumentException + // throw new IllegalArgumentException loadManagedInstance(code, false); code.getfield().setField(SM, SMTYPE); @@ -2050,7 +2051,7 @@ public class PCEnhancer { Code code = method.getCode(true); // if (pcStateManager != null) - // pcStateManager = pcStateManager.replaceStateManager(sm); + // pcStateManager = pcStateManager.replaceStateManager(sm); loadManagedInstance(code, false); code.getfield().setField(SM, SMTYPE); JumpInstruction ifins = code.ifnull(); @@ -2065,7 +2066,7 @@ public class PCEnhancer { // SecurityManager sec = System.getSecurityManager (); // if (sec != null) - // sec.checkPermission (Permission.SET_STATE_MANAGER); + // sec.checkPermission (Permission.SET_STATE_MANAGER); ifins.setTarget(code.invokestatic().setMethod(System.class, "getSecurityManager", SecurityManager.class, null)); @@ -2085,7 +2086,7 @@ public class PCEnhancer { */ private void addNoOpApplicationIdentityMethods() { // public void pcCopyKeyFieldsToObjectId (ObjectIdFieldSupplier fs, - // Object oid) + // Object oid) BCMethod method = _pc.declareMethod(PRE + "CopyKeyFieldsToObjectId", void.class, new Class[]{ OIDFSTYPE, Object.class }); Code code = method.getCode(true); @@ -2100,7 +2101,7 @@ public class PCEnhancer { code.calculateMaxLocals(); // public void pcCopyKeyFieldsFromObjectId (ObjectIdFieldConsumer fc, - // Object oid) + // Object oid) method = _pc.declareMethod(PRE + "CopyKeyFieldsFromObjectId", void.class, new Class[]{ OIDFCTYPE, Object.class }); code = method.getCode(true); @@ -2140,7 +2141,7 @@ public class PCEnhancer { private void addCopyKeyFieldsToObjectIdMethod(boolean fieldManager) throws NoSuchMethodException { // public void pcCopyKeyFieldsToObjectId (ObjectIdFieldSupplier fs, - // Object oid) + // Object oid) String[] args = (fieldManager) ? new String[]{ OIDFSTYPE.getName(), Object.class.getName() } : new String[]{ Object.class.getName() }; @@ -2321,9 +2322,9 @@ public class PCEnhancer { (getFieldSupplierMethod(type)); if (fmds[i].getObjectIdFieldTypeCode() == JavaTypes.OBJECT && !fmds[i].getDeclaredType().isEnum()) { - code.checkcast().setType(ObjectId.class); - code.invokevirtual().setMethod(ObjectId.class, "getId", - Object.class, null); + code.checkcast().setType(ObjectId.class); + code.invokevirtual().setMethod(ObjectId.class, "getId", + Object.class, null); } // if the type of this field meta data is @@ -2585,7 +2586,7 @@ public class PCEnhancer { if (pkcode == JavaTypes.OBJECT) { code.checkcast().setType(ObjectId.class); code.invokevirtual().setMethod(ObjectId.class, "getId", - Object.class, null); + Object.class, null); } code.checkcast().setType(pktype); } else @@ -2635,7 +2636,7 @@ public class PCEnhancer { private void addCopyKeyFieldsFromObjectIdMethod(boolean fieldManager) throws NoSuchMethodException { // public void pcCopyKeyFieldsFromObjectId (ObjectIdFieldConsumer fc, - // Object oid) + // Object oid) String[] args = (fieldManager) ? new String[]{ OIDFCTYPE.getName(), Object.class.getName() } : new String[]{ Object.class.getName() }; @@ -3068,46 +3069,55 @@ public class PCEnhancer { * if it is not already present. */ private void enhanceClass() { - // make the class implement PersistenceCapable - //_pc.declareInterface(PCTYPE); - final ClassNodeTracker classNodeTracker = AsmHelper.toClassNode(_pc); // make the class implement PersistenceCapable - classNodeTracker.getClassNode().interfaces.add(Type.getInternalName(PCTYPE)); + final ClassNode classNode = classNodeTracker.getClassNode(); + classNode.interfaces.add(Type.getInternalName(PCTYPE)); // add a version stamp addGetEnhancementContractVersionMethod(classNodeTracker); - AsmHelper.readIntoBCClass(classNodeTracker, _pc); - // find the default constructor - BCMethod method = _pc.getDeclaredMethod("<init>", (String[]) null); - - // a default constructor is required - if (method == null) { - String name = _pc.getName(); - if (!_defCons) - throw new UserException(_loc.get("enhance-defaultconst", name)); + final boolean hasDefaultCt = classNode.methods.stream() + .anyMatch(m -> m.name.equals("<init>") && m.desc.equals("()V")); + if (!hasDefaultCt) { + if (!_defCons) { + throw new UserException(_loc.get("enhance-defaultconst", classNode.name)); + } - method = _pc.addDefaultConstructor(); + int accessMode; String access; if (_meta.isDetachable()) { // externalizable requires that the constructor // be public, so make the added constructor public - method.makePublic(); + accessMode = Opcodes.ACC_PUBLIC; access = "public"; } else if (_pc.isFinal()) { - method.makePrivate(); + accessMode = Opcodes.ACC_PRIVATE; access = "private"; } else { - method.makeProtected(); + accessMode = Opcodes.ACC_PROTECTED; access = "protected"; } + + MethodNode ctNode = new MethodNode(accessMode, + "<init>", + Type.getMethodDescriptor(Type.VOID_TYPE), + null, null); + ctNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); + ctNode.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, classNode.superName, + "<init>", "()V")); + ctNode.instructions.add(new InsnNode(Opcodes.RETURN)); + classNode.methods.add(ctNode); + if (!(_meta.getDescribedType().isInterface() || getCreateSubclass()) - && _log.isWarnEnabled()) - _log.warn(_loc.get("enhance-adddefaultconst", name, access)); + && _log.isWarnEnabled()) { + _log.warn(_loc.get("enhance-adddefaultconst", classNode.name, access)); + } + } + AsmHelper.readIntoBCClass(classNodeTracker, _pc); } /** @@ -3204,7 +3214,7 @@ public class PCEnhancer { code.putstatic().setField(PRE + "FieldFlags", byte[].class); // PCRegistry.register (cls, - // pcFieldNames, pcFieldTypes, pcFieldFlags, + // pcFieldNames, pcFieldTypes, pcFieldFlags, // pcPCSuperclass, alias, new XXX ()); code.classconstant().setClass(_meta.getDescribedType()); code.getstatic().setField(PRE + "FieldNames", String[].class); @@ -3577,7 +3587,7 @@ public class PCEnhancer { FieldMetaData version = _meta.getVersionField(); if (state != Boolean.TRUE && version != null) { // if (<version> != <default>) - // return true; + // return true; loadManagedInstance(code, false); addGetManagedValueCode(code, version); ifins = ifDefaultValue(code, version); @@ -3612,7 +3622,7 @@ public class PCEnhancer { && _meta.getIdentityType() == ClassMetaData.ID_APPLICATION) { // for each pk field: // if (<pk> != <default> [&& !"".equals (<pk>)]) - // return Boolean.TRUE; + // return Boolean.TRUE; FieldMetaData[] pks = _meta.getPrimaryKeyFields(); for (FieldMetaData pk : pks) { if (pk.getValueStrategy() == ValueStrategies.NONE) @@ -3845,7 +3855,7 @@ public class PCEnhancer { * Gets the auxiliary enhancers registered as {@link Services services}. */ public AuxiliaryEnhancer[] getAuxiliaryEnhancers() { - return _auxEnhancers; + return _auxEnhancers; } /** @@ -4284,7 +4294,7 @@ public class PCEnhancer { */ private String toBackingFieldName(String name) { // meta is null when enhancing persistence-aware - FieldMetaData fmd = _meta == null ? null : _meta.getField(name); + FieldMetaData fmd = _meta == null ? null : _meta.getField(name); if (_meta != null && isPropertyAccess(fmd) && _attrsToFields != null && _attrsToFields.containsKey(name)) name = (String)_attrsToFields.get(name); @@ -4297,7 +4307,7 @@ public class PCEnhancer { */ private String fromBackingFieldName(String name) { // meta is null when enhancing persistence-aware - FieldMetaData fmd = _meta == null ? null : _meta.getField(name); + FieldMetaData fmd = _meta == null ? null : _meta.getField(name); if (_meta != null && isPropertyAccess(fmd) && _fieldsToAttrs != null && _fieldsToAttrs.containsKey(name)) return (String)_fieldsToAttrs.get(name); @@ -4801,7 +4811,7 @@ public class PCEnhancer { * @return the first instruction added to <code>code</code>. */ private Instruction loadManagedInstance(Code code, boolean forStatic) { - return loadManagedInstance(code, forStatic, null); + return loadManagedInstance(code, forStatic, null); } private int getAccessorParameterOffset(FieldMetaData fmd) { @@ -4812,22 +4822,22 @@ public class PCEnhancer { * Affirms if the given class is using field-based access. */ boolean isPropertyAccess(ClassMetaData meta) { - return meta != null && (meta.isMixedAccess() || - AccessCode.isProperty(meta.getAccessType())); + return meta != null && (meta.isMixedAccess() || + AccessCode.isProperty(meta.getAccessType())); } /** * Affirms if the given field is using field-based access. */ boolean isPropertyAccess(FieldMetaData fmd) { - return fmd != null && AccessCode.isProperty(fmd.getAccessType()); + return fmd != null && AccessCode.isProperty(fmd.getAccessType()); } /** * Affirms if the given field is using method-based access. */ boolean isFieldAccess(FieldMetaData fmd) { - return fmd != null && AccessCode.isField(fmd.getAccessType()); + return fmd != null && AccessCode.isField(fmd.getAccessType()); } /** @@ -4903,19 +4913,6 @@ public class PCEnhancer { cnt.getClassNode().methods.add(methodNode); } - @Deprecated //X TODO REMOVE - private void addGetEnhancementContractVersionMethod() { - // public int getEnhancementContractVersion() - BCMethod method = _pc.declareMethod(PRE + - "GetEnhancementContractVersion", int.class, null); - method.makePublic(); - Code code = method.getCode(true); - code.constant().setValue(ENHANCER_VERSION); - code.ireturn(); - code.calculateMaxStack(); - code.calculateMaxLocals(); - } - /** * Return the concrete type for the given class, i.e. impl for managed * interfaces @@ -4976,7 +4973,7 @@ public class PCEnhancer { * If the type being enhanced has metadata, it will be enhanced as a * persistence capable class. If not, it will be considered a persistence * aware class, and all access to fields of persistence capable classes - * will be replaced by the appropriate get/set method. If the type + * will be replaced by the appropriate get/set method. If the type * explicitly declares the persistence-capable interface, it will * not be enhanced. Thus, it is safe to invoke the enhancer on classes * that are already enhanced.