private List<JitTypeBehavior> getInputTypes(List<JitVal> inVals) {
			int inputCount = getInputCount();
			if (inputCount != inVals.size()) { // includes inputCount == -1 (variadic)
				return JitDataFlowModel.allAny(inVals);
			}
			Method method = decOp.getJavaMethod();
			if (method == null) {
				return JitDataFlowModel.allAny(inVals);
			}
			List<JitTypeBehavior> result = new ArrayList<>();
			Parameter[] parameters = method.getParameters();
			for (int i = 0; i < inVals.size(); i++) {
				Parameter p = parameters[i];
				JitTypeBehavior type = JitTypeBehavior.forJavaType(p.getType());
				if (type == null) {
					return JitDataFlowModel.allAny(inVals);
				}
				result.add(type);
			}
			return Collections.unmodifiableList(result);
		}
If the number of arguments matches the userop's Java method, map each argument value to
the type behavior for its corresponding parameter.

<p>
This is used by the {@link JitTypeModel} to assign types to JVM locals in order to reduce
the number of type casts. In the case of direct invocation, this enters type information
from the userop's Java definition into the analysis.

<p>
If the parameter count doesn't match, we just map the arguments to
{@link JitTypeBehavior#ANY} and let the error surface at run time. We need not throw the
exception until/unless the invocation is actually executed. Similarly, if any parameter's
type is not supported, or the userop cannot be invoked directly, we just map all
arguments to {@link JitTypeBehavior#ANY}, because the generator will apply standard
invocation, which does not benefit from type analysis.

@param inVals the input arguments
@return the map from argument value (SSA variable) to parameter type behavior
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitDataFlowUseropLibrary.java