*
* NORMAL_EXCEPTION_HANDLING:
*/
private void genException(MethodVisitor mv, BasicBlock bb, List<CallWeaver> cwList) {
bb.startLabel.accept(mv);
LabelNode resumeLabel = new LabelNode();
VMType.loadVar(mv, VMType.TOBJECT, getFiberVar());
mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "upEx", "()I");
// fiber.pc is on stack
LabelNode[] labels = new LabelNode[cwList.size()];
int[] keys = new int[cwList.size()];
for (int i = 0; i < cwList.size(); i++) {
labels[i] = new LabelNode();
keys[i] = callWeavers.indexOf(cwList.get(i)) + 1;
}
new LookupSwitchInsnNode(resumeLabel, keys, labels).accept(mv);
int i = 0;
for (CallWeaver cw: cwList) {
if (i > 0) {
// This is the jump (to normal exception handling) for the previous
// switch case.
mv.visitJumpInsn(GOTO, resumeLabel.getLabel());
}
labels[i].accept(mv);
cw.genRestoreEx(mv, labels[i]);
i++;
}
// Consume the first instruction because we have already consumed the
// corresponding label. (The standard visitInstructions code does a
// visitLabel before visiting the instruction itself)
resumeLabel.accept(mv);
bb.getInstruction(bb.startPos).accept(mv);
}