about summary refs log tree commit diff
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2014-07-04 16:36:49 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2014-07-04 16:36:49 -0700
commit717de500eefc2f501f12587fc9626944ab593ff8 (patch)
treeda70f8af72fa4f220dad1d104c498c615e56ad26
parent83f9f07ec4a339a31650abf7023a584cf7c5ce54 (diff)
downloadrust-717de500eefc2f501f12587fc9626944ab593ff8.tar.gz
rust-717de500eefc2f501f12587fc9626944ab593ff8.zip
serialize: escaping json strings should write in batches.
This significantly speeds up encoding json strings.
-rw-r--r--src/libserialize/json.rs46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs
index 49f929d4658..bb044f65348 100644
--- a/src/libserialize/json.rs
+++ b/src/libserialize/json.rs
@@ -256,21 +256,37 @@ fn io_error_to_error(io: io::IoError) -> ParserError {
 pub type EncodeResult = io::IoResult<()>;
 pub type DecodeResult<T> = Result<T, DecoderError>;
 
-fn escape_bytes(writer: &mut io::Writer, s: &[u8]) -> Result<(), io::IoError> {
-    try!(writer.write_str("\""));
-    for byte in s.iter() {
-        match *byte {
-            b'"' => try!(writer.write_str("\\\"")),
-            b'\\' => try!(writer.write_str("\\\\")),
-            b'\x08' => try!(writer.write_str("\\b")),
-            b'\x0c' => try!(writer.write_str("\\f")),
-            b'\n' => try!(writer.write_str("\\n")),
-            b'\r' => try!(writer.write_str("\\r")),
-            b'\t' => try!(writer.write_str("\\t")),
-            _ => try!(writer.write_u8(*byte)),
-        }
-    }
-    writer.write_str("\"")
+pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError> {
+    try!(wr.write_str("\""));
+
+    let mut start = 0;
+
+    for (i, byte) in bytes.iter().enumerate() {
+        let escaped = match *byte {
+            b'"' => "\\\"",
+            b'\\' => "\\\\",
+            b'\x08' => "\\b",
+            b'\x0c' => "\\f",
+            b'\n' => "\\n",
+            b'\r' => "\\r",
+            b'\t' => "\\t",
+            _ => { continue; }
+        };
+
+        if start < i {
+            try!(wr.write(bytes.slice(start, i)));
+        }
+
+        try!(wr.write_str(escaped));
+
+        start = i + 1;
+    }
+
+    if start != bytes.len() {
+        try!(wr.write(bytes.slice_from(start)));
+    }
+
+    wr.write_str("\"")
 }
 
 fn escape_str(writer: &mut io::Writer, v: &str) -> Result<(), io::IoError> {