From c40fad34e25f4e00b118d7d362e7639954a717f2 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 28 Oct 2016 17:10:34 +0200 Subject: [PATCH 1/2] Debug instrumentation for construction of ImportedFileMap table entries. --- src/librustc_metadata/decoder.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 0d42ff8ce27..3e367cbee2e 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1138,6 +1138,14 @@ pub fn imported_filemaps(&'a self, match reusable_filemap { Some(fm) => { + + debug!("CrateMetaData::imported_filemaps reuse \ + filemap {:?} original (start_pos {:?} end_pos {:?}) \ + translated (start_pos {:?} end_pos {:?})", + filemap_to_import.name, + filemap_to_import.start_pos, filemap_to_import.end_pos, + fm.start_pos, fm.end_pos); + cstore::ImportedFileMap { original_start_pos: filemap_to_import.start_pos, original_end_pos: filemap_to_import.end_pos, @@ -1176,6 +1184,12 @@ pub fn imported_filemaps(&'a self, source_length, lines, multibyte_chars); + debug!("CrateMetaData::imported_filemaps alloc \ + filemap {:?} original (start_pos {:?} end_pos {:?}) \ + translated (start_pos {:?} end_pos {:?})", + local_version.name, start_pos, end_pos, + local_version.start_pos, local_version.end_pos); + cstore::ImportedFileMap { original_start_pos: start_pos, original_end_pos: end_pos, From 3f639a0f11eda43d9a31ef407eaac793dd038a43 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 28 Oct 2016 17:12:54 +0200 Subject: [PATCH 2/2] Do not intern filemap to entry w/ mismatched length. Fix #37274 (I think). --- src/librustc_metadata/decoder.rs | 4 ++++ src/libsyntax_pos/lib.rs | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 3e367cbee2e..7f36fa59830 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1207,6 +1207,10 @@ pub fn imported_filemaps(&'a self, } fn are_equal_modulo_startpos(fm1: &syntax_pos::FileMap, fm2: &syntax_pos::FileMap) -> bool { + if fm1.byte_length() != fm2.byte_length() { + return false; + } + if fm1.name != fm2.name { return false; } diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index e3feaee5369..d83d3a6c5cf 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -481,6 +481,9 @@ pub fn is_imported(&self) -> bool { self.src.is_none() } + pub fn byte_length(&self) -> u32 { + self.end_pos.0 - self.start_pos.0 + } pub fn count_lines(&self) -> usize { self.lines.borrow().len() }