Package com.oracle.truffle.api.nodes

## Class DirectCallNode

- java.lang.Object
- - com.oracle.truffle.api.nodes.Node
  - - com.oracle.truffle.api.nodes.DirectCallNode

All Implemented Interfaces:
  `NodeInterface`, `java.lang.Cloneable`

Direct Known Subclasses:
  `DefaultDirectCallNode`

    public abstract class DirectCallNode
    extends Node

Represents a direct call to a `CallTarget`. Direct calls are calls for which the `CallTarget` remains the same for each consecutive call. This part of the Truffle API enables the runtime system to perform additional optimizations on direct calls. Optimizations that can be applied to a `DirectCallNode` are inlining and call site sensitive AST duplication. Inlining inlines this call site into the call graph of the parent `CallTarget`. Call site sensitive AST duplication duplicates the `CallTarget` in an uninitialized state to collect call site sensitive profiling information. Please note: This class is not intended to be subclassed by guest language implementations.

See Also:
  `for calls with a non-constant target`, `TruffleRuntime.createDirectCallNode(CallTarget)`, `forceInlining()`, `cloneCallTarget()`

### Nested Class Summary

### Nested classes/interfaces inherited from class com.oracle.truffle.api.nodes.Node

`Node.Child, Node.Children`

### Field Summary

Fields
`protected CallTarget` `callTarget`

### Constructor Summary

Constructors
`protected` `DirectCallNode​(CallTarget callTarget)`

### Method Summary

All Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods
`abstract java.lang.Object` `call​(VirtualFrame frame, java.lang.Object[] arguments)` Calls the inner `CallTarget` returned by `getCurrentCallTarget()`.
`abstract boolean` `cloneCallTarget()` Clones the `CallTarget` instance returned by `getCallTarget()` in an uninitialized state for this `DirectCallNode`.
`abstract void` `forceInlining()` Enforces the runtime system to inline the `CallTarget` at this call site.
`CallTarget` `getCallTarget()` Returns the originally supplied `CallTarget` when this call node was created.
`abstract CallTarget` `getClonedCallTarget()` Returns the split `CallTarget` if this call site's `CallTarget` is cloned.
`CallTarget` `getCurrentCallTarget()` Returns the used call target when `call(VirtualFrame, Object[])` is invoked.
`RootNode` `getCurrentRootNode()` Returns the `RootNode` associated with `CallTarget` returned by `getCurrentCallTarget()`.
`boolean` `isCallTargetCloned()` Returns `true` if the target of the `DirectCallNode` was cloned by the runtime system or by the guest language implementation.
`abstract boolean` `isCallTargetCloningAllowed()` Returns `true` if the runtime system supports cloning and the `RootNode` returns `true` in `RootNode.isCloningAllowed()`.
`abstract boolean` `isInlinable()` Returns `true` if the underlying runtime system supports inlining for the `CallTarget` in this `DirectCallNode`.
`boolean` `isInlined()` Deprecated. we do not expose this information any longer.
`abstract boolean` `isInliningForced()` Returns `true` if the `CallTarget` is forced to be inlined.
`java.lang.String` `toString()` Converts this node to a textual representation useful for debugging.

### Methods inherited from class com.oracle.truffle.api.nodes.Node

`accept, adoptChildren, assignSourceSection, atomic, atomic, clearSourceSection, clone, copy, getChildren, getCost, getDebugProperties, getDescription, getEncapsulatingSourceSection, getLanguage, getParent, getRootNode, getSourceSection, insert, insert, isReplaceable, onAdopt, onReplace, replace, replace`

### Methods inherited from class java.lang.Object

`equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Field Detail

#### callTarget

    protected final CallTarget callTarget

### Constructor Detail

#### DirectCallNode

    protected DirectCallNode​(CallTarget callTarget)

### Method Detail

#### call

    public abstract java.lang.Object call​(VirtualFrame frame,
                                          java.lang.Object[] arguments)

Calls the inner `CallTarget` returned by `getCurrentCallTarget()`.

Parameters:
  `arguments` - the arguments that should be passed to the callee
Returns:
  the return result of the call

#### getCallTarget

    public CallTarget getCallTarget()

Returns the originally supplied `CallTarget` when this call node was created. Please note that the returned `CallTarget` is not necessarily the `CallTarget` that is called. For that use `getCurrentCallTarget()` instead.

Returns:
  the `CallTarget` provided.

#### isInlinable

    public abstract boolean isInlinable()

Returns `true` if the underlying runtime system supports inlining for the `CallTarget` in this `DirectCallNode`.

Returns:
  true if inlining is supported.

#### isInliningForced

    public abstract boolean isInliningForced()

Returns `true` if the `CallTarget` is forced to be inlined. A `DirectCallNode` can either be inlined manually by invoking `forceInlining()` or by the runtime system which may at any point decide to inline.

Returns:
  true if this method was inlined else false.

#### forceInlining

    public abstract void forceInlining()

Enforces the runtime system to inline the `CallTarget` at this call site. If the runtime system does not support inlining or it is already inlined this method has no effect. The runtime system may decide to not inline calls which were forced to inline.

#### isInlined

    @Deprecated
    public final boolean isInlined()

Deprecated.
we do not expose this information any longer. returns always false.
Returns true if the runtime system has decided to inline this call-site. If the `DirectCallNode` was forced to inline then this does not necessarily mean that the `DirectCallNode` is really going to be inlined. This depends on whether or not the runtime system supports inlining. The runtime system may also decide to not inline calls which were forced to inline.

#### isCallTargetCloningAllowed

    public abstract boolean isCallTargetCloningAllowed()

Returns `true` if the runtime system supports cloning and the `RootNode` returns `true` in `RootNode.isCloningAllowed()`.

Returns:
  `true` if the target is allowed to be cloned.

#### cloneCallTarget

    public abstract boolean cloneCallTarget()

Clones the `CallTarget` instance returned by `getCallTarget()` in an uninitialized state for this `DirectCallNode`. This can be sensible to gather call site sensitive profiling information for this `DirectCallNode`. If `isCallTargetCloningAllowed()` returns `false` this method has no effect and returns `false`.

#### isCallTargetCloned

    public final boolean isCallTargetCloned()

Returns `true` if the target of the `DirectCallNode` was cloned by the runtime system or by the guest language implementation.

Returns:
  if the target was split

#### getClonedCallTarget

    public abstract CallTarget getClonedCallTarget()

Returns the split `CallTarget` if this call site's `CallTarget` is cloned.

Returns:
  the split `CallTarget`

#### getCurrentCallTarget

    public CallTarget getCurrentCallTarget()

Returns the used call target when `call(VirtualFrame, Object[])` is invoked. If the `CallTarget` was split this method returns the `CallTarget` returned by `getClonedCallTarget()`.

Returns:
  the used `CallTarget` when node is called

#### getCurrentRootNode

    public final RootNode getCurrentRootNode()

Returns the `RootNode` associated with `CallTarget` returned by `getCurrentCallTarget()`. If the stored `CallTarget` does not contain a `RootNode` this method returns `null`.

Returns:
  the root node of the used call target
See Also:
  `getCurrentCallTarget()`

#### toString

    public java.lang.String toString()

Description copied from class: `Node`
Converts this node to a textual representation useful for debugging.

Overrides:
  `toString` in class `Node`