public class GuardedInvocation extends Object
GuardingDynamicLinker.getGuardedInvocation(LinkRequest, LinkerServices)
and
GuardingTypeConverterFactory.convertToType(Class, Class, Supplier)
.
It is an immutable tuple of an invocation method handle, a guard method
handle that defines the applicability of the invocation handle, zero or more
switch points that can be used for external invalidation of the invocation
handle, and an exception type that if thrown during an invocation of the
method handle also invalidates it. The invocation handle is suitable for
invocation if the guard handle returns true for its arguments, and as long
as any of the switch points are not invalidated, and as long as it does not
throw an exception of the designated type. The guard, the switch points, and
the exception type are all optional (a guarded invocation having none of them
is unconditionally valid).Constructor and Description |
---|
GuardedInvocation(MethodHandle invocation)
Creates a new unconditional guarded invocation.
|
GuardedInvocation(MethodHandle invocation,
MethodHandle guard)
Creates a new guarded invocation, with a guard method handle.
|
GuardedInvocation(MethodHandle invocation,
MethodHandle guard,
SwitchPoint switchPoint)
Creates a new guarded invocation, with both a guard method handle and a
switch point that can be used to invalidate it.
|
GuardedInvocation(MethodHandle invocation,
MethodHandle guard,
SwitchPoint[] switchPoints,
Class<? extends Throwable> exception)
Creates a new guarded invocation, with a guard method handle, any number
of switch points that can be used to invalidate it, and an exception that
if thrown when invoked also invalidates it.
|
GuardedInvocation(MethodHandle invocation,
MethodHandle guard,
SwitchPoint switchPoint,
Class<? extends Throwable> exception)
Creates a new guarded invocation, with a guard method handle, a
switch point that can be used to invalidate it, and an exception that if
thrown when invoked also invalidates it.
|
GuardedInvocation(MethodHandle invocation,
SwitchPoint switchPoint)
Creates a new guarded invocation that can be invalidated by a switch
point.
|
Modifier and Type | Method and Description |
---|---|
GuardedInvocation |
addSwitchPoint(SwitchPoint newSwitchPoint)
Create a new guarded invocation with an added switch point.
|
GuardedInvocation |
asType(MethodType newType)
Changes the type of the invocation, as if
MethodHandle.asType(MethodType) was applied to its invocation
and its guard, if it has one (with return type changed to boolean, and
parameter count potentially truncated for the guard). |
GuardedInvocation |
asType(CallSiteDescriptor desc)
Changes the type of the invocation, as if
MethodHandle.asType(MethodType) was applied to its invocation
and its guard, if it has one (with return type changed to boolean for
guard). |
GuardedInvocation |
asType(LinkerServices linkerServices,
MethodType newType)
Changes the type of the invocation, as if
LinkerServices.asType(MethodHandle, MethodType) was applied to
its invocation and its guard, if it has one (with return type changed to
boolean, and parameter count potentially truncated for the guard). |
GuardedInvocation |
asTypeSafeReturn(LinkerServices linkerServices,
MethodType newType)
Changes the type of the invocation, as if
LinkerServices.asTypeLosslessReturn(MethodHandle, MethodType) was
applied to its invocation and
LinkerServices.asType(MethodHandle, MethodType) applied to its
guard, if it has one (with return type changed to boolean, and parameter
count potentially truncated for the guard). |
MethodHandle |
compose(MethodHandle fallback)
Composes the invocation, guard, switch points, and the exception into a
composite method handle that knows how to fall back when the guard fails
or the invocation is invalidated.
|
MethodHandle |
compose(MethodHandle guardFallback,
MethodHandle switchpointFallback,
MethodHandle catchFallback)
Composes the invocation, guard, switch points, and the exception into a
composite method handle that knows how to fall back when the guard fails
or the invocation is invalidated.
|
GuardedInvocation |
dropArguments(int pos,
Class<?>... valueTypes)
Makes an invocation that drops arguments in both the invocation and the
guard (if there is one) with
MethodHandles.dropArguments(MethodHandle, int, Class...) . |
GuardedInvocation |
dropArguments(int pos,
List<Class<?>> valueTypes)
Makes an invocation that drops arguments in both the invocation and the
guard (if there is one) with
MethodHandles.dropArguments(MethodHandle, int, List) . |
GuardedInvocation |
filterArguments(int pos,
MethodHandle... filters)
Applies argument filters to both the invocation and the guard (if there
is one) with
MethodHandles.filterArguments(MethodHandle, int, MethodHandle...) . |
Class<? extends Throwable> |
getException()
Returns the exception type that if thrown by the invocation should
invalidate the linkage of this guarded invocation.
|
MethodHandle |
getGuard()
Returns the guard method handle.
|
MethodHandle |
getInvocation()
Returns the invocation method handle.
|
SwitchPoint[] |
getSwitchPoints()
Returns the switch points that can be used to invalidate the linkage of
this invocation handle.
|
boolean |
hasBeenInvalidated()
Returns true if and only if this guarded invocation has at least one
invalidated switch point.
|
GuardedInvocation |
replaceMethods(MethodHandle newInvocation,
MethodHandle newGuard)
Creates a new guarded invocation with different methods, preserving the switch point.
|
public GuardedInvocation(MethodHandle invocation)
invocation
- the method handle representing the invocation. Must not
be null.NullPointerException
- if invocation is null.public GuardedInvocation(MethodHandle invocation, MethodHandle guard)
invocation
- the method handle representing the invocation. Must not
be null.guard
- the method handle representing the guard. Must have be
compatible with the invocation
handle as per
MethodHandles.guardWithTest(MethodHandle, MethodHandle, MethodHandle)
.
For some useful guards, check out the Guards
class. It can be
null to represent an unconditional invocation.NullPointerException
- if invocation is null.public GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint switchPoint)
invocation
- the method handle representing the invocation. Must
not be null.guard
- the method handle representing the guard. Must have be
compatible with the invocation
handle as per
MethodHandles.guardWithTest(MethodHandle, MethodHandle, MethodHandle)
.
For some useful guards, check out the Guards
class. It can be
null. If both it and the switch point are null, this represents an
unconditional invocation.switchPoint
- the optional switch point that can be used to
invalidate this linkage.NullPointerException
- if invocation is null.public GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint[] switchPoints, Class<? extends Throwable> exception)
invocation
- the method handle representing the invocation. Must not
be null.guard
- the method handle representing the guard. Must have be
compatible with the invocation
handle as per
MethodHandles.guardWithTest(MethodHandle, MethodHandle, MethodHandle)
.
For some useful guards, check out the Guards
class. It can be
null. If it and the exception are both null, and no switch points were
specified, this represents an unconditional invocation.switchPoints
- optional switch points that can be used to
invalidate this linkage.exception
- the optional exception type that is when thrown by the
invocation also invalidates it.NullPointerException
- if invocation is null.public GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint switchPoint, Class<? extends Throwable> exception)
invocation
- the method handle representing the invocation. Must not
be null.guard
- the method handle representing the guard. Must have be
compatible with the invocation
handle as per
MethodHandles.guardWithTest(MethodHandle, MethodHandle, MethodHandle)
.
For some useful guards, check out the Guards
class. It can be
null. If it and the switch point and the exception are all null, this
represents an unconditional invocation.switchPoint
- the optional switch point that can be used to
invalidate this linkage.exception
- the optional exception type that is when thrown by the
invocation also invalidates it.NullPointerException
- if invocation is null.public GuardedInvocation(MethodHandle invocation, SwitchPoint switchPoint)
invocation
- the method handle representing the invocation. Must
not be null.switchPoint
- the optional switch point that can be used to
invalidate this linkage. It can be null. If it is null, this represents
an unconditional invocation.NullPointerException
- if invocation is null.public MethodHandle getInvocation()
public MethodHandle getGuard()
public SwitchPoint[] getSwitchPoints()
public Class<? extends Throwable> getException()
public boolean hasBeenInvalidated()
public GuardedInvocation replaceMethods(MethodHandle newInvocation, MethodHandle newGuard)
newInvocation
- the new invocationnewGuard
- the new guardpublic GuardedInvocation addSwitchPoint(SwitchPoint newSwitchPoint)
newSwitchPoint
- new switch point. Can be null in which case this
method return the current guarded invocation with no changes.public GuardedInvocation asType(MethodType newType)
MethodHandle.asType(MethodType)
was applied to its invocation
and its guard, if it has one (with return type changed to boolean, and
parameter count potentially truncated for the guard). If the invocation
already is of the required type, returns this object.newType
- the new type of the invocation.public GuardedInvocation asType(LinkerServices linkerServices, MethodType newType)
LinkerServices.asType(MethodHandle, MethodType)
was applied to
its invocation and its guard, if it has one (with return type changed to
boolean, and parameter count potentially truncated for the guard). If the
invocation already is of the required type, returns this object.linkerServices
- the linker services to use for the conversionnewType
- the new type of the invocation.public GuardedInvocation asTypeSafeReturn(LinkerServices linkerServices, MethodType newType)
LinkerServices.asTypeLosslessReturn(MethodHandle, MethodType)
was
applied to its invocation and
LinkerServices.asType(MethodHandle, MethodType)
applied to its
guard, if it has one (with return type changed to boolean, and parameter
count potentially truncated for the guard). If the invocation doesn't
change its type, returns this object.linkerServices
- the linker services to use for the conversionnewType
- the new type of the invocation.public GuardedInvocation asType(CallSiteDescriptor desc)
MethodHandle.asType(MethodType)
was applied to its invocation
and its guard, if it has one (with return type changed to boolean for
guard). If the invocation already is of the required type, returns this
object.desc
- a call descriptor whose method type is adapted.public GuardedInvocation filterArguments(int pos, MethodHandle... filters)
MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
.pos
- the position of the first argument being filteredfilters
- the argument filterspublic GuardedInvocation dropArguments(int pos, List<Class<?>> valueTypes)
MethodHandles.dropArguments(MethodHandle, int, List)
.pos
- the position of the first argument being droppedvalueTypes
- the types of the values being droppedpublic GuardedInvocation dropArguments(int pos, Class<?>... valueTypes)
MethodHandles.dropArguments(MethodHandle, int, Class...)
.pos
- the position of the first argument being droppedvalueTypes
- the types of the values being droppedpublic MethodHandle compose(MethodHandle fallback)
fallback
- the fallback method handle for when a switch point is
invalidated, a guard returns false, or invalidating exception is thrown.public MethodHandle compose(MethodHandle guardFallback, MethodHandle switchpointFallback, MethodHandle catchFallback)
switchpointFallback
- the fallback method handle in case a switch
point is invalidated.guardFallback
- the fallback method handle in case guard returns
false.catchFallback
- the fallback method in case the exception handler
triggers.
Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved.
DRAFT 9-internal+0-2016-09-03-162606.buildd.src