Config editor through XML file
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / codegen / CodeStream.java
index 52d6b86..0519450 100644 (file)
@@ -19,5672 +19,5698 @@ import net.sourceforge.phpdt.internal.compiler.flow.*;
 import net.sourceforge.phpdt.internal.compiler.lookup.*;
 
 public class CodeStream implements OperatorIds, ClassFileConstants, Opcodes, BaseTypes, TypeConstants, TypeIds {
-       // It will be responsible for the following items.
+  // It will be responsible for the following items.
 
-       // -> Tracking Max Stack.
+  // -> Tracking Max Stack.
 
-       public int stackMax; // Use Ints to keep from using extra bc when adding
-       public int stackDepth; // Use Ints to keep from using extra bc when adding
-       public int maxLocals;
-       public static final int max = 100; // Maximum size of the code array
-       public static final int growFactor = 400;
-       public static final int LABELS_INCREMENT = 5;
-       public byte[] bCodeStream;
-       public int pcToSourceMapSize;
-       public int[] pcToSourceMap = new int[24];
-       public int lastEntryPC; // last entry recorded
-       public int[] lineSeparatorPositions;
-       public int position; // So when first set can be incremented
-       public int classFileOffset;
-       public int startingClassFileOffset; // I need to keep the starting point inside the byte array
-       public ConstantPool constantPool; // The constant pool used to generate bytecodes that need to store information into the constant pool
-       public ClassFile classFile; // The current classfile it is associated to.
-       // local variable attributes output
-       public static final int LOCALS_INCREMENT = 10;
-       public LocalVariableBinding[] locals = new LocalVariableBinding[LOCALS_INCREMENT];
-       static LocalVariableBinding[] noLocals = new LocalVariableBinding[LOCALS_INCREMENT];
-       public LocalVariableBinding[] visibleLocals = new LocalVariableBinding[LOCALS_INCREMENT];
-       static LocalVariableBinding[] noVisibleLocals = new LocalVariableBinding[LOCALS_INCREMENT];
-       int visibleLocalsCount;
-       public AbstractMethodDeclaration methodDeclaration;
-       public ExceptionLabel[] exceptionHandlers = new ExceptionLabel[LABELS_INCREMENT];
-       static ExceptionLabel[] noExceptionHandlers = new ExceptionLabel[LABELS_INCREMENT];
-       public int exceptionHandlersNumber;
-       public static FieldBinding[] ImplicitThis = new FieldBinding[] {};
-       public boolean generateLineNumberAttributes;
-       public boolean generateLocalVariableTableAttributes;
-       public boolean preserveUnusedLocals;
-       // store all the labels placed at the current position to be able to optimize
-       // a jump to the next bytecode.
-       public Label[] labels = new Label[LABELS_INCREMENT];
-       static Label[] noLabels = new Label[LABELS_INCREMENT];
-       public int countLabels;
-       public int allLocalsCounter;
-       public int maxFieldCount;
-       // to handle goto_w
-       public boolean wideMode = false;
-       public static final CompilationResult RESTART_IN_WIDE_MODE = new CompilationResult((char[])null, 0, 0, 0);
-       
-public CodeStream(ClassFile classFile) {
-       generateLineNumberAttributes = (classFile.produceDebugAttributes & CompilerOptions.Lines) != 0;
-       generateLocalVariableTableAttributes = (classFile.produceDebugAttributes & CompilerOptions.Vars) != 0;
-       if (generateLineNumberAttributes) {
-               lineSeparatorPositions = classFile.referenceBinding.scope.referenceCompilationUnit().compilationResult.lineSeparatorPositions;
-       }
-}
-final public void aaload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aaload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aaload);
-       }
-}
-final public void aastore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aastore);
-       }
-}
-final public void aconst_null() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aconst_null;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aconst_null);
-       }
-}
-public final void addDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
-       // Required to fix 1PR0XVS: LFRE:WINNT - Compiler: variable table for method appears incorrect
-       if (!generateLocalVariableTableAttributes)
-               return;
-/*     if (initStateIndex == lastInitStateIndexWhenAddingInits)
-               return;
-       lastInitStateIndexWhenAddingInits = initStateIndex;
-       if (lastInitStateIndexWhenRemovingInits != initStateIndex){
-               lastInitStateIndexWhenRemovingInits = -2; // reinitialize remove index 
-               // remove(1)-add(1)-remove(1) -> ignore second remove
-               // remove(1)-add(2)-remove(1) -> perform second remove
-       }
-       
-*/     for (int i = 0; i < visibleLocalsCount; i++) {
-               LocalVariableBinding localBinding = visibleLocals[i];
-               if (localBinding != null) {
-                       // Check if the local is definitely assigned
-                       if ((initStateIndex != -1) && isDefinitelyAssigned(scope, initStateIndex, localBinding)) {
-                               if ((localBinding.initializationCount == 0) || (localBinding.initializationPCs[((localBinding.initializationCount - 1) << 1) + 1] != -1)) {
-                                       /* There are two cases:
-                                        * 1) there is no initialization interval opened ==> add an opened interval
-                                        * 2) there is already some initialization intervals but the last one is closed ==> add an opened interval
-                                        * An opened interval means that the value at localBinding.initializationPCs[localBinding.initializationCount - 1][1]
-                                        * is equals to -1.
-                                        * initializationPCs is a collection of pairs of int:
-                                        *      first value is the startPC and second value is the endPC. -1 one for the last value means that the interval
-                                        *      is not closed yet.
-                                        */
-                                       localBinding.recordInitializationStartPC(position);
-                               }
-                       }
-               }
-       }
-}
-public void addLabel(Label aLabel) {
-       if (countLabels == labels.length)
-               System.arraycopy(labels, 0, (labels = new Label[countLabels + LABELS_INCREMENT]), 0, countLabels);
-       labels[countLabels++] = aLabel;
-}
-public void addVisibleLocalVariable(LocalVariableBinding localBinding) {
-       if (!generateLocalVariableTableAttributes)
-               return;
+  public int stackMax; // Use Ints to keep from using extra bc when adding
+  public int stackDepth; // Use Ints to keep from using extra bc when adding
+  public int maxLocals;
+  public static final int max = 100; // Maximum size of the code array
+  public static final int growFactor = 400;
+  public static final int LABELS_INCREMENT = 5;
+  public byte[] bCodeStream;
+  public int pcToSourceMapSize;
+  public int[] pcToSourceMap = new int[24];
+  public int lastEntryPC; // last entry recorded
+  public int[] lineSeparatorPositions;
+  public int position; // So when first set can be incremented
+  public int classFileOffset;
+  public int startingClassFileOffset; // I need to keep the starting point inside the byte array
+  public ConstantPool constantPool;
+  // The constant pool used to generate bytecodes that need to store information into the constant pool
+  public ClassFile classFile; // The current classfile it is associated to.
+  // local variable attributes output
+  public static final int LOCALS_INCREMENT = 10;
+  public LocalVariableBinding[] locals = new LocalVariableBinding[LOCALS_INCREMENT];
+  static LocalVariableBinding[] noLocals = new LocalVariableBinding[LOCALS_INCREMENT];
+  public LocalVariableBinding[] visibleLocals = new LocalVariableBinding[LOCALS_INCREMENT];
+  static LocalVariableBinding[] noVisibleLocals = new LocalVariableBinding[LOCALS_INCREMENT];
+  int visibleLocalsCount;
+  public AbstractMethodDeclaration methodDeclaration;
+  public ExceptionLabel[] exceptionHandlers = new ExceptionLabel[LABELS_INCREMENT];
+  static ExceptionLabel[] noExceptionHandlers = new ExceptionLabel[LABELS_INCREMENT];
+  public int exceptionHandlersNumber;
+  public static FieldBinding[] ImplicitThis = new FieldBinding[] {
+  };
+  public boolean generateLineNumberAttributes;
+  public boolean generateLocalVariableTableAttributes;
+  public boolean preserveUnusedLocals;
+  // store all the labels placed at the current position to be able to optimize
+  // a jump to the next bytecode.
+  public Label[] labels = new Label[LABELS_INCREMENT];
+  static Label[] noLabels = new Label[LABELS_INCREMENT];
+  public int countLabels;
+  public int allLocalsCounter;
+  public int maxFieldCount;
+  // to handle goto_w
+  public boolean wideMode = false;
+  public static final CompilationResult RESTART_IN_WIDE_MODE = new CompilationResult((char[]) null, 0, 0, 0);
 
-       if (visibleLocalsCount >= visibleLocals.length) {
-               System.arraycopy(visibleLocals, 0, (visibleLocals = new LocalVariableBinding[visibleLocalsCount * 2]), 0, visibleLocalsCount);
-       }
-       visibleLocals[visibleLocalsCount++] = localBinding;
-}
-final public void aload(int iArg) {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_aload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_aload);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               // Don't need to use the wide bytecode
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_aload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_aload);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) (iArg);
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void aload_0() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals == 0) {
-               maxLocals = 1;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aload_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aload_0);
-       }
-}
-final public void aload_1() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aload_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aload_1);
-       }
-}
-final public void aload_2() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aload_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aload_2);
-       }
-}
-final public void aload_3() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_aload_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_aload_3);
-       }
-}
-public final void anewarray(TypeBinding typeBinding) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_anewarray;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_anewarray);
-       }
-       writeUnsignedShort(constantPool.literalIndex(typeBinding));
-}
-public void anewarrayJavaLangClass() {
-       // anewarray: java.lang.Class
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_anewarray;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_anewarray);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangClass());
-}
-public void anewarrayJavaLangObject() {
-       // anewarray: java.lang.Object
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_anewarray;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_anewarray);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangObject());
-}
-final public void areturn() {
-       countLabels = 0;
-       stackDepth--;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_areturn;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_areturn);
-       }
-}
-public void arrayAt(int typeBindingID) {
-       switch (typeBindingID) {
-               case T_int :
-                       this.iaload();
-                       break;
-               case T_byte :
-               case T_boolean :
-                       this.baload();
-                       break;
-               case T_short :
-                       this.saload();
-                       break;
-               case T_char :
-                       this.caload();
-                       break;
-               case T_long :
-                       this.laload();
-                       break;
-               case T_float :
-                       this.faload();
-                       break;
-               case T_double :
-                       this.daload();
-                       break;
-               default :
-                       this.aaload();
-       }
-}
-public void arrayAtPut(int elementTypeID, boolean valueRequired) {
-       switch (elementTypeID) {
-               case T_int :
-                       if (valueRequired)
-                               dup_x2();
-                       iastore();
-                       break;
-               case T_byte :
-               case T_boolean :
-                       if (valueRequired)
-                               dup_x2();
-                       bastore();
-                       break;
-               case T_short :
-                       if (valueRequired)
-                               dup_x2();
-                       sastore();
-                       break;
-               case T_char :
-                       if (valueRequired)
-                               dup_x2();
-                       castore();
-                       break;
-               case T_long :
-                       if (valueRequired)
-                               dup2_x2();
-                       lastore();
-                       break;
-               case T_float :
-                       if (valueRequired)
-                               dup_x2();
-                       fastore();
-                       break;
-               case T_double :
-                       if (valueRequired)
-                               dup2_x2();
-                       dastore();
-                       break;
-               default :
-                       if (valueRequired)
-                               dup_x2();
-                       aastore();
-       }
-}
-final public void arraylength() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_arraylength;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_arraylength);
-       }
-}
-final public void astore(int iArg) {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_astore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_astore);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_astore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_astore);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void astore_0() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals == 0) {
-               maxLocals = 1;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_astore_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_astore_0);
-       }
-}
-final public void astore_1() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_astore_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_astore_1);
-       }
-}
-final public void astore_2() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_astore_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_astore_2);
-       }
-}
-final public void astore_3() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_astore_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_astore_3);
-       }
-}
-final public void athrow() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_athrow;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_athrow);
-       }
-}
-final public void baload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_baload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_baload);
-       }
-}
-final public void bastore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_bastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_bastore);
-       }
-}
-final public void bipush(byte b) {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_bipush;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_bipush);
-       }
-       writeSignedByte(b);
-}
-final public void caload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_caload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_caload);
-       }
-}
-final public void castore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_castore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_castore);
-       }
-}
-public final void checkcast(TypeBinding typeBinding) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_checkcast;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_checkcast);
-       }
-       writeUnsignedShort(constantPool.literalIndex(typeBinding));
-}
-public final void checkcastJavaLangError() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_checkcast;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_checkcast);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangError());
-}
-final public void d2f() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_d2f;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_d2f);
-       }
-}
-final public void d2i() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_d2i;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_d2i);
-       }
-}
-final public void d2l() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_d2l;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_d2l);
-       }
-}
-final public void dadd() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dadd;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dadd);
-       }
-}
-final public void daload() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_daload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_daload);
-       }
-}
-final public void dastore() {
-       countLabels = 0;
-       stackDepth -= 4;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dastore);
-       }
-}
-final public void dcmpg() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dcmpg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dcmpg);
-       }
-}
-final public void dcmpl() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dcmpl;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dcmpl);
-       }
-}
-final public void dconst_0() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dconst_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dconst_0);
-       }
-}
-final public void dconst_1() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dconst_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dconst_1);
-       }
-}
-final public void ddiv() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ddiv;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ddiv);
-       }
-}
-public void decrStackSize(int offset) {
-       stackDepth -= offset;
-}
-final public void dload(int iArg) {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals < iArg + 2) {
-               maxLocals = iArg + 2; // + 2 because it is a double
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_dload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_dload);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               // Don't need to use the wide bytecode
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_dload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_dload);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void dload_0() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals < 2) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dload_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dload_0);
-       }
-}
-final public void dload_1() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals < 3) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dload_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dload_1);
-       }
-}
-final public void dload_2() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals < 4) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dload_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dload_2);
-       }
-}
-final public void dload_3() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (maxLocals < 5) {
-               maxLocals = 5;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dload_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dload_3);
-       }
-}
-final public void dmul() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dmul;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dmul);
-       }
-}
-final public void dneg() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dneg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dneg);
-       }
-}
-final public void drem() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_drem;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_drem);
-       }
-}
-final public void dreturn() {
-       countLabels = 0;
-       stackDepth -= 2;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dreturn;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dreturn);
-       }
-}
-final public void dstore(int iArg) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals <= iArg + 1) {
-               maxLocals = iArg + 2;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_dstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_dstore);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_dstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_dstore);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void dstore_0() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 2) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dstore_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dstore_0);
-       }
-}
-final public void dstore_1() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 3) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dstore_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dstore_1);
-       }
-}
-final public void dstore_2() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 4) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dstore_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dstore_2);
-       }
-}
-final public void dstore_3() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 5) {
-               maxLocals = 5;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dstore_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dstore_3);
-       }
-}
-final public void dsub() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dsub;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dsub);
-       }
-}
-final public void dup() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup);
-       }
-}
-final public void dup_x1() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup_x1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup_x1);
-       }
-}
-final public void dup_x2() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup_x2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup_x2);
-       }
-}
-final public void dup2() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup2);
-       }
-}
-final public void dup2_x1() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup2_x1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup2_x1);
-       }
-}
-final public void dup2_x2() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_dup2_x2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_dup2_x2);
-       }
-}
-public void exitUserScope(BlockScope blockScope) {
-       // mark all the scope's locals as loosing their definite assignment
+  public CodeStream(ClassFile classFile) {
+    generateLineNumberAttributes = (classFile.produceDebugAttributes & CompilerOptions.Lines) != 0;
+    generateLocalVariableTableAttributes = (classFile.produceDebugAttributes & CompilerOptions.Vars) != 0;
+    if (generateLineNumberAttributes) {
+      lineSeparatorPositions = classFile.referenceBinding.scope.referenceCompilationUnit().compilationResult.lineSeparatorPositions;
+    }
+  }
+  final public void aaload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aaload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aaload);
+    }
+  }
+  final public void aastore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aastore);
+    }
+  }
+  final public void aconst_null() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aconst_null;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aconst_null);
+    }
+  }
+  public final void addDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
+    // Required to fix 1PR0XVS: LFRE:WINNT - Compiler: variable table for method appears incorrect
+    if (!generateLocalVariableTableAttributes)
+      return;
+    /* if (initStateIndex == lastInitStateIndexWhenAddingInits)
+               return;
+       lastInitStateIndexWhenAddingInits = initStateIndex;
+       if (lastInitStateIndexWhenRemovingInits != initStateIndex){
+               lastInitStateIndexWhenRemovingInits = -2; // reinitialize remove index 
+               // remove(1)-add(1)-remove(1) -> ignore second remove
+               // remove(1)-add(2)-remove(1) -> perform second remove
+       }
+       
+    */
+    for (int i = 0; i < visibleLocalsCount; i++) {
+      LocalVariableBinding localBinding = visibleLocals[i];
+      if (localBinding != null) {
+        // Check if the local is definitely assigned
+        if ((initStateIndex != -1) && isDefinitelyAssigned(scope, initStateIndex, localBinding)) {
+          if ((localBinding.initializationCount == 0)
+            || (localBinding.initializationPCs[((localBinding.initializationCount - 1) << 1) + 1] != -1)) {
+            /* There are two cases:
+             * 1) there is no initialization interval opened ==> add an opened interval
+             * 2) there is already some initialization intervals but the last one is closed ==> add an opened interval
+             * An opened interval means that the value at localBinding.initializationPCs[localBinding.initializationCount - 1][1]
+             * is equals to -1.
+             * initializationPCs is a collection of pairs of int:
+             *         first value is the startPC and second value is the endPC. -1 one for the last value means that the interval
+             *         is not closed yet.
+             */
+            localBinding.recordInitializationStartPC(position);
+          }
+        }
+      }
+    }
+  }
+  public void addLabel(Label aLabel) {
+    if (countLabels == labels.length)
+      System.arraycopy(labels, 0, (labels = new Label[countLabels + LABELS_INCREMENT]), 0, countLabels);
+    labels[countLabels++] = aLabel;
+  }
+  public void addVisibleLocalVariable(LocalVariableBinding localBinding) {
+    if (!generateLocalVariableTableAttributes)
+      return;
 
-       if (!generateLocalVariableTableAttributes)
-               return;
-       for (int i = 0; i < visibleLocalsCount; i++) {
-               LocalVariableBinding visibleLocal = visibleLocals[i];
-               if ((visibleLocal != null) && (visibleLocal.declaringScope == blockScope)) { 
-                       // there maybe some some preserved locals never initialized
-                       if (visibleLocal.initializationCount > 0){
-                               visibleLocals[i].recordInitializationEndPC(position);
-                       }
-                       visibleLocals[i] = null; // this variable is no longer visible afterwards
-               }
-       }
-}
-final public void f2d() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_f2d;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_f2d);
-       }
-}
-final public void f2i() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_f2i;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_f2i);
-       }
-}
-final public void f2l() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_f2l;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_f2l);
-       }
-}
-final public void fadd() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fadd;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fadd);
-       }
-}
-final public void faload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_faload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_faload);
-       }
-}
-final public void fastore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fastore);
-       }
-}
-final public void fcmpg() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fcmpg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fcmpg);
-       }
-}
-final public void fcmpl() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fcmpl;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fcmpl);
-       }
-}
-final public void fconst_0() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fconst_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fconst_0);
-       }
-}
-final public void fconst_1() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fconst_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fconst_1);
-       }
-}
-final public void fconst_2() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fconst_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fconst_2);
-       }
-}
-final public void fdiv() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fdiv;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fdiv);
-       }
-}
-final public void fload(int iArg) {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_fload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_fload);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_fload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_fload);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void fload_0() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals == 0) {
-               maxLocals = 1;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fload_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fload_0);
-       }
-}
-final public void fload_1() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fload_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fload_1);
-       }
-}
-final public void fload_2() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fload_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fload_2);
-       }
-}
-final public void fload_3() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fload_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fload_3);
-       }
-}
-final public void fmul() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fmul;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fmul);
-       }
-}
-final public void fneg() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fneg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fneg);
-       }
-}
-final public void frem() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_frem;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_frem);
-       }
-}
-final public void freturn() {
-       countLabels = 0;
-       stackDepth--;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_freturn;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_freturn);
-       }
-}
-final public void fstore(int iArg) {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_fstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_fstore);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_fstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_fstore);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void fstore_0() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals == 0) {
-               maxLocals = 1;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fstore_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fstore_0);
-       }
-}
-final public void fstore_1() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fstore_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fstore_1);
-       }
-}
-final public void fstore_2() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fstore_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fstore_2);
-       }
-}
-final public void fstore_3() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fstore_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fstore_3);
-       }
-}
-final public void fsub() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_fsub;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_fsub);
-       }
-}
-/**
- * Macro for building a class descriptor object
- */
-public void generateClassLiteralAccessForType(TypeBinding accessedType, FieldBinding syntheticFieldBinding) {
-       Label endLabel;
-       ExceptionLabel anyExceptionHandler;
-       int saveStackSize;
-       if (accessedType.isBaseType() && accessedType != NullBinding) {
-               this.getTYPE(accessedType.id);
-               return;
-       }
-       endLabel = new Label(this);
+    if (visibleLocalsCount >= visibleLocals.length) {
+      System.arraycopy(visibleLocals, 0, (visibleLocals = new LocalVariableBinding[visibleLocalsCount * 2]), 0, visibleLocalsCount);
+    }
+    visibleLocals[visibleLocalsCount++] = localBinding;
+  }
+  final public void aload(int iArg) {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_aload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_aload);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      // Don't need to use the wide bytecode
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_aload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_aload);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) (iArg);
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void aload_0() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals == 0) {
+      maxLocals = 1;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aload_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aload_0);
+    }
+  }
+  final public void aload_1() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aload_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aload_1);
+    }
+  }
+  final public void aload_2() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aload_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aload_2);
+    }
+  }
+  final public void aload_3() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_aload_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_aload_3);
+    }
+  }
+  public final void anewarray(TypeBinding typeBinding) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_anewarray;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_anewarray);
+    }
+    writeUnsignedShort(constantPool.literalIndex(typeBinding));
+  }
+  public void anewarrayJavaLangClass() {
+    // anewarray: java.lang.Class
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_anewarray;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_anewarray);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangClass());
+  }
+  public void anewarrayJavaLangObject() {
+    // anewarray: java.lang.Object
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_anewarray;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_anewarray);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangObject());
+  }
+  final public void areturn() {
+    countLabels = 0;
+    stackDepth--;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_areturn;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_areturn);
+    }
+  }
+  public void arrayAt(int typeBindingID) {
+    switch (typeBindingID) {
+      case T_int :
+        this.iaload();
+        break;
+      case T_byte :
+      case T_boolean :
+        this.baload();
+        break;
+      case T_short :
+        this.saload();
+        break;
+      case T_char :
+        this.caload();
+        break;
+      case T_long :
+        this.laload();
+        break;
+      case T_float :
+        this.faload();
+        break;
+      case T_double :
+        this.daload();
+        break;
+      default :
+        this.aaload();
+    }
+  }
+  public void arrayAtPut(int elementTypeID, boolean valueRequired) {
+    switch (elementTypeID) {
+      case T_int :
+        if (valueRequired)
+          dup_x2();
+        iastore();
+        break;
+      case T_byte :
+      case T_boolean :
+        if (valueRequired)
+          dup_x2();
+        bastore();
+        break;
+      case T_short :
+        if (valueRequired)
+          dup_x2();
+        sastore();
+        break;
+      case T_char :
+        if (valueRequired)
+          dup_x2();
+        castore();
+        break;
+      case T_long :
+        if (valueRequired)
+          dup2_x2();
+        lastore();
+        break;
+      case T_float :
+        if (valueRequired)
+          dup_x2();
+        fastore();
+        break;
+      case T_double :
+        if (valueRequired)
+          dup2_x2();
+        dastore();
+        break;
+      default :
+        if (valueRequired)
+          dup_x2();
+        aastore();
+    }
+  }
+  final public void arraylength() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_arraylength;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_arraylength);
+    }
+  }
+  final public void astore(int iArg) {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_astore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_astore);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_astore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_astore);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void astore_0() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals == 0) {
+      maxLocals = 1;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_astore_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_astore_0);
+    }
+  }
+  final public void astore_1() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_astore_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_astore_1);
+    }
+  }
+  final public void astore_2() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_astore_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_astore_2);
+    }
+  }
+  final public void astore_3() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_astore_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_astore_3);
+    }
+  }
+  final public void athrow() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_athrow;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_athrow);
+    }
+  }
+  final public void baload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_baload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_baload);
+    }
+  }
+  final public void bastore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_bastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_bastore);
+    }
+  }
+  final public void bipush(byte b) {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_bipush;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_bipush);
+    }
+    writeSignedByte(b);
+  }
+  final public void caload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_caload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_caload);
+    }
+  }
+  final public void castore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_castore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_castore);
+    }
+  }
+  public final void checkcast(TypeBinding typeBinding) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_checkcast;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_checkcast);
+    }
+    writeUnsignedShort(constantPool.literalIndex(typeBinding));
+  }
+  public final void checkcastJavaLangError() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_checkcast;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_checkcast);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangError());
+  }
+  final public void d2f() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_d2f;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_d2f);
+    }
+  }
+  final public void d2i() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_d2i;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_d2i);
+    }
+  }
+  final public void d2l() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_d2l;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_d2l);
+    }
+  }
+  final public void dadd() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dadd;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dadd);
+    }
+  }
+  final public void daload() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_daload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_daload);
+    }
+  }
+  final public void dastore() {
+    countLabels = 0;
+    stackDepth -= 4;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dastore);
+    }
+  }
+  final public void dcmpg() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dcmpg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dcmpg);
+    }
+  }
+  final public void dcmpl() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dcmpl;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dcmpl);
+    }
+  }
+  final public void dconst_0() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dconst_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dconst_0);
+    }
+  }
+  final public void dconst_1() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dconst_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dconst_1);
+    }
+  }
+  final public void ddiv() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ddiv;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ddiv);
+    }
+  }
+  public void decrStackSize(int offset) {
+    stackDepth -= offset;
+  }
+  final public void dload(int iArg) {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals < iArg + 2) {
+      maxLocals = iArg + 2; // + 2 because it is a double
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_dload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_dload);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      // Don't need to use the wide bytecode
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_dload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_dload);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void dload_0() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals < 2) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dload_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dload_0);
+    }
+  }
+  final public void dload_1() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals < 3) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dload_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dload_1);
+    }
+  }
+  final public void dload_2() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals < 4) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dload_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dload_2);
+    }
+  }
+  final public void dload_3() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (maxLocals < 5) {
+      maxLocals = 5;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dload_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dload_3);
+    }
+  }
+  final public void dmul() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dmul;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dmul);
+    }
+  }
+  final public void dneg() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dneg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dneg);
+    }
+  }
+  final public void drem() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_drem;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_drem);
+    }
+  }
+  final public void dreturn() {
+    countLabels = 0;
+    stackDepth -= 2;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dreturn;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dreturn);
+    }
+  }
+  final public void dstore(int iArg) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals <= iArg + 1) {
+      maxLocals = iArg + 2;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_dstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_dstore);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_dstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_dstore);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void dstore_0() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 2) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dstore_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dstore_0);
+    }
+  }
+  final public void dstore_1() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 3) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dstore_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dstore_1);
+    }
+  }
+  final public void dstore_2() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 4) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dstore_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dstore_2);
+    }
+  }
+  final public void dstore_3() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 5) {
+      maxLocals = 5;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dstore_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dstore_3);
+    }
+  }
+  final public void dsub() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dsub;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dsub);
+    }
+  }
+  final public void dup() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup);
+    }
+  }
+  final public void dup_x1() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup_x1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup_x1);
+    }
+  }
+  final public void dup_x2() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup_x2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup_x2);
+    }
+  }
+  final public void dup2() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup2);
+    }
+  }
+  final public void dup2_x1() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup2_x1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup2_x1);
+    }
+  }
+  final public void dup2_x2() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_dup2_x2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_dup2_x2);
+    }
+  }
+  public void exitUserScope(BlockScope blockScope) {
+    // mark all the scope's locals as loosing their definite assignment
 
-       if (syntheticFieldBinding != null) { // non interface case
-               this.getstatic(syntheticFieldBinding);
-               this.dup();
-               this.ifnonnull(endLabel);
-               this.pop();
-       }
+    if (!generateLocalVariableTableAttributes)
+      return;
+    for (int i = 0; i < visibleLocalsCount; i++) {
+      LocalVariableBinding visibleLocal = visibleLocals[i];
+      if ((visibleLocal != null) && (visibleLocal.declaringScope == blockScope)) {
+        // there maybe some some preserved locals never initialized
+        if (visibleLocal.initializationCount > 0) {
+          visibleLocals[i].recordInitializationEndPC(position);
+        }
+        visibleLocals[i] = null; // this variable is no longer visible afterwards
+      }
+    }
+  }
+  final public void f2d() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_f2d;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_f2d);
+    }
+  }
+  final public void f2i() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_f2i;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_f2i);
+    }
+  }
+  final public void f2l() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_f2l;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_f2l);
+    }
+  }
+  final public void fadd() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fadd;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fadd);
+    }
+  }
+  final public void faload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_faload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_faload);
+    }
+  }
+  final public void fastore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fastore);
+    }
+  }
+  final public void fcmpg() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fcmpg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fcmpg);
+    }
+  }
+  final public void fcmpl() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fcmpl;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fcmpl);
+    }
+  }
+  final public void fconst_0() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fconst_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fconst_0);
+    }
+  }
+  final public void fconst_1() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fconst_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fconst_1);
+    }
+  }
+  final public void fconst_2() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fconst_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fconst_2);
+    }
+  }
+  final public void fdiv() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fdiv;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fdiv);
+    }
+  }
+  final public void fload(int iArg) {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_fload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_fload);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_fload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_fload);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void fload_0() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals == 0) {
+      maxLocals = 1;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fload_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fload_0);
+    }
+  }
+  final public void fload_1() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fload_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fload_1);
+    }
+  }
+  final public void fload_2() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fload_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fload_2);
+    }
+  }
+  final public void fload_3() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fload_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fload_3);
+    }
+  }
+  final public void fmul() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fmul;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fmul);
+    }
+  }
+  final public void fneg() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fneg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fneg);
+    }
+  }
+  final public void frem() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_frem;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_frem);
+    }
+  }
+  final public void freturn() {
+    countLabels = 0;
+    stackDepth--;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_freturn;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_freturn);
+    }
+  }
+  final public void fstore(int iArg) {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_fstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_fstore);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_fstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_fstore);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void fstore_0() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals == 0) {
+      maxLocals = 1;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fstore_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fstore_0);
+    }
+  }
+  final public void fstore_1() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fstore_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fstore_1);
+    }
+  }
+  final public void fstore_2() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fstore_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fstore_2);
+    }
+  }
+  final public void fstore_3() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fstore_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fstore_3);
+    }
+  }
+  final public void fsub() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_fsub;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_fsub);
+    }
+  }
+  /**
+   * Macro for building a class descriptor object
+   */
+  public void generateClassLiteralAccessForType(TypeBinding accessedType, FieldBinding syntheticFieldBinding) {
+    Label endLabel;
+    ExceptionLabel anyExceptionHandler;
+    int saveStackSize;
+    if (accessedType.isBaseType() && accessedType != NullBinding) {
+      this.getTYPE(accessedType.id);
+      return;
+    }
+    endLabel = new Label(this);
 
-       /* Macro for building a class descriptor object... using or not a field cache to store it into...
-       this sequence is responsible for building the actual class descriptor.
-       
-       If the fieldCache is set, then it is supposed to be the body of a synthetic access method
-       factoring the actual descriptor creation out of the invocation site (saving space).
-       If the fieldCache is nil, then we are dumping the bytecode on the invocation site, since
-       we have no way to get a hand on the field cache to do better. */
+    if (syntheticFieldBinding != null) { // non interface case
+      this.getstatic(syntheticFieldBinding);
+      this.dup();
+      this.ifnonnull(endLabel);
+      this.pop();
+    }
 
+    /* Macro for building a class descriptor object... using or not a field cache to store it into...
+    this sequence is responsible for building the actual class descriptor.
+    
+    If the fieldCache is set, then it is supposed to be the body of a synthetic access method
+    factoring the actual descriptor creation out of the invocation site (saving space).
+    If the fieldCache is nil, then we are dumping the bytecode on the invocation site, since
+    we have no way to get a hand on the field cache to do better. */
 
-       // Wrap the code in an exception handler to convert a ClassNotFoundException into a NoClassDefError
+    // Wrap the code in an exception handler to convert a ClassNotFoundException into a NoClassDefError
 
-       anyExceptionHandler = new ExceptionLabel(this, TypeBinding.NullBinding /* represents ClassNotFoundException*/);
-       this.ldc(accessedType == TypeBinding.NullBinding ? "java.lang.Object" : String.valueOf(accessedType.constantPoolName()).replace('/', '.')); //$NON-NLS-1$
-       this.invokeClassForName();
+    anyExceptionHandler = new ExceptionLabel(this, TypeBinding.NullBinding /* represents ClassNotFoundException*/
+    );
+    this.ldc(accessedType == TypeBinding.NullBinding ? "java.lang.Object" : String.valueOf(accessedType.constantPoolName()).replace('/', '.')); //$NON-NLS-1$
+    this.invokeClassForName();
 
-       /* We need to protect the runtime code from binary inconsistencies
-       in case the accessedType is missing, the ClassNotFoundException has to be converted
-       into a NoClassDefError(old ex message), we thus need to build an exception handler for this one. */
-       anyExceptionHandler.placeEnd();
+    /* We need to protect the runtime code from binary inconsistencies
+    in case the accessedType is missing, the ClassNotFoundException has to be converted
+    into a NoClassDefError(old ex message), we thus need to build an exception handler for this one. */
+    anyExceptionHandler.placeEnd();
 
-       if (syntheticFieldBinding != null) { // non interface case
-               this.dup();
-               this.putstatic(syntheticFieldBinding);
-       }
-       this.goto_(endLabel);
+    if (syntheticFieldBinding != null) { // non interface case
+      this.dup();
+      this.putstatic(syntheticFieldBinding);
+    }
+    this.goto_(endLabel);
 
+    // Generate the body of the exception handler
+    saveStackSize = stackDepth;
+    stackDepth = 1;
+    /* ClassNotFoundException on stack -- the class literal could be doing more things
+    on the stack, which means that the stack may not be empty at this point in the
+    above code gen. So we save its state and restart it from 1. */
 
-       // Generate the body of the exception handler
-       saveStackSize = stackDepth;
-       stackDepth = 1;
-       /* ClassNotFoundException on stack -- the class literal could be doing more things
-       on the stack, which means that the stack may not be empty at this point in the
-       above code gen. So we save its state and restart it from 1. */
+    anyExceptionHandler.place();
 
-       anyExceptionHandler.place();
+    // Transform the current exception, and repush and throw a 
+    // NoClassDefFoundError(ClassNotFound.getMessage())
 
-       // Transform the current exception, and repush and throw a 
-       // NoClassDefFoundError(ClassNotFound.getMessage())
+    this.newNoClassDefFoundError();
+    this.dup_x1();
+    this.swap();
 
-       this.newNoClassDefFoundError();
-       this.dup_x1();
-       this.swap();
+    // Retrieve the message from the old exception
+    this.invokeThrowableGetMessage();
 
-       // Retrieve the message from the old exception
-       this.invokeThrowableGetMessage();
+    // Send the constructor taking a message string as an argument
+    this.invokeNoClassDefFoundErrorStringConstructor();
+    this.athrow();
+    endLabel.place();
+    stackDepth = saveStackSize;
+  }
+  /**
+   * This method returns the exception handler to be able to generate the exception handler
+   * attribute.
+   */
+  final public int[] generateCodeAttributeForProblemMethod(String errorName, String problemMessage) {
+    /**
+     * Equivalent code:
+     * try {
+     *         throw ((Error) (Class.forName(errorName).getConstructor(new Class[] {Class.forName("java.lang.String")})).newInstance(new Object[] {problemMessage}));
+     * } catch (Exception e) {
+     *         throw (NullPointerException) null;
+     * }
+     */
+    int endPC, handlerPC;
+    ldc(errorName);
+    invokeClassForName();
+    iconst_1();
+    anewarrayJavaLangClass();
+    dup();
+    iconst_0();
+    ldc("java.lang.String"); //$NON-NLS-1$
+    invokeClassForName();
+    aastore();
+    invokeConstructorGetConstructor();
+    iconst_1();
+    anewarrayJavaLangObject();
+    dup();
+    iconst_0();
+    ldc(problemMessage);
+    aastore();
+    invokeObjectNewInstance();
+    checkcastJavaLangError();
+    athrow();
+    endPC = handlerPC = position;
+    pop();
+    aconst_null();
+    athrow();
+    return_();
+    return new int[] { 0, endPC, handlerPC };
+  }
+  public void generateConstant(Constant constant, int implicitConversionCode) {
+    int targetTypeID = implicitConversionCode >> 4;
+    switch (targetTypeID) {
+      case T_boolean :
+        generateInlinedValue(constant.booleanValue());
+        break;
+      case T_char :
+        generateInlinedValue(constant.charValue());
+        break;
+      case T_byte :
+        generateInlinedValue(constant.byteValue());
+        break;
+      case T_short :
+        generateInlinedValue(constant.shortValue());
+        break;
+      case T_int :
+        generateInlinedValue(constant.intValue());
+        break;
+      case T_long :
+        generateInlinedValue(constant.longValue());
+        break;
+      case T_float :
+        generateInlinedValue(constant.floatValue());
+        break;
+      case T_double :
+        generateInlinedValue(constant.doubleValue());
+        break;
+      case T_String :
+        this.ldc(constant.stringValue());
+        break;
+      default : //reference object (constant can be from T_null or T_String)
+        if (constant.typeID() == T_String)
+          ldc(constant.stringValue());
+        else
+          aconst_null();
+    }
+  }
+  /**
+   * @param implicitConversionCode int
+   */
+  public void generateImplicitConversion(int implicitConversionCode) {
+    switch (implicitConversionCode) {
+      case Float2Char :
+        this.f2i();
+        this.i2c();
+        break;
+      case Double2Char :
+        this.d2i();
+        this.i2c();
+        break;
+      case Int2Char :
+      case Short2Char :
+      case Byte2Char :
+        this.i2c();
+        break;
+      case Long2Char :
+        this.l2i();
+        this.i2c();
+        break;
+      case Char2Float :
+      case Short2Float :
+      case Int2Float :
+      case Byte2Float :
+        this.i2f();
+        break;
+      case Double2Float :
+        this.d2f();
+        break;
+      case Long2Float :
+        this.l2f();
+        break;
+      case Float2Byte :
+        this.f2i();
+        this.i2b();
+        break;
+      case Double2Byte :
+        this.d2i();
+        this.i2b();
+        break;
+      case Int2Byte :
+      case Short2Byte :
+      case Char2Byte :
+        this.i2b();
+        break;
+      case Long2Byte :
+        this.l2i();
+        this.i2b();
+        break;
+      case Byte2Double :
+      case Char2Double :
+      case Short2Double :
+      case Int2Double :
+        this.i2d();
+        break;
+      case Float2Double :
+        this.f2d();
+        break;
+      case Long2Double :
+        this.l2d();
+        break;
+      case Byte2Short :
+      case Char2Short :
+      case Int2Short :
+        this.i2s();
+        break;
+      case Double2Short :
+        this.d2i();
+        this.i2s();
+        break;
+      case Long2Short :
+        this.l2i();
+        this.i2s();
+        break;
+      case Float2Short :
+        this.f2i();
+        this.i2s();
+        break;
+      case Double2Int :
+        this.d2i();
+        break;
+      case Float2Int :
+        this.f2i();
+        break;
+      case Long2Int :
+        this.l2i();
+        break;
+      case Int2Long :
+      case Char2Long :
+      case Byte2Long :
+      case Short2Long :
+        this.i2l();
+        break;
+      case Double2Long :
+        this.d2l();
+        break;
+      case Float2Long :
+        this.f2l();
+    }
+  }
+  public void generateInlinedValue(byte inlinedValue) {
+    switch (inlinedValue) {
+      case -1 :
+        this.iconst_m1();
+        break;
+      case 0 :
+        this.iconst_0();
+        break;
+      case 1 :
+        this.iconst_1();
+        break;
+      case 2 :
+        this.iconst_2();
+        break;
+      case 3 :
+        this.iconst_3();
+        break;
+      case 4 :
+        this.iconst_4();
+        break;
+      case 5 :
+        this.iconst_5();
+        break;
+      default :
+        if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
+          this.bipush((byte) inlinedValue);
+          return;
+        }
+    }
+  }
+  public void generateInlinedValue(char inlinedValue) {
+    switch (inlinedValue) {
+      case 0 :
+        this.iconst_0();
+        break;
+      case 1 :
+        this.iconst_1();
+        break;
+      case 2 :
+        this.iconst_2();
+        break;
+      case 3 :
+        this.iconst_3();
+        break;
+      case 4 :
+        this.iconst_4();
+        break;
+      case 5 :
+        this.iconst_5();
+        break;
+      default :
+        if ((6 <= inlinedValue) && (inlinedValue <= 127)) {
+          this.bipush((byte) inlinedValue);
+          return;
+        }
+        if ((128 <= inlinedValue) && (inlinedValue <= 32767)) {
+          this.sipush(inlinedValue);
+          return;
+        }
+        this.ldc(inlinedValue);
+    }
+  }
+  public void generateInlinedValue(double inlinedValue) {
+    if (inlinedValue == 0.0) {
+      if (Double.doubleToLongBits(inlinedValue) != 0L)
+        this.ldc2_w(inlinedValue);
+      else
+        this.dconst_0();
+      return;
+    }
+    if (inlinedValue == 1.0) {
+      this.dconst_1();
+      return;
+    }
+    this.ldc2_w(inlinedValue);
+  }
+  public void generateInlinedValue(float inlinedValue) {
+    if (inlinedValue == 0.0f) {
+      if (Float.floatToIntBits(inlinedValue) != 0)
+        this.ldc(inlinedValue);
+      else
+        this.fconst_0();
+      return;
+    }
+    if (inlinedValue == 1.0f) {
+      this.fconst_1();
+      return;
+    }
+    if (inlinedValue == 2.0f) {
+      this.fconst_2();
+      return;
+    }
+    this.ldc(inlinedValue);
+  }
+  public void generateInlinedValue(int inlinedValue) {
+    switch (inlinedValue) {
+      case -1 :
+        this.iconst_m1();
+        break;
+      case 0 :
+        this.iconst_0();
+        break;
+      case 1 :
+        this.iconst_1();
+        break;
+      case 2 :
+        this.iconst_2();
+        break;
+      case 3 :
+        this.iconst_3();
+        break;
+      case 4 :
+        this.iconst_4();
+        break;
+      case 5 :
+        this.iconst_5();
+        break;
+      default :
+        if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
+          this.bipush((byte) inlinedValue);
+          return;
+        }
+        if ((-32768 <= inlinedValue) && (inlinedValue <= 32767)) {
+          this.sipush(inlinedValue);
+          return;
+        }
+        this.ldc(inlinedValue);
+    }
+  }
+  public void generateInlinedValue(long inlinedValue) {
+    if (inlinedValue == 0) {
+      this.lconst_0();
+      return;
+    }
+    if (inlinedValue == 1) {
+      this.lconst_1();
+      return;
+    }
+    this.ldc2_w(inlinedValue);
+  }
+  public void generateInlinedValue(short inlinedValue) {
+    switch (inlinedValue) {
+      case -1 :
+        this.iconst_m1();
+        break;
+      case 0 :
+        this.iconst_0();
+        break;
+      case 1 :
+        this.iconst_1();
+        break;
+      case 2 :
+        this.iconst_2();
+        break;
+      case 3 :
+        this.iconst_3();
+        break;
+      case 4 :
+        this.iconst_4();
+        break;
+      case 5 :
+        this.iconst_5();
+        break;
+      default :
+        if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
+          this.bipush((byte) inlinedValue);
+          return;
+        }
+        this.sipush(inlinedValue);
+    }
+  }
+  public void generateInlinedValue(boolean inlinedValue) {
+    if (inlinedValue)
+      this.iconst_1();
+    else
+      this.iconst_0();
+  }
+  public void generateOuterAccess(Object[] mappingSequence, AstNode invocationSite, Scope scope) {
+    if (mappingSequence == null)
+      return;
+    if (mappingSequence == BlockScope.EmulationPathToImplicitThis) {
+      if (scope.methodScope().isConstructorCall) {
+        scope.problemReporter().errorThisSuperInStatic(invocationSite);
+      }
+      this.aload_0();
+      return;
+    }
+    if (mappingSequence[0] instanceof FieldBinding) {
+      FieldBinding fieldBinding = (FieldBinding) mappingSequence[0];
+      if (scope.methodScope().isConstructorCall) {
+        scope.problemReporter().errorThisSuperInStatic(invocationSite);
+      }
+      this.aload_0();
+      this.getfield(fieldBinding);
+    } else {
+      load((LocalVariableBinding) mappingSequence[0]);
+    }
+    for (int i = 1, length = mappingSequence.length; i < length; i++) {
+      if (mappingSequence[i] instanceof FieldBinding) {
+        FieldBinding fieldBinding = (FieldBinding) mappingSequence[i];
+        this.getfield(fieldBinding);
+      } else {
+        this.invokestatic((MethodBinding) mappingSequence[i]);
+      }
+    }
+  }
+  /**
+   * The equivalent code performs a string conversion:
+   *
+   * @param oper1 org.eclipse.jdt.internal.compiler.lookup.BlockScope
+   * @param oper1 org.eclipse.jdt.internal.compiler.ast.Expression
+   * @param oper2 org.eclipse.jdt.internal.compiler.ast.Expression
+   */
+  public void generateStringAppend(BlockScope blockScope, Expression oper1, Expression oper2) {
+    int pc;
+    if (oper1 == null) {
+      /* Operand is already on the stack, and maybe nil:
+      note type1 is always to  java.lang.String here.*/
+      this.newStringBuffer();
+      this.dup_x1();
+      this.swap();
+      // If argument is reference type, need to transform it 
+      // into a string (handles null case)
+      this.invokeStringValueOf(T_Object);
+      this.invokeStringBufferStringConstructor();
+    } else {
+      pc = position;
+      oper1.generateOptimizedStringBufferCreation(blockScope, this, oper1.implicitConversion & 0xF);
+      this.recordPositionsFrom(pc, oper1.sourceStart);
+    }
+    pc = position;
+    oper2.generateOptimizedStringBuffer(blockScope, this, oper2.implicitConversion & 0xF);
+    this.recordPositionsFrom(pc, oper2.sourceStart);
+    this.invokeStringBufferToString();
+  }
+  /**
+   * Code responsible to generate the suitable code to supply values for the synthetic arguments of
+   * a constructor invocation of a nested type.
+   */
+  public void generateSyntheticArgumentValues(
+    BlockScope currentScope,
+    ReferenceBinding targetType,
+    Expression enclosingInstance,
+    AstNode invocationSite) {
 
-       // Send the constructor taking a message string as an argument
-       this.invokeNoClassDefFoundErrorStringConstructor();
-       this.athrow();
-       endLabel.place();
-       stackDepth = saveStackSize;
-}
-/**
- * This method returns the exception handler to be able to generate the exception handler
- * attribute.
- */
-final public int[] generateCodeAttributeForProblemMethod(String errorName, String problemMessage) {
-       /**
-        * Equivalent code:
-        *      try {
-        *              throw ((Error) (Class.forName(errorName).getConstructor(new Class[] {Class.forName("java.lang.String")})).newInstance(new Object[] {problemMessage}));
-        *      } catch (Exception e) {
-        *              throw (NullPointerException) null;
-        *      }
-        */
-       int endPC, handlerPC;
-       ldc(errorName);
-       invokeClassForName();
-       iconst_1();
-       anewarrayJavaLangClass();
-       dup();
-       iconst_0();
-       ldc("java.lang.String"); //$NON-NLS-1$
-       invokeClassForName();
-       aastore();
-       invokeConstructorGetConstructor();
-       iconst_1();
-       anewarrayJavaLangObject();
-       dup();
-       iconst_0();
-       ldc(problemMessage);
-       aastore();
-       invokeObjectNewInstance();
-       checkcastJavaLangError();
-       athrow();
-       endPC = handlerPC = position;
-       pop();
-       aconst_null();
-       athrow();
-       return_();
-       return new int[] {0, endPC, handlerPC};
-}
-public void generateConstant(Constant constant, int implicitConversionCode) {
-       int targetTypeID = implicitConversionCode >> 4;
-       switch (targetTypeID) {
-               case T_boolean :
-                       generateInlinedValue(constant.booleanValue());
-                       break;
-               case T_char :
-                       generateInlinedValue(constant.charValue());
-                       break;
-               case T_byte :
-                       generateInlinedValue(constant.byteValue());
-                       break;
-               case T_short :
-                       generateInlinedValue(constant.shortValue());
-                       break;
-               case T_int :
-                       generateInlinedValue(constant.intValue());
-                       break;
-               case T_long :
-                       generateInlinedValue(constant.longValue());
-                       break;
-               case T_float :
-                       generateInlinedValue(constant.floatValue());
-                       break;
-               case T_double :
-                       generateInlinedValue(constant.doubleValue());
-                       break;
-               case T_String :
-                       this.ldc(constant.stringValue());
-                       break;
-               default : //reference object (constant can be from T_null or T_String)
-                       if (constant.typeID() == T_String)
-                               ldc(constant.stringValue());
-                       else
-                               aconst_null();
-       }
-}
-/**
- * @param implicitConversionCode int
- */
-public void generateImplicitConversion(int implicitConversionCode) {
-       switch (implicitConversionCode) {
-               case Float2Char :
-                       this.f2i();
-                       this.i2c();
-                       break;
-               case Double2Char :
-                       this.d2i();
-                       this.i2c();
-                       break;
-               case Int2Char :
-               case Short2Char :
-               case Byte2Char :
-                       this.i2c();
-                       break;
-               case Long2Char :
-                       this.l2i();
-                       this.i2c();
-                       break;
-               case Char2Float :
-               case Short2Float :
-               case Int2Float :
-               case Byte2Float :
-                       this.i2f();
-                       break;
-               case Double2Float :
-                       this.d2f();
-                       break;
-               case Long2Float :
-                       this.l2f();
-                       break;
-               case Float2Byte :
-                       this.f2i();
-                       this.i2b();
-                       break;
-               case Double2Byte :
-                       this.d2i();
-                       this.i2b();
-                       break;
-               case Int2Byte :
-               case Short2Byte :
-               case Char2Byte :
-                       this.i2b();
-                       break;
-               case Long2Byte :
-                       this.l2i();
-                       this.i2b();
-                       break;
-               case Byte2Double :
-               case Char2Double :
-               case Short2Double :
-               case Int2Double :
-                       this.i2d();
-                       break;
-               case Float2Double :
-                       this.f2d();
-                       break;
-               case Long2Double :
-                       this.l2d();
-                       break;
-               case Byte2Short :
-               case Char2Short :
-               case Int2Short :
-                       this.i2s();
-                       break;
-               case Double2Short :
-                       this.d2i();
-                       this.i2s();
-                       break;
-               case Long2Short :
-                       this.l2i();
-                       this.i2s();
-                       break;
-               case Float2Short :
-                       this.f2i();
-                       this.i2s();
-                       break;
-               case Double2Int :
-                       this.d2i();
-                       break;
-               case Float2Int :
-                       this.f2i();
-                       break;
-               case Long2Int :
-                       this.l2i();
-                       break;
-               case Int2Long :
-               case Char2Long :
-               case Byte2Long :
-               case Short2Long :
-                       this.i2l();
-                       break;
-               case Double2Long :
-                       this.d2l();
-                       break;
-               case Float2Long :
-                       this.f2l();
-       }
-}
-public void generateInlinedValue(byte inlinedValue) {
-       switch (inlinedValue) {
-               case -1 :
-                       this.iconst_m1();
-                       break;
-               case 0 :
-                       this.iconst_0();
-                       break;
-               case 1 :
-                       this.iconst_1();
-                       break;
-               case 2 :
-                       this.iconst_2();
-                       break;
-               case 3 :
-                       this.iconst_3();
-                       break;
-               case 4 :
-                       this.iconst_4();
-                       break;
-               case 5 :
-                       this.iconst_5();
-                       break;
-               default :
-                       if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
-                               this.bipush((byte) inlinedValue);
-                               return;
-                       }
-       }
-}
-public void generateInlinedValue(char inlinedValue) {
-       switch (inlinedValue) {
-               case 0 :
-                       this.iconst_0();
-                       break;
-               case 1 :
-                       this.iconst_1();
-                       break;
-               case 2 :
-                       this.iconst_2();
-                       break;
-               case 3 :
-                       this.iconst_3();
-                       break;
-               case 4 :
-                       this.iconst_4();
-                       break;
-               case 5 :
-                       this.iconst_5();
-                       break;
-               default :
-                       if ((6 <= inlinedValue) && (inlinedValue <= 127)) {
-                               this.bipush((byte) inlinedValue);
-                               return;
-                       }
-                       if ((128 <= inlinedValue) && (inlinedValue <= 32767)) {
-                               this.sipush(inlinedValue);
-                               return;
-                       }
-                       this.ldc(inlinedValue);
-       }
-}
-public void generateInlinedValue(double inlinedValue) {
-       if (inlinedValue == 0.0) {
-               if (Double.doubleToLongBits(inlinedValue) != 0L)
-                       this.ldc2_w(inlinedValue);
-               else
-                       this.dconst_0();
-               return;
-       }
-       if (inlinedValue == 1.0) {
-               this.dconst_1();
-               return;
-       }
-       this.ldc2_w(inlinedValue);
-}
-public void generateInlinedValue(float inlinedValue) {
-       if (inlinedValue == 0.0f) {
-               if (Float.floatToIntBits(inlinedValue) != 0)
-                       this.ldc(inlinedValue);
-               else
-                       this.fconst_0();
-               return;
-       }
-       if (inlinedValue == 1.0f) {
-               this.fconst_1();
-               return;
-       }
-       if (inlinedValue == 2.0f) {
-               this.fconst_2();
-               return;
-       }
-       this.ldc(inlinedValue);
-}
-public void generateInlinedValue(int inlinedValue) {
-       switch (inlinedValue) {
-               case -1 :
-                       this.iconst_m1();
-                       break;
-               case 0 :
-                       this.iconst_0();
-                       break;
-               case 1 :
-                       this.iconst_1();
-                       break;
-               case 2 :
-                       this.iconst_2();
-                       break;
-               case 3 :
-                       this.iconst_3();
-                       break;
-               case 4 :
-                       this.iconst_4();
-                       break;
-               case 5 :
-                       this.iconst_5();
-                       break;
-               default :
-                       if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
-                               this.bipush((byte) inlinedValue);
-                               return;
-                       }
-                       if ((-32768 <= inlinedValue) && (inlinedValue <= 32767)) {
-                               this.sipush(inlinedValue);
-                               return;
-                       }
-                       this.ldc(inlinedValue);
-       }
-}
-public void generateInlinedValue(long inlinedValue) {
-       if (inlinedValue == 0) {
-               this.lconst_0();
-               return;
-       }
-       if (inlinedValue == 1) {
-               this.lconst_1();
-               return;
-       }
-       this.ldc2_w(inlinedValue);
-}
-public void generateInlinedValue(short inlinedValue) {
-       switch (inlinedValue) {
-               case -1 :
-                       this.iconst_m1();
-                       break;
-               case 0 :
-                       this.iconst_0();
-                       break;
-               case 1 :
-                       this.iconst_1();
-                       break;
-               case 2 :
-                       this.iconst_2();
-                       break;
-               case 3 :
-                       this.iconst_3();
-                       break;
-               case 4 :
-                       this.iconst_4();
-                       break;
-               case 5 :
-                       this.iconst_5();
-                       break;
-               default :
-                       if ((-128 <= inlinedValue) && (inlinedValue <= 127)) {
-                               this.bipush((byte) inlinedValue);
-                               return;
-                       }
-                       this.sipush(inlinedValue);
-       }
-}
-public void generateInlinedValue(boolean inlinedValue) {
-       if (inlinedValue)
-               this.iconst_1();
-       else
-               this.iconst_0();
-}
-public void generateOuterAccess(Object[] mappingSequence, AstNode invocationSite, Scope scope) {
-       if (mappingSequence == null)
-               return;
-       if (mappingSequence == BlockScope.EmulationPathToImplicitThis) {
-               if (scope.methodScope().isConstructorCall){
-                       scope.problemReporter().errorThisSuperInStatic(invocationSite);
-               }
-               this.aload_0();
-               return;
-       }
-       if (mappingSequence[0] instanceof FieldBinding) {
-               FieldBinding fieldBinding = (FieldBinding) mappingSequence[0];
-               if (scope.methodScope().isConstructorCall){
-                       scope.problemReporter().errorThisSuperInStatic(invocationSite);
-               }
-               this.aload_0();
-               this.getfield(fieldBinding);
-       } else {
-               load((LocalVariableBinding) mappingSequence[0]);
-       }
-       for (int i = 1, length = mappingSequence.length; i < length; i++) {
-               if (mappingSequence[i] instanceof FieldBinding) {
-                       FieldBinding fieldBinding = (FieldBinding) mappingSequence[i];
-                       this.getfield(fieldBinding);
-               } else {
-                       this.invokestatic((MethodBinding) mappingSequence[i]);
-               }
-       }
-}
-/**
- * The equivalent code performs a string conversion:
- *
- * @param oper1 org.eclipse.jdt.internal.compiler.lookup.BlockScope
- * @param oper1 org.eclipse.jdt.internal.compiler.ast.Expression
- * @param oper2 org.eclipse.jdt.internal.compiler.ast.Expression
- */
-public void generateStringAppend(BlockScope blockScope, Expression oper1, Expression oper2) {
-       int pc;
-       if (oper1 == null) {
-               /* Operand is already on the stack, and maybe nil:
-               note type1 is always to  java.lang.String here.*/
-               this.newStringBuffer();
-               this.dup_x1();
-               this.swap();
-               // If argument is reference type, need to transform it 
-               // into a string (handles null case)
-               this.invokeStringValueOf(T_Object);
-               this.invokeStringBufferStringConstructor();
-       } else {
-               pc = position;
-               oper1.generateOptimizedStringBufferCreation(blockScope, this, oper1.implicitConversion & 0xF);
-               this.recordPositionsFrom(pc, oper1.sourceStart);
-       }
-       pc = position;
-       oper2.generateOptimizedStringBuffer(blockScope, this, oper2.implicitConversion & 0xF);
-       this.recordPositionsFrom(pc, oper2.sourceStart);
-       this.invokeStringBufferToString();
-}
-/**
- * Code responsible to generate the suitable code to supply values for the synthetic arguments of
- * a constructor invocation of a nested type.
- */
-public void generateSyntheticArgumentValues(BlockScope currentScope, ReferenceBinding targetType, Expression enclosingInstance, AstNode invocationSite) {
+    // perform some emulation work in case there is some and we are inside a local type only
+    ReferenceBinding[] syntheticArgumentTypes;
 
-       // perform some emulation work in case there is some and we are inside a local type only
-       ReferenceBinding[] syntheticArgumentTypes;
+    // generate the enclosing instance first
+    if ((syntheticArgumentTypes = targetType.syntheticEnclosingInstanceTypes()) != null) {
 
-       // generate the enclosing instance first
-       if ((syntheticArgumentTypes = targetType.syntheticEnclosingInstanceTypes()) != null) {
+        ReferenceBinding targetEnclosingType =
+          targetType.isAnonymousType()
+            ? targetType.superclass().enclosingType() // supplying enclosing instance for the anonymous type's superclass
+  : targetType.enclosingType();
 
-               ReferenceBinding targetEnclosingType = targetType.isAnonymousType() ? 
-                               targetType.superclass().enclosingType() // supplying enclosing instance for the anonymous type's superclass
-                               : targetType.enclosingType();
-                               
-               for (int i = 0, max = syntheticArgumentTypes.length; i < max; i++) {
-                       ReferenceBinding syntheticArgType = syntheticArgumentTypes[i];
-                       if (enclosingInstance != null && i == 0) {
-                               if (syntheticArgType != targetEnclosingType) {
-                                       currentScope.problemReporter().unnecessaryEnclosingInstanceSpecification(enclosingInstance, targetType);
-                               }
-                               //if (currentScope.environment().options.complianceLevel >= CompilerOptions.JDK1_4){
-                               enclosingInstance.generateCode(currentScope, this, true);
-                               if (syntheticArgType == targetEnclosingType){
-                                       this.dup();
-                               } 
-                               this.invokeObjectGetClass(); // causes null check for all explicit enclosing instances
-                               this.pop();
-                               //} else {
-                               //      enclosingInstance.generateCode(currentScope, this, syntheticArgType == targetEnclosingType);
-                               //}                     
-                       } else {
-                               Object[] emulationPath = currentScope.getCompatibleEmulationPath(syntheticArgType);
-                               if (emulationPath == null) {
-                                       currentScope.problemReporter().missingEnclosingInstanceSpecification(syntheticArgType, invocationSite);
-                               } else {
-                                       this.generateOuterAccess(emulationPath, invocationSite, currentScope);
-                               }
-                       }
-               }
-       } else { // we may still have an enclosing instance to consider
-               if (enclosingInstance != null) {
-                       currentScope.problemReporter().unnecessaryEnclosingInstanceSpecification(enclosingInstance, targetType);
-                       //if (currentScope.environment().options.complianceLevel >= CompilerOptions.JDK1_4){
-                       enclosingInstance.generateCode(currentScope, this, true);
-                       this.invokeObjectGetClass(); // causes null check for all explicit enclosing instances
-                       this.pop();
-                       //} else {
-                       //      enclosingInstance.generateCode(currentScope, this, false); // do not want the value
-                       //}                     
-               }
-       }
-       // generate the synthetic outer arguments then
-       SyntheticArgumentBinding syntheticArguments[];
-       if ((syntheticArguments = targetType.syntheticOuterLocalVariables()) != null) {
-               for (int i = 0, max = syntheticArguments.length; i < max; i++) {
-                       VariableBinding[] emulationPath = currentScope.getEmulationPath(syntheticArguments[i].actualOuterLocalVariable);
-                       if (emulationPath == null) {
-                               // could not emulate a path to a given outer local variable (internal error)
-                               currentScope.problemReporter().needImplementation();
-                       } else {
-                               this.generateOuterAccess(emulationPath, invocationSite, currentScope);
-                       }
-               }
-       }
-}
-/**
- * @param parameters org.eclipse.jdt.internal.compiler.lookup.TypeBinding[]
- * @param constructorBinding org.eclipse.jdt.internal.compiler.lookup.MethodBinding
- */
-public void generateSyntheticBodyForConstructorAccess(SyntheticAccessMethodBinding accessBinding) {
+      for (int i = 0, max = syntheticArgumentTypes.length; i < max; i++) {
+        ReferenceBinding syntheticArgType = syntheticArgumentTypes[i];
+        if (enclosingInstance != null && i == 0) {
+          if (syntheticArgType != targetEnclosingType) {
+            currentScope.problemReporter().unnecessaryEnclosingInstanceSpecification(enclosingInstance, targetType);
+          }
+          //if (currentScope.environment().options.complianceLevel >= CompilerOptions.JDK1_4){
+          enclosingInstance.generateCode(currentScope, this, true);
+          if (syntheticArgType == targetEnclosingType) {
+            this.dup();
+          }
+          this.invokeObjectGetClass(); // causes null check for all explicit enclosing instances
+          this.pop();
+          //} else {
+          //   enclosingInstance.generateCode(currentScope, this, syntheticArgType == targetEnclosingType);
+          //}                  
+        } else {
+          Object[] emulationPath = currentScope.getCompatibleEmulationPath(syntheticArgType);
+          if (emulationPath == null) {
+            currentScope.problemReporter().missingEnclosingInstanceSpecification(syntheticArgType, invocationSite);
+          } else {
+            this.generateOuterAccess(emulationPath, invocationSite, currentScope);
+          }
+        }
+      }
+    } else { // we may still have an enclosing instance to consider
+      if (enclosingInstance != null) {
+        currentScope.problemReporter().unnecessaryEnclosingInstanceSpecification(enclosingInstance, targetType);
+        //if (currentScope.environment().options.complianceLevel >= CompilerOptions.JDK1_4){
+        enclosingInstance.generateCode(currentScope, this, true);
+        this.invokeObjectGetClass(); // causes null check for all explicit enclosing instances
+        this.pop();
+        //} else {
+        //     enclosingInstance.generateCode(currentScope, this, false); // do not want the value
+        //}                    
+      }
+    }
+    // generate the synthetic outer arguments then
+    SyntheticArgumentBinding syntheticArguments[];
+    if ((syntheticArguments = targetType.syntheticOuterLocalVariables()) != null) {
+      for (int i = 0, max = syntheticArguments.length; i < max; i++) {
+        VariableBinding[] emulationPath = currentScope.getEmulationPath(syntheticArguments[i].actualOuterLocalVariable);
+        if (emulationPath == null) {
+          // could not emulate a path to a given outer local variable (internal error)
+          currentScope.problemReporter().needImplementation();
+        } else {
+          this.generateOuterAccess(emulationPath, invocationSite, currentScope);
+        }
+      }
+    }
+  }
+  /**
+   * @param parameters org.eclipse.jdt.internal.compiler.lookup.TypeBinding[]
+   * @param constructorBinding org.eclipse.jdt.internal.compiler.lookup.MethodBinding
+   */
+  public void generateSyntheticBodyForConstructorAccess(SyntheticAccessMethodBinding accessBinding) {
 
-       initializeMaxLocals(accessBinding);
+    initializeMaxLocals(accessBinding);
 
-       MethodBinding constructorBinding = accessBinding.targetMethod;
-       TypeBinding[] parameters = constructorBinding.parameters;
-       int length = parameters.length;
-       int resolvedPosition = 1;
-       this.aload_0();
-       if (constructorBinding.declaringClass.isNestedType()) {
-               NestedTypeBinding nestedType = (NestedTypeBinding) constructorBinding.declaringClass;
-               SyntheticArgumentBinding[] syntheticArguments = nestedType.syntheticEnclosingInstances();
-               for (int i = 0; i < (syntheticArguments == null ? 0 : syntheticArguments.length); i++) {
-                       TypeBinding type;
-                       load((type = syntheticArguments[i].type), resolvedPosition);
-                       if ((type == DoubleBinding) || (type == LongBinding))
-                               resolvedPosition += 2;
-                       else
-                               resolvedPosition++;
-               }
-               syntheticArguments = nestedType.syntheticOuterLocalVariables();
-               for (int i = 0; i < (syntheticArguments == null ? 0 : syntheticArguments.length); i++) {
-                       TypeBinding type;
-                       load((type = syntheticArguments[i].type), resolvedPosition);
-                       if ((type == DoubleBinding) || (type == LongBinding))
-                               resolvedPosition += 2;
-                       else
-                               resolvedPosition++;
-               }
-       }
-       for (int i = 0; i < length; i++) {
-               load(parameters[i], resolvedPosition);
-               if ((parameters[i] == DoubleBinding) || (parameters[i] == LongBinding))
-                       resolvedPosition += 2;
-               else
-                       resolvedPosition++;
-       }
-       this.invokespecial(constructorBinding);
-       this.return_();
-}
-public void generateSyntheticBodyForFieldReadAccess(SyntheticAccessMethodBinding accessBinding) {
-       initializeMaxLocals(accessBinding);
-       FieldBinding fieldBinding = accessBinding.targetReadField;
-       TypeBinding type;
-       if (fieldBinding.isStatic())
-               this.getstatic(fieldBinding);
-       else {
-               this.aload_0();
-               this.getfield(fieldBinding);
-       }
-       if ((type = fieldBinding.type).isBaseType()) {
-               if (type == IntBinding)
-                       this.ireturn();
-               else
-                       if (type == FloatBinding)
-                               this.freturn();
-                       else
-                               if (type == LongBinding)
-                                       this.lreturn();
-                               else
-                                       if (type == DoubleBinding)
-                                               this.dreturn();
-                                       else
-                                               this.ireturn();
-       } else
-               this.areturn();
-}
-public void generateSyntheticBodyForFieldWriteAccess(SyntheticAccessMethodBinding accessBinding) {
-       initializeMaxLocals(accessBinding);
-       FieldBinding fieldBinding = accessBinding.targetWriteField;
-       if (fieldBinding.isStatic()) {
-               load(fieldBinding.type, 0);
-               this.putstatic(fieldBinding);
-       } else {
-               this.aload_0();
-               load(fieldBinding.type, 1);
-               this.putfield(fieldBinding);
-       }
-       this.return_();
-}
-public void generateSyntheticBodyForMethodAccess(SyntheticAccessMethodBinding accessBinding) {
+    MethodBinding constructorBinding = accessBinding.targetMethod;
+    TypeBinding[] parameters = constructorBinding.parameters;
+    int length = parameters.length;
+    int resolvedPosition = 1;
+    this.aload_0();
+    if (constructorBinding.declaringClass.isNestedType()) {
+      NestedTypeBinding nestedType = (NestedTypeBinding) constructorBinding.declaringClass;
+      SyntheticArgumentBinding[] syntheticArguments = nestedType.syntheticEnclosingInstances();
+      for (int i = 0; i < (syntheticArguments == null ? 0 : syntheticArguments.length); i++) {
+        TypeBinding type;
+        load((type = syntheticArguments[i].type), resolvedPosition);
+        if ((type == DoubleBinding) || (type == LongBinding))
+          resolvedPosition += 2;
+        else
+          resolvedPosition++;
+      }
+      syntheticArguments = nestedType.syntheticOuterLocalVariables();
+      for (int i = 0; i < (syntheticArguments == null ? 0 : syntheticArguments.length); i++) {
+        TypeBinding type;
+        load((type = syntheticArguments[i].type), resolvedPosition);
+        if ((type == DoubleBinding) || (type == LongBinding))
+          resolvedPosition += 2;
+        else
+          resolvedPosition++;
+      }
+    }
+    for (int i = 0; i < length; i++) {
+      load(parameters[i], resolvedPosition);
+      if ((parameters[i] == DoubleBinding) || (parameters[i] == LongBinding))
+        resolvedPosition += 2;
+      else
+        resolvedPosition++;
+    }
+    this.invokespecial(constructorBinding);
+    this.return_();
+  }
+  public void generateSyntheticBodyForFieldReadAccess(SyntheticAccessMethodBinding accessBinding) {
+    initializeMaxLocals(accessBinding);
+    FieldBinding fieldBinding = accessBinding.targetReadField;
+    TypeBinding type;
+    if (fieldBinding.isStatic())
+      this.getstatic(fieldBinding);
+    else {
+      this.aload_0();
+      this.getfield(fieldBinding);
+    }
+    if ((type = fieldBinding.type).isBaseType()) {
+      if (type == IntBinding)
+        this.ireturn();
+      else if (type == FloatBinding)
+        this.freturn();
+      else if (type == LongBinding)
+        this.lreturn();
+      else if (type == DoubleBinding)
+        this.dreturn();
+      else
+        this.ireturn();
+    } else
+      this.areturn();
+  }
+  public void generateSyntheticBodyForFieldWriteAccess(SyntheticAccessMethodBinding accessBinding) {
+    initializeMaxLocals(accessBinding);
+    FieldBinding fieldBinding = accessBinding.targetWriteField;
+    if (fieldBinding.isStatic()) {
+      load(fieldBinding.type, 0);
+      this.putstatic(fieldBinding);
+    } else {
+      this.aload_0();
+      load(fieldBinding.type, 1);
+      this.putfield(fieldBinding);
+    }
+    this.return_();
+  }
+  public void generateSyntheticBodyForMethodAccess(SyntheticAccessMethodBinding accessBinding) {
 
-       initializeMaxLocals(accessBinding);
-       MethodBinding methodBinding = accessBinding.targetMethod;
-       TypeBinding[] parameters = methodBinding.parameters;
-       int length = parameters.length;
-       int resolvedPosition;
-       if (methodBinding.isStatic())
-               resolvedPosition = 0;
-       else {
-               this.aload_0();
-               resolvedPosition = 1;
-       }
-       for (int i = 0; i < length; i++) {
-               load(parameters[i], resolvedPosition);
-               if ((parameters[i] == DoubleBinding) || (parameters[i] == LongBinding))
-                       resolvedPosition += 2;
-               else
-                       resolvedPosition++;
-       }
-       TypeBinding type;
-       if (methodBinding.isStatic())
-               this.invokestatic(methodBinding);
-       else {
-               if (methodBinding.isConstructor()
-                       || methodBinding.isPrivate()
-                       // qualified super "X.super.foo()" targets methods from superclass
-                       || (methodBinding.declaringClass != methodDeclaration.binding.declaringClass)){
-                       this.invokespecial(methodBinding);
-               } else {
-                       if (methodBinding.declaringClass.isInterface()){
-                               this.invokeinterface(methodBinding);
-                       } else {
-                               this.invokevirtual(methodBinding);
-                       }
-               }
-       }
-       if ((type = methodBinding.returnType).isBaseType())
-               if (type == VoidBinding)
-                       this.return_();
-               else
-                       if (type == IntBinding)
-                               this.ireturn();
-                       else
-                               if (type == FloatBinding)
-                                       this.freturn();
-                               else
-                                       if (type == LongBinding)
-                                               this.lreturn();
-                                       else
-                                               if (type == DoubleBinding)
-                                                       this.dreturn();
-                                               else
-                                                       this.ireturn();
-       else
-               this.areturn();
-}
-final public byte[] getContents() {
-       byte[] contents;
-       System.arraycopy(bCodeStream, 0, contents = new byte[position], 0, position);
-       return contents;
-}
-final public void getfield(FieldBinding fieldBinding) {
-       countLabels = 0;
-       if ((fieldBinding.type.id == T_double) || (fieldBinding.type.id == T_long)) {
-               if (++stackDepth > stackMax)
-                       stackMax = stackDepth;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_getfield;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_getfield);
-       }
-       writeUnsignedShort(constantPool.literalIndex(fieldBinding));
-}
-final public void getstatic(FieldBinding fieldBinding) {
-       countLabels = 0;
-       if ((fieldBinding.type.id == T_double) || (fieldBinding.type.id == T_long))
-               stackDepth += 2;
-       else
-               stackDepth += 1;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_getstatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_getstatic);
-       }
-       writeUnsignedShort(constantPool.literalIndex(fieldBinding));
-}
-public void getSystemOut() {
-       countLabels = 0;
-       if (++stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_getstatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_getstatic);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangSystemOut());
-}
-public void getTYPE(int baseTypeID) {
-       countLabels = 0;
-       if (++stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_getstatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_getstatic);
-       }
-       switch (baseTypeID) {
-               // getstatic: java.lang.Byte.TYPE                       
-               case T_byte :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangByteTYPE());
-                       break;
-                       // getstatic: java.lang.Short.TYPE                      
-               case T_short :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangShortTYPE());
-                       break;
-                       // getstatic: java.lang.Character.TYPE                  
-               case T_char :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangCharacterTYPE());
-                       break;
-                       // getstatic: java.lang.Integer.TYPE                    
-               case T_int :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangIntegerTYPE());
-                       break;
-                       // getstatic: java.lang.Long.TYPE                       
-               case T_long :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangLongTYPE());
-                       break;
-                       // getstatic: java.lang.Float.TYPE                      
-               case T_float :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangFloatTYPE());
-                       break;
-                       // getstatic: java.lang.Double.TYPE                     
-               case T_double :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangDoubleTYPE());
-                       break;
-                       // getstatic: java.lang.Boolean.TYPE                    
-               case T_boolean :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangBooleanTYPE());
-                       break;
-                       // getstatic: java.lang.Void.TYPE
-               case T_void :
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangVoidTYPE());
-                       break;
-       }
-}
-/**
- * We didn't call it goto, because there is a conflit with the goto keyword
- */
-final public void goto_(Label lbl) {
-       if (this.wideMode) {
-               this.goto_w(lbl);
-               return;
-       }
-       try {
-               lbl.inlineForwardReferencesFromLabelsTargeting(position);
-               /*
-                Possible optimization for code such as:
-                public Object foo() {
-                       boolean b = true;
-                       if (b) {
-                               if (b)
-                                       return null;
-                       } else {
-                               if (b) {
-                                       return null;
-                               }
-                       }
-                       return null;
-               }
-               The goto around the else block for the first if will
-               be unreachable, because the thenClause of the second if
-               returns.
-               See inlineForwardReferencesFromLabelsTargeting defined
-               on the Label class for the remaining part of this
-               optimization.
-                if (!lbl.isBranchTarget(position)) {
-                       switch(bCodeStream[classFileOffset-1]) {
-                               case OPC_return :
-                               case OPC_areturn:
-                                       return;
-                       }
-               }*/
-               position++;
-               bCodeStream[classFileOffset++] = OPC_goto;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_goto);
-       }
-       lbl.branch();
-}
+    initializeMaxLocals(accessBinding);
+    MethodBinding methodBinding = accessBinding.targetMethod;
+    TypeBinding[] parameters = methodBinding.parameters;
+    int length = parameters.length;
+    int resolvedPosition;
+    if (methodBinding.isStatic())
+      resolvedPosition = 0;
+    else {
+      this.aload_0();
+      resolvedPosition = 1;
+    }
+    for (int i = 0; i < length; i++) {
+      load(parameters[i], resolvedPosition);
+      if ((parameters[i] == DoubleBinding) || (parameters[i] == LongBinding))
+        resolvedPosition += 2;
+      else
+        resolvedPosition++;
+    }
+    TypeBinding type;
+    if (methodBinding.isStatic())
+      this.invokestatic(methodBinding);
+    else {
+      if (methodBinding.isConstructor()
+        || methodBinding.isPrivate() // qualified super "X.super.foo()" targets methods from superclass
+        || (methodBinding.declaringClass != methodDeclaration.binding.declaringClass)) {
+        this.invokespecial(methodBinding);
+      } else {
+        if (methodBinding.declaringClass.isInterface()) {
+          this.invokeinterface(methodBinding);
+        } else {
+          this.invokevirtual(methodBinding);
+        }
+      }
+    }
+    if ((type = methodBinding.returnType).isBaseType())
+      if (type == VoidBinding)
+        this.return_();
+      else if (type == IntBinding)
+        this.ireturn();
+      else if (type == FloatBinding)
+        this.freturn();
+      else if (type == LongBinding)
+        this.lreturn();
+      else if (type == DoubleBinding)
+        this.dreturn();
+      else
+        this.ireturn();
+    else
+      this.areturn();
+  }
+  final public byte[] getContents() {
+    byte[] contents;
+    System.arraycopy(bCodeStream, 0, contents = new byte[position], 0, position);
+    return contents;
+  }
+  final public void getfield(FieldBinding fieldBinding) {
+    countLabels = 0;
+    if ((fieldBinding.type.id == T_double) || (fieldBinding.type.id == T_long)) {
+      if (++stackDepth > stackMax)
+        stackMax = stackDepth;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_getfield;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_getfield);
+    }
+    writeUnsignedShort(constantPool.literalIndex(fieldBinding));
+  }
+  final public void getstatic(FieldBinding fieldBinding) {
+    countLabels = 0;
+    if ((fieldBinding.type.id == T_double) || (fieldBinding.type.id == T_long))
+      stackDepth += 2;
+    else
+      stackDepth += 1;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_getstatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_getstatic);
+    }
+    writeUnsignedShort(constantPool.literalIndex(fieldBinding));
+  }
+  public void getSystemOut() {
+    countLabels = 0;
+    if (++stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_getstatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_getstatic);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangSystemOut());
+  }
+  public void getTYPE(int baseTypeID) {
+    countLabels = 0;
+    if (++stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_getstatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_getstatic);
+    }
+    switch (baseTypeID) {
+      // getstatic: java.lang.Byte.TYPE                        
+      case T_byte :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangByteTYPE());
+        break;
+        // getstatic: java.lang.Short.TYPE                     
+      case T_short :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangShortTYPE());
+        break;
+        // getstatic: java.lang.Character.TYPE                 
+      case T_char :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangCharacterTYPE());
+        break;
+        // getstatic: java.lang.Integer.TYPE                   
+      case T_int :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangIntegerTYPE());
+        break;
+        // getstatic: java.lang.Long.TYPE                      
+      case T_long :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangLongTYPE());
+        break;
+        // getstatic: java.lang.Float.TYPE                     
+      case T_float :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangFloatTYPE());
+        break;
+        // getstatic: java.lang.Double.TYPE                    
+      case T_double :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangDoubleTYPE());
+        break;
+        // getstatic: java.lang.Boolean.TYPE                   
+      case T_boolean :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangBooleanTYPE());
+        break;
+        // getstatic: java.lang.Void.TYPE
+      case T_void :
+        writeUnsignedShort(constantPool.literalIndexForJavaLangVoidTYPE());
+        break;
+    }
+  }
+  /**
+   * We didn't call it goto, because there is a conflit with the goto keyword
+   */
+  final public void goto_(Label lbl) {
+    if (this.wideMode) {
+      this.goto_w(lbl);
+      return;
+    }
+    try {
+      lbl.inlineForwardReferencesFromLabelsTargeting(position);
+      /*
+       Possible optimization for code such as:
+       public Object foo() {
+       boolean b = true;
+       if (b) {
+               if (b)
+                       return null;
+       } else {
+               if (b) {
+                       return null;
+               }
+       }
+       return null;
+      }
+      The goto around the else block for the first if will
+      be unreachable, because the thenClause of the second if
+      returns.
+      See inlineForwardReferencesFromLabelsTargeting defined
+      on the Label class for the remaining part of this
+      optimization.
+       if (!lbl.isBranchTarget(position)) {
+       switch(bCodeStream[classFileOffset-1]) {
+               case OPC_return :
+               case OPC_areturn:
+                       return;
+       }
+      }*/
+      position++;
+      bCodeStream[classFileOffset++] = OPC_goto;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_goto);
+    }
+    lbl.branch();
+  }
 
-/**
- * We didn't call it goto, because there is a conflit with the goto keyword
- */
-final public void internal_goto_(Label lbl) {
-       try {
-               lbl.inlineForwardReferencesFromLabelsTargeting(position);
-               /*
-                Possible optimization for code such as:
-                public Object foo() {
-                       boolean b = true;
-                       if (b) {
-                               if (b)
-                                       return null;
-                       } else {
-                               if (b) {
-                                       return null;
-                               }
-                       }
-                       return null;
-               }
-               The goto around the else block for the first if will
-               be unreachable, because the thenClause of the second if
-               returns.
-               See inlineForwardReferencesFromLabelsTargeting defined
-               on the Label class for the remaining part of this
-               optimization.
-                if (!lbl.isBranchTarget(position)) {
-                       switch(bCodeStream[classFileOffset-1]) {
-                               case OPC_return :
-                               case OPC_areturn:
-                                       return;
-                       }
-               }*/
-               position++;
-               bCodeStream[classFileOffset++] = OPC_goto;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_goto);
-       }
-       lbl.branch();
-}
-final public void goto_w(Label lbl) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_goto_w;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_goto_w);
-       }
-       lbl.branchWide();
-}
-final public void i2b() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2b);
-       }
-}
-final public void i2c() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2c;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2c);
-       }
-}
-final public void i2d() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2d;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2d);
-       }
-}
-final public void i2f() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2f;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2f);
-       }
-}
-final public void i2l() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2l;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2l);
-       }
-}
-final public void i2s() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_i2s;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_i2s);
-       }
-}
-final public void iadd() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iadd;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iadd);
-       }
-}
-final public void iaload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iaload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iaload);
-       }
-}
-final public void iand() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iand;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iand);
-       }
-}
-final public void iastore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iastore);
-       }
-}
-final public void iconst_0() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_0);
-       }
-}
-final public void iconst_1() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_1);
-       }
-}
-final public void iconst_2() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_2);
-       }
-}
-final public void iconst_3() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_3);
-       }
-}
-final public void iconst_4() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_4;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_4);
-       }
-}
-final public void iconst_5() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_5;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_5);
-       }
-}
-final public void iconst_m1() {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iconst_m1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iconst_m1);
-       }
-}
-final public void idiv() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_idiv;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_idiv);
-       }
-}
-final public void if_acmpeq(Label lbl) {
-       countLabels = 0;
-       stackDepth-=2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_acmpeq, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_acmpeq;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_acmpeq);
-               }
-               lbl.branch();
-       }
-}
-final public void if_acmpne(Label lbl) {
-       countLabels = 0;
-       stackDepth-=2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_acmpne, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_acmpne;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_acmpne);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmpeq(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmpeq, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmpeq;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmpeq);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmpge(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmpge, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmpge;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmpge);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmpgt(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmpgt, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmpgt;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmpgt);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmple(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmple, lbl);
-       } else {        
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmple;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmple);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmplt(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmplt, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmplt;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmplt);
-               }
-               lbl.branch();
-       }
-}
-final public void if_icmpne(Label lbl) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_if_icmpne, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_if_icmpne;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_if_icmpne);
-               }
-               lbl.branch();
-       }
-}
-final public void ifeq(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifeq, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifeq;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifeq);
-               }
-               lbl.branch();
-       }
-}
-final public void ifge(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifge, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifge;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifge);
-               }
-               lbl.branch();
-       }
-}
-final public void ifgt(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifgt, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifgt;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifgt);
-               }
-               lbl.branch();
-       }
-}
-final public void ifle(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifle, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifle;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifle);
-               }
-               lbl.branch();
-       }
-}
-final public void iflt(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_iflt, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_iflt;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_iflt);
-               }
-               lbl.branch();
-       }
-}
-final public void ifne(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifne, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifne;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifne);
-               }
-               lbl.branch();
-       }
-}
-final public void ifnonnull(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifnonnull, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifnonnull;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifnonnull);
-               }
-               lbl.branch();
-       }
-}
-final public void ifnull(Label lbl) {
-       countLabels = 0;
-       stackDepth--;
-       if (this.wideMode) {
-               generateWideConditionalBranch(OPC_ifnull, lbl);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ifnull;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ifnull);
-               }
-               lbl.branch();
-       }
-}
-final public void iinc(int index, int value) {
-       countLabels = 0;
-       if ((index > 255) || (value < -128 || value > 127)) { // have to widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_iinc;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_iinc);
-               }
-               writeUnsignedShort(index);
-               writeSignedShort(value);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_iinc;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_iinc);
-               }
-               writeUnsignedByte(index);
-               writeSignedByte(value);
-       }
-}
-final public void iload(int iArg) {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_iload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_iload);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_iload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_iload);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void iload_0() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 0) {
-               maxLocals = 1;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iload_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iload_0);
-       }
-}
-final public void iload_1() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iload_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iload_1);
-       }
-}
-final public void iload_2() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iload_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iload_2);
-       }
-}
-final public void iload_3() {
-       countLabels = 0;
-       stackDepth++;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iload_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iload_3);
-       }
-}
-final public void imul() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_imul;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_imul);
-       }
-}
-public void incrementTemp(LocalVariableBinding localBinding, int value) {
-       if (value == (short) value) {
-               this.iinc(localBinding.resolvedPosition, value);
-               return;
-       }
-       load(localBinding);
-       this.ldc(value);
-       this.iadd();
-       store(localBinding, false);
-}
-public void incrStackSize(int offset) {
-       if ((stackDepth += offset) > stackMax)
-               stackMax = stackDepth;
-}
-public int indexOfSameLineEntrySincePC(int pc, int line) {
-       for (int index = pc, max = pcToSourceMapSize; index < max; index+=2) {
-               if (pcToSourceMap[index+1] == line)
-                       return index;
-       }
-       return -1;
-}
-final public void ineg() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ineg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ineg);
-       }
-}
-public void init(ClassFile classFile) {
-       this.classFile = classFile;
-       this.constantPool = classFile.constantPool;
-       this.bCodeStream = classFile.contents;
-       this.classFileOffset = classFile.contentsOffset;
-       this.startingClassFileOffset = this.classFileOffset;
-       pcToSourceMapSize = 0;
-       lastEntryPC = 0;
-       int length = visibleLocals.length;
-       if (noVisibleLocals.length < length) {
-               noVisibleLocals = new LocalVariableBinding[length];
-       }
-       System.arraycopy(noVisibleLocals, 0, visibleLocals, 0, length);
-       visibleLocalsCount = 0;
-       
-       length = locals.length;
-       if (noLocals.length < length) {
-               noLocals = new LocalVariableBinding[length];
-       }
-       System.arraycopy(noLocals, 0, locals, 0, length);
-       allLocalsCounter = 0;
+  /**
+   * We didn't call it goto, because there is a conflit with the goto keyword
+   */
+  final public void internal_goto_(Label lbl) {
+    try {
+      lbl.inlineForwardReferencesFromLabelsTargeting(position);
+      /*
+       Possible optimization for code such as:
+       public Object foo() {
+       boolean b = true;
+       if (b) {
+               if (b)
+                       return null;
+       } else {
+               if (b) {
+                       return null;
+               }
+       }
+       return null;
+      }
+      The goto around the else block for the first if will
+      be unreachable, because the thenClause of the second if
+      returns.
+      See inlineForwardReferencesFromLabelsTargeting defined
+      on the Label class for the remaining part of this
+      optimization.
+       if (!lbl.isBranchTarget(position)) {
+       switch(bCodeStream[classFileOffset-1]) {
+               case OPC_return :
+               case OPC_areturn:
+                       return;
+       }
+      }*/
+      position++;
+      bCodeStream[classFileOffset++] = OPC_goto;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_goto);
+    }
+    lbl.branch();
+  }
+  final public void goto_w(Label lbl) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_goto_w;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_goto_w);
+    }
+    lbl.branchWide();
+  }
+  final public void i2b() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2b);
+    }
+  }
+  final public void i2c() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2c;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2c);
+    }
+  }
+  final public void i2d() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2d;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2d);
+    }
+  }
+  final public void i2f() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2f;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2f);
+    }
+  }
+  final public void i2l() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2l;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2l);
+    }
+  }
+  final public void i2s() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_i2s;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_i2s);
+    }
+  }
+  final public void iadd() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iadd;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iadd);
+    }
+  }
+  final public void iaload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iaload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iaload);
+    }
+  }
+  final public void iand() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iand;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iand);
+    }
+  }
+  final public void iastore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iastore);
+    }
+  }
+  final public void iconst_0() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_0);
+    }
+  }
+  final public void iconst_1() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_1);
+    }
+  }
+  final public void iconst_2() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_2);
+    }
+  }
+  final public void iconst_3() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_3);
+    }
+  }
+  final public void iconst_4() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_4;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_4);
+    }
+  }
+  final public void iconst_5() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_5;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_5);
+    }
+  }
+  final public void iconst_m1() {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iconst_m1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iconst_m1);
+    }
+  }
+  final public void idiv() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_idiv;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_idiv);
+    }
+  }
+  final public void if_acmpeq(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_acmpeq, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_acmpeq;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_acmpeq);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_acmpne(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_acmpne, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_acmpne;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_acmpne);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmpeq(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmpeq, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmpeq;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmpeq);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmpge(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmpge, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmpge;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmpge);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmpgt(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmpgt, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmpgt;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmpgt);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmple(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmple, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmple;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmple);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmplt(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmplt, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmplt;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmplt);
+      }
+      lbl.branch();
+    }
+  }
+  final public void if_icmpne(Label lbl) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_if_icmpne, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_if_icmpne;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_if_icmpne);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifeq(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifeq, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifeq;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifeq);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifge(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifge, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifge;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifge);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifgt(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifgt, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifgt;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifgt);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifle(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifle, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifle;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifle);
+      }
+      lbl.branch();
+    }
+  }
+  final public void iflt(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_iflt, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_iflt;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_iflt);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifne(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifne, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifne;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifne);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifnonnull(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifnonnull, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifnonnull;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifnonnull);
+      }
+      lbl.branch();
+    }
+  }
+  final public void ifnull(Label lbl) {
+    countLabels = 0;
+    stackDepth--;
+    if (this.wideMode) {
+      generateWideConditionalBranch(OPC_ifnull, lbl);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ifnull;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ifnull);
+      }
+      lbl.branch();
+    }
+  }
+  final public void iinc(int index, int value) {
+    countLabels = 0;
+    if ((index > 255) || (value < -128 || value > 127)) { // have to widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_iinc;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_iinc);
+      }
+      writeUnsignedShort(index);
+      writeSignedShort(value);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_iinc;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_iinc);
+      }
+      writeUnsignedByte(index);
+      writeSignedByte(value);
+    }
+  }
+  final public void iload(int iArg) {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_iload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_iload);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_iload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_iload);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void iload_0() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 0) {
+      maxLocals = 1;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iload_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iload_0);
+    }
+  }
+  final public void iload_1() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iload_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iload_1);
+    }
+  }
+  final public void iload_2() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iload_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iload_2);
+    }
+  }
+  final public void iload_3() {
+    countLabels = 0;
+    stackDepth++;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iload_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iload_3);
+    }
+  }
+  final public void imul() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_imul;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_imul);
+    }
+  }
+  public void incrementTemp(LocalVariableBinding localBinding, int value) {
+    if (value == (short) value) {
+      this.iinc(localBinding.resolvedPosition, value);
+      return;
+    }
+    load(localBinding);
+    this.ldc(value);
+    this.iadd();
+    store(localBinding, false);
+  }
+  public void incrStackSize(int offset) {
+    if ((stackDepth += offset) > stackMax)
+      stackMax = stackDepth;
+  }
+  public int indexOfSameLineEntrySincePC(int pc, int line) {
+    for (int index = pc, max = pcToSourceMapSize; index < max; index += 2) {
+      if (pcToSourceMap[index + 1] == line)
+        return index;
+    }
+    return -1;
+  }
+  final public void ineg() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ineg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ineg);
+    }
+  }
+  public void init(ClassFile classFile) {
+    this.classFile = classFile;
+    this.constantPool = classFile.constantPool;
+    this.bCodeStream = classFile.contents;
+    this.classFileOffset = classFile.contentsOffset;
+    this.startingClassFileOffset = this.classFileOffset;
+    pcToSourceMapSize = 0;
+    lastEntryPC = 0;
+    int length = visibleLocals.length;
+    if (noVisibleLocals.length < length) {
+      noVisibleLocals = new LocalVariableBinding[length];
+    }
+    System.arraycopy(noVisibleLocals, 0, visibleLocals, 0, length);
+    visibleLocalsCount = 0;
 
-       length = exceptionHandlers.length;
-       if (noExceptionHandlers.length < length) {
-               noExceptionHandlers = new ExceptionLabel[length];
-       }
-       System.arraycopy(noExceptionHandlers, 0, exceptionHandlers, 0, length);
-       exceptionHandlersNumber = 0;
-       
-       length = labels.length;
-       if (noLabels.length < length) {
-               noLabels = new Label[length];
-       }
-       System.arraycopy(noLabels, 0, labels, 0, length);
-       countLabels = 0;
+    length = locals.length;
+    if (noLocals.length < length) {
+      noLocals = new LocalVariableBinding[length];
+    }
+    System.arraycopy(noLocals, 0, locals, 0, length);
+    allLocalsCounter = 0;
 
-       stackMax = 0;
-       stackDepth = 0;
-       maxLocals = 0;
-       position = 0;
-}
-/**
- * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
- * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
- */
-public void initializeMaxLocals(MethodBinding methodBinding) {
+    length = exceptionHandlers.length;
+    if (noExceptionHandlers.length < length) {
+      noExceptionHandlers = new ExceptionLabel[length];
+    }
+    System.arraycopy(noExceptionHandlers, 0, exceptionHandlers, 0, length);
+    exceptionHandlersNumber = 0;
 
-       maxLocals = (methodBinding == null || methodBinding.isStatic()) ? 0 : 1;
-       // take into account the synthetic parameters
-       if (methodBinding != null) {
-               if (methodBinding.isConstructor() && methodBinding.declaringClass.isNestedType()) {
-                       ReferenceBinding enclosingInstanceTypes[];
-                       if ((enclosingInstanceTypes = methodBinding.declaringClass.syntheticEnclosingInstanceTypes()) != null) {
-                               for (int i = 0, max = enclosingInstanceTypes.length; i < max; i++) {
-                                       maxLocals++; // an enclosingInstanceType can only be a reference binding. It cannot be
-                                       // LongBinding or DoubleBinding
-                               }
-                       }
-                       SyntheticArgumentBinding syntheticArguments[];
-                       if ((syntheticArguments = methodBinding.declaringClass.syntheticOuterLocalVariables()) != null) {
-                               for (int i = 0, max = syntheticArguments.length; i < max; i++) {
-                                       TypeBinding argType;
-                                       if (((argType = syntheticArguments[i].type) == LongBinding) || (argType == DoubleBinding)) {
-                                               maxLocals += 2;
-                                       } else {
-                                               maxLocals++;
-                                       }
-                               }
-                       }
-               }
-               TypeBinding[] arguments;
-               if ((arguments = methodBinding.parameters) != null) {
-                       for (int i = 0, max = arguments.length; i < max; i++) {
-                               TypeBinding argType;
-                               if (((argType = arguments[i]) == LongBinding) || (argType == DoubleBinding)) {
-                                       maxLocals += 2;
-                               } else {
-                                       maxLocals++;
-                               }
-                       }
-               }
-       }
-}
-/**
- * This methods searches for an existing entry inside the pcToSourceMap table with a pc equals to @pc.
- * If there is an existing entry it returns -1 (no insertion required).
- * Otherwise it returns the index where the entry for the pc has to be inserted.
- * This is based on the fact that the pcToSourceMap table is sorted according to the pc.
- *
- * @param int pc
- * @return int
- */
-public static int insertionIndex(int[] pcToSourceMap, int length, int pc) {
-       int g = 0;
-       int d = length - 2;
-       int m = 0;
-       while (g <= d) {
-               m = (g + d) / 2;
-               // we search only on even indexes
-               if ((m % 2) != 0)
-                       m--;
-               int currentPC = pcToSourceMap[m];
-               if (pc < currentPC) {
-                       d = m - 2;
-               } else
-                       if (pc > currentPC) {
-                               g = m + 2;
-                       } else {
-                               return -1;
-                       }
-       }
-       if (pc < pcToSourceMap[m])
-               return m;
-       return m + 2;
-}
-/**
- * We didn't call it instanceof because there is a conflit with the
- * instanceof keyword
- */
-final public void instance_of(TypeBinding typeBinding) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_instanceof;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_instanceof);
-       }
-       writeUnsignedShort(constantPool.literalIndex(typeBinding));
-}
-public void invokeClassForName() {
-       // invokestatic: java.lang.Class.forName(Ljava.lang.String;)Ljava.lang.Class;
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokestatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokestatic);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangClassForName());
-}
+    length = labels.length;
+    if (noLabels.length < length) {
+      noLabels = new Label[length];
+    }
+    System.arraycopy(noLabels, 0, labels, 0, length);
+    countLabels = 0;
 
-public void invokeJavaLangClassDesiredAssertionStatus() {
-       // invokevirtual: java.lang.Class.desiredAssertionStatus()Z;
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangClassDesiredAssertionStatus());
-}
+    stackMax = 0;
+    stackDepth = 0;
+    maxLocals = 0;
+    position = 0;
+  }
+  /**
+   * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
+   * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
+   */
+  public void initializeMaxLocals(MethodBinding methodBinding) {
 
-public void invokeConstructorGetConstructor() {
-       // invokevirtual: java.lang.Class.getConstructor(java.lang.Class[])Ljava.lang.reflect.Constructor;
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangClassGetConstructor());
-}
-final public void invokeinterface(MethodBinding methodBinding) {
-       // initialized to 1 to take into account this  immediately
-       countLabels = 0;
-       int argCount = 1;
-       int id;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokeinterface;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokeinterface);
-       }
-       writeUnsignedShort(constantPool.literalIndex(methodBinding));
-       for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
-               if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
-                       argCount += 2;
-               else
-                       argCount += 1;
-       writeUnsignedByte(argCount);
-       // Generate a  0 into the byte array. Like the array is already fill with 0, we just need to increment
-       // the number of bytes.
-       position++;
-       classFileOffset++;
-       if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
-               stackDepth += (2 - argCount);
-       else
-               if (id == T_void)
-                       stackDepth -= argCount;
-               else
-                       stackDepth += (1 - argCount);
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-}
-public void invokeJavaLangErrorConstructor() {
-       // invokespecial: java.lang.Error<init>(Ljava.lang.String;)V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       stackDepth -= 2;
-       writeUnsignedShort(constantPool.literalIndexForJavaLangErrorConstructor());
-}
-public void invokeNoClassDefFoundErrorStringConstructor() {
-       // invokespecial: java.lang.NoClassDefFoundError.<init>(Ljava.lang.String;)V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangNoClassDefFoundErrorStringConstructor());
-       stackDepth -= 2;
-}
-public void invokeObjectNewInstance() {
-       // invokevirtual: java.lang.reflect.Constructor.newInstance(java.lang.Object[])Ljava.lang.Object;
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangReflectConstructorNewInstance());
-}
+    maxLocals = (methodBinding == null || methodBinding.isStatic()) ? 0 : 1;
+    // take into account the synthetic parameters
+    if (methodBinding != null) {
+      if (methodBinding.isConstructor() && methodBinding.declaringClass.isNestedType()) {
+        ReferenceBinding enclosingInstanceTypes[];
+        if ((enclosingInstanceTypes = methodBinding.declaringClass.syntheticEnclosingInstanceTypes()) != null) {
+          for (int i = 0, max = enclosingInstanceTypes.length; i < max; i++) {
+            maxLocals++; // an enclosingInstanceType can only be a reference binding. It cannot be
+            // LongBinding or DoubleBinding
+          }
+        }
+        SyntheticArgumentBinding syntheticArguments[];
+        if ((syntheticArguments = methodBinding.declaringClass.syntheticOuterLocalVariables()) != null) {
+          for (int i = 0, max = syntheticArguments.length; i < max; i++) {
+            TypeBinding argType;
+            if (((argType = syntheticArguments[i].type) == LongBinding) || (argType == DoubleBinding)) {
+              maxLocals += 2;
+            } else {
+              maxLocals++;
+            }
+          }
+        }
+      }
+      TypeBinding[] arguments;
+      if ((arguments = methodBinding.parameters) != null) {
+        for (int i = 0, max = arguments.length; i < max; i++) {
+          TypeBinding argType;
+          if (((argType = arguments[i]) == LongBinding) || (argType == DoubleBinding)) {
+            maxLocals += 2;
+          } else {
+            maxLocals++;
+          }
+        }
+      }
+    }
+  }
+  /**
+   * This methods searches for an existing entry inside the pcToSourceMap table with a pc equals to @pc.
+   * If there is an existing entry it returns -1 (no insertion required).
+   * Otherwise it returns the index where the entry for the pc has to be inserted.
+   * This is based on the fact that the pcToSourceMap table is sorted according to the pc.
+   *
+   * @param int pc
+   * @return int
+   */
+  public static int insertionIndex(int[] pcToSourceMap, int length, int pc) {
+    int g = 0;
+    int d = length - 2;
+    int m = 0;
+    while (g <= d) {
+      m = (g + d) / 2;
+      // we search only on even indexes
+      if ((m % 2) != 0)
+        m--;
+      int currentPC = pcToSourceMap[m];
+      if (pc < currentPC) {
+        d = m - 2;
+      } else if (pc > currentPC) {
+        g = m + 2;
+      } else {
+        return -1;
+      }
+    }
+    if (pc < pcToSourceMap[m])
+      return m;
+    return m + 2;
+  }
+  /**
+   * We didn't call it instanceof because there is a conflit with the
+   * instanceof keyword
+   */
+  final public void instance_of(TypeBinding typeBinding) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_instanceof;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_instanceof);
+    }
+    writeUnsignedShort(constantPool.literalIndex(typeBinding));
+  }
+  public void invokeClassForName() {
+    // invokestatic: java.lang.Class.forName(Ljava.lang.String;)Ljava.lang.Class;
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokestatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokestatic);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangClassForName());
+  }
 
-public void invokeObjectGetClass() {
-       // invokevirtual: java.lang.Object.getClass()Ljava.lang.Class;
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangObjectGetClass());
-}
+  public void invokeJavaLangClassDesiredAssertionStatus() {
+    // invokevirtual: java.lang.Class.desiredAssertionStatus()Z;
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangClassDesiredAssertionStatus());
+  }
 
-final public void invokespecial(MethodBinding methodBinding) {
-       // initialized to 1 to take into account this  immediately
-       countLabels = 0;
-       int argCount = 1;
-       int id;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndex(methodBinding));
-       if (methodBinding.isConstructor() && methodBinding.declaringClass.isNestedType()) {
-               // enclosing instances
-               TypeBinding[] syntheticArgumentTypes = methodBinding.declaringClass.syntheticEnclosingInstanceTypes();
-               if (syntheticArgumentTypes != null) {
-                       for (int i = 0, max = syntheticArgumentTypes.length; i < max; i++) {
-                               if (((id = syntheticArgumentTypes[i].id) == T_double) || (id == T_long)) {
-                                       argCount += 2;
-                               } else {
-                                       argCount++;
-                               }
-                       }
-               }
-               // outer local variables
-               SyntheticArgumentBinding[] syntheticArguments = methodBinding.declaringClass.syntheticOuterLocalVariables();
-               if (syntheticArguments != null) {
-                       for (int i = 0, max = syntheticArguments.length; i < max; i++) {
-                               if (((id = syntheticArguments[i].type.id) == T_double) || (id == T_long)) {
-                                       argCount += 2;
-                               } else {
-                                       argCount++;
-                               }
-                       }
-               }
-       }
-       for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
-               if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
-                       argCount += 2;
-               else
-                       argCount++;
-       if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
-               stackDepth += (2 - argCount);
-       else
-               if (id == T_void)
-                       stackDepth -= argCount;
-               else
-                       stackDepth += (1 - argCount);
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-}
-final public void invokestatic(MethodBinding methodBinding) {
-       // initialized to 0 to take into account that there is no this for
-       // a static method
-       countLabels = 0;
-       int argCount = 0;
-       int id;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokestatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokestatic);
-       }
-       writeUnsignedShort(constantPool.literalIndex(methodBinding));
-       for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
-               if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
-                       argCount += 2;
-               else
-                       argCount += 1;
-       if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
-               stackDepth += (2 - argCount);
-       else
-               if (id == T_void)
-                       stackDepth -= argCount;
-               else
-                       stackDepth += (1 - argCount);
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-}
-/**
- * The equivalent code performs a string conversion of the TOS
- * @param typeID <CODE>int</CODE>
- */
-public void invokeStringBufferAppendForType(int typeID) {
-       countLabels = 0;
-       int usedTypeID;
-       if (typeID == T_null)
-               usedTypeID = T_String;
-       else
-               usedTypeID = typeID;
-       // invokevirtual
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferAppend(typeID));
-       if ((usedTypeID == T_long) || (usedTypeID == T_double))
-               stackDepth -= 2;
-       else
-               stackDepth--;
-}
+  public void invokeConstructorGetConstructor() {
+    // invokevirtual: java.lang.Class.getConstructor(java.lang.Class[])Ljava.lang.reflect.Constructor;
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangClassGetConstructor());
+  }
+  final public void invokeinterface(MethodBinding methodBinding) {
+    // initialized to 1 to take into account this  immediately
+    countLabels = 0;
+    int argCount = 1;
+    int id;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokeinterface;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokeinterface);
+    }
+    writeUnsignedShort(constantPool.literalIndex(methodBinding));
+    for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
+      if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
+        argCount += 2;
+      else
+        argCount += 1;
+    writeUnsignedByte(argCount);
+    // Generate a  0 into the byte array. Like the array is already fill with 0, we just need to increment
+    // the number of bytes.
+    position++;
+    classFileOffset++;
+    if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
+      stackDepth += (2 - argCount);
+    else if (id == T_void)
+      stackDepth -= argCount;
+    else
+      stackDepth += (1 - argCount);
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+  }
+  public void invokeJavaLangErrorConstructor() {
+    // invokespecial: java.lang.Error<init>(Ljava.lang.String;)V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    stackDepth -= 2;
+    writeUnsignedShort(constantPool.literalIndexForJavaLangErrorConstructor());
+  }
+  public void invokeNoClassDefFoundErrorStringConstructor() {
+    // invokespecial: java.lang.NoClassDefFoundError.<init>(Ljava.lang.String;)V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangNoClassDefFoundErrorStringConstructor());
+    stackDepth -= 2;
+  }
+  public void invokeObjectNewInstance() {
+    // invokevirtual: java.lang.reflect.Constructor.newInstance(java.lang.Object[])Ljava.lang.Object;
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangReflectConstructorNewInstance());
+  }
 
-public void invokeJavaLangAssertionErrorConstructor(int typeBindingID) {
-       // invokespecial: java.lang.AssertionError.<init>(typeBindingID)V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionErrorConstructor(typeBindingID));
-       stackDepth -= 2;
-}
+  public void invokeObjectGetClass() {
+    // invokevirtual: java.lang.Object.getClass()Ljava.lang.Class;
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangObjectGetClass());
+  }
 
-public void invokeJavaLangAssertionErrorDefaultConstructor() {
-       // invokespecial: java.lang.AssertionError.<init>()V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionErrorDefaultConstructor());
-       stackDepth --;
-}
+  final public void invokespecial(MethodBinding methodBinding) {
+    // initialized to 1 to take into account this  immediately
+    countLabels = 0;
+    int argCount = 1;
+    int id;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndex(methodBinding));
+    if (methodBinding.isConstructor() && methodBinding.declaringClass.isNestedType()) {
+      // enclosing instances
+      TypeBinding[] syntheticArgumentTypes = methodBinding.declaringClass.syntheticEnclosingInstanceTypes();
+      if (syntheticArgumentTypes != null) {
+        for (int i = 0, max = syntheticArgumentTypes.length; i < max; i++) {
+          if (((id = syntheticArgumentTypes[i].id) == T_double) || (id == T_long)) {
+            argCount += 2;
+          } else {
+            argCount++;
+          }
+        }
+      }
+      // outer local variables
+      SyntheticArgumentBinding[] syntheticArguments = methodBinding.declaringClass.syntheticOuterLocalVariables();
+      if (syntheticArguments != null) {
+        for (int i = 0, max = syntheticArguments.length; i < max; i++) {
+          if (((id = syntheticArguments[i].type.id) == T_double) || (id == T_long)) {
+            argCount += 2;
+          } else {
+            argCount++;
+          }
+        }
+      }
+    }
+    for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
+      if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
+        argCount += 2;
+      else
+        argCount++;
+    if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
+      stackDepth += (2 - argCount);
+    else if (id == T_void)
+      stackDepth -= argCount;
+    else
+      stackDepth += (1 - argCount);
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+  }
+  final public void invokestatic(MethodBinding methodBinding) {
+    // initialized to 0 to take into account that there is no this for
+    // a static method
+    countLabels = 0;
+    int argCount = 0;
+    int id;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokestatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokestatic);
+    }
+    writeUnsignedShort(constantPool.literalIndex(methodBinding));
+    for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
+      if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
+        argCount += 2;
+      else
+        argCount += 1;
+    if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
+      stackDepth += (2 - argCount);
+    else if (id == T_void)
+      stackDepth -= argCount;
+    else
+      stackDepth += (1 - argCount);
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+  }
+  /**
+   * The equivalent code performs a string conversion of the TOS
+   * @param typeID <CODE>int</CODE>
+   */
+  public void invokeStringBufferAppendForType(int typeID) {
+    countLabels = 0;
+    int usedTypeID;
+    if (typeID == T_null)
+      usedTypeID = T_String;
+    else
+      usedTypeID = typeID;
+    // invokevirtual
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferAppend(typeID));
+    if ((usedTypeID == T_long) || (usedTypeID == T_double))
+      stackDepth -= 2;
+    else
+      stackDepth--;
+  }
 
-public void invokeStringBufferDefaultConstructor() {
-       // invokespecial: java.lang.StringBuffer.<init>()V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferDefaultConstructor());
-       stackDepth--;
-}
-public void invokeStringBufferStringConstructor() {
-       // invokespecial: java.lang.StringBuffer.<init>(Ljava.lang.String;)V
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokespecial;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokespecial);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferConstructor());
-       stackDepth -= 2;
-}
+  public void invokeJavaLangAssertionErrorConstructor(int typeBindingID) {
+    // invokespecial: java.lang.AssertionError.<init>(typeBindingID)V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionErrorConstructor(typeBindingID));
+    stackDepth -= 2;
+  }
 
-public void invokeStringBufferToString() {
-       // invokevirtual: StringBuffer.toString()Ljava.lang.String;
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferToString());
-}
-public void invokeStringIntern() {
-       // invokevirtual: java.lang.String.intern()
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringIntern());
-}
-public void invokeStringValueOf(int typeID) {
-       // invokestatic: java.lang.String.valueOf(argumentType)
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokestatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokestatic);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringValueOf(typeID));
-}
-public void invokeSystemExit() {
-       // invokestatic: java.lang.System.exit(I)
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokestatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokestatic);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangSystemExitInt());
-       stackDepth--; // int argument
-}
-public void invokeThrowableGetMessage() {
-       // invokevirtual: java.lang.Throwable.getMessage()Ljava.lang.String;
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangThrowableGetMessage());
-}
-final public void invokevirtual(MethodBinding methodBinding) {
-       // initialized to 1 to take into account this  immediately
-       countLabels = 0;
-       int argCount = 1;
-       int id;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_invokevirtual;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_invokevirtual);
-       }
-       writeUnsignedShort(constantPool.literalIndex(methodBinding));
-       for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
-               if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
-                       argCount += 2;
-               else
-                       argCount++;
-       if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
-               stackDepth += (2 - argCount);
-       else
-               if (id == T_void)
-                       stackDepth -= argCount;
-               else
-                       stackDepth += (1 - argCount);
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-}
-final public void ior() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ior;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ior);
-       }
-}
-final public void irem() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_irem;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_irem);
-       }
-}
-final public void ireturn() {
-       countLabels = 0;
-       stackDepth--;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ireturn;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ireturn);
-       }
-}
-public boolean isDefinitelyAssigned(Scope scope, int initStateIndex, LocalVariableBinding local) {
-       // Dependant of UnconditionalFlowInfo.isDefinitelyAssigned(..)
-       if (initStateIndex == -1)
-               return false;
-       if (local.isArgument) {
-               return true;
-       }
-       int position = local.id + maxFieldCount;
-       MethodScope methodScope = scope.methodScope();
-       // id is zero-based
-       if (position < UnconditionalFlowInfo.BitCacheSize) {
-               return (methodScope.definiteInits[initStateIndex] & (1L << position)) != 0; // use bits
-       }
-       // use extra vector
-       long[] extraInits = methodScope.extraDefiniteInits[initStateIndex];
-       if (extraInits == null)
-               return false; // if vector not yet allocated, then not initialized
-       int vectorIndex;
-       if ((vectorIndex = (position / UnconditionalFlowInfo.BitCacheSize) - 1) >= extraInits.length)
-               return false; // if not enough room in vector, then not initialized 
-       return ((extraInits[vectorIndex]) & (1L << (position % UnconditionalFlowInfo.BitCacheSize))) != 0;
-}
-final public void ishl() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ishl;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ishl);
-       }
-}
-final public void ishr() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ishr;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ishr);
-       }
-}
-final public void istore(int iArg) {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= iArg) {
-               maxLocals = iArg + 1;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_istore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_istore);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_istore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_istore);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void istore_0() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals == 0) {
-               maxLocals = 1;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_istore_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_istore_0);
-       }
-}
-final public void istore_1() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 1) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_istore_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_istore_1);
-       }
-}
-final public void istore_2() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 2) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_istore_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_istore_2);
-       }
-}
-final public void istore_3() {
-       countLabels = 0;
-       stackDepth--;
-       if (maxLocals <= 3) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_istore_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_istore_3);
-       }
-}
-final public void isub() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_isub;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_isub);
-       }
-}
-final public void iushr() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_iushr;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_iushr);
-       }
-}
-final public void ixor() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ixor;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ixor);
-       }
-}
-final public void jsr(Label lbl) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_jsr;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_jsr);
-       }
-       lbl.branch();
-}
-final public void jsr_w(Label lbl) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_jsr_w;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_jsr_w);
-       }
-       lbl.branchWide();
-}
-final public void l2d() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_l2d;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_l2d);
-       }
-}
-final public void l2f() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_l2f;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_l2f);
-       }
-}
-final public void l2i() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_l2i;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_l2i);
-       }
-}
-final public void ladd() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ladd;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ladd);
-       }
-}
-final public void laload() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_laload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_laload);
-       }
-}
-final public void land() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_land;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_land);
-       }
-}
-final public void lastore() {
-       countLabels = 0;
-       stackDepth -= 4;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lastore);
-       }
-}
-final public void lcmp() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lcmp;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lcmp);
-       }
-}
-final public void lconst_0() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lconst_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lconst_0);
-       }
-}
-final public void lconst_1() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lconst_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lconst_1);
-       }
-}
-final public void ldc(float constant) {
-       countLabels = 0;
-       int index = constantPool.literalIndex(constant);
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (index > 255) {
-               // Generate a ldc_w
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ldc_w;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ldc_w);
-               }
-               writeUnsignedShort(index);
-       } else {
-               // Generate a ldc
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ldc;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ldc);
-               }
-               writeUnsignedByte(index);
-       }
-}
-final public void ldc(int constant) {
-       countLabels = 0;
-       int index = constantPool.literalIndex(constant);
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (index > 255) {
-               // Generate a ldc_w
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ldc_w;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ldc_w);
-               }
-               writeUnsignedShort(index);
-       } else {
-               // Generate a ldc
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ldc;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ldc);
-               }
-               writeUnsignedByte(index);
-       }
-}
-final public void ldc(String constant) {
-       countLabels = 0;
-       int currentConstantPoolIndex = constantPool.currentIndex;
-       int currentConstantPoolOffset = constantPool.currentOffset;
-       int currentCodeStreamPosition = position;
-       int index = constantPool.literalIndexForLdc(constant.toCharArray());
-       if (index > 0) {
-               // the string already exists inside the constant pool
-               // we reuse the same index
-               stackDepth++;
-               if (stackDepth > stackMax)
-                       stackMax = stackDepth;
-               if (index > 255) {
-                       // Generate a ldc_w
-                       try {
-                               position++;
-                               bCodeStream[classFileOffset++] = OPC_ldc_w;
-                       } catch (IndexOutOfBoundsException e) {
-                               resizeByteArray(OPC_ldc_w);
-                       }
-                       writeUnsignedShort(index);
-               } else {
-                       // Generate a ldc
-                       try {
-                               position++;
-                               bCodeStream[classFileOffset++] = OPC_ldc;
-                       } catch (IndexOutOfBoundsException e) {
-                               resizeByteArray(OPC_ldc);
-                       }
-                       writeUnsignedByte(index);
-               }
-       } else {
-               // the string is too big to be utf8-encoded in one pass.
-               // we have to split it into different pieces.
-               // first we clean all side-effects due to the code above
-               // this case is very rare, so we can afford to lose time to handle it
-               char[] constantChars = constant.toCharArray();
-               position = currentCodeStreamPosition;
-               constantPool.currentIndex = currentConstantPoolIndex;
-               constantPool.currentOffset = currentConstantPoolOffset;
-               constantPool.stringCache.remove(constantChars);
-               constantPool.UTF8Cache.remove(constantChars);
-               int i = 0;
-               int length = 0;
-               int constantLength = constant.length();
-               byte[] utf8encoding = new byte[Math.min(constantLength + 100, 65535)];
-               int utf8encodingLength = 0;
-               while ((length < 65532) && (i < constantLength)) {
-                       char current = constantChars[i];
-                       // we resize the byte array immediately if necessary
-                       if (length + 3 > (utf8encodingLength = utf8encoding.length)) {
-                               System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[Math.min(utf8encodingLength + 100, 65535)]), 0, length);
-                       }
-                       if ((current >= 0x0001) && (current <= 0x007F)) {
-                               // we only need one byte: ASCII table
-                               utf8encoding[length++] = (byte) current;
-                       } else {
-                               if (current > 0x07FF) {
-                                       // we need 3 bytes
-                                       utf8encoding[length++] = (byte) (0xE0 | ((current >> 12) & 0x0F)); // 0xE0 = 1110 0000
-                                       utf8encoding[length++] = (byte) (0x80 | ((current >> 6) & 0x3F)); // 0x80 = 1000 0000
-                                       utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
-                               } else {
-                                       // we can be 0 or between 0x0080 and 0x07FF
-                                       // In that case we only need 2 bytes
-                                       utf8encoding[length++] = (byte) (0xC0 | ((current >> 6) & 0x1F)); // 0xC0 = 1100 0000
-                                       utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
-                               }
-                       }
-                       i++;
-               }
-               // check if all the string is encoded (PR 1PR2DWJ)
-               // the string is too big to be encoded in one pass
-               newStringBuffer();
-               dup();
-               // write the first part
-               char[] subChars = new char[i];
-               System.arraycopy(constantChars, 0, subChars, 0, i);
-               System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[length]), 0, length);
-               index = constantPool.literalIndex(subChars, utf8encoding);
-               stackDepth++;
-               if (stackDepth > stackMax)
-                       stackMax = stackDepth;
-               if (index > 255) {
-                       // Generate a ldc_w
-                       try {
-                               position++;
-                               bCodeStream[classFileOffset++] = OPC_ldc_w;
-                       } catch (IndexOutOfBoundsException e) {
-                               resizeByteArray(OPC_ldc_w);
-                       }
-                       writeUnsignedShort(index);
-               } else {
-                       // Generate a ldc
-                       try {
-                               position++;
-                               bCodeStream[classFileOffset++] = OPC_ldc;
-                       } catch (IndexOutOfBoundsException e) {
-                               resizeByteArray(OPC_ldc);
-                       }
-                       writeUnsignedByte(index);
-               }
-               // write the remaining part
-               invokeStringBufferStringConstructor();
-               while (i < constantLength) {
-                       length = 0;
-                       utf8encoding = new byte[Math.min(constantLength - i + 100, 65535)];
-                       int startIndex = i;
-                       while ((length < 65532) && (i < constantLength)) {
-                               char current = constantChars[i];
-                               // we resize the byte array immediately if necessary
-                               if (constantLength + 2 > (utf8encodingLength = utf8encoding.length)) {
-                                       System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[Math.min(utf8encodingLength + 100, 65535)]), 0, length);
-                               }
-                               if ((current >= 0x0001) && (current <= 0x007F)) {
-                                       // we only need one byte: ASCII table
-                                       utf8encoding[length++] = (byte) current;
-                               } else {
-                                       if (current > 0x07FF) {
-                                               // we need 3 bytes
-                                               utf8encoding[length++] = (byte) (0xE0 | ((current >> 12) & 0x0F)); // 0xE0 = 1110 0000
-                                               utf8encoding[length++] = (byte) (0x80 | ((current >> 6) & 0x3F)); // 0x80 = 1000 0000
-                                               utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
-                                       } else {
-                                               // we can be 0 or between 0x0080 and 0x07FF
-                                               // In that case we only need 2 bytes
-                                               utf8encoding[length++] = (byte) (0xC0 | ((current >> 6) & 0x1F)); // 0xC0 = 1100 0000
-                                               utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
-                                       }
-                               }
-                               i++;
-                       }
-                       // the next part is done
-                       subChars = new char[i - startIndex];
-                       System.arraycopy(constantChars, startIndex, subChars, 0, i - startIndex);
-                       System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[length]), 0, length);
-                       index = constantPool.literalIndex(subChars, utf8encoding);
-                       stackDepth++;
-                       if (stackDepth > stackMax)
-                               stackMax = stackDepth;
-                       if (index > 255) {
-                               // Generate a ldc_w
-                               try {
-                                       position++;
-                                       bCodeStream[classFileOffset++] = OPC_ldc_w;
-                               } catch (IndexOutOfBoundsException e) {
-                                       resizeByteArray(OPC_ldc_w);
-                               }
-                               writeUnsignedShort(index);
-                       } else {
-                               // Generate a ldc
-                               try {
-                                       position++;
-                                       bCodeStream[classFileOffset++] = OPC_ldc;
-                               } catch (IndexOutOfBoundsException e) {
-                                       resizeByteArray(OPC_ldc);
-                               }
-                               writeUnsignedByte(index);
-                       }
-                       // now on the stack it should be a StringBuffer and a string.
-                       invokeStringBufferAppendForType(T_String);
-               }
-               invokeStringBufferToString();
-               invokeStringIntern();
-       }
-}
-final public void ldc2_w(double constant) {
-       countLabels = 0;
-       int index = constantPool.literalIndex(constant);
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       // Generate a ldc2_w
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ldc2_w;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ldc2_w);
-       }
-       writeUnsignedShort(index);
-}
-final public void ldc2_w(long constant) {
-       countLabels = 0;
-       int index = constantPool.literalIndex(constant);
-       stackDepth += 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       // Generate a ldc2_w
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ldc2_w;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ldc2_w);
-       }
-       writeUnsignedShort(index);
-}
-final public void ldiv() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_ldiv;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_ldiv);
-       }
-}
-final public void lload(int iArg) {
-       countLabels = 0;
-       stackDepth += 2;
-       if (maxLocals <= iArg + 1) {
-               maxLocals = iArg + 2;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_lload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_lload);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_lload;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_lload);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void lload_0() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (maxLocals < 2) {
-               maxLocals = 2;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lload_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lload_0);
-       }
-}
-final public void lload_1() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (maxLocals < 3) {
-               maxLocals = 3;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lload_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lload_1);
-       }
-}
-final public void lload_2() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (maxLocals < 4) {
-               maxLocals = 4;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lload_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lload_2);
-       }
-}
-final public void lload_3() {
-       countLabels = 0;
-       stackDepth += 2;
-       if (maxLocals < 5) {
-               maxLocals = 5;
-       }
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lload_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lload_3);
-       }
-}
-final public void lmul() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lmul;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lmul);
-       }
-}
-final public void lneg() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lneg;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lneg);
-       }
-}
-public final void load(LocalVariableBinding localBinding) {
-       countLabels = 0;
-       TypeBinding typeBinding = localBinding.type;
-       int resolvedPosition = localBinding.resolvedPosition;
-       // Using dedicated int bytecode
-       if (typeBinding == IntBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.iload_0();
-                               break;
-                       case 1 :
-                               this.iload_1();
-                               break;
-                       case 2 :
-                               this.iload_2();
-                               break;
-                       case 3 :
-                               this.iload_3();
-                               break;
-                       default :
-                               this.iload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated float bytecode
-       if (typeBinding == FloatBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.fload_0();
-                               break;
-                       case 1 :
-                               this.fload_1();
-                               break;
-                       case 2 :
-                               this.fload_2();
-                               break;
-                       case 3 :
-                               this.fload_3();
-                               break;
-                       default :
-                               this.fload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated long bytecode
-       if (typeBinding == LongBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.lload_0();
-                               break;
-                       case 1 :
-                               this.lload_1();
-                               break;
-                       case 2 :
-                               this.lload_2();
-                               break;
-                       case 3 :
-                               this.lload_3();
-                               break;
-                       default :
-                               this.lload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated double bytecode
-       if (typeBinding == DoubleBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.dload_0();
-                               break;
-                       case 1 :
-                               this.dload_1();
-                               break;
-                       case 2 :
-                               this.dload_2();
-                               break;
-                       case 3 :
-                               this.dload_3();
-                               break;
-                       default :
-                               this.dload(resolvedPosition);
-               }
-               return;
-       }
-       // boolean, byte, char and short are handled as int
-       if ((typeBinding == ByteBinding) || (typeBinding == CharBinding) || (typeBinding == BooleanBinding) || (typeBinding == ShortBinding)) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.iload_0();
-                               break;
-                       case 1 :
-                               this.iload_1();
-                               break;
-                       case 2 :
-                               this.iload_2();
-                               break;
-                       case 3 :
-                               this.iload_3();
-                               break;
-                       default :
-                               this.iload(resolvedPosition);
-               }
-               return;
-       }
+  public void invokeJavaLangAssertionErrorDefaultConstructor() {
+    // invokespecial: java.lang.AssertionError.<init>()V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionErrorDefaultConstructor());
+    stackDepth--;
+  }
 
-       // Reference object
-       switch (resolvedPosition) {
-               case 0 :
-                       this.aload_0();
-                       break;
-               case 1 :
-                       this.aload_1();
-                       break;
-               case 2 :
-                       this.aload_2();
-                       break;
-               case 3 :
-                       this.aload_3();
-                       break;
-               default :
-                       this.aload(resolvedPosition);
-       }
-}
-public final void load(TypeBinding typeBinding, int resolvedPosition) {
-       countLabels = 0;
-       // Using dedicated int bytecode
-       if (typeBinding == IntBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.iload_0();
-                               break;
-                       case 1 :
-                               this.iload_1();
-                               break;
-                       case 2 :
-                               this.iload_2();
-                               break;
-                       case 3 :
-                               this.iload_3();
-                               break;
-                       default :
-                               this.iload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated float bytecode
-       if (typeBinding == FloatBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.fload_0();
-                               break;
-                       case 1 :
-                               this.fload_1();
-                               break;
-                       case 2 :
-                               this.fload_2();
-                               break;
-                       case 3 :
-                               this.fload_3();
-                               break;
-                       default :
-                               this.fload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated long bytecode
-       if (typeBinding == LongBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.lload_0();
-                               break;
-                       case 1 :
-                               this.lload_1();
-                               break;
-                       case 2 :
-                               this.lload_2();
-                               break;
-                       case 3 :
-                               this.lload_3();
-                               break;
-                       default :
-                               this.lload(resolvedPosition);
-               }
-               return;
-       }
-       // Using dedicated double bytecode
-       if (typeBinding == DoubleBinding) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.dload_0();
-                               break;
-                       case 1 :
-                               this.dload_1();
-                               break;
-                       case 2 :
-                               this.dload_2();
-                               break;
-                       case 3 :
-                               this.dload_3();
-                               break;
-                       default :
-                               this.dload(resolvedPosition);
-               }
-               return;
-       }
-       // boolean, byte, char and short are handled as int
-       if ((typeBinding == ByteBinding) || (typeBinding == CharBinding) || (typeBinding == BooleanBinding) || (typeBinding == ShortBinding)) {
-               switch (resolvedPosition) {
-                       case 0 :
-                               this.iload_0();
-                               break;
-                       case 1 :
-                               this.iload_1();
-                               break;
-                       case 2 :
-                               this.iload_2();
-                               break;
-                       case 3 :
-                               this.iload_3();
-                               break;
-                       default :
-                               this.iload(resolvedPosition);
-               }
-               return;
-       }
+  public void invokeStringBufferDefaultConstructor() {
+    // invokespecial: java.lang.StringBuffer.<init>()V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferDefaultConstructor());
+    stackDepth--;
+  }
+  public void invokeStringBufferStringConstructor() {
+    // invokespecial: java.lang.StringBuffer.<init>(Ljava.lang.String;)V
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokespecial;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokespecial);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferConstructor());
+    stackDepth -= 2;
+  }
 
-       // Reference object
-       switch (resolvedPosition) {
-               case 0 :
-                       this.aload_0();
-                       break;
-               case 1 :
-                       this.aload_1();
-                       break;
-               case 2 :
-                       this.aload_2();
-                       break;
-               case 3 :
-                       this.aload_3();
-                       break;
-               default :
-                       this.aload(resolvedPosition);
-       }
-}
-public final void loadInt(int resolvedPosition) {
-       // Using dedicated int bytecode
-       switch (resolvedPosition) {
-               case 0 :
-                       this.iload_0();
-                       break;
-               case 1 :
-                       this.iload_1();
-                       break;
-               case 2 :
-                       this.iload_2();
-                       break;
-               case 3 :
-                       this.iload_3();
-                       break;
-               default :
-                       this.iload(resolvedPosition);
-       }
-}
-public final void loadObject(int resolvedPosition) {
-       switch (resolvedPosition) {
-               case 0 :
-                       this.aload_0();
-                       break;
-               case 1 :
-                       this.aload_1();
-                       break;
-               case 2 :
-                       this.aload_2();
-                       break;
-               case 3 :
-                       this.aload_3();
-                       break;
-               default :
-                       this.aload(resolvedPosition);
-       }
-}
-final public void lookupswitch(CaseLabel defaultLabel, int[] keys, int[] sortedIndexes, CaseLabel[] casesLabel) {
-       countLabels = 0;
-       stackDepth--;
-       int length = keys.length;
-       int pos = position;
-       defaultLabel.placeInstruction();
-       for (int i = 0; i < length; i++) {
-               casesLabel[i].placeInstruction();
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lookupswitch;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lookupswitch);
-       }
-       for (int i = (3 - (pos % 4)); i > 0; i--) {
-               position++; // Padding
-               classFileOffset++;
-       }
-       defaultLabel.branch();
-       writeSignedWord(length);
-       for (int i = 0; i < length; i++) {
-               writeSignedWord(keys[sortedIndexes[i]]);
-               casesLabel[sortedIndexes[i]].branch();
-       }
-}
-final public void lor() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lor;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lor);
-       }
-}
-final public void lrem() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lrem;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lrem);
-       }
-}
-final public void lreturn() {
-       countLabels = 0;
-       stackDepth -= 2;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lreturn;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lreturn);
-       }
-}
-final public void lshl() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lshl;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lshl);
-       }
-}
-final public void lshr() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lshr;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lshr);
-       }
-}
-final public void lstore(int iArg) {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals <= iArg + 1) {
-               maxLocals = iArg + 2;
-       }
-       if (iArg > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_lstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_lstore);
-               }
-               writeUnsignedShort(iArg);
-       } else {
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_lstore;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_lstore);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) iArg;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) iArg);
-               }
-       }
-}
-final public void lstore_0() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 2) {
-               maxLocals = 2;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lstore_0;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lstore_0);
-       }
-}
-final public void lstore_1() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 3) {
-               maxLocals = 3;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lstore_1;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lstore_1);
-       }
-}
-final public void lstore_2() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 4) {
-               maxLocals = 4;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lstore_2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lstore_2);
-       }
-}
-final public void lstore_3() {
-       countLabels = 0;
-       stackDepth -= 2;
-       if (maxLocals < 5) {
-               maxLocals = 5;
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lstore_3;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lstore_3);
-       }
-}
-final public void lsub() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lsub;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lsub);
-       }
-}
-final public void lushr() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lushr;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lushr);
-       }
-}
-final public void lxor() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_lxor;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_lxor);
-       }
-}
-final public void monitorenter() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_monitorenter;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_monitorenter);
-       }
-}
-final public void monitorexit() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_monitorexit;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_monitorexit);
-       }
-}
-final public void multianewarray(TypeBinding typeBinding, int dimensions) {
-       countLabels = 0;
-       stackDepth += (1 - dimensions);
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_multianewarray;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_multianewarray);
-       }
-       writeUnsignedShort(constantPool.literalIndex(typeBinding));
-       writeUnsignedByte(dimensions);
-}
-public static void needImplementation() {
-}
-/**
- * We didn't call it new, because there is a conflit with the new keyword
- */
-final public void new_(TypeBinding typeBinding) {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       writeUnsignedShort(constantPool.literalIndex(typeBinding));
-}
-final public void newarray(int array_Type) {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_newarray;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_newarray);
-       }
-       writeUnsignedByte(array_Type);
-}
-public void newArray(Scope scope, ArrayBinding arrayBinding) {
-       TypeBinding component = arrayBinding.elementsType(scope);
-       switch (component.id) {
-               case T_int :
-                       this.newarray(10);
-                       break;
-               case T_byte :
-                       this.newarray(8);
-                       break;
-               case T_boolean :
-                       this.newarray(4);
-                       break;
-               case T_short :
-                       this.newarray(9);
-                       break;
-               case T_char :
-                       this.newarray(5);
-                       break;
-               case T_long :
-                       this.newarray(11);
-                       break;
-               case T_float :
-                       this.newarray(6);
-                       break;
-               case T_double :
-                       this.newarray(7);
-                       break;
-               default :
-                       this.anewarray(component);
-       }
-}
-public void newJavaLangError() {
-       // new: java.lang.Error
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangError());
-}
+  public void invokeStringBufferToString() {
+    // invokevirtual: StringBuffer.toString()Ljava.lang.String;
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringBufferToString());
+  }
+  public void invokeStringIntern() {
+    // invokevirtual: java.lang.String.intern()
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringIntern());
+  }
+  public void invokeStringValueOf(int typeID) {
+    // invokestatic: java.lang.String.valueOf(argumentType)
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokestatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokestatic);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringValueOf(typeID));
+  }
+  public void invokeSystemExit() {
+    // invokestatic: java.lang.System.exit(I)
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokestatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokestatic);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangSystemExitInt());
+    stackDepth--; // int argument
+  }
+  public void invokeThrowableGetMessage() {
+    // invokevirtual: java.lang.Throwable.getMessage()Ljava.lang.String;
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangThrowableGetMessage());
+  }
+  final public void invokevirtual(MethodBinding methodBinding) {
+    // initialized to 1 to take into account this  immediately
+    countLabels = 0;
+    int argCount = 1;
+    int id;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_invokevirtual;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_invokevirtual);
+    }
+    writeUnsignedShort(constantPool.literalIndex(methodBinding));
+    for (int i = methodBinding.parameters.length - 1; i >= 0; i--)
+      if (((id = methodBinding.parameters[i].id) == T_double) || (id == T_long))
+        argCount += 2;
+      else
+        argCount++;
+    if (((id = methodBinding.returnType.id) == T_double) || (id == T_long))
+      stackDepth += (2 - argCount);
+    else if (id == T_void)
+      stackDepth -= argCount;
+    else
+      stackDepth += (1 - argCount);
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+  }
+  final public void ior() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ior;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ior);
+    }
+  }
+  final public void irem() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_irem;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_irem);
+    }
+  }
+  final public void ireturn() {
+    countLabels = 0;
+    stackDepth--;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ireturn;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ireturn);
+    }
+  }
+  public boolean isDefinitelyAssigned(Scope scope, int initStateIndex, LocalVariableBinding local) {
+    // Dependant of UnconditionalFlowInfo.isDefinitelyAssigned(..)
+    if (initStateIndex == -1)
+      return false;
+    if (local.isArgument) {
+      return true;
+    }
+    int position = local.id + maxFieldCount;
+    MethodScope methodScope = scope.methodScope();
+    // id is zero-based
+    if (position < UnconditionalFlowInfo.BitCacheSize) {
+      return (methodScope.definiteInits[initStateIndex] & (1L << position)) != 0; // use bits
+    }
+    // use extra vector
+    long[] extraInits = methodScope.extraDefiniteInits[initStateIndex];
+    if (extraInits == null)
+      return false; // if vector not yet allocated, then not initialized
+    int vectorIndex;
+    if ((vectorIndex = (position / UnconditionalFlowInfo.BitCacheSize) - 1) >= extraInits.length)
+      return false; // if not enough room in vector, then not initialized 
+    return ((extraInits[vectorIndex]) & (1L << (position % UnconditionalFlowInfo.BitCacheSize))) != 0;
+  }
+  final public void ishl() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ishl;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ishl);
+    }
+  }
+  final public void ishr() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ishr;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ishr);
+    }
+  }
+  final public void istore(int iArg) {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= iArg) {
+      maxLocals = iArg + 1;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_istore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_istore);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_istore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_istore);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void istore_0() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals == 0) {
+      maxLocals = 1;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_istore_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_istore_0);
+    }
+  }
+  final public void istore_1() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 1) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_istore_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_istore_1);
+    }
+  }
+  final public void istore_2() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 2) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_istore_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_istore_2);
+    }
+  }
+  final public void istore_3() {
+    countLabels = 0;
+    stackDepth--;
+    if (maxLocals <= 3) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_istore_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_istore_3);
+    }
+  }
+  final public void isub() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_isub;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_isub);
+    }
+  }
+  final public void iushr() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_iushr;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_iushr);
+    }
+  }
+  final public void ixor() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ixor;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ixor);
+    }
+  }
+  final public void jsr(Label lbl) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_jsr;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_jsr);
+    }
+    lbl.branch();
+  }
+  final public void jsr_w(Label lbl) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_jsr_w;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_jsr_w);
+    }
+    lbl.branchWide();
+  }
+  final public void l2d() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_l2d;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_l2d);
+    }
+  }
+  final public void l2f() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_l2f;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_l2f);
+    }
+  }
+  final public void l2i() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_l2i;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_l2i);
+    }
+  }
+  final public void ladd() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ladd;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ladd);
+    }
+  }
+  final public void laload() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_laload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_laload);
+    }
+  }
+  final public void land() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_land;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_land);
+    }
+  }
+  final public void lastore() {
+    countLabels = 0;
+    stackDepth -= 4;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lastore);
+    }
+  }
+  final public void lcmp() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lcmp;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lcmp);
+    }
+  }
+  final public void lconst_0() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lconst_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lconst_0);
+    }
+  }
+  final public void lconst_1() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lconst_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lconst_1);
+    }
+  }
+  final public void ldc(float constant) {
+    countLabels = 0;
+    int index = constantPool.literalIndex(constant);
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (index > 255) {
+      // Generate a ldc_w
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ldc_w;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ldc_w);
+      }
+      writeUnsignedShort(index);
+    } else {
+      // Generate a ldc
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ldc;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ldc);
+      }
+      writeUnsignedByte(index);
+    }
+  }
+  final public void ldc(int constant) {
+    countLabels = 0;
+    int index = constantPool.literalIndex(constant);
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (index > 255) {
+      // Generate a ldc_w
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ldc_w;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ldc_w);
+      }
+      writeUnsignedShort(index);
+    } else {
+      // Generate a ldc
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ldc;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ldc);
+      }
+      writeUnsignedByte(index);
+    }
+  }
+  final public void ldc(String constant) {
+    countLabels = 0;
+    int currentConstantPoolIndex = constantPool.currentIndex;
+    int currentConstantPoolOffset = constantPool.currentOffset;
+    int currentCodeStreamPosition = position;
+    int index = constantPool.literalIndexForLdc(constant.toCharArray());
+    if (index > 0) {
+      // the string already exists inside the constant pool
+      // we reuse the same index
+      stackDepth++;
+      if (stackDepth > stackMax)
+        stackMax = stackDepth;
+      if (index > 255) {
+        // Generate a ldc_w
+        try {
+          position++;
+          bCodeStream[classFileOffset++] = OPC_ldc_w;
+        } catch (IndexOutOfBoundsException e) {
+          resizeByteArray(OPC_ldc_w);
+        }
+        writeUnsignedShort(index);
+      } else {
+        // Generate a ldc
+        try {
+          position++;
+          bCodeStream[classFileOffset++] = OPC_ldc;
+        } catch (IndexOutOfBoundsException e) {
+          resizeByteArray(OPC_ldc);
+        }
+        writeUnsignedByte(index);
+      }
+    } else {
+      // the string is too big to be utf8-encoded in one pass.
+      // we have to split it into different pieces.
+      // first we clean all side-effects due to the code above
+      // this case is very rare, so we can afford to lose time to handle it
+      char[] constantChars = constant.toCharArray();
+      position = currentCodeStreamPosition;
+      constantPool.currentIndex = currentConstantPoolIndex;
+      constantPool.currentOffset = currentConstantPoolOffset;
+      constantPool.stringCache.remove(constantChars);
+      constantPool.UTF8Cache.remove(constantChars);
+      int i = 0;
+      int length = 0;
+      int constantLength = constant.length();
+      byte[] utf8encoding = new byte[Math.min(constantLength + 100, 65535)];
+      int utf8encodingLength = 0;
+      while ((length < 65532) && (i < constantLength)) {
+        char current = constantChars[i];
+        // we resize the byte array immediately if necessary
+        if (length + 3 > (utf8encodingLength = utf8encoding.length)) {
+          System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[Math.min(utf8encodingLength + 100, 65535)]), 0, length);
+        }
+        if ((current >= 0x0001) && (current <= 0x007F)) {
+          // we only need one byte: ASCII table
+          utf8encoding[length++] = (byte) current;
+        } else {
+          if (current > 0x07FF) {
+            // we need 3 bytes
+            utf8encoding[length++] = (byte) (0xE0 | ((current >> 12) & 0x0F)); // 0xE0 = 1110 0000
+            utf8encoding[length++] = (byte) (0x80 | ((current >> 6) & 0x3F)); // 0x80 = 1000 0000
+            utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
+          } else {
+            // we can be 0 or between 0x0080 and 0x07FF
+            // In that case we only need 2 bytes
+            utf8encoding[length++] = (byte) (0xC0 | ((current >> 6) & 0x1F)); // 0xC0 = 1100 0000
+            utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
+          }
+        }
+        i++;
+      }
+      // check if all the string is encoded (PR 1PR2DWJ)
+      // the string is too big to be encoded in one pass
+      newStringBuffer();
+      dup();
+      // write the first part
+      char[] subChars = new char[i];
+      System.arraycopy(constantChars, 0, subChars, 0, i);
+      System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[length]), 0, length);
+      index = constantPool.literalIndex(subChars, utf8encoding);
+      stackDepth++;
+      if (stackDepth > stackMax)
+        stackMax = stackDepth;
+      if (index > 255) {
+        // Generate a ldc_w
+        try {
+          position++;
+          bCodeStream[classFileOffset++] = OPC_ldc_w;
+        } catch (IndexOutOfBoundsException e) {
+          resizeByteArray(OPC_ldc_w);
+        }
+        writeUnsignedShort(index);
+      } else {
+        // Generate a ldc
+        try {
+          position++;
+          bCodeStream[classFileOffset++] = OPC_ldc;
+        } catch (IndexOutOfBoundsException e) {
+          resizeByteArray(OPC_ldc);
+        }
+        writeUnsignedByte(index);
+      }
+      // write the remaining part
+      invokeStringBufferStringConstructor();
+      while (i < constantLength) {
+        length = 0;
+        utf8encoding = new byte[Math.min(constantLength - i + 100, 65535)];
+        int startIndex = i;
+        while ((length < 65532) && (i < constantLength)) {
+          char current = constantChars[i];
+          // we resize the byte array immediately if necessary
+          if (constantLength + 2 > (utf8encodingLength = utf8encoding.length)) {
+            System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[Math.min(utf8encodingLength + 100, 65535)]), 0, length);
+          }
+          if ((current >= 0x0001) && (current <= 0x007F)) {
+            // we only need one byte: ASCII table
+            utf8encoding[length++] = (byte) current;
+          } else {
+            if (current > 0x07FF) {
+              // we need 3 bytes
+              utf8encoding[length++] = (byte) (0xE0 | ((current >> 12) & 0x0F)); // 0xE0 = 1110 0000
+              utf8encoding[length++] = (byte) (0x80 | ((current >> 6) & 0x3F)); // 0x80 = 1000 0000
+              utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
+            } else {
+              // we can be 0 or between 0x0080 and 0x07FF
+              // In that case we only need 2 bytes
+              utf8encoding[length++] = (byte) (0xC0 | ((current >> 6) & 0x1F)); // 0xC0 = 1100 0000
+              utf8encoding[length++] = (byte) (0x80 | (current & 0x3F)); // 0x80 = 1000 0000
+            }
+          }
+          i++;
+        }
+        // the next part is done
+        subChars = new char[i - startIndex];
+        System.arraycopy(constantChars, startIndex, subChars, 0, i - startIndex);
+        System.arraycopy(utf8encoding, 0, (utf8encoding = new byte[length]), 0, length);
+        index = constantPool.literalIndex(subChars, utf8encoding);
+        stackDepth++;
+        if (stackDepth > stackMax)
+          stackMax = stackDepth;
+        if (index > 255) {
+          // Generate a ldc_w
+          try {
+            position++;
+            bCodeStream[classFileOffset++] = OPC_ldc_w;
+          } catch (IndexOutOfBoundsException e) {
+            resizeByteArray(OPC_ldc_w);
+          }
+          writeUnsignedShort(index);
+        } else {
+          // Generate a ldc
+          try {
+            position++;
+            bCodeStream[classFileOffset++] = OPC_ldc;
+          } catch (IndexOutOfBoundsException e) {
+            resizeByteArray(OPC_ldc);
+          }
+          writeUnsignedByte(index);
+        }
+        // now on the stack it should be a StringBuffer and a string.
+        invokeStringBufferAppendForType(T_String);
+      }
+      invokeStringBufferToString();
+      invokeStringIntern();
+    }
+  }
+  final public void ldc2_w(double constant) {
+    countLabels = 0;
+    int index = constantPool.literalIndex(constant);
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    // Generate a ldc2_w
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ldc2_w;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ldc2_w);
+    }
+    writeUnsignedShort(index);
+  }
+  final public void ldc2_w(long constant) {
+    countLabels = 0;
+    int index = constantPool.literalIndex(constant);
+    stackDepth += 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    // Generate a ldc2_w
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ldc2_w;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ldc2_w);
+    }
+    writeUnsignedShort(index);
+  }
+  final public void ldiv() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_ldiv;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_ldiv);
+    }
+  }
+  final public void lload(int iArg) {
+    countLabels = 0;
+    stackDepth += 2;
+    if (maxLocals <= iArg + 1) {
+      maxLocals = iArg + 2;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_lload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_lload);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_lload;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_lload);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void lload_0() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (maxLocals < 2) {
+      maxLocals = 2;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lload_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lload_0);
+    }
+  }
+  final public void lload_1() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (maxLocals < 3) {
+      maxLocals = 3;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lload_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lload_1);
+    }
+  }
+  final public void lload_2() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (maxLocals < 4) {
+      maxLocals = 4;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lload_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lload_2);
+    }
+  }
+  final public void lload_3() {
+    countLabels = 0;
+    stackDepth += 2;
+    if (maxLocals < 5) {
+      maxLocals = 5;
+    }
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lload_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lload_3);
+    }
+  }
+  final public void lmul() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lmul;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lmul);
+    }
+  }
+  final public void lneg() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lneg;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lneg);
+    }
+  }
+  public final void load(LocalVariableBinding localBinding) {
+    countLabels = 0;
+    TypeBinding typeBinding = localBinding.type;
+    int resolvedPosition = localBinding.resolvedPosition;
+    // Using dedicated int bytecode
+    if (typeBinding == IntBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.iload_0();
+          break;
+        case 1 :
+          this.iload_1();
+          break;
+        case 2 :
+          this.iload_2();
+          break;
+        case 3 :
+          this.iload_3();
+          break;
+        default :
+          this.iload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated float bytecode
+    if (typeBinding == FloatBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.fload_0();
+          break;
+        case 1 :
+          this.fload_1();
+          break;
+        case 2 :
+          this.fload_2();
+          break;
+        case 3 :
+          this.fload_3();
+          break;
+        default :
+          this.fload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated long bytecode
+    if (typeBinding == LongBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.lload_0();
+          break;
+        case 1 :
+          this.lload_1();
+          break;
+        case 2 :
+          this.lload_2();
+          break;
+        case 3 :
+          this.lload_3();
+          break;
+        default :
+          this.lload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated double bytecode
+    if (typeBinding == DoubleBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.dload_0();
+          break;
+        case 1 :
+          this.dload_1();
+          break;
+        case 2 :
+          this.dload_2();
+          break;
+        case 3 :
+          this.dload_3();
+          break;
+        default :
+          this.dload(resolvedPosition);
+      }
+      return;
+    }
+    // boolean, byte, char and short are handled as int
+    if ((typeBinding == ByteBinding)
+      || (typeBinding == CharBinding)
+      || (typeBinding == BooleanBinding)
+      || (typeBinding == ShortBinding)) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.iload_0();
+          break;
+        case 1 :
+          this.iload_1();
+          break;
+        case 2 :
+          this.iload_2();
+          break;
+        case 3 :
+          this.iload_3();
+          break;
+        default :
+          this.iload(resolvedPosition);
+      }
+      return;
+    }
 
-public void newJavaLangAssertionError() {
-       // new: java.lang.AssertionError
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionError());
-}
+    // Reference object
+    switch (resolvedPosition) {
+      case 0 :
+        this.aload_0();
+        break;
+      case 1 :
+        this.aload_1();
+        break;
+      case 2 :
+        this.aload_2();
+        break;
+      case 3 :
+        this.aload_3();
+        break;
+      default :
+        this.aload(resolvedPosition);
+    }
+  }
+  public final void load(TypeBinding typeBinding, int resolvedPosition) {
+    countLabels = 0;
+    // Using dedicated int bytecode
+    if (typeBinding == IntBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.iload_0();
+          break;
+        case 1 :
+          this.iload_1();
+          break;
+        case 2 :
+          this.iload_2();
+          break;
+        case 3 :
+          this.iload_3();
+          break;
+        default :
+          this.iload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated float bytecode
+    if (typeBinding == FloatBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.fload_0();
+          break;
+        case 1 :
+          this.fload_1();
+          break;
+        case 2 :
+          this.fload_2();
+          break;
+        case 3 :
+          this.fload_3();
+          break;
+        default :
+          this.fload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated long bytecode
+    if (typeBinding == LongBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.lload_0();
+          break;
+        case 1 :
+          this.lload_1();
+          break;
+        case 2 :
+          this.lload_2();
+          break;
+        case 3 :
+          this.lload_3();
+          break;
+        default :
+          this.lload(resolvedPosition);
+      }
+      return;
+    }
+    // Using dedicated double bytecode
+    if (typeBinding == DoubleBinding) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.dload_0();
+          break;
+        case 1 :
+          this.dload_1();
+          break;
+        case 2 :
+          this.dload_2();
+          break;
+        case 3 :
+          this.dload_3();
+          break;
+        default :
+          this.dload(resolvedPosition);
+      }
+      return;
+    }
+    // boolean, byte, char and short are handled as int
+    if ((typeBinding == ByteBinding)
+      || (typeBinding == CharBinding)
+      || (typeBinding == BooleanBinding)
+      || (typeBinding == ShortBinding)) {
+      switch (resolvedPosition) {
+        case 0 :
+          this.iload_0();
+          break;
+        case 1 :
+          this.iload_1();
+          break;
+        case 2 :
+          this.iload_2();
+          break;
+        case 3 :
+          this.iload_3();
+          break;
+        default :
+          this.iload(resolvedPosition);
+      }
+      return;
+    }
 
-public void newNoClassDefFoundError() { // new: java.lang.NoClassDefFoundError
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangNoClassDefFoundError());
-}
-public void newStringBuffer() { // new: java.lang.StringBuffer
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       writeUnsignedShort(constantPool.literalIndexForJavaLangStringBuffer());
-}
-public void newWrapperFor(int typeID) {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_new;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_new);
-       }
-       switch (typeID) {
-               case T_int : // new: java.lang.Integer
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangInteger());
-                       break;
-               case T_boolean : // new: java.lang.Boolean
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangBoolean());
-                       break;
-               case T_byte : // new: java.lang.Byte
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangByte());
-                       break;
-               case T_char : // new: java.lang.Character
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangCharacter());
-                       break;
-               case T_float : // new: java.lang.Float
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangFloat());
-                       break;
-               case T_double : // new: java.lang.Double
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangDouble());
-                       break;
-               case T_short : // new: java.lang.Short
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangShort());
-                       break;
-               case T_long : // new: java.lang.Long
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangLong());
-                       break;
-               case T_void : // new: java.lang.Void
-                       writeUnsignedShort(constantPool.literalIndexForJavaLangVoid());
-       }
-}
-final public void nop() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_nop;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_nop);
-       }
-}
-final public void pop() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_pop;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_pop);
-       }
-}
-final public void pop2() {
-       countLabels = 0;
-       stackDepth -= 2;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_pop2;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_pop2);
-       }
-}
-final public void putfield(FieldBinding fieldBinding) {
-       countLabels = 0;
-       int id;
-       if (((id = fieldBinding.type.id) == T_double) || (id == T_long))
-               stackDepth -= 3;
-       else
-               stackDepth -= 2;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_putfield;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_putfield);
-       }
-       writeUnsignedShort(constantPool.literalIndex(fieldBinding));
-}
-final public void putstatic(FieldBinding fieldBinding) {
-       countLabels = 0;
-       int id;
-       if (((id = fieldBinding.type.id) == T_double) || (id == T_long))
-               stackDepth -= 2;
-       else
-               stackDepth -= 1;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_putstatic;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_putstatic);
-       }
-       writeUnsignedShort(constantPool.literalIndex(fieldBinding));
-}
-public void record(LocalVariableBinding local) {
-       if (!generateLocalVariableTableAttributes)
-               return;
-       if (allLocalsCounter == locals.length) {
-               // resize the collection
-               System.arraycopy(locals, 0, (locals = new LocalVariableBinding[allLocalsCounter + LOCALS_INCREMENT]), 0, allLocalsCounter);
-       }
-       locals[allLocalsCounter++] = local;
-       local.initializationPCs = new int[4];
-       local.initializationCount = 0;
-}
-public void recordPositionsFrom(int startPC, int sourcePos) {
+    // Reference object
+    switch (resolvedPosition) {
+      case 0 :
+        this.aload_0();
+        break;
+      case 1 :
+        this.aload_1();
+        break;
+      case 2 :
+        this.aload_2();
+        break;
+      case 3 :
+        this.aload_3();
+        break;
+      default :
+        this.aload(resolvedPosition);
+    }
+  }
+  public final void loadInt(int resolvedPosition) {
+    // Using dedicated int bytecode
+    switch (resolvedPosition) {
+      case 0 :
+        this.iload_0();
+        break;
+      case 1 :
+        this.iload_1();
+        break;
+      case 2 :
+        this.iload_2();
+        break;
+      case 3 :
+        this.iload_3();
+        break;
+      default :
+        this.iload(resolvedPosition);
+    }
+  }
+  public final void loadObject(int resolvedPosition) {
+    switch (resolvedPosition) {
+      case 0 :
+        this.aload_0();
+        break;
+      case 1 :
+        this.aload_1();
+        break;
+      case 2 :
+        this.aload_2();
+        break;
+      case 3 :
+        this.aload_3();
+        break;
+      default :
+        this.aload(resolvedPosition);
+    }
+  }
+  final public void lookupswitch(CaseLabel defaultLabel, int[] keys, int[] sortedIndexes, CaseLabel[] casesLabel) {
+    countLabels = 0;
+    stackDepth--;
+    int length = keys.length;
+    int pos = position;
+    defaultLabel.placeInstruction();
+    for (int i = 0; i < length; i++) {
+      casesLabel[i].placeInstruction();
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lookupswitch;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lookupswitch);
+    }
+    for (int i = (3 - (pos % 4)); i > 0; i--) {
+      position++; // Padding
+      classFileOffset++;
+    }
+    defaultLabel.branch();
+    writeSignedWord(length);
+    for (int i = 0; i < length; i++) {
+      writeSignedWord(keys[sortedIndexes[i]]);
+      casesLabel[sortedIndexes[i]].branch();
+    }
+  }
+  final public void lor() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lor;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lor);
+    }
+  }
+  final public void lrem() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lrem;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lrem);
+    }
+  }
+  final public void lreturn() {
+    countLabels = 0;
+    stackDepth -= 2;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lreturn;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lreturn);
+    }
+  }
+  final public void lshl() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lshl;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lshl);
+    }
+  }
+  final public void lshr() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lshr;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lshr);
+    }
+  }
+  final public void lstore(int iArg) {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals <= iArg + 1) {
+      maxLocals = iArg + 2;
+    }
+    if (iArg > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_lstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_lstore);
+      }
+      writeUnsignedShort(iArg);
+    } else {
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_lstore;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_lstore);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) iArg;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) iArg);
+      }
+    }
+  }
+  final public void lstore_0() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 2) {
+      maxLocals = 2;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lstore_0;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lstore_0);
+    }
+  }
+  final public void lstore_1() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 3) {
+      maxLocals = 3;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lstore_1;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lstore_1);
+    }
+  }
+  final public void lstore_2() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 4) {
+      maxLocals = 4;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lstore_2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lstore_2);
+    }
+  }
+  final public void lstore_3() {
+    countLabels = 0;
+    stackDepth -= 2;
+    if (maxLocals < 5) {
+      maxLocals = 5;
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lstore_3;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lstore_3);
+    }
+  }
+  final public void lsub() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lsub;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lsub);
+    }
+  }
+  final public void lushr() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lushr;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lushr);
+    }
+  }
+  final public void lxor() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_lxor;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_lxor);
+    }
+  }
+  final public void monitorenter() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_monitorenter;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_monitorenter);
+    }
+  }
+  final public void monitorexit() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_monitorexit;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_monitorexit);
+    }
+  }
+  final public void multianewarray(TypeBinding typeBinding, int dimensions) {
+    countLabels = 0;
+    stackDepth += (1 - dimensions);
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_multianewarray;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_multianewarray);
+    }
+    writeUnsignedShort(constantPool.literalIndex(typeBinding));
+    writeUnsignedByte(dimensions);
+  }
+  public static void needImplementation() {
+  }
+  /**
+   * We didn't call it new, because there is a conflit with the new keyword
+   */
+  final public void new_(TypeBinding typeBinding) {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    writeUnsignedShort(constantPool.literalIndex(typeBinding));
+  }
+  final public void newarray(int array_Type) {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_newarray;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_newarray);
+    }
+    writeUnsignedByte(array_Type);
+  }
+  public void newArray(Scope scope, ArrayBinding arrayBinding) {
+    TypeBinding component = arrayBinding.elementsType(scope);
+    switch (component.id) {
+      case T_int :
+        this.newarray(10);
+        break;
+      case T_byte :
+        this.newarray(8);
+        break;
+      case T_boolean :
+        this.newarray(4);
+        break;
+      case T_short :
+        this.newarray(9);
+        break;
+      case T_char :
+        this.newarray(5);
+        break;
+      case T_long :
+        this.newarray(11);
+        break;
+      case T_float :
+        this.newarray(6);
+        break;
+      case T_double :
+        this.newarray(7);
+        break;
+      default :
+        this.anewarray(component);
+    }
+  }
+  public void newJavaLangError() {
+    // new: java.lang.Error
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangError());
+  }
 
-       /* Record positions in the table, only if nothing has 
-        * already been recorded. Since we output them on the way 
-        * up (children first for more specific info)
-        * The pcToSourceMap table is always sorted.
-        */
+  public void newJavaLangAssertionError() {
+    // new: java.lang.AssertionError
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangAssertionError());
+  }
 
-       if (!generateLineNumberAttributes)
-               return;
-       if (sourcePos == 0)
-               return;
+  public void newNoClassDefFoundError() { // new: java.lang.NoClassDefFoundError
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangNoClassDefFoundError());
+  }
+  public void newStringBuffer() { // new: java.lang.StringBuffer
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    writeUnsignedShort(constantPool.literalIndexForJavaLangStringBuffer());
+  }
+  public void newWrapperFor(int typeID) {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_new;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_new);
+    }
+    switch (typeID) {
+      case T_int : // new: java.lang.Integer
+        writeUnsignedShort(constantPool.literalIndexForJavaLangInteger());
+        break;
+      case T_boolean : // new: java.lang.Boolean
+        writeUnsignedShort(constantPool.literalIndexForJavaLangBoolean());
+        break;
+      case T_byte : // new: java.lang.Byte
+        writeUnsignedShort(constantPool.literalIndexForJavaLangByte());
+        break;
+      case T_char : // new: java.lang.Character
+        writeUnsignedShort(constantPool.literalIndexForJavaLangCharacter());
+        break;
+      case T_float : // new: java.lang.Float
+        writeUnsignedShort(constantPool.literalIndexForJavaLangFloat());
+        break;
+      case T_double : // new: java.lang.Double
+        writeUnsignedShort(constantPool.literalIndexForJavaLangDouble());
+        break;
+      case T_short : // new: java.lang.Short
+        writeUnsignedShort(constantPool.literalIndexForJavaLangShort());
+        break;
+      case T_long : // new: java.lang.Long
+        writeUnsignedShort(constantPool.literalIndexForJavaLangLong());
+        break;
+      case T_void : // new: java.lang.Void
+        writeUnsignedShort(constantPool.literalIndexForJavaLangVoid());
+    }
+  }
+  final public void nop() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_nop;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_nop);
+    }
+  }
+  final public void pop() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_pop;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_pop);
+    }
+  }
+  final public void pop2() {
+    countLabels = 0;
+    stackDepth -= 2;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_pop2;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_pop2);
+    }
+  }
+  final public void putfield(FieldBinding fieldBinding) {
+    countLabels = 0;
+    int id;
+    if (((id = fieldBinding.type.id) == T_double) || (id == T_long))
+      stackDepth -= 3;
+    else
+      stackDepth -= 2;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_putfield;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_putfield);
+    }
+    writeUnsignedShort(constantPool.literalIndex(fieldBinding));
+  }
+  final public void putstatic(FieldBinding fieldBinding) {
+    countLabels = 0;
+    int id;
+    if (((id = fieldBinding.type.id) == T_double) || (id == T_long))
+      stackDepth -= 2;
+    else
+      stackDepth -= 1;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_putstatic;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_putstatic);
+    }
+    writeUnsignedShort(constantPool.literalIndex(fieldBinding));
+  }
+  public void record(LocalVariableBinding local) {
+    if (!generateLocalVariableTableAttributes)
+      return;
+    if (allLocalsCounter == locals.length) {
+      // resize the collection
+      System.arraycopy(locals, 0, (locals = new LocalVariableBinding[allLocalsCounter + LOCALS_INCREMENT]), 0, allLocalsCounter);
+    }
+    locals[allLocalsCounter++] = local;
+    local.initializationPCs = new int[4];
+    local.initializationCount = 0;
+  }
+  public void recordPositionsFrom(int startPC, int sourcePos) {
 
-       // no code generated for this node. e.g. field without any initialization
-       if (position == startPC)
-               return;
+    /* Record positions in the table, only if nothing has 
+     * already been recorded. Since we output them on the way 
+     * up (children first for more specific info)
+     * The pcToSourceMap table is always sorted.
+     */
 
-       // Widening an existing entry that already has the same source positions
-       if (pcToSourceMapSize + 4 > pcToSourceMap.length) {
-               // resize the array pcToSourceMap
-               System.arraycopy(pcToSourceMap, 0, (pcToSourceMap = new int[pcToSourceMapSize << 1]), 0, pcToSourceMapSize);
-       }
-       int newLine = ClassFile.searchLineNumber(lineSeparatorPositions, sourcePos);
-       // lastEntryPC represents the endPC of the lastEntry.
-       if (pcToSourceMapSize > 0) {
-               // in this case there is already an entry in the table
-               if (pcToSourceMap[pcToSourceMapSize - 1] != newLine) {
-                       if (startPC < lastEntryPC) {
-                               // we forgot to add an entry.
-                               // search if an existing entry exists for startPC
-                               int insertionIndex = insertionIndex(pcToSourceMap, pcToSourceMapSize, startPC);
-                               if (insertionIndex != -1) {
-                                       // there is no existing entry starting with startPC.
-                                       int existingEntryIndex = indexOfSameLineEntrySincePC(startPC, newLine); // index for PC
-                                       /* the existingEntryIndex corresponds to en entry with the same line and a PC >= startPC.
-                                               in this case it is relevant to widen this entry instead of creating a new one.
-                                               line1: this(a,
-                                                 b,
-                                                 c);
-                                               with this code we generate each argument. We generate a aload0 to invoke the constructor. There is no entry for this
-                                               aload0 bytecode. The first entry is the one for the argument a.
-                                               But we want the constructor call to start at the aload0 pc and not just at the pc of the first argument.
-                                               So we widen the existing entry (if there is one) or we create a new entry with the startPC.
-                                       */
-                                       if (existingEntryIndex != -1) {
-                                               // widen existing entry
-                                               pcToSourceMap[existingEntryIndex] = startPC;
-                                       } else {
-                                               // we have to add an entry that won't be sorted. So we sort the pcToSourceMap.
-                                               System.arraycopy(pcToSourceMap, insertionIndex, pcToSourceMap, insertionIndex + 2, pcToSourceMapSize - insertionIndex);
-                                               pcToSourceMap[insertionIndex++] = startPC;
-                                               pcToSourceMap[insertionIndex] = newLine;
-                                               pcToSourceMapSize += 2;
-                                       }
-                               }
-                               if (position != lastEntryPC) { // no bytecode since last entry pc
-                                       pcToSourceMap[pcToSourceMapSize++] = lastEntryPC;
-                                       pcToSourceMap[pcToSourceMapSize++] = newLine;
-                               }
-                       } else {
-                               // we can safely add the new entry. The endPC of the previous entry is not in conflit with the startPC of the new entry.
-                               pcToSourceMap[pcToSourceMapSize++] = startPC;
-                               pcToSourceMap[pcToSourceMapSize++] = newLine;
-                       }
-               } else {
-                       /* the last recorded entry is on the same line. But it could be relevant to widen this entry.
-                          we want to extend this entry forward in case we generated some bytecode before the last entry that are not related to any statement
-                       */      
-                       if (startPC < pcToSourceMap[pcToSourceMapSize - 2]) {
-                               int insertionIndex = insertionIndex(pcToSourceMap, pcToSourceMapSize, startPC);
-                               if (insertionIndex != -1) {
-                                       // widen the existing entry
-                                       // we have to figure out if we need to move the last entry at another location to keep a sorted table
-                                       if ((pcToSourceMapSize > 4) && (pcToSourceMap[pcToSourceMapSize - 4] > startPC)) {
-                                               System.arraycopy(pcToSourceMap, insertionIndex, pcToSourceMap, insertionIndex + 2, pcToSourceMapSize - 2 - insertionIndex);
-                                               pcToSourceMap[insertionIndex++] = startPC;
-                                               pcToSourceMap[insertionIndex] = newLine;                                                
-                                       } else {
-                                               pcToSourceMap[pcToSourceMapSize - 2] = startPC;
-                                       }
-                               }
-                       }
-               }
-               lastEntryPC = position;
-       } else {
-               // record the first entry
-               pcToSourceMap[pcToSourceMapSize++] = startPC;
-               pcToSourceMap[pcToSourceMapSize++] = newLine;
-               lastEntryPC = position;
-       }
-}
-/**
- * @param anExceptionLabel org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel
- */
-public void registerExceptionHandler(ExceptionLabel anExceptionLabel) {
-       int length;
-       if (exceptionHandlersNumber >= (length = exceptionHandlers.length)) {
-               // resize the exception handlers table
-               System.arraycopy(exceptionHandlers, 0, exceptionHandlers = new ExceptionLabel[length + LABELS_INCREMENT], 0, length);
-       }
-       // no need to resize. So just add the new exception label
-       exceptionHandlers[exceptionHandlersNumber++] = anExceptionLabel;
-}
-public final void removeNotDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
-       // given some flow info, make sure we did not loose some variables initialization
-       // if this happens, then we must update their pc entries to reflect it in debug attributes
-       if (!generateLocalVariableTableAttributes)
-               return;
-/*     if (initStateIndex == lastInitStateIndexWhenRemovingInits)
-               return;
-               
-       lastInitStateIndexWhenRemovingInits = initStateIndex;
-       if (lastInitStateIndexWhenAddingInits != initStateIndex){
-               lastInitStateIndexWhenAddingInits = -2;// reinitialize add index 
-               // add(1)-remove(1)-add(1) -> ignore second add
-               // add(1)-remove(2)-add(1) -> perform second add
-       }*/
-       for (int i = 0; i < visibleLocalsCount; i++) {
-               LocalVariableBinding localBinding = visibleLocals[i];
-               if (localBinding != null) {
-                       if (initStateIndex == -1 || !isDefinitelyAssigned(scope, initStateIndex, localBinding)) {
-                               if (localBinding.initializationCount > 0) {
-                                       localBinding.recordInitializationEndPC(position);
-                               }
-                       }
-               }
-       }
-}
-/**
- * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
- * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
- */
-public void reset(AbstractMethodDeclaration methodDeclaration, ClassFile classFile) {
-       init(classFile);
-       this.methodDeclaration = methodDeclaration;
-       preserveUnusedLocals = methodDeclaration.scope.problemReporter().options.preserveAllLocalVariables;
-       initializeMaxLocals(methodDeclaration.binding);
-}
-/**
- * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
- * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
- */
-public void resetForProblemClinit(ClassFile classFile) {
-       init(classFile);
-       maxLocals = 0;
-}
-protected final void resizeByteArray() {
-       int actualLength = bCodeStream.length;
-       int requiredSize = actualLength + growFactor;
-       if (classFileOffset > requiredSize) {
-               requiredSize = classFileOffset + growFactor;
-       }
-       System.arraycopy(bCodeStream, 0, (bCodeStream = new byte[requiredSize]), 0, actualLength);
-}
-/**
- * This method is used to resize the internal byte array in 
- * case of a ArrayOutOfBoundsException when adding the value b.
- * Resize and add the new byte b inside the array.
- * @param b byte
- */
-protected final void resizeByteArray(byte b) {
-       resizeByteArray();
-       bCodeStream[classFileOffset - 1] = b;
-}
-final public void ret(int index) {
-       countLabels = 0;
-       if (index > 255) { // Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_wide;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_wide);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ret;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ret);
-               }
-               writeUnsignedShort(index);
-       } else { // Don't Widen
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = OPC_ret;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(OPC_ret);
-               }
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = (byte) index;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray((byte) index);
-               }
-       }
-}
-final public void return_() {
-       countLabels = 0;
-       // the stackDepth should be equal to 0 
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_return;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_return);
-       }
-}
-final public void saload() {
-       countLabels = 0;
-       stackDepth--;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_saload;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_saload);
-       }
-}
-final public void sastore() {
-       countLabels = 0;
-       stackDepth -= 3;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_sastore;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_sastore);
-       }
-}
-/**
- * @param operatorConstant int
- * @param type_ID int
- */
-public void sendOperator(int operatorConstant, int type_ID) {
-       switch (type_ID) {
-               case T_int :
-               case T_boolean :
-               case T_char :
-               case T_byte :
-               case T_short :
-                       switch (operatorConstant) {
-                               case PLUS :
-                                       this.iadd();
-                                       break;
-                               case MINUS :
-                                       this.isub();
-                                       break;
-                               case MULTIPLY :
-                                       this.imul();
-                                       break;
-                               case DIVIDE :
-                                       this.idiv();
-                                       break;
-                               case REMAINDER :
-                                       this.irem();
-                                       break;
-                               case LEFT_SHIFT :
-                                       this.ishl();
-                                       break;
-                               case RIGHT_SHIFT :
-                                       this.ishr();
-                                       break;
-                               case UNSIGNED_RIGHT_SHIFT :
-                                       this.iushr();
-                                       break;
-                               case AND :
-                                       this.iand();
-                                       break;
-                               case OR :
-                                       this.ior();
-                                       break;
-                               case XOR :
-                                       this.ixor();
-                                       break;
-                       }
-                       break;
-               case T_long :
-                       switch (operatorConstant) {
-                               case PLUS :
-                                       this.ladd();
-                                       break;
-                               case MINUS :
-                                       this.lsub();
-                                       break;
-                               case MULTIPLY :
-                                       this.lmul();
-                                       break;
-                               case DIVIDE :
-                                       this.ldiv();
-                                       break;
-                               case REMAINDER :
-                                       this.lrem();
-                                       break;
-                               case LEFT_SHIFT :
-                                       this.lshl();
-                                       break;
-                               case RIGHT_SHIFT :
-                                       this.lshr();
-                                       break;
-                               case UNSIGNED_RIGHT_SHIFT :
-                                       this.lushr();
-                                       break;
-                               case AND :
-                                       this.land();
-                                       break;
-                               case OR :
-                                       this.lor();
-                                       break;
-                               case XOR :
-                                       this.lxor();
-                                       break;
-                       }
-                       break;
-               case T_float :
-                       switch (operatorConstant) {
-                               case PLUS :
-                                       this.fadd();
-                                       break;
-                               case MINUS :
-                                       this.fsub();
-                                       break;
-                               case MULTIPLY :
-                                       this.fmul();
-                                       break;
-                               case DIVIDE :
-                                       this.fdiv();
-                                       break;
-                               case REMAINDER :
-                                       this.frem();
-                       }
-                       break;
-               case T_double :
-                       switch (operatorConstant) {
-                               case PLUS :
-                                       this.dadd();
-                                       break;
-                               case MINUS :
-                                       this.dsub();
-                                       break;
-                               case MULTIPLY :
-                                       this.dmul();
-                                       break;
-                               case DIVIDE :
-                                       this.ddiv();
-                                       break;
-                               case REMAINDER :
-                                       this.drem();
-                       }
-       }
-}
-final public void sipush(int s) {
-       countLabels = 0;
-       stackDepth++;
-       if (stackDepth > stackMax)
-               stackMax = stackDepth;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_sipush;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_sipush);
-       }
-       writeSignedShort(s);
-}
-public static final void sort(int[] tab, int lo0, int hi0, int[] result) {
-       int lo = lo0;
-       int hi = hi0;
-       int mid;
-       if (hi0 > lo0) {
-               /* Arbitrarily establishing partition element as the midpoint of
-                 * the array.
-                 */
-               mid = tab[ (lo0 + hi0) / 2];
-               // loop through the array until indices cross
-               while (lo <= hi) {
-                       /* find the first element that is greater than or equal to 
-                        * the partition element starting from the left Index.
-                        */
-                       while ((lo < hi0) && (tab[lo] < mid))
-                               ++lo;
-                       /* find an element that is smaller than or equal to 
-                        * the partition element starting from the right Index.
-                        */
-                       while ((hi > lo0) && (tab[hi] > mid))
-                               --hi;
-                       // if the indexes have not crossed, swap
-                       if (lo <= hi) {
-                               swap(tab, lo, hi, result);
-                               ++lo;
-                               --hi;
-                       }
-               }
-               /* If the right index has not reached the left side of array
-                 * must now sort the left partition.
-                 */
-               if (lo0 < hi)
-                       sort(tab, lo0, hi, result);
-               /* If the left index has not reached the right side of array
-                 * must now sort the right partition.
-                 */
-               if (lo < hi0)
-                       sort(tab, lo, hi0, result);
-       }
-}
-public final void store(LocalVariableBinding localBinding, boolean valueRequired) {
-       TypeBinding type = localBinding.type;
-       int position = localBinding.resolvedPosition;
-       // Using dedicated int bytecode
-       if ((type == IntBinding) || (type == CharBinding) || (type == ByteBinding) || (type == ShortBinding) || (type == BooleanBinding)) {
-               if (valueRequired)
-                       this.dup();
-               switch (position) {
-                       case 0 :
-                               this.istore_0();
-                               break;
-                       case 1 :
-                               this.istore_1();
-                               break;
-                       case 2 :
-                               this.istore_2();
-                               break;
-                       case 3 :
-                               this.istore_3();
-                               break;
-                       default :
-                               this.istore(position);
-               }
-               return;
-       }
-       // Using dedicated float bytecode
-       if (type == FloatBinding) {
-               if (valueRequired)
-                       this.dup();
-               switch (position) {
-                       case 0 :
-                               this.fstore_0();
-                               break;
-                       case 1 :
-                               this.fstore_1();
-                               break;
-                       case 2 :
-                               this.fstore_2();
-                               break;
-                       case 3 :
-                               this.fstore_3();
-                               break;
-                       default :
-                               this.fstore(position);
-               }
-               return;
-       }
-       // Using dedicated long bytecode
-       if (type == LongBinding) {
-               if (valueRequired)
-                       this.dup2();
-               switch (position) {
-                       case 0 :
-                               this.lstore_0();
-                               break;
-                       case 1 :
-                               this.lstore_1();
-                               break;
-                       case 2 :
-                               this.lstore_2();
-                               break;
-                       case 3 :
-                               this.lstore_3();
-                               break;
-                       default :
-                               this.lstore(position);
-               }
-               return;
-       }
-       // Using dedicated double bytecode
-       if (type == DoubleBinding) {
-               if (valueRequired)
-                       this.dup2();
-               switch (position) {
-                       case 0 :
-                               this.dstore_0();
-                               break;
-                       case 1 :
-                               this.dstore_1();
-                               break;
-                       case 2 :
-                               this.dstore_2();
-                               break;
-                       case 3 :
-                               this.dstore_3();
-                               break;
-                       default :
-                               this.dstore(position);
-               }
-               return;
-       }
-       // Reference object
-       if (valueRequired)
-               this.dup();
-       switch (position) {
-               case 0 :
-                       this.astore_0();
-                       break;
-               case 1 :
-                       this.astore_1();
-                       break;
-               case 2 :
-                       this.astore_2();
-                       break;
-               case 3 :
-                       this.astore_3();
-                       break;
-               default :
-                       this.astore(position);
-       }
-}
-public final void store(TypeBinding type, int position) {
-       // Using dedicated int bytecode
-       if ((type == IntBinding) || (type == CharBinding) || (type == ByteBinding) || (type == ShortBinding) || (type == BooleanBinding)) {
-               switch (position) {
-                       case 0 :
-                               this.istore_0();
-                               break;
-                       case 1 :
-                               this.istore_1();
-                               break;
-                       case 2 :
-                               this.istore_2();
-                               break;
-                       case 3 :
-                               this.istore_3();
-                               break;
-                       default :
-                               this.istore(position);
-               }
-               return;
-       }
-       // Using dedicated float bytecode
-       if (type == FloatBinding) {
-               switch (position) {
-                       case 0 :
-                               this.fstore_0();
-                               break;
-                       case 1 :
-                               this.fstore_1();
-                               break;
-                       case 2 :
-                               this.fstore_2();
-                               break;
-                       case 3 :
-                               this.fstore_3();
-                               break;
-                       default :
-                               this.fstore(position);
-               }
-               return;
-       }
-       // Using dedicated long bytecode
-       if (type == LongBinding) {
-               switch (position) {
-                       case 0 :
-                               this.lstore_0();
-                               break;
-                       case 1 :
-                               this.lstore_1();
-                               break;
-                       case 2 :
-                               this.lstore_2();
-                               break;
-                       case 3 :
-                               this.lstore_3();
-                               break;
-                       default :
-                               this.lstore(position);
-               }
-               return;
-       }
-       // Using dedicated double bytecode
-       if (type == DoubleBinding) {
-               switch (position) {
-                       case 0 :
-                               this.dstore_0();
-                               break;
-                       case 1 :
-                               this.dstore_1();
-                               break;
-                       case 2 :
-                               this.dstore_2();
-                               break;
-                       case 3 :
-                               this.dstore_3();
-                               break;
-                       default :
-                               this.dstore(position);
-               }
-               return;
-       }
-       // Reference object
-       switch (position) {
-               case 0 :
-                       this.astore_0();
-                       break;
-               case 1 :
-                       this.astore_1();
-                       break;
-               case 2 :
-                       this.astore_2();
-                       break;
-               case 3 :
-                       this.astore_3();
-                       break;
-               default :
-                       this.astore(position);
-       }
-}
-public final void storeInt(int position) {
-       switch (position) {
-               case 0 :
-                       this.istore_0();
-                       break;
-               case 1 :
-                       this.istore_1();
-                       break;
-               case 2 :
-                       this.istore_2();
-                       break;
-               case 3 :
-                       this.istore_3();
-                       break;
-               default :
-                       this.istore(position);
-       }
-}
-public final void storeObject(int position) {
-       switch (position) {
-               case 0 :
-                       this.astore_0();
-                       break;
-               case 1 :
-                       this.astore_1();
-                       break;
-               case 2 :
-                       this.astore_2();
-                       break;
-               case 3 :
-                       this.astore_3();
-                       break;
-               default :
-                       this.astore(position);
-       }
-}
-final public void swap() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_swap;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_swap);
-       }
-}
-private static final void swap(int a[], int i, int j, int result[]) {
-       int T;
-       T = a[i];
-       a[i] = a[j];
-       a[j] = T;
-       T = result[j];
-       result[j] = result[i];
-       result[i] = T;
-}
-final public void tableswitch(CaseLabel defaultLabel, int low, int high, int[] keys, int[] sortedIndexes, CaseLabel[] casesLabel) {
-       countLabels = 0;
-       stackDepth--;
-       int length = casesLabel.length;
-       int pos = position;
-       defaultLabel.placeInstruction();
-       for (int i = 0; i < length; i++)
-               casesLabel[i].placeInstruction();
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_tableswitch;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_tableswitch);
-       }
-       for (int i = (3 - (pos % 4)); i > 0; i--) {
-               position++; // Padding
-               classFileOffset++;
-       }
-       defaultLabel.branch();
-       writeSignedWord(low);
-       writeSignedWord(high);
-       int i = low, j = low;
-       // the index j is used to know if the index i is one of the missing entries in case of an 
-       // optimized tableswitch
-       while (true) {
-               int index;
-               int key = keys[index = sortedIndexes[j - low]];
-               if (key == i) {
-                       casesLabel[index].branch();
-                       j++;
-                       if (i == high) break; // if high is maxint, then avoids wrapping to minint.
-               } else {
-                       defaultLabel.branch();
-               }
-               i++;
-       }
-}
-public String toString() {
-       StringBuffer buffer = new StringBuffer("( position:"); //$NON-NLS-1$
-       buffer.append(position);
-       buffer.append(",\nstackDepth:"); //$NON-NLS-1$
-       buffer.append(stackDepth);
-       buffer.append(",\nmaxStack:"); //$NON-NLS-1$
-       buffer.append(stackMax);
-       buffer.append(",\nmaxLocals:"); //$NON-NLS-1$
-       buffer.append(maxLocals);
-       buffer.append(")"); //$NON-NLS-1$
-       return buffer.toString();
-}
-public void updateLastRecordedEndPC(int pos) {
+    if (!generateLineNumberAttributes)
+      return;
+    if (sourcePos == 0)
+      return;
 
-       /* Tune positions in the table, this is due to some 
-        * extra bytecodes being
-        * added to some user code (jumps). */
-       /** OLD CODE
-               if (!generateLineNumberAttributes)
-                       return;
-               pcToSourceMap[pcToSourceMapSize - 1][1] = position;
-               // need to update the initialization endPC in case of generation of local variable attributes.
-               updateLocalVariablesAttribute(pos);     
-       */      
+    // no code generated for this node. e.g. field without any initialization
+    if (position == startPC)
+      return;
 
-       if (!generateLineNumberAttributes)
-               return;
-       // need to update the initialization endPC in case of generation of local variable attributes.
-       updateLocalVariablesAttribute(pos);
-}
-public void updateLocalVariablesAttribute(int pos) {
-       // need to update the initialization endPC in case of generation of local variable attributes.
-       if (generateLocalVariableTableAttributes) {
-               for (int i = 0, max = locals.length; i < max; i++) {
-                       LocalVariableBinding local = locals[i];
-                       if ((local != null) && (local.initializationCount > 0)) {
-                               if (local.initializationPCs[((local.initializationCount - 1) << 1) + 1] == pos) {
-                                       local.initializationPCs[((local.initializationCount - 1) << 1) + 1] = position;
-                               }
-                       }
-               }
-       }
-}
-final public void wide() {
-       countLabels = 0;
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = OPC_wide;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(OPC_wide);
-       }
-}
-public final void writeByte(byte b) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray(b);
-       }
-}
-public final void writeByteAtPos(int pos, byte b) {
-       try {
-               bCodeStream[pos] = b;
-       } catch (IndexOutOfBoundsException ex) {
-               resizeByteArray();
-               bCodeStream[pos] = b;
-       }
-}
-/**
- * Write a unsigned 8 bits value into the byte array
- * @param b the signed byte
- */
-public final void writeSignedByte(int b) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) b);
-       }
-}
-/**
- * Write a signed 16 bits value into the byte array
- * @param b the signed short
- */
-public final void writeSignedShort(int b) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (b >> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (b >> 8));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) b);
-       }
-}
-public final void writeSignedShort(int pos, int b) {
-       int currentOffset = startingClassFileOffset + pos;
-       try {
-               bCodeStream[currentOffset] = (byte) (b >> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset] = (byte) (b >> 8);
-       }
-       try {
-               bCodeStream[currentOffset + 1] = (byte) b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset + 1] = (byte) b;
-       }
-}
-public final void writeSignedWord(int value) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) ((value & 0xFF000000) >> 24);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) ((value & 0xFF000000) >> 24));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) ((value & 0xFF0000) >> 16);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) ((value & 0xFF0000) >> 16));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) ((value & 0xFF00) >> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) ((value & 0xFF00) >> 8));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (value & 0xFF);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (value & 0xFF));
-       }
-}
-public final void writeSignedWord(int pos, int value) {
-       int currentOffset = startingClassFileOffset + pos;
-       try {
-               bCodeStream[currentOffset++] = (byte) ((value & 0xFF000000) >> 24);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset-1] = (byte) ((value & 0xFF000000) >> 24);
-       }
-       try {
-               bCodeStream[currentOffset++] = (byte) ((value & 0xFF0000) >> 16);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset-1] = (byte) ((value & 0xFF0000) >> 16);
-       }
-       try {
-               bCodeStream[currentOffset++] = (byte) ((value & 0xFF00) >> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset-1] = (byte) ((value & 0xFF00) >> 8);
-       }
-       try {
-               bCodeStream[currentOffset++] = (byte) (value & 0xFF);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray();
-               bCodeStream[currentOffset-1] = (byte) (value & 0xFF);
-       }
-}
-/**
- * Write a unsigned 8 bits value into the byte array
- * @param b the unsigned byte
- */
-public final void writeUnsignedByte(int b) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) b);
-       }
-}
-/**
- * Write a unsigned 16 bits value into the byte array
- * @param b the unsigned short
- */
-public final void writeUnsignedShort(int b) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (b >>> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (b >>> 8));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) b;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) b);
-       }
-}
-/**
- * Write a unsigned 32 bits value into the byte array
- * @param value the unsigned word
- */
-public final void writeUnsignedWord(int value) {
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (value >>> 24);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (value >>> 24));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (value >>> 16);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (value >>> 16));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) (value >>> 8);
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) (value >>> 8));
-       }
-       try {
-               position++;
-               bCodeStream[classFileOffset++] = (byte) value;
-       } catch (IndexOutOfBoundsException e) {
-               resizeByteArray((byte) value);
-       }
-}
+    // Widening an existing entry that already has the same source positions
+    if (pcToSourceMapSize + 4 > pcToSourceMap.length) {
+      // resize the array pcToSourceMap
+      System.arraycopy(pcToSourceMap, 0, (pcToSourceMap = new int[pcToSourceMapSize << 1]), 0, pcToSourceMapSize);
+    }
+    int newLine = ClassFile.searchLineNumber(lineSeparatorPositions, sourcePos);
+    // lastEntryPC represents the endPC of the lastEntry.
+    if (pcToSourceMapSize > 0) {
+      // in this case there is already an entry in the table
+      if (pcToSourceMap[pcToSourceMapSize - 1] != newLine) {
+        if (startPC < lastEntryPC) {
+          // we forgot to add an entry.
+          // search if an existing entry exists for startPC
+          int insertionIndex = insertionIndex(pcToSourceMap, pcToSourceMapSize, startPC);
+          if (insertionIndex != -1) {
+            // there is no existing entry starting with startPC.
+            int existingEntryIndex = indexOfSameLineEntrySincePC(startPC, newLine); // index for PC
+            /* the existingEntryIndex corresponds to en entry with the same line and a PC >= startPC.
+               in this case it is relevant to widen this entry instead of creating a new one.
+               line1: this(a,
+                 b,
+                 c);
+               with this code we generate each argument. We generate a aload0 to invoke the constructor. There is no entry for this
+               aload0 bytecode. The first entry is the one for the argument a.
+               But we want the constructor call to start at the aload0 pc and not just at the pc of the first argument.
+               So we widen the existing entry (if there is one) or we create a new entry with the startPC.
+            */
+            if (existingEntryIndex != -1) {
+              // widen existing entry
+              pcToSourceMap[existingEntryIndex] = startPC;
+            } else {
+              // we have to add an entry that won't be sorted. So we sort the pcToSourceMap.
+              System.arraycopy(
+                pcToSourceMap,
+                insertionIndex,
+                pcToSourceMap,
+                insertionIndex + 2,
+                pcToSourceMapSize - insertionIndex);
+              pcToSourceMap[insertionIndex++] = startPC;
+              pcToSourceMap[insertionIndex] = newLine;
+              pcToSourceMapSize += 2;
+            }
+          }
+          if (position != lastEntryPC) { // no bytecode since last entry pc
+            pcToSourceMap[pcToSourceMapSize++] = lastEntryPC;
+            pcToSourceMap[pcToSourceMapSize++] = newLine;
+          }
+        } else {
+          // we can safely add the new entry. The endPC of the previous entry is not in conflit with the startPC of the new entry.
+          pcToSourceMap[pcToSourceMapSize++] = startPC;
+          pcToSourceMap[pcToSourceMapSize++] = newLine;
+        }
+      } else {
+        /* the last recorded entry is on the same line. But it could be relevant to widen this entry.
+           we want to extend this entry forward in case we generated some bytecode before the last entry that are not related to any statement
+        */
+        if (startPC < pcToSourceMap[pcToSourceMapSize - 2]) {
+          int insertionIndex = insertionIndex(pcToSourceMap, pcToSourceMapSize, startPC);
+          if (insertionIndex != -1) {
+            // widen the existing entry
+            // we have to figure out if we need to move the last entry at another location to keep a sorted table
+            if ((pcToSourceMapSize > 4) && (pcToSourceMap[pcToSourceMapSize - 4] > startPC)) {
+              System.arraycopy(
+                pcToSourceMap,
+                insertionIndex,
+                pcToSourceMap,
+                insertionIndex + 2,
+                pcToSourceMapSize - 2 - insertionIndex);
+              pcToSourceMap[insertionIndex++] = startPC;
+              pcToSourceMap[insertionIndex] = newLine;
+            } else {
+              pcToSourceMap[pcToSourceMapSize - 2] = startPC;
+            }
+          }
+        }
+      }
+      lastEntryPC = position;
+    } else {
+      // record the first entry
+      pcToSourceMap[pcToSourceMapSize++] = startPC;
+      pcToSourceMap[pcToSourceMapSize++] = newLine;
+      lastEntryPC = position;
+    }
+  }
+  /**
+   * @param anExceptionLabel org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel
+   */
+  public void registerExceptionHandler(ExceptionLabel anExceptionLabel) {
+    int length;
+    if (exceptionHandlersNumber >= (length = exceptionHandlers.length)) {
+      // resize the exception handlers table
+      System.arraycopy(exceptionHandlers, 0, exceptionHandlers = new ExceptionLabel[length + LABELS_INCREMENT], 0, length);
+    }
+    // no need to resize. So just add the new exception label
+    exceptionHandlers[exceptionHandlersNumber++] = anExceptionLabel;
+  }
+  public final void removeNotDefinitelyAssignedVariables(Scope scope, int initStateIndex) {
+    // given some flow info, make sure we did not loose some variables initialization
+    // if this happens, then we must update their pc entries to reflect it in debug attributes
+    if (!generateLocalVariableTableAttributes)
+      return;
+    /* if (initStateIndex == lastInitStateIndexWhenRemovingInits)
+               return;
+               
+       lastInitStateIndexWhenRemovingInits = initStateIndex;
+       if (lastInitStateIndexWhenAddingInits != initStateIndex){
+               lastInitStateIndexWhenAddingInits = -2;// reinitialize add index 
+               // add(1)-remove(1)-add(1) -> ignore second add
+               // add(1)-remove(2)-add(1) -> perform second add
+       }*/
+    for (int i = 0; i < visibleLocalsCount; i++) {
+      LocalVariableBinding localBinding = visibleLocals[i];
+      if (localBinding != null) {
+        if (initStateIndex == -1 || !isDefinitelyAssigned(scope, initStateIndex, localBinding)) {
+          if (localBinding.initializationCount > 0) {
+            localBinding.recordInitializationEndPC(position);
+          }
+        }
+      }
+    }
+  }
+  /**
+   * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
+   * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
+   */
+  public void reset(AbstractMethodDeclaration methodDeclaration, ClassFile classFile) {
+    init(classFile);
+    this.methodDeclaration = methodDeclaration;
+    preserveUnusedLocals = methodDeclaration.scope.problemReporter().options.preserveAllLocalVariables;
+    initializeMaxLocals(methodDeclaration.binding);
+  }
+  /**
+   * @param methodDeclaration org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration
+   * @param classFile org.eclipse.jdt.internal.compiler.codegen.ClassFile
+   */
+  public void resetForProblemClinit(ClassFile classFile) {
+    init(classFile);
+    maxLocals = 0;
+  }
+  protected final void resizeByteArray() {
+    int actualLength = bCodeStream.length;
+    int requiredSize = actualLength + growFactor;
+    if (classFileOffset > requiredSize) {
+      requiredSize = classFileOffset + growFactor;
+    }
+    System.arraycopy(bCodeStream, 0, (bCodeStream = new byte[requiredSize]), 0, actualLength);
+  }
+  /**
+   * This method is used to resize the internal byte array in 
+   * case of a ArrayOutOfBoundsException when adding the value b.
+   * Resize and add the new byte b inside the array.
+   * @param b byte
+   */
+  protected final void resizeByteArray(byte b) {
+    resizeByteArray();
+    bCodeStream[classFileOffset - 1] = b;
+  }
+  final public void ret(int index) {
+    countLabels = 0;
+    if (index > 255) { // Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_wide;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_wide);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ret;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ret);
+      }
+      writeUnsignedShort(index);
+    } else { // Don't Widen
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = OPC_ret;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray(OPC_ret);
+      }
+      try {
+        position++;
+        bCodeStream[classFileOffset++] = (byte) index;
+      } catch (IndexOutOfBoundsException e) {
+        resizeByteArray((byte) index);
+      }
+    }
+  }
+  final public void return_() {
+    countLabels = 0;
+    // the stackDepth should be equal to 0 
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_return;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_return);
+    }
+  }
+  final public void saload() {
+    countLabels = 0;
+    stackDepth--;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_saload;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_saload);
+    }
+  }
+  final public void sastore() {
+    countLabels = 0;
+    stackDepth -= 3;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_sastore;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_sastore);
+    }
+  }
+  /**
+   * @param operatorConstant int
+   * @param type_ID int
+   */
+  public void sendOperator(int operatorConstant, int type_ID) {
+    switch (type_ID) {
+      case T_int :
+      case T_boolean :
+      case T_char :
+      case T_byte :
+      case T_short :
+        switch (operatorConstant) {
+          case PLUS :
+            this.iadd();
+            break;
+          case MINUS :
+            this.isub();
+            break;
+          case MULTIPLY :
+            this.imul();
+            break;
+          case DIVIDE :
+            this.idiv();
+            break;
+          case REMAINDER :
+            this.irem();
+            break;
+          case LEFT_SHIFT :
+            this.ishl();
+            break;
+          case RIGHT_SHIFT :
+            this.ishr();
+            break;
+          case UNSIGNED_RIGHT_SHIFT :
+            this.iushr();
+            break;
+          case AND :
+            this.iand();
+            break;
+          case OR :
+            this.ior();
+            break;
+          case XOR :
+            this.ixor();
+            break;
+        }
+        break;
+      case T_long :
+        switch (operatorConstant) {
+          case PLUS :
+            this.ladd();
+            break;
+          case MINUS :
+            this.lsub();
+            break;
+          case MULTIPLY :
+            this.lmul();
+            break;
+          case DIVIDE :
+            this.ldiv();
+            break;
+          case REMAINDER :
+            this.lrem();
+            break;
+          case LEFT_SHIFT :
+            this.lshl();
+            break;
+          case RIGHT_SHIFT :
+            this.lshr();
+            break;
+          case UNSIGNED_RIGHT_SHIFT :
+            this.lushr();
+            break;
+          case AND :
+            this.land();
+            break;
+          case OR :
+            this.lor();
+            break;
+          case XOR :
+            this.lxor();
+            break;
+        }
+        break;
+      case T_float :
+        switch (operatorConstant) {
+          case PLUS :
+            this.fadd();
+            break;
+          case MINUS :
+            this.fsub();
+            break;
+          case MULTIPLY :
+            this.fmul();
+            break;
+          case DIVIDE :
+            this.fdiv();
+            break;
+          case REMAINDER :
+            this.frem();
+        }
+        break;
+      case T_double :
+        switch (operatorConstant) {
+          case PLUS :
+            this.dadd();
+            break;
+          case MINUS :
+            this.dsub();
+            break;
+          case MULTIPLY :
+            this.dmul();
+            break;
+          case DIVIDE :
+            this.ddiv();
+            break;
+          case REMAINDER :
+            this.drem();
+        }
+    }
+  }
+  final public void sipush(int s) {
+    countLabels = 0;
+    stackDepth++;
+    if (stackDepth > stackMax)
+      stackMax = stackDepth;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_sipush;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_sipush);
+    }
+    writeSignedShort(s);
+  }
+  public static final void sort(int[] tab, int lo0, int hi0, int[] result) {
+    int lo = lo0;
+    int hi = hi0;
+    int mid;
+    if (hi0 > lo0) {
+      /* Arbitrarily establishing partition element as the midpoint of
+        * the array.
+        */
+      mid = tab[(lo0 + hi0) / 2];
+      // loop through the array until indices cross
+      while (lo <= hi) {
+        /* find the first element that is greater than or equal to 
+         * the partition element starting from the left Index.
+         */
+        while ((lo < hi0) && (tab[lo] < mid))
+          ++lo;
+        /* find an element that is smaller than or equal to 
+         * the partition element starting from the right Index.
+         */
+        while ((hi > lo0) && (tab[hi] > mid))
+          --hi;
+        // if the indexes have not crossed, swap
+        if (lo <= hi) {
+          swap(tab, lo, hi, result);
+          ++lo;
+          --hi;
+        }
+      }
+      /* If the right index has not reached the left side of array
+        * must now sort the left partition.
+        */
+      if (lo0 < hi)
+        sort(tab, lo0, hi, result);
+      /* If the left index has not reached the right side of array
+        * must now sort the right partition.
+        */
+      if (lo < hi0)
+        sort(tab, lo, hi0, result);
+    }
+  }
+  public final void store(LocalVariableBinding localBinding, boolean valueRequired) {
+    TypeBinding type = localBinding.type;
+    int position = localBinding.resolvedPosition;
+    // Using dedicated int bytecode
+    if ((type == IntBinding)
+      || (type == CharBinding)
+      || (type == ByteBinding)
+      || (type == ShortBinding)
+      || (type == BooleanBinding)) {
+      if (valueRequired)
+        this.dup();
+      switch (position) {
+        case 0 :
+          this.istore_0();
+          break;
+        case 1 :
+          this.istore_1();
+          break;
+        case 2 :
+          this.istore_2();
+          break;
+        case 3 :
+          this.istore_3();
+          break;
+        default :
+          this.istore(position);
+      }
+      return;
+    }
+    // Using dedicated float bytecode
+    if (type == FloatBinding) {
+      if (valueRequired)
+        this.dup();
+      switch (position) {
+        case 0 :
+          this.fstore_0();
+          break;
+        case 1 :
+          this.fstore_1();
+          break;
+        case 2 :
+          this.fstore_2();
+          break;
+        case 3 :
+          this.fstore_3();
+          break;
+        default :
+          this.fstore(position);
+      }
+      return;
+    }
+    // Using dedicated long bytecode
+    if (type == LongBinding) {
+      if (valueRequired)
+        this.dup2();
+      switch (position) {
+        case 0 :
+          this.lstore_0();
+          break;
+        case 1 :
+          this.lstore_1();
+          break;
+        case 2 :
+          this.lstore_2();
+          break;
+        case 3 :
+          this.lstore_3();
+          break;
+        default :
+          this.lstore(position);
+      }
+      return;
+    }
+    // Using dedicated double bytecode
+    if (type == DoubleBinding) {
+      if (valueRequired)
+        this.dup2();
+      switch (position) {
+        case 0 :
+          this.dstore_0();
+          break;
+        case 1 :
+          this.dstore_1();
+          break;
+        case 2 :
+          this.dstore_2();
+          break;
+        case 3 :
+          this.dstore_3();
+          break;
+        default :
+          this.dstore(position);
+      }
+      return;
+    }
+    // Reference object
+    if (valueRequired)
+      this.dup();
+    switch (position) {
+      case 0 :
+        this.astore_0();
+        break;
+      case 1 :
+        this.astore_1();
+        break;
+      case 2 :
+        this.astore_2();
+        break;
+      case 3 :
+        this.astore_3();
+        break;
+      default :
+        this.astore(position);
+    }
+  }
+  public final void store(TypeBinding type, int position) {
+    // Using dedicated int bytecode
+    if ((type == IntBinding)
+      || (type == CharBinding)
+      || (type == ByteBinding)
+      || (type == ShortBinding)
+      || (type == BooleanBinding)) {
+      switch (position) {
+        case 0 :
+          this.istore_0();
+          break;
+        case 1 :
+          this.istore_1();
+          break;
+        case 2 :
+          this.istore_2();
+          break;
+        case 3 :
+          this.istore_3();
+          break;
+        default :
+          this.istore(position);
+      }
+      return;
+    }
+    // Using dedicated float bytecode
+    if (type == FloatBinding) {
+      switch (position) {
+        case 0 :
+          this.fstore_0();
+          break;
+        case 1 :
+          this.fstore_1();
+          break;
+        case 2 :
+          this.fstore_2();
+          break;
+        case 3 :
+          this.fstore_3();
+          break;
+        default :
+          this.fstore(position);
+      }
+      return;
+    }
+    // Using dedicated long bytecode
+    if (type == LongBinding) {
+      switch (position) {
+        case 0 :
+          this.lstore_0();
+          break;
+        case 1 :
+          this.lstore_1();
+          break;
+        case 2 :
+          this.lstore_2();
+          break;
+        case 3 :
+          this.lstore_3();
+          break;
+        default :
+          this.lstore(position);
+      }
+      return;
+    }
+    // Using dedicated double bytecode
+    if (type == DoubleBinding) {
+      switch (position) {
+        case 0 :
+          this.dstore_0();
+          break;
+        case 1 :
+          this.dstore_1();
+          break;
+        case 2 :
+          this.dstore_2();
+          break;
+        case 3 :
+          this.dstore_3();
+          break;
+        default :
+          this.dstore(position);
+      }
+      return;
+    }
+    // Reference object
+    switch (position) {
+      case 0 :
+        this.astore_0();
+        break;
+      case 1 :
+        this.astore_1();
+        break;
+      case 2 :
+        this.astore_2();
+        break;
+      case 3 :
+        this.astore_3();
+        break;
+      default :
+        this.astore(position);
+    }
+  }
+  public final void storeInt(int position) {
+    switch (position) {
+      case 0 :
+        this.istore_0();
+        break;
+      case 1 :
+        this.istore_1();
+        break;
+      case 2 :
+        this.istore_2();
+        break;
+      case 3 :
+        this.istore_3();
+        break;
+      default :
+        this.istore(position);
+    }
+  }
+  public final void storeObject(int position) {
+    switch (position) {
+      case 0 :
+        this.astore_0();
+        break;
+      case 1 :
+        this.astore_1();
+        break;
+      case 2 :
+        this.astore_2();
+        break;
+      case 3 :
+        this.astore_3();
+        break;
+      default :
+        this.astore(position);
+    }
+  }
+  final public void swap() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_swap;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_swap);
+    }
+  }
+  private static final void swap(int a[], int i, int j, int result[]) {
+    int T;
+    T = a[i];
+    a[i] = a[j];
+    a[j] = T;
+    T = result[j];
+    result[j] = result[i];
+    result[i] = T;
+  }
+  final public void tableswitch(
+    CaseLabel defaultLabel,
+    int low,
+    int high,
+    int[] keys,
+    int[] sortedIndexes,
+    CaseLabel[] casesLabel) {
+    countLabels = 0;
+    stackDepth--;
+    int length = casesLabel.length;
+    int pos = position;
+    defaultLabel.placeInstruction();
+    for (int i = 0; i < length; i++)
+      casesLabel[i].placeInstruction();
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_tableswitch;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_tableswitch);
+    }
+    for (int i = (3 - (pos % 4)); i > 0; i--) {
+      position++; // Padding
+      classFileOffset++;
+    }
+    defaultLabel.branch();
+    writeSignedWord(low);
+    writeSignedWord(high);
+    int i = low, j = low;
+    // the index j is used to know if the index i is one of the missing entries in case of an 
+    // optimized tableswitch
+    while (true) {
+      int index;
+      int key = keys[index = sortedIndexes[j - low]];
+      if (key == i) {
+        casesLabel[index].branch();
+        j++;
+        if (i == high)
+          break; // if high is maxint, then avoids wrapping to minint.
+      } else {
+        defaultLabel.branch();
+      }
+      i++;
+    }
+  }
+  public String toString() {
+    StringBuffer buffer = new StringBuffer("( position:"); //$NON-NLS-1$
+    buffer.append(position);
+    buffer.append(",\nstackDepth:"); //$NON-NLS-1$
+    buffer.append(stackDepth);
+    buffer.append(",\nmaxStack:"); //$NON-NLS-1$
+    buffer.append(stackMax);
+    buffer.append(",\nmaxLocals:"); //$NON-NLS-1$
+    buffer.append(maxLocals);
+    buffer.append(")"); //$NON-NLS-1$
+    return buffer.toString();
+  }
+  public void updateLastRecordedEndPC(int pos) {
 
-public void generateWideConditionalBranch(byte opcode, Label lbl) {
-               /* we handle the goto_w problem inside an if.... with some macro expansion
-                * at the bytecode level
-                * instead of:
-                * if_...... lbl
-                * we have:
-                *    ifne <l1>
-                *    goto <l2>
-                * l1 gotow <l3> // l3 is a wide target
-                * l2 ....
-                */
-               Label l1 = new Label(this);
-               try {
-                       position++;
-                       bCodeStream[classFileOffset++] = opcode;
-               } catch (IndexOutOfBoundsException e) {
-                       resizeByteArray(opcode);
-               }
-               l1.branch();
-               Label l2 = new Label(this);
-               this.internal_goto_(l2);
-               l1.place();
-               this.goto_w(lbl);
-               l2.place();
-}
+    /* Tune positions in the table, this is due to some 
+     * extra bytecodes being
+     * added to some user code (jumps). */
+    /** OLD CODE
+       if (!generateLineNumberAttributes)
+               return;
+       pcToSourceMap[pcToSourceMapSize - 1][1] = position;
+       // need to update the initialization endPC in case of generation of local variable attributes.
+       updateLocalVariablesAttribute(pos);     
+    */
+
+    if (!generateLineNumberAttributes)
+      return;
+    // need to update the initialization endPC in case of generation of local variable attributes.
+    updateLocalVariablesAttribute(pos);
+  }
+  public void updateLocalVariablesAttribute(int pos) {
+    // need to update the initialization endPC in case of generation of local variable attributes.
+    if (generateLocalVariableTableAttributes) {
+      for (int i = 0, max = locals.length; i < max; i++) {
+        LocalVariableBinding local = locals[i];
+        if ((local != null) && (local.initializationCount > 0)) {
+          if (local.initializationPCs[((local.initializationCount - 1) << 1) + 1] == pos) {
+            local.initializationPCs[((local.initializationCount - 1) << 1) + 1] = position;
+          }
+        }
+      }
+    }
+  }
+  final public void wide() {
+    countLabels = 0;
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = OPC_wide;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(OPC_wide);
+    }
+  }
+  public final void writeByte(byte b) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(b);
+    }
+  }
+  public final void writeByteAtPos(int pos, byte b) {
+    try {
+      bCodeStream[pos] = b;
+    } catch (IndexOutOfBoundsException ex) {
+      resizeByteArray();
+      bCodeStream[pos] = b;
+    }
+  }
+  /**
+   * Write a unsigned 8 bits value into the byte array
+   * @param b the signed byte
+   */
+  public final void writeSignedByte(int b) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) b);
+    }
+  }
+  /**
+   * Write a signed 16 bits value into the byte array
+   * @param b the signed short
+   */
+  public final void writeSignedShort(int b) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (b >> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (b >> 8));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) b);
+    }
+  }
+  public final void writeSignedShort(int pos, int b) {
+    int currentOffset = startingClassFileOffset + pos;
+    try {
+      bCodeStream[currentOffset] = (byte) (b >> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset] = (byte) (b >> 8);
+    }
+    try {
+      bCodeStream[currentOffset + 1] = (byte) b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset + 1] = (byte) b;
+    }
+  }
+  public final void writeSignedWord(int value) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) ((value & 0xFF000000) >> 24);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) ((value & 0xFF000000) >> 24));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) ((value & 0xFF0000) >> 16);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) ((value & 0xFF0000) >> 16));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) ((value & 0xFF00) >> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) ((value & 0xFF00) >> 8));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (value & 0xFF);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (value & 0xFF));
+    }
+  }
+  public final void writeSignedWord(int pos, int value) {
+    int currentOffset = startingClassFileOffset + pos;
+    try {
+      bCodeStream[currentOffset++] = (byte) ((value & 0xFF000000) >> 24);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset - 1] = (byte) ((value & 0xFF000000) >> 24);
+    }
+    try {
+      bCodeStream[currentOffset++] = (byte) ((value & 0xFF0000) >> 16);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset - 1] = (byte) ((value & 0xFF0000) >> 16);
+    }
+    try {
+      bCodeStream[currentOffset++] = (byte) ((value & 0xFF00) >> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset - 1] = (byte) ((value & 0xFF00) >> 8);
+    }
+    try {
+      bCodeStream[currentOffset++] = (byte) (value & 0xFF);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray();
+      bCodeStream[currentOffset - 1] = (byte) (value & 0xFF);
+    }
+  }
+  /**
+   * Write a unsigned 8 bits value into the byte array
+   * @param b the unsigned byte
+   */
+  public final void writeUnsignedByte(int b) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) b);
+    }
+  }
+  /**
+   * Write a unsigned 16 bits value into the byte array
+   * @param b the unsigned short
+   */
+  public final void writeUnsignedShort(int b) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (b >>> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (b >>> 8));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) b;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) b);
+    }
+  }
+  /**
+   * Write a unsigned 32 bits value into the byte array
+   * @param value the unsigned word
+   */
+  public final void writeUnsignedWord(int value) {
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (value >>> 24);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (value >>> 24));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (value >>> 16);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (value >>> 16));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) (value >>> 8);
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) (value >>> 8));
+    }
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = (byte) value;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray((byte) value);
+    }
+  }
+
+  public void generateWideConditionalBranch(byte opcode, Label lbl) {
+    /* we handle the goto_w problem inside an if.... with some macro expansion
+     * at the bytecode level
+     * instead of:
+     * if_...... lbl
+     * we have:
+     *    ifne <l1>
+     *    goto <l2>
+     * l1 gotow <l3> // l3 is a wide target
+     * l2 ....
+     */
+    Label l1 = new Label(this);
+    try {
+      position++;
+      bCodeStream[classFileOffset++] = opcode;
+    } catch (IndexOutOfBoundsException e) {
+      resizeByteArray(opcode);
+    }
+    l1.branch();
+    Label l2 = new Label(this);
+    this.internal_goto_(l2);
+    l1.place();
+    this.goto_w(lbl);
+    l2.place();
+  }
 }