Esempio n. 1
0
 /**
  * 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;
 }