summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_span/src/source_map/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_span/src/source_map/tests.rs')
-rw-r--r--compiler/rustc_span/src/source_map/tests.rs38
1 files changed, 32 insertions, 6 deletions
diff --git a/compiler/rustc_span/src/source_map/tests.rs b/compiler/rustc_span/src/source_map/tests.rs
index 686b3b00d..a12f50c87 100644
--- a/compiler/rustc_span/src/source_map/tests.rs
+++ b/compiler/rustc_span/src/source_map/tests.rs
@@ -1,6 +1,6 @@
use super::*;
-use rustc_data_structures::sync::Lrc;
+use rustc_data_structures::sync::{FreezeLock, Lrc};
fn init_source_map() -> SourceMap {
let sm = SourceMap::new(FilePathMapping::empty());
@@ -50,6 +50,7 @@ impl SourceMap {
fn bytepos_to_file_charpos(&self, bpos: BytePos) -> CharPos {
let idx = self.lookup_source_file_idx(bpos);
let sf = &(*self.files.borrow().source_files)[idx];
+ let bpos = sf.relative_position(bpos);
sf.bytepos_to_file_charpos(bpos)
}
}
@@ -230,8 +231,7 @@ fn t10() {
let SourceFile {
name,
src_hash,
- start_pos,
- end_pos,
+ source_len,
lines,
multibyte_chars,
non_narrow_chars,
@@ -244,13 +244,12 @@ fn t10() {
name,
src_hash,
name_hash,
- (end_pos - start_pos).to_usize(),
+ source_len.to_u32(),
CrateNum::new(0),
- lines,
+ FreezeLock::new(lines.read().clone()),
multibyte_chars,
non_narrow_chars,
normalized_pos,
- start_pos,
0,
);
@@ -568,3 +567,30 @@ fn test_next_point() {
assert_eq!(span.hi().0, 6);
assert!(sm.span_to_snippet(span).is_err());
}
+
+#[cfg(target_os = "linux")]
+#[test]
+fn read_binary_file_handles_lying_stat() {
+ // read_binary_file tries to read the contents of a file into an Lrc<[u8]> while
+ // never having two copies of the data in memory at once. This is an optimization
+ // to support include_bytes! with large files. But since Rust allocators are
+ // sensitive to alignment, our implementation can't be bootstrapped off calling
+ // std::fs::read. So we test that we have the same behavior even on files where
+ // fs::metadata lies.
+
+ // stat always says that /proc/self/cmdline is length 0, but it isn't.
+ let cmdline = Path::new("/proc/self/cmdline");
+ let len = std::fs::metadata(cmdline).unwrap().len() as usize;
+ let real = std::fs::read(cmdline).unwrap();
+ assert!(len < real.len());
+ let bin = RealFileLoader.read_binary_file(cmdline).unwrap();
+ assert_eq!(&real[..], &bin[..]);
+
+ // stat always says that /sys/devices/system/cpu/kernel_max is the size of a block.
+ let kernel_max = Path::new("/sys/devices/system/cpu/kernel_max");
+ let len = std::fs::metadata(kernel_max).unwrap().len() as usize;
+ let real = std::fs::read(kernel_max).unwrap();
+ assert!(len > real.len());
+ let bin = RealFileLoader.read_binary_file(kernel_max).unwrap();
+ assert_eq!(&real[..], &bin[..]);
+}