about summary refs log tree commit diff
path: root/src/libserialize
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-12-17 08:33:54 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-12-17 11:50:24 -0800
commit6089699411d4644981808c20661fa559646293c8 (patch)
tree17c1c5e1b2db7519664b88bd445740c751dc7114 /src/libserialize
parentfc1b4379eb63363248765a20cd96b38e923236c5 (diff)
parent577f742d7a8a593e8134056259f195a7c897eeb9 (diff)
downloadrust-6089699411d4644981808c20661fa559646293c8.tar.gz
rust-6089699411d4644981808c20661fa559646293c8.zip
rollup merge of #19764: lifthrasiir/that-stray-nul
Fixes #19719.
Diffstat (limited to 'src/libserialize')
-rw-r--r--src/libserialize/json.rs54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs
index d17f293b443..bd634a58382 100644
--- a/src/libserialize/json.rs
+++ b/src/libserialize/json.rs
@@ -367,8 +367,8 @@ fn escape_str(writer: &mut io::Writer, v: &str) -> Result<(), io::IoError> {
 
 fn escape_char(writer: &mut io::Writer, v: char) -> Result<(), io::IoError> {
     let mut buf = [0, .. 4];
-    v.encode_utf8(&mut buf);
-    escape_bytes(writer, &mut buf)
+    let len = v.encode_utf8(&mut buf).unwrap();
+    escape_bytes(writer, buf[mut ..len])
 }
 
 fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
@@ -2729,37 +2729,39 @@ mod tests {
         );
     }
 
+    macro_rules! check_encoder_for_simple(
+        ($value:expr, $expected:expr) => ({
+            let s = with_str_writer(|writer| {
+                let mut encoder = Encoder::new(writer);
+                $value.encode(&mut encoder).unwrap();
+            });
+            assert_eq!(s, $expected);
+
+            let s = with_str_writer(|writer| {
+                let mut encoder = PrettyEncoder::new(writer);
+                $value.encode(&mut encoder).unwrap();
+            });
+            assert_eq!(s, $expected);
+        })
+    )
+
     #[test]
     fn test_write_some() {
-        let value = Some("jodhpurs".into_string());
-        let s = with_str_writer(|writer| {
-            let mut encoder = Encoder::new(writer);
-            value.encode(&mut encoder).unwrap();
-        });
-        assert_eq!(s, "\"jodhpurs\"");
-
-        let value = Some("jodhpurs".into_string());
-        let s = with_str_writer(|writer| {
-            let mut encoder = PrettyEncoder::new(writer);
-            value.encode(&mut encoder).unwrap();
-        });
-        assert_eq!(s, "\"jodhpurs\"");
+        check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
     }
 
     #[test]
     fn test_write_none() {
-        let value: Option<string::String> = None;
-        let s = with_str_writer(|writer| {
-            let mut encoder = Encoder::new(writer);
-            value.encode(&mut encoder).unwrap();
-        });
-        assert_eq!(s, "null");
+        check_encoder_for_simple!(None::<string::String>, "null");
+    }
 
-        let s = with_str_writer(|writer| {
-            let mut encoder = Encoder::new(writer);
-            value.encode(&mut encoder).unwrap();
-        });
-        assert_eq!(s, "null");
+    #[test]
+    fn test_write_char() {
+        check_encoder_for_simple!('a', "\"a\"");
+        check_encoder_for_simple!('\t', "\"\\t\"");
+        check_encoder_for_simple!('\u00a0', "\"\u00a0\"");
+        check_encoder_for_simple!('\uabcd', "\"\uabcd\"");
+        check_encoder_for_simple!('\U0010ffff', "\"\U0010ffff\"");
     }
 
     #[test]