org.apache.felix.ipojo.manipulation

## Class ConstructorCodeAdapter

- java.lang.Object
- - org.objectweb.asm.MethodVisitor
  - - org.objectweb.asm.commons.LocalVariablesSorter
    - - org.objectweb.asm.commons.GeneratorAdapter
      - - org.apache.felix.ipojo.manipulation.ConstructorCodeAdapter

All Implemented Interfaces:
  org.objectweb.asm.Opcodes

    public class ConstructorCodeAdapter
    extends org.objectweb.asm.commons.GeneratorAdapter
    implements org.objectweb.asm.Opcodes

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:
  Felix Project Team

### Field Summary

### Fields inherited from class org.objectweb.asm.commons.GeneratorAdapter

`ADD, AND, DIV, EQ, GE, GT, LE, LT, MUL, NE, NEG, OR, REM, SHL, SHR, SUB, USHR, XOR`

### Fields inherited from class org.objectweb.asm.commons.LocalVariablesSorter

`firstLocal, nextLocal`

### Fields inherited from class org.objectweb.asm.MethodVisitor

`api, mv`

### Fields inherited from interface org.objectweb.asm.Opcodes

`AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V9`

### Constructor Summary

Constructors
Constructor and Description
`ConstructorCodeAdapter(org.objectweb.asm.MethodVisitor mv, String owner, Set<String> fields, Set<String> finalFields, int access, String name, String desc, String superClass)` PropertyCodeAdapter constructor.

### Method Summary

All Methods Instance Methods Concrete Methods
`org.objectweb.asm.AnnotationVisitor` `visitAnnotation(String name, boolean visible)` Visits an annotation.
`void` `visitFieldInsn(int opcode, String owner, String name, String desc)` Adapts field accesses.
`void` `visitIincInsn(int var, int increment)` Visits an increment instruction.
`void` `visitLocalVariable(String name, String desc, String signature, org.objectweb.asm.Label start, org.objectweb.asm.Label end, int index)` Visits a local variable.
`void` `visitMaxs(int maxStack, int maxLocals)` Visit max method.
`void` `visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf)` Visits a method invocation instruction.
`org.objectweb.asm.AnnotationVisitor` `visitParameterAnnotation(int parameter, String desc, boolean visible)` Visits a parameter annotation.
`void` `visitVarInsn(int opcode, int var)` Visits a variable instruction.

### Methods inherited from class org.objectweb.asm.commons.GeneratorAdapter

`arrayLength, arrayLoad, arrayStore, box, cast, catchException, checkCast, dup, dup2, dup2X1, dup2X2, dupX1, dupX2, endMethod, getAccess, getArgumentTypes, getField, getLocalType, getName, getReturnType, getStatic, goTo, ifCmp, ifICmp, ifNonNull, ifNull, ifZCmp, iinc, instanceOf, invokeConstructor, invokeDynamic, invokeInterface, invokeStatic, invokeVirtual, loadArg, loadArgArray, loadArgs, loadArgs, loadLocal, loadLocal, loadThis, mark, mark, math, monitorEnter, monitorExit, newArray, newInstance, newLabel, not, pop, pop2, push, push, push, push, push, push, push, push, push, putField, putStatic, ret, returnValue, setLocalType, storeArg, storeLocal, storeLocal, swap, swap, tableSwitch, tableSwitch, throwException, throwException, unbox, valueOf`

### Methods inherited from class org.objectweb.asm.commons.LocalVariablesSorter

`newLocal, newLocalMapping, updateNewLocals, visitFrame, visitLocalVariableAnnotation`

### Methods inherited from class org.objectweb.asm.MethodVisitor

`getDelegate, visitAnnotableParameterCount, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitInsn, visitInsnAnnotation, visitIntInsn, visitInvokeDynamicInsn, visitJumpInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLookupSwitchInsn, visitMethodInsn, visitMultiANewArrayInsn, visitParameter, visitTableSwitchInsn, visitTryCatchAnnotation, visitTryCatchBlock, visitTypeAnnotation, visitTypeInsn`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### ConstructorCodeAdapter

    public ConstructorCodeAdapter(org.objectweb.asm.MethodVisitor mv,
                                  String owner,
                                  Set<String> fields,
                                  Set<String> finalFields,
                                  int access,
                                  String name,
                                  String desc,
                                  String superClass)

PropertyCodeAdapter constructor. A new FiledCodeAdapter should be create for each method visit.

Parameters:
  `mv` - the MethodVisitor
  `owner` - the name of the class
  `fields` - the list of contained fields
  `finalFields` - the list of contained final fields
  `access` - the constructor access
  `name` - the name
  `desc` - the constructor descriptor

### Method Detail

#### visitAnnotation

    public org.objectweb.asm.AnnotationVisitor visitAnnotation(String name,
                                                               boolean visible)

Visits an annotation. If the annotation is visible, the annotation is removed. In fact the annotation was already moved to the method replacing this one. If the annotation is not visible, this annotation is kept on this method.

Overrides:
  `visitAnnotation` in class `org.objectweb.asm.MethodVisitor`
Parameters:
  `name` - the name of the annotation
  `visible` - the annotation visibility
Returns:
  the `null` if the annotation is visible, otherwise returns `MethodVisitor.visitAnnotation(String, boolean)`
See Also:
  `MethodVisitor.visitAnnotation(java.lang.String, boolean)`

#### visitParameterAnnotation

    public org.objectweb.asm.AnnotationVisitor visitParameterAnnotation(int parameter,
                                                                        String desc,
                                                                        boolean visible)

Visits a parameter annotation. Parameter annotations are moved to replacing constructor except they are injection annotations(-@Property and -@Requires). Because injection annotations shouldn't be copied to generated one in case of re-manipulation, since this is caused to wrong type resolution of injected parameters.

Overrides:
  `visitParameterAnnotation` in class `org.objectweb.asm.MethodVisitor`
Parameters:
  `parameter` - parameter index
  `desc` - annotation description(annotation name)
  `visible` - is parameter annotation visible
Returns:
  @AnnotationVisitor

#### visitFieldInsn

    public void visitFieldInsn(int opcode,
                               String owner,
                               String name,
                               String desc)

Adapts field accesses. If the field is owned by the visited class:

- `GETFIELD` are changed to a `__getX` invocation.
- `SETFIELD` are changed to a `__setX` invocation.

Overrides:
  `visitFieldInsn` in class `org.objectweb.asm.MethodVisitor`
Parameters:
  `opcode` - the visited operation code
  `owner` - the owner of the field
  `name` - the name of the field
  `desc` - the descriptor of the field
See Also:
  `MethodVisitor.visitFieldInsn(int, String, String, String)`

#### visitMethodInsn

    public void visitMethodInsn(int opcode,
                                String owner,
                                String name,
                                String desc,
                                boolean itf)

Visits a method invocation instruction. After the super constructor invocation, insert the _setComponentManager invocation. Otherwise, the method invocation doesn't change

Overrides:
  `visitMethodInsn` in class `org.objectweb.asm.MethodVisitor`
Parameters:
  `opcode` - the opcode
  `owner` - the class owning the invoked method
  `name` - the method name
  `desc` - the method descriptor
  `itf` - if the method's owner class is an interface
See Also:
  `MethodVisitor.visitMethodInsn(int, java.lang.String, java.lang.String, java.lang.String)`

#### visitVarInsn

    public void visitVarInsn(int opcode,
                             int var)

Visits a variable instruction. This method increments the variable index if it is not `this` (i.e. 0). This increment is due to the instance manager parameter added in the method signature.

Overrides:
  `visitVarInsn` in class `org.objectweb.asm.commons.LocalVariablesSorter`
Parameters:
  `opcode` - the opcode
  `var` - the variable index
See Also:
  `LocalVariablesSorter.visitVarInsn(int, int)`

#### visitIincInsn

    public void visitIincInsn(int var,
                              int increment)

Visits an increment instruction. This method increments the variable index if it is not `this` (i.e. 0). This increment is due to the instance manager parameter added in the method signature.

Overrides:
  `visitIincInsn` in class `org.objectweb.asm.commons.LocalVariablesSorter`
Parameters:
  `var` - the variable index
  `increment` - the increment
See Also:
  `LocalVariablesSorter.visitIincInsn(int, int)`

#### visitLocalVariable

    public void visitLocalVariable(String name,
                                   String desc,
                                   String signature,
                                   org.objectweb.asm.Label start,
                                   org.objectweb.asm.Label end,
                                   int index)

Visits a local variable. Adds _manager and increment others variable indexes. This variable has the same scope than `this` and has the `1` index.

Overrides:
  `visitLocalVariable` in class `org.objectweb.asm.commons.LocalVariablesSorter`
Parameters:
  `name` - the variable name
  `desc` - the variable descriptor
  `signature` - the variable signature
  `start` - the beginning label
  `end` - the ending label
  `index` - the variable index
See Also:
  `LocalVariablesSorter.visitLocalVariable(java.lang.String, java.lang.String, java.lang.String, org.objectweb.asm.Label, org.objectweb.asm.Label, int)`

#### visitMaxs

    public void visitMaxs(int maxStack,
                          int maxLocals)

Visit max method. The stack size is incremented of 1. The local variable count is incremented of 2.

Overrides:
  `visitMaxs` in class `org.objectweb.asm.commons.LocalVariablesSorter`
Parameters:
  `maxStack` - the stack size.
  `maxLocals` - the local variable count.
See Also:
  `LocalVariablesSorter.visitMaxs(int, int)`