Fix issue Felix-788
Allows passing the bundle context to a super constructor.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@707578 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
index 844ab9a..1b5327f 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
@@ -28,7 +28,10 @@
/**
- * Constructor Adapter : add a component manager argument inside a constructor.
+ * Constructor Adapter.
+ * This class adds an instance manager argument (so switch variable index).
+ * Moreover, it adapts field accesses to delegate accesses to the instance
+ * manager if needed.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ConstructorCodeAdapter extends GeneratorAdapter implements Opcodes {
@@ -53,12 +56,12 @@
/**
* PropertyCodeAdapter constructor.
* A new FiledCodeAdapter should be create for each method visit.
- * @param mv MethodVisitor
- * @param owner Name of the class
- * @param fields List of contained fields
- * @param access Access
- * @param desc : constructor descriptor
- * @param name : name
+ * @param mv the MethodVisitor
+ * @param owner the name of the class
+ * @param fields the list of contained fields
+ * @param access the constructor access
+ * @param desc the constructor descriptor
+ * @param name the name
*/
public ConstructorCodeAdapter(final MethodVisitor mv, final String owner, Set fields, int access, String name, String desc) {
super(mv, access, name, desc);
@@ -89,12 +92,17 @@
/**
- * Visit Method for Field instance (GETFIELD).
+ * Adapts field accesses.
+ * If the field is owned by the visited class:
+ * <ul>
+ * <li><code>GETFIELD</code> are changed to a <code>__getX</code> invocation.</li>
+ * <li><code>SETFIELD</code> are changed to a <code>__setX</code> invocation.</li>
+ * </ul>
* @see org.objectweb.asm.MethodVisitor#visitFieldInsn(int, String, String, String)
- * @param opcode : visited operation code
- * @param owner : owner of the field
- * @param name : name of the field
- * @param desc : descriptor of the field
+ * @param opcode the visited operation code
+ * @param owner the owner of the field
+ * @param name the name of the field
+ * @param desc the descriptor of the field
*/
public void visitFieldInsn(
final int opcode,
@@ -117,12 +125,13 @@
}
/**
- * Visit a method invocation instruction.
+ * Visits a method invocation instruction.
* After the super constructor invocation, insert the _setComponentManager invocation.
- * @param opcode : opcode
- * @param owner : method owning class
- * @param name : method name
- * @param desc : method descriptor
+ * Otherwise, the method invocation doesn't change
+ * @param opcode the opcode
+ * @param owner the class owning the invoked method
+ * @param name the method name
+ * @param desc the method descriptor
* @see org.objectweb.asm.MethodAdapter#visitMethodInsn(int, java.lang.String, java.lang.String, java.lang.String)
*/
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
@@ -134,7 +143,8 @@
// The first invocation is the super call
// 1) Visit the super constructor :
- //mv.visitVarInsn(ALOAD, 0); The ALOAD 0 was already visited. This previous visit allows loading constants
+ //mv.visitVarInsn(ALOAD, 0); The ALOAD 0 was already visited. This previous visit allows
+ // Super constructor parameters.
mv.visitMethodInsn(opcode, owner, name, desc); // Super constructor invocation
// 2) Load the object and the component manager argument
@@ -150,31 +160,33 @@
}
/**
- * Visit an instruction implying a variable.
- * For all non-this variable, increment the variable index.
- * @param opcode : opcode
- * @param var : variable index
+ * Visits a variable instruction.
+ * This method increments the variable index if
+ * it is not <code>this</code> (i.e. 0). This increment
+ * is due to the instance manager parameter added in the method
+ * signature.
+ * @param opcode the opcode
+ * @param var the variable index
* @see org.objectweb.asm.MethodAdapter#visitVarInsn(int, int)
*/
public void visitVarInsn(int opcode, int var) {
- if (!m_superDetected) {
- if (var == 0) {
- mv.visitVarInsn(opcode, var); // ALOAD 0 (THIS)
- }
- } else {
- if (var == 0) {
- mv.visitVarInsn(opcode, var); // ALOAD 0 (THIS)
- } else {
- mv.visitVarInsn(opcode, var + 1); // All other variable count
- }
+ if (var == 0) {
+ mv.visitVarInsn(opcode, var); // ALOAD 0 (THIS)
+ } else {
+ mv.visitVarInsn(opcode, var + 1); // All other variable index must be incremented (due to
+ // the instance manager argument
}
+
}
/**
- * Visit an increment instruction.
- * If incrementing a variable, increment the variable index.
- * @param var : variable index
- * @param increment : increment
+ * Visits an increment instruction.
+ * This method increments the variable index if
+ * it is not <code>this</code> (i.e. 0). This increment
+ * is due to the instance manager parameter added in the method
+ * signature.
+ * @param var the variable index
+ * @param increment the increment
* @see org.objectweb.asm.MethodAdapter#visitIincInsn(int, int)
*/
public void visitIincInsn(int var, int increment) {
@@ -186,14 +198,16 @@
}
/**
- * Visit a local variable.
- * Add _manager and increment variable index.
- * @param name : variable name
- * @param desc : variable descriptor
- * @param signature : variable signature
- * @param start : beginning label
- * @param end : ending label
- * @param index :variable index
+ * Visits a local variable.
+ * Adds _manager and increment others variable indexes.
+ * This variable has the same scope than <code>this</code> and
+ * has the <code>1</code> index.
+ * @param name the variable name
+ * @param desc the variable descriptor
+ * @param signature the variable signature
+ * @param start the beginning label
+ * @param end the ending label
+ * @param index the variable index
* @see org.objectweb.asm.MethodAdapter#visitLocalVariable(java.lang.String, java.lang.String, java.lang.String, org.objectweb.asm.Label, org.objectweb.asm.Label, int)
*/
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
@@ -206,8 +220,10 @@
/**
* Visit max method.
- * @param maxStack : stack size.
- * @param maxLocals : local number.
+ * The stack size is incremented of 1. The
+ * local variable count is incremented of 2.
+ * @param maxStack the stack size.
+ * @param maxLocals the local variable count.
* @see org.objectweb.asm.MethodAdapter#visitMaxs(int, int)
*/
public void visitMaxs(int maxStack, int maxLocals) {
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
index 31d1796..45bdec5 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
@@ -62,7 +62,7 @@
private static final String FIELD_FLAG_PREFIX = "__F";
/**
- * MEthof flag prefix.
+ * Method flag prefix.
*/
private static final String METHOD_FLAG_PREFIX = "__M";