diff options
| author | bors <bors@rust-lang.org> | 2014-02-18 12:21:45 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-02-18 12:21:45 -0800 |
| commit | aa06bf4f129ea670f3f9cd1db160c63845759126 (patch) | |
| tree | 3d113c529e380dc4fedf680ebf25890436a97f9b /src/libstd | |
| parent | a88654977234d18b57e2a1842549941397ab0d59 (diff) | |
| parent | 96102b39455d414ec5966cb4547f5317f3cada15 (diff) | |
| download | rust-aa06bf4f129ea670f3f9cd1db160c63845759126.tar.gz rust-aa06bf4f129ea670f3f9cd1db160c63845759126.zip | |
auto merge of #12357 : chromatic/rust/gh_11976_fail_bounds_check_str, r=alexcrichton
Fixes #11976.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/unstable/lang.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libstd/unstable/lang.rs b/src/libstd/unstable/lang.rs index 4648f149a9f..8818cb0d270 100644 --- a/src/libstd/unstable/lang.rs +++ b/src/libstd/unstable/lang.rs @@ -10,7 +10,10 @@ //! Runtime calls emitted by the compiler. -use c_str::ToCStr; +use c_str::CString; +use libc::c_char; +use cast; +use option::Some; #[cold] #[lang="fail_"] @@ -23,7 +26,14 @@ pub fn fail_(expr: *u8, file: *u8, line: uint) -> ! { pub fn fail_bounds_check(file: *u8, line: uint, index: uint, len: uint) -> ! { let msg = format!("index out of bounds: the len is {} but the index is {}", len as uint, index as uint); - msg.with_c_str(|buf| fail_(buf as *u8, file, line)) + + let file_str = match unsafe { CString::new(file as *c_char, false) }.as_str() { + // This transmute is safe because `file` is always stored in rodata. + Some(s) => unsafe { cast::transmute::<&str, &'static str>(s) }, + None => "file wasn't UTF-8 safe" + }; + + ::rt::begin_unwind(msg, file_str, line) } #[lang="malloc"] |
