public abstract class DirectCallNode extends Node
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.Node.Child, Node.Children| Modifier and Type | Field and Description |
|---|---|
protected CallTarget |
callTarget |
| Modifier | Constructor and Description |
|---|---|
protected |
DirectCallNode(CallTarget callTarget) |
| Modifier and Type | Method and Description |
|---|---|
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()
|
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. returns always false.
|
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.
|
accept, adoptChildren, assignSourceSection, atomic, atomic, clearSourceSection, clone, copy, getChildren, getCost, getDebugProperties, getDescription, getEncapsulatingSourceSection, getLanguage, getParent, getRootNode, getSourceSection, insert, insert, isReplaceable, onAdopt, onReplace, replace, replaceprotected final CallTarget callTarget
protected DirectCallNode(CallTarget callTarget)
public abstract java.lang.Object call(VirtualFrame frame, java.lang.Object[] arguments)
CallTarget returned by getCurrentCallTarget().arguments - the arguments that should be passed to the calleepublic CallTarget getCallTarget()
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.CallTarget provided.public abstract boolean isInlinable()
true if the underlying runtime system supports inlining for the
CallTarget in this DirectCallNode.public abstract boolean isInliningForced()
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.public abstract void forceInlining()
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.@Deprecated public final boolean isInlined()
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.public abstract boolean isCallTargetCloningAllowed()
true if the runtime system supports cloning and the RootNode
returns true in RootNode.isCloningAllowed().true if the target is allowed to be cloned.public abstract boolean cloneCallTarget()
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.public final boolean isCallTargetCloned()
true if the target of the DirectCallNode was cloned by the
runtime system or by the guest language implementation.public abstract CallTarget getClonedCallTarget()
CallTarget if this call site's CallTarget is cloned.CallTargetpublic CallTarget getCurrentCallTarget()
call(VirtualFrame, Object[]) is invoked. If the
CallTarget was split this method returns the CallTarget returned by
getClonedCallTarget().CallTarget when node is calledpublic final RootNode getCurrentRootNode()
RootNode associated with CallTarget returned by
getCurrentCallTarget(). If the stored CallTarget does not contain a
RootNode this method returns null.getCurrentCallTarget()