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, replace
protected 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.CallTarget
public 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()