pub enum ScalarValue {
Unsigned(UIntTy, u128),
Signed(IntTy, i128),
}
Expand description
A scalar value.
Variants§
Implementations§
Source§impl ScalarValue
impl ScalarValue
Source§impl ScalarValue
impl ScalarValue
Source§impl ScalarValue
impl ScalarValue
pub fn as_unsigned_mut(&mut self) -> Option<(&mut UIntTy, &mut u128)>
pub fn as_signed_mut(&mut self) -> Option<(&mut IntTy, &mut i128)>
Source§impl ScalarValue
impl ScalarValue
pub fn variant_name(&self) -> &'static str
Source§impl ScalarValue
impl ScalarValue
pub fn variant_index_arity(&self) -> (u32, usize)
Source§impl ScalarValue
impl ScalarValue
fn ptr_size_max(ptr_size: ByteCount, signed: bool) -> ScalarResult<u128>
fn ptr_size_min(ptr_size: ByteCount, signed: bool) -> ScalarResult<i128>
pub fn get_integer_ty(&self) -> IntegerTy
pub fn is_int(&self) -> bool
pub fn is_uint(&self) -> bool
Sourcepub fn as_uint(&self) -> ScalarResult<u128>
pub fn as_uint(&self) -> ScalarResult<u128>
When computing the result of binary operations, we convert the values to u128 then back to the target type (while performing dynamic checks of course).
pub fn uint_is_in_bounds(ptr_size: ByteCount, ty: UIntTy, v: u128) -> bool
pub fn from_unchecked_uint(ty: UIntTy, v: u128) -> ScalarValue
pub fn from_uint( ptr_size: ByteCount, ty: UIntTy, v: u128, ) -> ScalarResult<ScalarValue>
Sourcepub fn as_int(&self) -> ScalarResult<i128>
pub fn as_int(&self) -> ScalarResult<i128>
When computing the result of binary operations, we convert the values to i128 then back to the target type (while performing dynamic checks of course).
pub fn int_is_in_bounds(ptr_size: ByteCount, ty: IntTy, v: i128) -> bool
pub fn from_unchecked_int(ty: IntTy, v: i128) -> ScalarValue
Sourcepub fn to_bits(&self) -> u128
pub fn to_bits(&self) -> u128
Most integers are represented as u128
by rustc. We must be careful not to sign-extend.
Sourcepub fn from_le_bytes(ty: IntegerTy, bytes: [u8; 16]) -> Self
pub fn from_le_bytes(ty: IntegerTy, bytes: [u8; 16]) -> Self
Translates little endian bytes into a corresponding ScalarValue
.
This needs to do the round-trip to the correct integer type to guarantee
that the values are correctly sign-extended (e.g. if the bytes encode -1i8, taking all 16 bytes
would lead to the value 255i128 instead of -1i128).
pub fn from_bits(ty: IntegerTy, bits: u128) -> Self
Sourcepub fn from_int(
ptr_size: ByteCount,
ty: IntTy,
v: i128,
) -> ScalarResult<ScalarValue>
pub fn from_int( ptr_size: ByteCount, ty: IntTy, v: i128, ) -> ScalarResult<ScalarValue>
Warning: most constants are stored as u128 by rustc. When converting
to i128, it is not correct to do v as i128
, we must reinterpret the
bits (see ScalarValue::from_le_bytes).
pub fn to_constant(self) -> ConstantExpr
Trait Implementations§
Source§impl AstVisitable for ScalarValue
impl AstVisitable for ScalarValue
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
self
, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
self
, in pre-order traversal.Source§impl BodyVisitable for ScalarValue
impl BodyVisitable for ScalarValue
Source§fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.Source§fn drive_body_mut<V: VisitBodyMut>(
&mut self,
v: &mut V,
) -> ControlFlow<V::Break>
fn drive_body_mut<V: VisitBodyMut>( &mut self, v: &mut V, ) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner
.Source§fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
self
, in pre-order traversal.Source§fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
self
, in pre-order traversal.Source§impl Clone for ScalarValue
impl Clone for ScalarValue
Source§fn clone(&self) -> ScalarValue
fn clone(&self) -> ScalarValue
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for ScalarValue
impl Debug for ScalarValue
Source§impl<'de> Deserialize<'de> for ScalarValue
impl<'de> Deserialize<'de> for ScalarValue
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Display for ScalarValue
impl Display for ScalarValue
Source§impl<'s, V> Drive<'s, V> for ScalarValuewhere
V: Visitor,
impl<'s, V> Drive<'s, V> for ScalarValuewhere
V: Visitor,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit()
on the immediate contents of self
.Source§impl<'s, V> DriveMut<'s, V> for ScalarValuewhere
V: Visitor,
impl<'s, V> DriveMut<'s, V> for ScalarValuewhere
V: Visitor,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit()
on the immediate contents of self
.Source§impl Hash for ScalarValue
impl Hash for ScalarValue
Source§impl Ord for ScalarValue
impl Ord for ScalarValue
Source§fn cmp(&self, other: &ScalarValue) -> Ordering
fn cmp(&self, other: &ScalarValue) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for ScalarValue
impl PartialEq for ScalarValue
Source§impl PartialOrd for ScalarValue
impl PartialOrd for ScalarValue
Source§impl Serialize for ScalarValue
impl Serialize for ScalarValue
impl Copy for ScalarValue
impl Eq for ScalarValue
impl StructuralPartialEq for ScalarValue
Auto Trait Implementations§
impl Freeze for ScalarValue
impl RefUnwindSafe for ScalarValue
impl Send for ScalarValue
impl Sync for ScalarValue
impl Unpin for ScalarValue
impl UnwindSafe for ScalarValue
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
§impl<T> Indentable for Twhere
T: Display,
impl<T> Indentable for Twhere
T: Display,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<I> RecreateContext<I> for I
impl<I> RecreateContext<I> for I
§fn recreate_context(_original_input: I, tail: I) -> I
fn recreate_context(_original_input: I, tail: I) -> I
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self
, as seen from the outside of self
. This means
that any variable bound inside self
will be skipped, and all the seen De Bruijn indices
will count from the outside of self
.fn substitute(self, generics: &GenericArgs) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth
binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth
binders. Returns None
if it contains a variable bound in
one of these depth
binders.Source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self
, as seen from the outside of self
. This means
that any variable bound inside self
will be skipped, and all the seen indices will count
from the outside of self.