Skip to content

Commit e3e790a

Browse files
committed
Fixed on-demand hygiene info encoding.
1 parent b653026 commit e3e790a

File tree

3 files changed

+19
-13
lines changed

3 files changed

+19
-13
lines changed

src/librustc_metadata/decoder.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,7 @@ impl<'a, 'tcx> CrateMetadata {
12691269
// This shouldn't borrow twice, but there is no way to downgrade RefMut to Ref.
12701270
*self.hygiene_data_import_info.borrow_mut() =
12711271
Some(hygiene::extend_hygiene_data(external_hygiene_data));
1272+
12721273
self.hygiene_data_being_decoded.set(false);
12731274

12741275
Ref::map(self.hygiene_data_import_info.borrow(), |d| d.as_ref().unwrap())

src/librustc_metadata/encoder.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
351351
}
352352

353353
fn encode_hygiene_data(&mut self) -> Lazy<hygiene::HygieneDataMap> {
354-
// TODO(twk): remove the `ensure_hygiene_data_loaded` method!
355-
hygiene::HygieneData::safe_with(|data| self.lazy(&data.to_map()))
354+
// FIXME(twk): remove the `ensure_hygiene_data_loaded` method
355+
// self.tcx.sess.cstore.ensure_hygiene_data_loaded();
356+
let data = hygiene::HygieneData::safe_with(|data| data.to_map());
357+
self.lazy(&data)
356358
}
357359

358360
fn encode_crate_root(&mut self) -> Lazy<CrateRoot> {

src/libsyntax_pos/hygiene.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,12 @@ impl HygieneData {
161161
let mut mark_queue: VecDeque<_> = self.used_marks.iter().cloned().collect();
162162
let mut ctxt_queue: VecDeque<_> = self.used_syntax_contexts.iter().cloned().collect();
163163
ctxt_queue.extend(self.gensym_to_ctxt.values());
164-
165164
let gensym_to_ctxt = self.gensym_to_ctxt.clone();
166165

167166
let mut visited_marks = HashSet::new();
168167
let mut visited_ctxts = HashSet::new();
169168

170-
loop {
169+
while !(mark_queue.is_empty() && ctxt_queue.is_empty()) {
171170
let next_mark = mark_queue.pop_front().and_then(|mark|
172171
// skip default mark and already visited marks
173172
if visited_marks.contains(&mark) || mark.0 == 0 {
@@ -185,10 +184,6 @@ impl HygieneData {
185184
Some(ctxt)
186185
});
187186

188-
if next_mark.is_none() && next_ctxt.is_none() {
189-
break;
190-
}
191-
192187
if let Some(mark) = next_mark {
193188
let data = &self.marks[mark.0 as usize];
194189

@@ -261,18 +256,26 @@ impl ImportedHygieneData {
261256
}
262257

263258
pub fn translate_ctxt(&self, external: SyntaxContext) -> SyntaxContext {
264-
self.ctxt_map[&external]
259+
if external.0 != 0 {
260+
self.ctxt_map[&external]
261+
} else {
262+
external
263+
}
265264
}
266265

267266
pub fn translate_mark(&self, external: Mark) -> Mark {
268-
self.mark_map[&external]
267+
if external.0 != 0 {
268+
self.mark_map[&external]
269+
} else {
270+
external
271+
}
269272
}
270273

271274
pub fn translate_span(&self, external: Span) -> Span {
272275
Span {
273276
lo: external.lo,
274277
hi: external.hi,
275-
ctxt: self.ctxt_map[&external.ctxt],
278+
ctxt: self.translate_ctxt(external.ctxt),
276279
}
277280
}
278281

@@ -320,7 +323,7 @@ pub fn extend_hygiene_data(extend_with: HygieneDataMap) -> ImportedHygieneData {
320323
.enumerate()
321324
.map(|(index_offset, (mark, data))| {
322325
let index_offset = index_offset as u32;
323-
imported_map.insert_mark(mark, mark.translate(mark_offset + index_offset));
326+
imported_map.insert_mark(mark, Mark(mark_offset + index_offset));
324327
data
325328
})
326329
.collect();
@@ -330,7 +333,7 @@ pub fn extend_hygiene_data(extend_with: HygieneDataMap) -> ImportedHygieneData {
330333
.enumerate()
331334
.map(|(index_offset, (ctxt, data))| {
332335
let index_offset = index_offset as u32;
333-
imported_map.insert_ctxt(ctxt, ctxt.translate(ctxt_offset + index_offset));
336+
imported_map.insert_ctxt(ctxt, SyntaxContext(ctxt_offset + index_offset));
334337
data
335338
})
336339
.collect();

0 commit comments

Comments
 (0)