/** * Fixup all function references. * * @param compiledFunction the Instruction representing this function in the compiled code * @throws XPathException if an error occurs. */ private void fixupInstruction(UserFunction compiledFunction) throws XPathException { ExpressionVisitor visitor = makeExpressionVisitor(); try { for (UserFunctionCall reference : references) { UserFunctionCall call = (reference); call.setFunction(compiledFunction); call.checkFunctionCall(compiledFunction, visitor); call.computeArgumentEvaluationModes(); } } catch (XPathException err) { compileError(err); } }
/** * Bind a function, given the URI and local parts of the function name, and the list of * expressions supplied as arguments. This method is called at compile time. * * @param functionName * @param staticArgs The expressions supplied statically in the function call. The intention is * that the static type of the arguments (obtainable via getItemType() and getCardinality() * may be used as part of the binding algorithm. * @param env * @return An object representing the extension function to be called, if one is found; null if no * extension function was found matching the required name and arity. * @throws net.sf.saxon.trans.XPathException if a function is found with the required name and * arity, but the implementation of the function cannot be loaded or used; or if an error * occurs while searching for the function; or if this function library "owns" the namespace * containing the function call, but no function was found. */ public Expression bind(StructuredQName functionName, Expression[] staticArgs, StaticContext env) throws XPathException { XSLFunction fn = stylesheet.getStylesheetFunction(functionName, staticArgs.length); if (fn == null) { return null; } if (fn.isOverriding() != overriding) { return null; } UserFunctionCall fc = new UserFunctionCall(); fn.registerReference(fc); fc.setFunctionName(functionName); fc.setArguments(staticArgs); fc.setConfirmed(true); return fc; }