diff options
| author | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2014-07-04 16:36:49 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2014-07-04 16:36:49 -0700 |
| commit | 717de500eefc2f501f12587fc9626944ab593ff8 (patch) | |
| tree | da70f8af72fa4f220dad1d104c498c615e56ad26 | |
| parent | 83f9f07ec4a339a31650abf7023a584cf7c5ce54 (diff) | |
| download | rust-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.rs | 46 |
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> { |
