about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-12-27 18:07:12 -0800
committerPatrick Walton <pcwalton@mimiga.net>2014-01-03 14:01:59 -0800
commitada9150abf26912478aa6f613602f8ac7ba135e5 (patch)
treeb190b9886e3d14fef2eea1c4b928bb7723eda4c8 /src/libsyntax
parent39f0270544af19bf51b0088c93fe5cf58a8eccbe (diff)
downloadrust-ada9150abf26912478aa6f613602f8ac7ba135e5.tar.gz
rust-ada9150abf26912478aa6f613602f8ac7ba135e5.zip
libsyntax: Correctly de-`@mut` the pretty printer writer
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/expand.rs2
-rw-r--r--src/libsyntax/print/pprust.rs32
2 files changed, 15 insertions, 19 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 4df29dc21b1..917b8d2e391 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -1319,7 +1319,7 @@ mod test {
     }
 
     fn fake_print_crate(crate: &ast::Crate) {
-        let out = @mut std::io::stderr() as @mut std::io::Writer;
+        let mut out = ~std::io::stderr() as ~std::io::Writer;
         let s = pprust::rust_printer(out, get_ident_interner());
         pprust::print_crate_(s, crate);
     }
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 36a77dfdd89..45e9641c71b 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -122,7 +122,7 @@ pub fn print_crate(cm: @CodeMap,
                    span_diagnostic: @diagnostic::SpanHandler,
                    crate: &ast::Crate,
                    filename: @str,
-                   input: @mut io::Reader,
+                   input: &mut io::Reader,
                    out: ~io::Writer,
                    ann: @pp_ann,
                    is_expanded: bool) {
@@ -211,13 +211,8 @@ pub fn fun_to_str(decl: &ast::fn_decl, purity: ast::purity, name: ast::Ident,
     end(&mut s); // Close the head box
     end(&mut s); // Close the outer box
     eof(&mut s.s);
-
-    // XXX(pcwalton): Need checked downcasts.
     unsafe {
-        let (_, wr): (uint, ~MemWriter) = cast::transmute(s.s.out);
-        let result = str::from_utf8_owned(wr.inner_ref().to_owned());
-        cast::forget(wr);
-        result
+        get_mem_writer(&mut s.s.out)
     }
 }
 
@@ -230,13 +225,8 @@ pub fn block_to_str(blk: &ast::Block, intr: @ident_interner) -> ~str {
     ibox(&mut s, 0u);
     print_block(&mut s, blk);
     eof(&mut s.s);
-
-    // XXX(pcwalton): Need checked downcasts.
     unsafe {
-        let (_, wr): (uint, ~MemWriter) = cast::transmute(s.s.out);
-        let result = str::from_utf8_owned(wr.inner_ref().to_owned());
-        cast::forget(wr);
-        result
+        get_mem_writer(&mut s.s.out)
     }
 }
 
@@ -2318,17 +2308,23 @@ pub fn print_string(s: &mut ps, st: &str, style: ast::StrStyle) {
     word(&mut s.s, st);
 }
 
+// XXX(pcwalton): A nasty function to extract the string from an `io::Writer`
+// that we "know" to be a `MemWriter` that works around the lack of checked
+// downcasts.
+unsafe fn get_mem_writer(writer: &mut ~io::Writer) -> ~str {
+    let (_, wr): (uint, ~MemWriter) = cast::transmute_copy(writer);
+    let result = str::from_utf8_owned(wr.inner_ref().to_owned());
+    cast::forget(wr);
+    result
+}
+
 pub fn to_str<T>(t: &T, f: |&mut ps, &T|, intr: @ident_interner) -> ~str {
     let wr = ~MemWriter::new();
     let mut s = rust_printer(wr as ~io::Writer, intr);
     f(&mut s, t);
     eof(&mut s.s);
-    // XXX(pcwalton): Need checked downcasts.
     unsafe {
-        let (_, wr): (uint, ~MemWriter) = cast::transmute(s.s.out);
-        let result = str::from_utf8_owned(wr.inner_ref().to_owned());
-        cast::forget(wr);
-        result
+        get_mem_writer(&mut s.s.out)
     }
 }