public ListIterator listIterator(final int startIndex) {
			if (startIndex < 0 || startIndex > instructionCount)
				throw new IllegalArgumentException();
			return new ListIterator() {
				Instruction instr = get0(startIndex);
				Instruction toRemove = null;
				int index = startIndex;

				public boolean hasNext() {
					return index < instructionCount;
				}

				public boolean hasPrevious() {
					return index > 0;
				}

				public Object next() {
					if (index >= instructionCount)
						throw new NoSuchElementException();
					index++;
					toRemove = instr;
					instr = instr.nextByAddr;
					// System.err.println("next: "+toRemove.getDescription());
					return toRemove;
				}

				public Object previous() {
					if (index == 0)
						throw new NoSuchElementException();
					index--;
					instr = instr.prevByAddr;
					toRemove = instr;
					// System.err.println("prev: "+toRemove.getDescription());
					return toRemove;
				}

				public int nextIndex() {
					return index;
				}

				public int previousIndex() {
					return index - 1;
				}

				public void remove() {
					if (toRemove == null)
						throw new IllegalStateException();
					// System.err.println("remove: "+toRemove.getDescription());
					instructionCount--;
					if (instr == toRemove)
						instr = instr.nextByAddr;
					else
						index--;
					toRemove.removeInstruction(BytecodeInfo.this);
					toRemove = null;
				}

				public void add(Object o) {
					instructionCount++;
					index++;
					// System.err.println("add: "
					// +((Instruction)o).getDescription()
					// +" after "+instr.prevByAddr
					// .getDescription());
					instr.prevByAddr.appendInstruction((Instruction) o,
							BytecodeInfo.this);
					toRemove = null;
				}

				public void set(Object o) {
					if (toRemove == null)
						throw new IllegalStateException();
					// System.err.println("replace "+toRemove.getDescription()
					// +" with "
					// +((Instruction)o).getDescription());
					toRemove.replaceInstruction((Instruction) o,
							BytecodeInfo.this);
					if (instr == toRemove)
						instr = (Instruction) o;
					toRemove = (Instruction) o;
				}
			};
		}