in src/main/java/org/apache/bcel/generic/InstructionList.java [1000:1045]
private void remove(final InstructionHandle prev, InstructionHandle next) throws TargetLostException {
InstructionHandle first;
InstructionHandle last; // First and last deleted instruction
if (prev == null && next == null) {
first = start;
last = end;
start = end = null;
} else {
if (prev == null) { // At start of list
first = start;
start = next;
} else {
first = prev.getNext();
prev.setNext(next);
}
if (next == null) { // At end of list
last = end;
end = prev;
} else {
last = next.getPrev();
next.setPrev(prev);
}
}
first.setPrev(null); // Completely separated from rest of list
last.setNext(null);
final List<InstructionHandle> targetList = new ArrayList<>();
for (InstructionHandle ih = first; ih != null; ih = ih.getNext()) {
ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets
}
final StringBuilder buf = new StringBuilder("{ ");
for (InstructionHandle ih = first; ih != null; ih = next) {
next = ih.getNext();
length--;
if (ih.hasTargeters()) { // Still got targeters?
targetList.add(ih);
buf.append(ih.toString(true)).append(" ");
ih.setNext(ih.setPrev(null));
} else {
ih.dispose();
}
}
buf.append("}");
if (!targetList.isEmpty()) {
throw new TargetLostException(targetList.toArray(InstructionHandle.EMPTY_ARRAY), buf.toString());
}
}