pub enum Discriminator {
Known(VariantId),
Invalid,
Branch {
offset: OffsetExpr,
int_ty: IntegerTy,
children: Vec<(RangeInclusive<IntegerValue>, Discriminator)>,
fallback: Box<Discriminator>,
},
}Expand description
Decision tree used to determine the active variant by reading memory. Mirrors MiniRust’s
Discriminator.
Variants§
Known(VariantId)
The variant is known.
Invalid
No valid variant (e.g., invalid tag value).
Branch
Branch on an integer value read from memory at offset.
Fields
§
offset: OffsetExprByte offset to read from.
§
children: Vec<(RangeInclusive<IntegerValue>, Discriminator)>If the integer is in one of these ranges, continue with the given Discriminator. The
ranges are sorted.
§
fallback: Box<Discriminator>Fallback if no range in children matches.
Implementations§
Source§impl Discriminator
impl Discriminator
Sourcepub fn trivial(variant_id: VariantId) -> Self
pub fn trivial(variant_id: VariantId) -> Self
Make a trivial discriminator that always returns the given variant id.
Sourcepub fn read_discriminant(
&self,
read: impl Fn(ByteCount, IntegerTy) -> Result<IntegerValue, DiscriminantReadError> + Copy,
) -> Result<VariantId, DiscriminantReadError>
pub fn read_discriminant( &self, read: impl Fn(ByteCount, IntegerTy) -> Result<IntegerValue, DiscriminantReadError> + Copy, ) -> Result<VariantId, DiscriminantReadError>
Read a discriminant from memory. The read function simulates reading an integer of the
given type at the given byte offset from memory and can return UninitByte if the byte
could not be read.
Trait Implementations§
Source§impl AstVisitable for Discriminator
impl AstVisitable for Discriminator
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
Recursively visit this type with the provided visitor. This calls the visitor’s
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>
Recursively visit this type with the provided visitor. This calls the visitor’s
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
Recursively visit this type with the provided visitor. This calls the visitor’s
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
Visit all occurrences of that type inside
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
Visit all occurrences of that type inside
self, in pre-order traversal.Source§impl Clone for Discriminator
impl Clone for Discriminator
Source§fn clone(&self) -> Discriminator
fn clone(&self) -> Discriminator
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for Discriminator
impl Debug for Discriminator
Source§impl<'de, __State: ?Sized + DedupSerializerState> DeserializeState<'de, __State> for Discriminator
impl<'de, __State: ?Sized + DedupSerializerState> DeserializeState<'de, __State> for Discriminator
fn deserialize_state<__D>(
__state: &__State,
__deserializer: __D,
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for Discriminatorwhere
V: Visitor + Visit<'s, VariantId> + Visit<'s, OffsetExpr> + Visit<'s, IntegerTy> + Visit<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + Visit<'s, Box<Discriminator>>,
impl<'s, V> Drive<'s, V> for Discriminatorwhere
V: Visitor + Visit<'s, VariantId> + Visit<'s, OffsetExpr> + Visit<'s, IntegerTy> + Visit<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + Visit<'s, Box<Discriminator>>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
Call
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for Discriminatorwhere
V: Visitor + VisitMut<'s, VariantId> + VisitMut<'s, OffsetExpr> + VisitMut<'s, IntegerTy> + VisitMut<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + VisitMut<'s, Box<Discriminator>>,
impl<'s, V> DriveMut<'s, V> for Discriminatorwhere
V: Visitor + VisitMut<'s, VariantId> + VisitMut<'s, OffsetExpr> + VisitMut<'s, IntegerTy> + VisitMut<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + VisitMut<'s, Box<Discriminator>>,
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>
Call
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveTwo<'s, V> for Discriminatorwhere
V: Visitor<Break: Default> + VisitTwo<'s, VariantId> + VisitTwo<'s, OffsetExpr> + VisitTwo<'s, IntegerTy> + VisitTwo<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + VisitTwo<'s, Box<Discriminator>>,
impl<'s, V> DriveTwo<'s, V> for Discriminatorwhere
V: Visitor<Break: Default> + VisitTwo<'s, VariantId> + VisitTwo<'s, OffsetExpr> + VisitTwo<'s, IntegerTy> + VisitTwo<'s, Vec<(RangeInclusive<IntegerValue>, Discriminator)>> + VisitTwo<'s, Box<Discriminator>>,
Source§fn drive_two_inner(
&'s self,
other: &'s Self,
visitor: &mut V,
) -> ControlFlow<V::Break>
fn drive_two_inner( &'s self, other: &'s Self, visitor: &mut V, ) -> ControlFlow<V::Break>
Call
v.visit() on the immediate contents of self and other, if they correspond. If
the values don’t match up, this returns Break(Default::default()).Source§impl<C: AstFormatter> FmtWithCtx<C> for Discriminator
impl<C: AstFormatter> FmtWithCtx<C> for Discriminator
Source§impl<__State: ?Sized + DedupSerializerState> SerializeState<__State> for Discriminator
impl<__State: ?Sized + DedupSerializerState> SerializeState<__State> for Discriminator
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for Discriminator
impl RefUnwindSafe for Discriminator
impl Send for Discriminator
impl Sync for Discriminator
impl Unpin for Discriminator
impl UnsafeUnpin for Discriminator
impl UnwindSafe for Discriminator
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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> ⓘ
Converts
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> ⓘ
Converts
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 moreimpl<T> Mappable for T
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)
Visit the variables contained in
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.Source§fn substitute(self, generics: &GenericArgs) -> Self
fn substitute(self, generics: &GenericArgs) -> Self
Substitute the generic variables inside
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you must use
substitute_with_self or substitute_inner_binder, otherwise you’ll get panics.Source§fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
Substitute the generic variables inside
self by replacing them with the provided values.
This is appropriate when substituting an inner binder.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Substitute only the type, region and const generic args.
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.Source§fn substitute_with_tref(self, tref: &TraitRef) -> Self
fn substitute_with_tref(self, tref: &TraitRef) -> Self
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.Source§fn try_substitute_with_tref(
self,
tref: &TraitRef,
) -> Result<Self, GenericsMismatch>
fn try_substitute_with_tref( self, tref: &TraitRef, ) -> Result<Self, GenericsMismatch>
Substitute the generic variables as well as the
TraitRefKind::SelfId trait ref.fn try_substitute( self, generics: &GenericArgs, ) -> Result<Self, GenericsMismatch>
fn try_substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Result<Self, GenericsMismatch>
Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Move under one binder.
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
Move under
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Move from under one binder.
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
Move the value out of
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>
Visit the de Bruijn ids contained in
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.Source§fn replace_erased_regions(self, f: impl FnMut() -> Region) -> Self
fn replace_erased_regions(self, f: impl FnMut() -> Region) -> Self
Replace all the erased regions by the output of the provided function. Binders levels are
handled automatically.