protected Instruction nextInstruction(Flow flow, boolean isInDelaySlot)
				throws CancelledException {
			state.monitor.checkCancelled();
			if (state.visited.contains(flow.to)) {
				// Already disassembled here
				// TODO: Record instruction conflicts?
				return null;
			}
			recordContext(flow.to);
			if (!shouldDisassemble(flow)) {
				return null;
			}
			MemBuffer buffer = state.createBuffer(flow.to);
			RegisterValue newCtxVal = disassemblerContext.getRegisterValue(ctxRegister);
			RegisterValue curCtxVal = programContext.getRegisterValue(ctxRegister, flow.to);
			if (Objects.equals(newCtxVal, curCtxVal) && flow.type != FlowType.SEED) {
				// No need to re-disassemble if context has not changed.
				return null;
			}
			ReDisassemblerContext ctx = new ReDisassemblerContext(state, flow);
			try {
				InstructionPrototype prototype = language.parse(buffer, ctx, false);
				return createInstruction(flow.to, prototype, buffer, ctx);
			}
			catch (UnknownInstructionException e) {
				block.setParseConflict(flow.from, disassemblerContext.getRegisterValue(
					disassemblerContext.getBaseContextRegister()), flow.to, e.getMessage());
				return null;
			}
			catch (InsufficientBytesException e) {
				block.setInstructionMemoryError(flow.to, flow.from, e.getMessage());
				return null;
			}
			catch (AddressOverflowException e) {
				block.setInstructionMemoryError(flow.to, flow.from,
					"Instruction does not fit within address space constraint");
				return null;
			}
		}
NOTE: New instructions are not placed until we're all done, so there is no need
to worry about differences in instruction length as we progress through a block.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java