BootstrapCallInfo
to represent the sequence of bootstrap arguments associated
with a bootstrap method, without forcing their immediate
resolution.
If you use the
simple get method,
the constant will be resolved, if this has not already
happened. An occasional side effect of resolution is a
LinkageError
, which happens if the system
could not resolve the constant in question.
In order to peek at a constant without necessarily resolving it, use the non-throwing get method. This method will never throw a resolution error. Instead, if the resolution would result in an error, or if the implementation elects not to attempt resolution at this point, then the method will return the user-supplied sentinel value.
To iterate through the constants, resolving as you go,
use the iterator provided on the List
-typed view.
If you supply a sentinel, resolution will be suppressed.
Typically the constant is drawn from a constant pool entry
in the virtual machine. Constant pool entries undergo a
one-time state transition from unresolved to resolved,
with a permanently recorded result. Usually that result
is the desired constant value, but it may also be an error.
In any case, the results displayed by a ConstantGroup
are stable in the same way. If a query to a particular
constant in a ConstantGroup
throws an exception once,
it will throw the same kind of exception forever after.
If the query returns a constant value once, it will return
the same value forever after.
The only possible change in the status of a constant is from the unresolved to the resolved state, and that happens exactly once. A constant will never revert to an unlinked state. However, from the point of view of this interface, constants may appear to spontaneously resolve. This is so because constant pools are global structures shared across threads, and because prefetching of some constants may occur, there are no strong guarantees when the virtual machine may resolve constants.
When choosing sentinel values, be aware that a constant
pool which has CONSTANT_Dynamic
entries
can contain potentially any representable value,
and arbitrary implementations of ConstantGroup
are also free to produce arbitrary values.
This means some obvious choices for sentinel values,
such as null
, may sometimes fail to distinguish
a resolved from an unresolved constant in the group.
The most reliable sentinel is a privately created object,
or perhaps the ConstantGroup
itself.
Modifier and Type | Method and Description |
---|---|
public default List | |
public default List | |
public default int | Returns: the limiting index,end index of first constant to retrieve start, int limiting index of constants to retrieve end, Object[] array to receive the requested values buf, int position in the array to offset storing the values pos)Copy a sequence of constant values into a given buffer. |
public default int | Returns: the limiting index,end index of first constant to retrieve start, int limiting index of constants to retrieve end, Object[] array to receive the requested values buf, int position in the array to offset storing the values pos, Object sentinel value to store if a value is not available ifNotPresent)Copy a sequence of constant values into a given buffer. |
public Object | Returns: the selected constantwhich constant to select index)Returns the selected constant, resolving it if necessary. |
public Object | |
public boolean | Returns: true if the selected constant is known by
this object to be present, false if it is known
not to be present orthe selected constant index)Returns an indication of whether a constant may be available. |
public static ConstantGroup | Returns: a new constant group with the given constants and resolution behaviorthe elements of this constant group constants, Object sentinel value provided instead of a missing constant ifNotPresent, IntFunction<Object> function to call when a missing constant is resolved constantProvider)Make a new constant group with the given constants. |
public static ConstantGroup | Returns: a new constant group with the given constantsthe constants of this constant group constants)Make a new constant group with the given constant values. |
public int | |
public default ConstantGroup | Returns: a view on the selected sub-groupthe index to begin the view start, int the index to end the view end)Create a view on a sub-sequence of this group. |
asList | back to summary |
---|---|
public default List Create a view on this group as a |
asList | back to summary |
---|---|
public default List Create a view on this group as a |
copyConstants | back to summary |
---|---|
public default int copyConstants(int start, int end, Object[] buf, int pos) throws LinkageError Copy a sequence of constant values into a given buffer.
This is equivalent to
|
copyConstants | back to summary |
---|---|
public default int copyConstants(int start, int end, Object[] buf, int pos, Object ifNotPresent) Copy a sequence of constant values into a given buffer.
This is equivalent to
|
get | back to summary |
---|---|
public Object get(int index) throws LinkageError Returns the selected constant, resolving it if necessary. Throws a linkage error if resolution proves impossible.
|
get | back to summary |
---|---|
public Object get(int index, Object ifNotPresent) Returns the selected constant,
or the given sentinel value if there is none available.
If the constant cannot be resolved, the sentinel will be returned.
If the constant can (perhaps) be resolved, but has not yet been resolved,
then the sentinel may be returned, at the implementation's discretion.
To force resolution (and a possible exception), call |
isPresent | back to summary |
---|---|
public boolean isPresent(int index) Returns an indication of whether a constant may be available.
If it returns
After a normal return from
If this method returns
|
makeConstantGroup | back to summary |
---|---|
public static ConstantGroup makeConstantGroup(List<Object> constants, Object ifNotPresent, IntFunction<Object> constantProvider) Make a new constant group with the given constants.
The value of
|
makeConstantGroup | back to summary |
---|---|
public static ConstantGroup makeConstantGroup(List<Object> constants) Make a new constant group with the given constant values. The constants will be copied from the given list into the new constant group, forcing resolution if any are missing.
|
size | back to summary |
---|---|
public int size() Returns the number of constants in this group. This value never changes, for any particular group.
|
subGroup | back to summary |
---|---|
public default ConstantGroup subGroup(int start, int end) Create a view on a sub-sequence of this group.
|