## net.sf.saxon.instruct
Class UserFunction

    java.lang.Object
      net.sf.saxon.instruct.Procedure
          net.sf.saxon.instruct.UserFunction

All Implemented Interfaces:
  Serializable, SourceLocator, LocationProvider, Container, InstructionInfoProvider

    public final class UserFunction

extends Procedure
implements InstructionInfoProvider

This object represents the compiled form of a user-written function (the source can be either an XSLT stylesheet function or an XQuery function).

It is assumed that type-checking, of both the arguments and the results, has been handled at compile time. That is, the expression supplied as the body of the function must be wrapped in code to check or convert the result to the required type, and calls on the function must be wrapped at compile time to check or convert the supplied arguments.

See Also:
  Serialized Form

Constructor Summary
`UserFunction()`
`UserFunction(Expression body)`

Method Summary
`ValueRepresentation` `call(ValueRepresentation[] actualArgs, Controller controller)` Call this function.
`ValueRepresentation` `call(ValueRepresentation[] actualArgs, XPathContextMajor context)` Call this function to return a value.
`void` `computeEvaluationMode()`
`boolean` `containsTailCalls()`
`void` `gatherDirectContributingCallees(Set result)` Gather the direct contributing callees of this function.
`SequenceType` `getArgumentType(int n)` Get the required types of an argument to this function
`int` `getEvaluationMode()` Get the evaluation mode
`int` `getFunctionNameCode()` Get the namepool name code of the function
`InstructionInfo` `getInstructionInfo()` Get the InstructionInfo details about the construct.
`int` `getNumberOfArguments()` Get the arity of this function
`UserFunctionParameter[]` `getParameterDefinitions()`
`SequenceType` `getResultType(TypeHierarchy th)` Get the type of value returned by this function
`boolean` `isTailRecursive()`
`void` `process(ValueRepresentation[] actualArgs, XPathContextMajor context)` Call this function in "push" mode, writing the results to the current output destination.
`void` `setFunctionNameCode(int nameCode)` Set the namepool name code of the function
`void` `setMemoFunction(boolean isMemo)` Mark this function as a memo function (or not)
`void` `setParameterDefinitions(UserFunctionParameter[] params)`
`void` `setResultType(SequenceType resultType)`
`void` `setTailRecursive(boolean tailCalls, boolean recursiveTailCalls)` Indicate whether the function contains a tail call

Methods inherited from class net.sf.saxon.instruct.Procedure
`getBody, getColumnNumber, getExecutable, getHostLanguage, getLineNumber, getLineNumber, getLocationProvider, getPublicId, getStackFrameMap, getSystemId, getSystemId, replaceSubExpression, setBody, setExecutable, setHostLanguage, setLineNumber, setStackFrameMap, setSystemId`

Methods inherited from class java.lang.Object
`equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### UserFunction

    public UserFunction()

### UserFunction

    public UserFunction(Expression body)

Method Detail

### computeEvaluationMode

    public void computeEvaluationMode()

### setParameterDefinitions

    public void setParameterDefinitions(UserFunctionParameter[] params)

### getParameterDefinitions

    public UserFunctionParameter[] getParameterDefinitions()

### setResultType

    public void setResultType(SequenceType resultType)

### setTailRecursive

    public void setTailRecursive(boolean tailCalls,
                                 boolean recursiveTailCalls)

  Indicate whether the function contains a tail call

  Parameters:
    `tailCalls` - true if the function contains a tail call (on any function)
    `recursiveTailCalls` - true if the function contains a tail call (on itself)

### containsTailCalls

    public boolean containsTailCalls()

### isTailRecursive

    public boolean isTailRecursive()

### getResultType

    public SequenceType getResultType(TypeHierarchy th)

  Get the type of value returned by this function

  Returns:
    the declared result type, or the inferred result type if this is more precise

### getArgumentType

    public SequenceType getArgumentType(int n)

  Get the required types of an argument to this function

  Parameters:
    `n` - identifies the argument in question, starting at 0
  Returns:
    a SequenceType object, indicating the required type of the argument

### getEvaluationMode

    public int getEvaluationMode()

  Get the evaluation mode

### getNumberOfArguments

    public int getNumberOfArguments()

  Get the arity of this function

  Returns:
    the number of arguments

### setMemoFunction

    public void setMemoFunction(boolean isMemo)

  Mark this function as a memo function (or not)

  Parameters:
    `isMemo` - true if this is a memo function

### setFunctionNameCode

    public void setFunctionNameCode(int nameCode)

  Set the namepool name code of the function

  Parameters:
    `nameCode` - represents the function name

### getFunctionNameCode

    public int getFunctionNameCode()

  Get the namepool name code of the function

  Returns:
    a name code representing the function name

### gatherDirectContributingCallees

    public void gatherDirectContributingCallees(Set result)

  Gather the direct contributing callees of this function. A callee is a function that this one calls. A contributing callee is a function whose output is added directly to the output of this function without further processing (other than by attaching it to a parent element or document node). A direct contributing callee is a function that is called directly, rather than indirectly.

  Parameters:
    `result` - the list into which the callees are gathered.

### call

    public ValueRepresentation call(ValueRepresentation[] actualArgs,
                                    XPathContextMajor context)
                             throws XPathException

  Call this function to return a value.

  Parameters:
    `actualArgs` - the arguments supplied to the function. These must have the correct types required by the function signature (it is the caller's responsibility to check this). It is acceptable to supply a `Closure` to represent a value whose evaluation will be delayed until it is needed. The array must be the correct size to match the number of arguments: again, it is the caller's responsibility to check this.
    `context` - This provides the run-time context for evaluating the function. It is the caller's responsibility to allocate a "clean" context for the function to use; the context that is provided will be overwritten by the function.
  Returns:
    a Value representing the result of the function.
  Throws:
    `XPathException`

### process

    public void process(ValueRepresentation[] actualArgs,
                        XPathContextMajor context)
                 throws XPathException

  Call this function in "push" mode, writing the results to the current output destination.

  Parameters:
    `actualArgs` - the arguments supplied to the function. These must have the correct types required by the function signature (it is the caller's responsibility to check this). It is acceptable to supply a `Closure` to represent a value whose evaluation will be delayed until it is needed. The array must be the correct size to match the number of arguments: again, it is the caller's responsibility to check this.
    `context` - This provides the run-time context for evaluating the function. It is the caller's responsibility to allocate a "clean" context for the function to use; the context that is provided will be overwritten by the function.
  Throws:
    `XPathException`

### call

    public ValueRepresentation call(ValueRepresentation[] actualArgs,
                                    Controller controller)
                             throws XPathException

  Call this function. This method allows an XQuery function to be called directly from a Java application. It creates the environment needed to achieve this

  Parameters:
    `actualArgs` - the arguments supplied to the function. These must have the correct types required by the function signature (it is the caller's responsibility to check this). It is acceptable to supply a `Closure` to represent a value whose evaluation will be delayed until it is needed. The array must be the correct size to match the number of arguments: again, it is the caller's responsibility to check this.
    `controller` - This provides the run-time context for evaluating the function. A Controller may be obtained by calling `XQueryExpression.newController()`. This may be used for a series of calls on functions defined in the same module as the XQueryExpression.
  Returns:
    a Value representing the result of the function.
  Throws:
    `XPathException`

### getInstructionInfo

    public InstructionInfo getInstructionInfo()

  Get the InstructionInfo details about the construct. This information isn't used for tracing, but it is available when inspecting the context stack.

  Specified by:
    `getInstructionInfo` in interface `InstructionInfoProvider`

Copyright (C) Michael H. Kay. All rights reserved.