V
- type of the abstract value that is trackedS
- the store type used in the analysispublic class ConditionalTransferResult<V extends AbstractValue<V>,S extends Store<S>> extends TransferResult<V,S>
TransferResult
with two non-exceptional stores. The 'then' store
contains information valid when the previous boolean-valued expression was true, and the 'else'
store contains information valid when the expression was false.
getRegularStore
returns the least upper bound of the two underlying stores.
Modifier and Type | Field and Description |
---|---|
protected S |
elseStore
The 'else' result store.
|
protected S |
thenStore
The 'then' result store.
|
exceptionalStores, resultValue
Constructor and Description |
---|
ConditionalTransferResult(V value,
S thenStore,
S elseStore)
Create a new
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean) ,
using false for whether the store changed and null for TransferResult.exceptionalStores . |
ConditionalTransferResult(V value,
S thenStore,
S elseStore,
boolean storeChanged)
Create a new
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean) ,
using null for TransferResult.exceptionalStores . |
ConditionalTransferResult(V value,
S thenStore,
S elseStore,
Map<TypeMirror,S> exceptionalStores)
Create a new
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean) ,
using false for the storeChanged formal parameter. |
ConditionalTransferResult(V value,
S thenStore,
S elseStore,
@Nullable Map<TypeMirror,S> exceptionalStores,
boolean storeChanged)
Create a
ConditionalTransferResult with thenStore as the resulting store if the
corresponding Node evaluates to true and
elseStore otherwise. |
Modifier and Type | Method and Description |
---|---|
boolean |
containsTwoStores()
Returns
true if and only if this transfer result contains two stores that are
potentially not equal. |
S |
getElseStore()
Returns the result store produced if the
Node
this result belongs to evaluates to false . |
S |
getRegularStore()
The regular result store.
|
S |
getThenStore()
Returns the result store produced if the
Node
this result belongs to evaluates to true . |
boolean |
storeChanged()
Returns
true if and only if the transfer function returning this transfer result
changed the regularStore, elseStore, or thenStore. |
String |
toString() |
getExceptionalStore, getExceptionalStores, getResultValue, setResultValue
public ConditionalTransferResult(V value, S thenStore, S elseStore, boolean storeChanged)
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
,
using null
for TransferResult.exceptionalStores
.
Exceptions: If the corresponding Node
throws an exception, then it is assumed that no
special handling is necessary and the store before the corresponding Node
will be passed along any exceptional edge.
Aliasing: thenStore
and elseStore
are not allowed to be used
anywhere outside of this class (including use through aliases). Complete control over the
objects is transferred to this class.
value
- the abstract value produced by the transfer functionthenStore
- 'then' result storeelseStore
- 'else' result storestoreChanged
- whether the store changedConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
public ConditionalTransferResult(V value, S thenStore, S elseStore)
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
,
using false
for whether the store changed and null
for TransferResult.exceptionalStores
.value
- the abstract value produced by the transfer functionthenStore
- thenStore
elseStore
- elseStore
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
public ConditionalTransferResult(V value, S thenStore, S elseStore, Map<TypeMirror,S> exceptionalStores)
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
,
using false
for the storeChanged
formal parameter.value
- the abstract value produced by the transfer functionthenStore
- thenStore
elseStore
- elseStore
exceptionalStores
- TransferResult.exceptionalStores
ConditionalTransferResult(AbstractValue, Store, Store, Map, boolean)
public ConditionalTransferResult(V value, S thenStore, S elseStore, @Nullable Map<TypeMirror,S> exceptionalStores, boolean storeChanged)
ConditionalTransferResult
with thenStore
as the resulting store if the
corresponding Node
evaluates to true
and
elseStore
otherwise.
Exceptions: If the corresponding Node
throws an exception, then the corresponding store
in exceptionalStores
is used. If no exception is found in exceptionalStores
,
then it is assumed that no special handling is necessary and the store before the corresponding
Node
will be passed along any exceptional edge.
Aliasing: thenStore
, elseStore
, and any store in exceptionalStores
are not allowed to be used anywhere outside of this class (including use
through aliases). Complete control over the objects is transferred to this class.
value
- the abstract value produced by the transfer functionthenStore
- thenStore
elseStore
- elseStore
exceptionalStores
- TransferResult.exceptionalStores
storeChanged
- whether the store changed; see TransferResult.storeChanged()
.public S getRegularStore()
getRegularStore
in class TransferResult<V extends AbstractValue<V>,S extends Store<S>>
Node
corresponding to this transfer function resultpublic S getThenStore()
TransferResult
Node
this result belongs to evaluates to true
.getThenStore
in class TransferResult<V extends AbstractValue<V>,S extends Store<S>>
Node
this result belongs to evaluates to true
public S getElseStore()
TransferResult
Node
this result belongs to evaluates to false
.getElseStore
in class TransferResult<V extends AbstractValue<V>,S extends Store<S>>
Node
this result belongs to evaluates to false
public boolean containsTwoStores()
TransferResult
true
if and only if this transfer result contains two stores that are
potentially not equal. Note that the result true
does not imply that getRegularStore
cannot be called (or vice versa for false
). Rather, it indicates that
getThenStore
or getElseStore
can be used to give more precise results.
Otherwise, if the result is false
, then all three methods getRegularStore
,
getThenStore
, and getElseStore
return equivalent stores.containsTwoStores
in class TransferResult<V extends AbstractValue<V>,S extends Store<S>>
true
if and only if this transfer result contains two stores that are
potentially not equalpublic boolean storeChanged()
TransferResult
true
if and only if the transfer function returning this transfer result
changed the regularStore, elseStore, or thenStore.storeChanged
in class TransferResult<V extends AbstractValue<V>,S extends Store<S>>
true
if and only if the transfer function returning this transfer result
changed the regularStore, elseStore, or thenStore