pub struct HygieneEncodeContext {
serialized_ctxts: FxHashSet<SyntaxContext>,
latest_ctxts: Vec<(u32, SyntaxContext)>,
serialized_expns: FxHashSet<ExpnId>,
latest_expns: Vec<ExpnId>,
encoding_indices: FxHashMap<SyntaxContext, u32>,
}Fields§
§serialized_ctxts: FxHashSet<SyntaxContext>All SyntaxContexts for which we have written SyntaxContextData into crate metadata.
latest_ctxts: Vec<(u32, SyntaxContext)>The SyntaxContexts that we have serialized (e.g. as a result of encoding Spans)
in the most recent ‘round’ of serializing. Serializing SyntaxContextData
may cause us to serialize more SyntaxContexts, so serialize in a loop
until we reach a fixed point.
serialized_expns: FxHashSet<ExpnId>§latest_expns: Vec<ExpnId>§encoding_indices: FxHashMap<SyntaxContext, u32>Maps every SyntaxContext into its encoding index.
Earlier the ctxt.0 was used when writing metadata, however,
this results into non-deterministic metadata (see #129094).
The non-determinism is encountered when decoding syntax contexts
in decode_syntax_context function below. The syntax contexts from
other crate metadata can be decoded in different order, which results
into different ids assigned to decoded syntax contexts.
First invocation:
(ALLOC - syntax context id, ORIG - original id of decoded syntax context:
raw_id in decode_syntax_context)
ALLOC: #3, ORIG: 1
ALLOC: #9, ORIG: 18769
ALLOC: #10, ORIG: 25868
ALLOC: #11, ORIG: 18822
ALLOC: #12, ORIG: 23092
Second invocation: ALLOC: #3, ORIG: 1 ALLOC: #9, ORIG: 25868 ALLOC: #10, ORIG: 18769 ALLOC: #11, ORIG: 18822 ALLOC: #12, ORIG: 23092
We see that 18769 and 25868 assigned different syntax context ids,
however, the order of encoding is deterministic, so we can remap allocated
syntax context ids into encoding indices and use them, thus outputting
same metadata.
Implementations§
Source§impl HygieneEncodeContext
impl HygieneEncodeContext
fn get_encoding_index(&mut self, ctxt: SyntaxContext) -> u32
Sourcepub fn schedule_expn_data_for_encoding(&mut self, expn: ExpnId)
pub fn schedule_expn_data_for_encoding(&mut self, expn: ExpnId)
Record the fact that we need to serialize the corresponding ExpnData.
pub fn encode<T>( h_ctxt: &RefCell<HygieneEncodeContext>, encoder: &mut T, encode_ctxt: impl FnMut(&mut T, u32, &SyntaxContextKey), encode_expn: impl FnMut(&mut T, ExpnId, Option<&ExpnData>, ExpnHash), )
pub fn get_syntax_ctxt_encoding_index(&mut self, ctxt: SyntaxContext) -> u32
Trait Implementations§
Source§impl Default for HygieneEncodeContext
impl Default for HygieneEncodeContext
Source§fn default() -> HygieneEncodeContext
fn default() -> HygieneEncodeContext
Auto Trait Implementations§
impl DynSend for HygieneEncodeContext
impl DynSync for HygieneEncodeContext
impl Freeze for HygieneEncodeContext
impl RefUnwindSafe for HygieneEncodeContext
impl Send for HygieneEncodeContext
impl Sync for HygieneEncodeContext
impl Unpin for HygieneEncodeContext
impl UnsafeUnpin for HygieneEncodeContext
impl UnwindSafe for HygieneEncodeContext
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
Source§fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 144 bytes