]> git.lizzy.rs Git - rust.git/commitdiff
syntax: Remove use of TraitObject in pretty printer
authorErick Tryzelaar <erick.tryzelaar@gmail.com>
Fri, 17 Apr 2015 02:54:05 +0000 (19:54 -0700)
committerErick Tryzelaar <erick.tryzelaar@gmail.com>
Tue, 21 Apr 2015 17:08:27 +0000 (10:08 -0700)
src/libsyntax/print/pprust.rs

index 1a5c295cdd6dbcceee618e81b2d3355ad534efc9..3ccc8f2619f2d79f7460ff7b03b3f772277c84c1 100644 (file)
@@ -28,7 +28,7 @@
 use ptr::P;
 use std_inject;
 
-use std::{ascii, mem};
+use std::ascii;
 use std::io::{self, Write, Read};
 use std::iter;
 
@@ -187,18 +187,13 @@ pub fn new(cm: &'a CodeMap,
 pub fn to_string<F>(f: F) -> String where
     F: FnOnce(&mut State) -> io::Result<()>,
 {
-    use std::raw::TraitObject;
-    let mut s = rust_printer(Box::new(Vec::new()));
-    f(&mut s).unwrap();
-    eof(&mut s.s).unwrap();
-    let wr = unsafe {
-        // FIXME(pcwalton): A nasty function to extract the string from an `Write`
-        // that we "know" to be a `Vec<u8>` that works around the lack of checked
-        // downcasts.
-        let obj: &TraitObject = mem::transmute(&s.s.out);
-        mem::transmute::<*mut (), &Vec<u8>>(obj.data)
-    };
-    String::from_utf8(wr.clone()).unwrap()
+    let mut wr = Vec::new();
+    {
+        let mut printer = rust_printer(Box::new(&mut wr));
+        f(&mut printer).unwrap();
+        eof(&mut printer.s).unwrap();
+    }
+    String::from_utf8(wr).unwrap()
 }
 
 pub fn binop_to_string(op: BinOpToken) -> &'static str {