code: Expression compileFunction(int opPos) throws TransformerException
    {
  
      int endFunc = opPos + getOp(opPos + 1) - 1;
  
      opPos = getFirstChildPos(opPos);
  
      int funcID = getOp(opPos);
  
      opPos++;
  
      if (-1 != funcID)
      {
        Function func = m_functionTable.getFunction(funcID);
        
        /**
         * It is a trick for function-available. Since the function table is an
         * instance field, insert this table at compilation time for later usage
         */
        
        if (func instanceof FuncExtFunctionAvailable)
            ((FuncExtFunctionAvailable) func).setFunctionTable(m_functionTable);
  
        func.postCompileStep(this);
        
        try
        {
          int i = 0;
  
          for (int p = opPos; p < endFunc; p = getNextOpPos(p), i++)
          {
  
            // System.out.println("argPos: "+ p);
            // System.out.println("argCode: "+ m_opMap[p]);
            func.setArg(compile(p), i);
          }
  
          func.checkNumberArgs(i);
        }
        catch (WrongNumberArgsException wnae)
        {
          java.lang.String name = m_functionTable.getFunctionName(funcID);
  
          m_errorHandler.fatalError( new TransformerException(
                    XSLMessages.createXPATHMessage(XPATHErrorResources.ER_ONLY_ALLOWS, 
                        new Object[]{name, wnae.getMessage()}), m_locator)); 
                //"name + " only allows " + wnae.getMessage() + " arguments", m_locator));
        }
  
        return func;
      }
      else
      {
        error(XPATHErrorResources.ER_FUNCTION_TOKEN_NOT_FOUND, null);  //"function token not found.");
  
        return null;
      }
    }
docs: Compile a built-in XPath function.
  
  @param opPos The current position in the m_opMap array.
  
  @return reference to {@link org.apache.xpath.functions.Function} instance.
  
  @throws TransformerException if a error occurs creating the Expression.