diff options
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/unwind.rs | 19 | ||||
| -rw-r--r-- | src/libstd/rt/util.rs | 18 |
2 files changed, 16 insertions, 21 deletions
diff --git a/src/libstd/rt/unwind.rs b/src/libstd/rt/unwind.rs index e0c512706e6..8d7713d0558 100644 --- a/src/libstd/rt/unwind.rs +++ b/src/libstd/rt/unwind.rs @@ -493,27 +493,16 @@ pub extern fn rust_begin_unwind(msg: fmt::Arguments, /// the actual formatting into this shared place. #[inline(never)] #[cold] pub fn begin_unwind_fmt(msg: fmt::Arguments, file_line: &(&'static str, uint)) -> ! { - use fmt::FormatWriter; + use fmt::Writer; // We do two allocations here, unfortunately. But (a) they're // required with the current scheme, and (b) we don't handle // panic + OOM properly anyway (see comment in begin_unwind // below). - struct VecWriter<'a> { v: &'a mut Vec<u8> } - - impl<'a> fmt::FormatWriter for VecWriter<'a> { - fn write(&mut self, buf: &[u8]) -> fmt::Result { - self.v.push_all(buf); - Ok(()) - } - } - - let mut v = Vec::new(); - let _ = write!(&mut VecWriter { v: &mut v }, "{}", msg); - - let msg = box String::from_utf8_lossy(v.as_slice()).into_owned(); - begin_unwind_inner(msg, file_line) + let mut s = String::new(); + let _ = write!(&mut s, "{}", msg); + begin_unwind_inner(box s, file_line) } /// This is the entry point of unwinding for panic!() and assert!(). diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs index fee86e33455..fa7c305d69e 100644 --- a/src/libstd/rt/util.rs +++ b/src/libstd/rt/util.rs @@ -96,8 +96,8 @@ pub const Stdout: Stdio = Stdio(libc::STDOUT_FILENO); #[allow(non_upper_case_globals)] pub const Stderr: Stdio = Stdio(libc::STDERR_FILENO); -impl fmt::FormatWriter for Stdio { - fn write(&mut self, data: &[u8]) -> fmt::Result { +impl Stdio { + pub fn write_bytes(&mut self, data: &[u8]) { #[cfg(unix)] type WriteLen = libc::size_t; #[cfg(windows)] @@ -108,6 +108,12 @@ impl fmt::FormatWriter for Stdio { data.as_ptr() as *const libc::c_void, data.len() as WriteLen); } + } +} + +impl fmt::Writer for Stdio { + fn write_str(&mut self, data: &str) -> fmt::Result { + self.write_bytes(data.as_bytes()); Ok(()) // yes, we're lying } } @@ -117,16 +123,16 @@ pub fn dumb_print(args: fmt::Arguments) { } pub fn abort(args: fmt::Arguments) -> ! { - use fmt::FormatWriter; + use fmt::Writer; struct BufWriter<'a> { buf: &'a mut [u8], pos: uint, } - impl<'a> FormatWriter for BufWriter<'a> { - fn write(&mut self, bytes: &[u8]) -> fmt::Result { + impl<'a> fmt::Writer for BufWriter<'a> { + fn write_str(&mut self, bytes: &str) -> fmt::Result { let left = self.buf.slice_from_mut(self.pos); - let to_write = bytes[..cmp::min(bytes.len(), left.len())]; + let to_write = bytes.as_bytes()[..cmp::min(bytes.len(), left.len())]; slice::bytes::copy_memory(left, to_write); self.pos += to_write.len(); Ok(()) |
