Fix bytecode instrumentation to work on pre-instrumented classes.

Currently, AsmInstrumentingClassLoader wipes out everything in a constructor
leading to the invokespecial for "<init>". If the class has already been
instrumented, for example for Emma or Jacoco offline code coverage, then part
of this instrumentation is destroyed, failing verification at load time due
to incorrect bytecode trying to access local variables no longer defined.

Closes #1234.
diff --git a/robolectric/src/main/java/org/robolectric/internal/bytecode/AsmInstrumentingClassLoader.java b/robolectric/src/main/java/org/robolectric/internal/bytecode/AsmInstrumentingClassLoader.java
index 8cb6be2..c0eab0a 100644
--- a/robolectric/src/main/java/org/robolectric/internal/bytecode/AsmInstrumentingClassLoader.java
+++ b/robolectric/src/main/java/org/robolectric/internal/bytecode/AsmInstrumentingClassLoader.java
@@ -23,6 +23,7 @@
 import org.objectweb.asm.tree.TypeInsnNode;
 import org.robolectric.internal.Shadow;
 import org.robolectric.internal.ShadowConstants;
+import org.objectweb.asm.tree.VarInsnNode;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -515,21 +516,31 @@
 
     private InsnList extractCallToSuperConstructor(MethodNode ctor) {
       InsnList removedInstructions = new InsnList();
+      int startIndex = 0;
 
-      InsnList ins = ctor.instructions;
-      ListIterator li = ins.iterator();
-
-      while (li.hasNext()) {
-        AbstractInsnNode node = (AbstractInsnNode) li.next();
-
-        li.remove();
-        removedInstructions.add(node);
+      AbstractInsnNode[] insns = ctor.instructions.toArray();
+      for (int i = 0; i < insns.length; i++) {
+        AbstractInsnNode node = insns[i];
 
         switch (node.getOpcode()) {
+          case ALOAD:
+            VarInsnNode vnode = (VarInsnNode) node;
+            if (vnode.var == 0) {
+              startIndex = i;
+            }
+            break;
+
           case INVOKESPECIAL:
             MethodInsnNode mnode = (MethodInsnNode) node;
             if (mnode.owner.equals(internalClassName) || mnode.owner.equals(classNode.superName)) {
               assert mnode.name.equals("<init>");
+
+              // remove all instructions in the range startIndex..i, from aload_0 to invokespecial <init>
+              while (startIndex <= i) {
+                ctor.instructions.remove(insns[startIndex]);
+                removedInstructions.add(insns[startIndex]);
+                startIndex++;
+              }
               return removedInstructions;
             }
             break;