private void markSubroutineWalk(final Subroutine sub, final int index,
			final BitSet anyvisited) {
		if (LOGGING) {
			log("markSubroutineWalk: sub=" + sub + " index=" + index);
		}

		// First find those instructions reachable via normal execution
		markSubroutineWalkDFS(sub, index, anyvisited);

		// Now, make sure we also include any applicable exception handlers
		boolean loop = true;
		while (loop) {
			loop = false;
			for (Iterator it = tryCatchBlocks.iterator(); it.hasNext();) {
				TryCatchBlockNode trycatch = (TryCatchBlockNode) it.next();

				if (LOGGING) {
					// TODO use of default toString().
					log("Scanning try/catch " + trycatch);
				}

				// If the handler has already been processed, skip it.
				int handlerindex = instructions.indexOf(trycatch.handler);
				if (sub.instructions.get(handlerindex)) {
					continue;
				}

				int startindex = instructions.indexOf(trycatch.start);
				int endindex = instructions.indexOf(trycatch.end);
				int nextbit = sub.instructions.nextSetBit(startindex);
				if (nextbit != -1 && nextbit < endindex) {
					if (LOGGING) {
						log("Adding exception handler: " + startindex + '-'
								+ endindex + " due to " + nextbit + " handler "
								+ handlerindex);
					}
					markSubroutineWalkDFS(sub, handlerindex, anyvisited);
					loop = true;
				}
			}
		}
	}