private void cacheDefaultOperandRefTypes(InstructionContext context) {

		// Resolve handles for each operand
		SleighParserContext protoContext;
		try {
			protoContext = (SleighParserContext) context.getParserContext();
		}
		catch (MemoryAccessException e) {
			throw new RuntimeException(e);
		}
		PcodeOp[] pcode = getPcode(context, null);
		if (pcode == null || pcode.length == 0) {
			return;
		}
		FixedHandle[] opHandles = new FixedHandle[opresolve.length];
		for (int index = 0; index < opresolve.length; index++) {
			ConstructState opState = mnemonicState.getSubState(opresolve[index]);
			opHandles[index] = protoContext.getFixedHandle(opState);
		}
		for (int index = 0; index < opHandles.length; index++) {
			if (opHandles[index] == null || opHandles[index].isInvalid() ||
				opRefTypes[index] != null) {
				continue;
			}
			RefType refType = RefType.DATA;
			if (opHandles[index].isDynamic()) {
				refType = getDynamicOperandRefType(opHandles[index], pcode);
			}
			else {
				Varnode var = opHandles[index].getStaticVarnode();
				if (var != null) {
					refType = getStaticOperandRefType(var, pcode);
				}
			}
			opRefTypes[index] = refType;
			for (int n = index + 1; n < opHandles.length; n++) {
				if (opHandles[index].equals(opHandles[n])) {
					opRefTypes[n] = refType;
				}
			}
		}
	}
Gather all the flow records (perhaps across multiple InstructionPrototypes via crossbuilds)
and convert to Addresses

@param res is the resulting flow Addresses
@param parsecontext is the parsing context for the current instruction
@param context is the context for the particular address so crossbuilds can be resolved
@throws MemoryAccessException if a memory error occurred while resolving instruction details
@throws UnknownContextException if the gather encounters an instruction not previously parsed
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java