mirror of
https://github.com/apache/openjpa.git
synced 2025-02-06 10:09:30 +00:00
OPENJPA-2911 add pcFields via ASM
This commit is contained in:
parent
f2d27aa15f
commit
80272a3bf7
@ -103,6 +103,7 @@ import org.apache.xbean.asm9.Type;
|
|||||||
import org.apache.xbean.asm9.tree.AbstractInsnNode;
|
import org.apache.xbean.asm9.tree.AbstractInsnNode;
|
||||||
import org.apache.xbean.asm9.tree.ClassNode;
|
import org.apache.xbean.asm9.tree.ClassNode;
|
||||||
import org.apache.xbean.asm9.tree.FieldInsnNode;
|
import org.apache.xbean.asm9.tree.FieldInsnNode;
|
||||||
|
import org.apache.xbean.asm9.tree.FieldNode;
|
||||||
import org.apache.xbean.asm9.tree.InsnNode;
|
import org.apache.xbean.asm9.tree.InsnNode;
|
||||||
import org.apache.xbean.asm9.tree.LdcInsnNode;
|
import org.apache.xbean.asm9.tree.LdcInsnNode;
|
||||||
import org.apache.xbean.asm9.tree.MethodInsnNode;
|
import org.apache.xbean.asm9.tree.MethodInsnNode;
|
||||||
@ -582,8 +583,13 @@ public class PCEnhancer {
|
|||||||
processViolations();
|
processViolations();
|
||||||
|
|
||||||
if (_meta != null) {
|
if (_meta != null) {
|
||||||
enhanceClass();
|
final ClassNodeTracker classNodeTracker = AsmHelper.toClassNode(_pc);
|
||||||
addFields();
|
|
||||||
|
enhanceClass(classNodeTracker);
|
||||||
|
addFields(classNodeTracker);
|
||||||
|
|
||||||
|
AsmHelper.readIntoBCClass(classNodeTracker, _pc);
|
||||||
|
|
||||||
addStaticInitializer();
|
addStaticInitializer();
|
||||||
addPCMethods();
|
addPCMethods();
|
||||||
addAccessors();
|
addAccessors();
|
||||||
@ -3068,8 +3074,7 @@ public class PCEnhancer {
|
|||||||
* enhanced, and adds a default constructor for use by OpenJPA
|
* enhanced, and adds a default constructor for use by OpenJPA
|
||||||
* if it is not already present.
|
* if it is not already present.
|
||||||
*/
|
*/
|
||||||
private void enhanceClass() {
|
private void enhanceClass(final ClassNodeTracker classNodeTracker) {
|
||||||
final ClassNodeTracker classNodeTracker = AsmHelper.toClassNode(_pc);
|
|
||||||
|
|
||||||
// make the class implement PersistenceCapable
|
// make the class implement PersistenceCapable
|
||||||
final ClassNode classNode = classNodeTracker.getClassNode();
|
final ClassNode classNode = classNodeTracker.getClassNode();
|
||||||
@ -3117,7 +3122,6 @@ public class PCEnhancer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
AsmHelper.readIntoBCClass(classNodeTracker, _pc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3133,22 +3137,27 @@ public class PCEnhancer {
|
|||||||
* if no PersistenceCapable superclass present)</li>
|
* if no PersistenceCapable superclass present)</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
private void addFields() {
|
private void addFields(ClassNodeTracker classNodeTracker) {
|
||||||
_pc.declareField(INHERIT, int.class).setStatic(true);
|
final ClassNode classNode = classNodeTracker.getClassNode();
|
||||||
_pc.declareField(PRE + "FieldNames", String[].class).setStatic(true);
|
|
||||||
_pc.declareField(PRE + "FieldTypes", Class[].class).setStatic(true);
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
|
||||||
_pc.declareField(PRE + "FieldFlags", byte[].class).setStatic(true);
|
INHERIT, Type.getDescriptor(int.class), null, null));
|
||||||
_pc.declareField(SUPER, Class.class).setStatic(true);
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
|
||||||
|
PRE + "FieldNames", Type.getDescriptor(String[].class), null, null));
|
||||||
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
|
||||||
|
PRE + "FieldTypes", Type.getDescriptor(Class[].class), null, null));
|
||||||
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
|
||||||
|
PRE + "FieldFlags", Type.getDescriptor(byte[].class), null, null));
|
||||||
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
|
||||||
|
SUPER, Type.getDescriptor(Class.class), null, null));
|
||||||
|
|
||||||
if (_addVersionInitFlag && _meta.getVersionField() != null) {
|
if (_addVersionInitFlag && _meta.getVersionField() != null) {
|
||||||
// protected transient boolean pcVersionInit;
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PROTECTED | Opcodes.ACC_TRANSIENT,
|
||||||
BCField field = _pc.declareField(VERSION_INIT_STR, boolean.class);
|
VERSION_INIT_STR, Type.getDescriptor(boolean.class), null, null));
|
||||||
field.makeProtected();
|
|
||||||
field.setTransient(true);
|
|
||||||
}
|
}
|
||||||
if (_meta.getPCSuperclass() == null || getCreateSubclass()) {
|
if (_meta.getPCSuperclass() == null || getCreateSubclass()) {
|
||||||
BCField field = _pc.declareField(SM, SMTYPE);
|
classNode.fields.add(new FieldNode(Opcodes.ACC_PROTECTED | Opcodes.ACC_TRANSIENT,
|
||||||
field.makeProtected();
|
SM, Type.getDescriptor(SMTYPE), null, null));
|
||||||
field.setTransient(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user