@@ -256,22 +256,38 @@ fn io_error_to_error(io: io::IoError) -> ParserError {
256
256
pub type EncodeResult = io:: IoResult < ( ) > ;
257
257
pub type DecodeResult < T > = Result < T , DecoderError > ;
258
258
259
- fn escape_str ( s : & str ) -> String {
260
- let mut escaped = String :: from_str ( "\" " ) ;
261
- for c in s. chars ( ) {
262
- match c {
263
- '"' => escaped. push_str ( "\\ \" " ) ,
264
- '\\' => escaped. push_str ( "\\ \\ " ) ,
265
- '\x08' => escaped. push_str ( "\\ b" ) ,
266
- '\x0c' => escaped. push_str ( "\\ f" ) ,
267
- '\n' => escaped. push_str ( "\\ n" ) ,
268
- '\r' => escaped. push_str ( "\\ r" ) ,
269
- '\t' => escaped. push_str ( "\\ t" ) ,
270
- _ => escaped. push_char ( c) ,
271
- }
272
- } ;
273
- escaped. push_char ( '"' ) ;
274
- escaped
259
+ fn escape_bytes ( writer : & mut io:: Writer , s : & [ u8 ] ) -> Result < ( ) , io:: IoError > {
260
+ try!( writer. write_str ( "\" " ) ) ;
261
+ for byte in s. iter ( ) {
262
+ match * byte {
263
+ b'"' => try!( writer. write_str ( "\\ \" " ) ) ,
264
+ b'\\' => try!( writer. write_str ( "\\ \\ " ) ) ,
265
+ b'\x08' => try!( writer. write_str ( "\\ b" ) ) ,
266
+ b'\x0c' => try!( writer. write_str ( "\\ f" ) ) ,
267
+ b'\n' => try!( writer. write_str ( "\\ n" ) ) ,
268
+ b'\r' => try!( writer. write_str ( "\\ r" ) ) ,
269
+ b'\t' => try!( writer. write_str ( "\\ t" ) ) ,
270
+ _ => try!( writer. write_u8 ( * byte) ) ,
271
+ }
272
+ }
273
+ writer. write_str ( "\" " )
274
+ }
275
+
276
+ fn escape_str ( writer : & mut io:: Writer , v : & str ) -> Result < ( ) , io:: IoError > {
277
+ escape_bytes ( writer, v. as_bytes ( ) )
278
+ }
279
+
280
+ fn escape_char ( writer : & mut io:: Writer , v : char ) -> Result < ( ) , io:: IoError > {
281
+ let mut buf = [ 0 , .. 4 ] ;
282
+ v. encode_utf8 ( buf) ;
283
+ escape_bytes ( writer, buf)
284
+ }
285
+
286
+ fn spaces ( writer : & mut io:: Writer , n : uint ) -> Result < ( ) , io:: IoError > {
287
+ for _ in range ( 0 , n) {
288
+ try!( writer. write_str ( " " ) ) ;
289
+ }
290
+ Ok ( ( ) )
275
291
}
276
292
277
293
fn fmt_number_or_null ( v : f64 ) -> String {
@@ -281,10 +297,6 @@ fn fmt_number_or_null(v: f64) -> String {
281
297
}
282
298
}
283
299
284
- fn spaces ( n : uint ) -> String {
285
- String :: from_char ( n, ' ' )
286
- }
287
-
288
300
/// A structure for implementing serialization to JSON.
289
301
pub struct Encoder < ' a > {
290
302
writer : & ' a mut io:: Writer ,
@@ -348,10 +360,10 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
348
360
fn emit_f32 ( & mut self , v : f32 ) -> EncodeResult { self . emit_f64 ( v as f64 ) }
349
361
350
362
fn emit_char ( & mut self , v : char ) -> EncodeResult {
351
- self . emit_str ( str :: from_char ( v ) . as_slice ( ) )
363
+ escape_char ( self . writer , v )
352
364
}
353
365
fn emit_str ( & mut self , v : & str ) -> EncodeResult {
354
- write ! ( self . writer, "{}" , escape_str ( v ) )
366
+ escape_str ( self . writer , v )
355
367
}
356
368
357
369
fn emit_enum ( & mut self , _name : & str , f: |& mut Encoder < ' a > | -> EncodeResult ) -> EncodeResult {
@@ -367,10 +379,10 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
367
379
// Bunny => "Bunny"
368
380
// Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
369
381
if cnt == 0 {
370
- write ! ( self . writer, "{}" , escape_str ( name) )
382
+ escape_str ( self . writer , name)
371
383
} else {
372
384
try!( write ! ( self . writer, "{{\" variant\" :" ) ) ;
373
- try!( write ! ( self . writer, "{}" , escape_str ( name) ) ) ;
385
+ try!( escape_str ( self . writer , name) ) ;
374
386
try!( write ! ( self . writer, ",\" fields\" :[" ) ) ;
375
387
try!( f ( self ) ) ;
376
388
write ! ( self . writer, "]}}" )
@@ -415,7 +427,8 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
415
427
idx : uint ,
416
428
f: |& mut Encoder < ' a > | -> EncodeResult ) -> EncodeResult {
417
429
if idx != 0 { try!( write ! ( self . writer, "," ) ) ; }
418
- try!( write ! ( self . writer, "{}:" , escape_str( name) ) ) ;
430
+ try!( escape_str ( self . writer , name) ) ;
431
+ try!( write ! ( self . writer, ":" ) ) ;
419
432
f ( self )
420
433
}
421
434
@@ -541,10 +554,10 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
541
554
}
542
555
543
556
fn emit_char ( & mut self , v : char ) -> EncodeResult {
544
- self . emit_str ( str :: from_char ( v ) . as_slice ( ) )
557
+ escape_char ( self . writer , v )
545
558
}
546
559
fn emit_str ( & mut self , v : & str ) -> EncodeResult {
547
- write ! ( self . writer, "{}" , escape_str ( v ) )
560
+ escape_str ( self . writer , v )
548
561
}
549
562
550
563
fn emit_enum ( & mut self ,
@@ -559,14 +572,18 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
559
572
cnt : uint ,
560
573
f: |& mut PrettyEncoder < ' a > | -> EncodeResult ) -> EncodeResult {
561
574
if cnt == 0 {
562
- write ! ( self . writer, "{}" , escape_str ( name) )
575
+ escape_str ( self . writer, name)
563
576
} else {
564
577
self . indent += 2 ;
565
- try!( write ! ( self . writer, "[\n {}{},\n " , spaces( self . indent) ,
566
- escape_str( name) ) ) ;
578
+ try!( write ! ( self . writer, "[\n " ) ) ;
579
+ try!( spaces( self . writer, self . indent) ) ;
580
+ try!( escape_str( self . writer, name) ) ;
581
+ try!( write ! ( self . writer, ",\n " ) ) ;
567
582
try!( f ( self ) ) ;
568
583
self . indent -= 2 ;
569
- write ! ( self . writer, "\n {}]" , spaces( self . indent) )
584
+ try!( write ! ( self . writer, "\n " ) ) ;
585
+ try!( spaces( self . writer, self . indent) ) ;
586
+ write ! ( self . writer, "]" )
570
587
}
571
588
}
572
589
@@ -576,7 +593,7 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
576
593
if idx != 0 {
577
594
try!( write ! ( self . writer, ",\n " ) ) ;
578
595
}
579
- try!( write ! ( self . writer, "{}" , spaces ( self . indent) ) ) ;
596
+ try!( spaces ( self . writer, self . indent) ) ;
580
597
f ( self )
581
598
}
582
599
@@ -607,7 +624,9 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
607
624
self . indent += 2 ;
608
625
try!( f ( self ) ) ;
609
626
self . indent -= 2 ;
610
- write ! ( self . writer, "\n {}}}" , spaces( self . indent) )
627
+ try!( write ! ( self . writer, "\n " ) ) ;
628
+ try!( spaces( self . writer, self . indent) ) ;
629
+ write ! ( self . writer, "}}" )
611
630
}
612
631
}
613
632
@@ -620,7 +639,9 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
620
639
} else {
621
640
try!( write ! ( self . writer, ",\n " ) ) ;
622
641
}
623
- try!( write ! ( self . writer, "{}{}: " , spaces( self . indent) , escape_str( name) ) ) ;
642
+ try!( spaces( self . writer, self . indent) ) ;
643
+ try!( escape_str( self . writer, name) ) ;
644
+ try!( write ! ( self . writer, ": " ) ) ;
624
645
f ( self )
625
646
}
626
647
@@ -665,7 +686,9 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
665
686
self . indent += 2 ;
666
687
try!( f( self ) ) ;
667
688
self . indent -= 2 ;
668
- write ! ( self . writer, "\n {}]" , spaces( self . indent) )
689
+ try!( write ! ( self . writer, "\n " ) ) ;
690
+ try!( spaces( self . writer, self . indent) ) ;
691
+ write ! ( self . writer, "]" )
669
692
}
670
693
}
671
694
@@ -677,7 +700,7 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
677
700
} else {
678
701
try!( write ! ( self . writer, ",\n " ) ) ;
679
702
}
680
- try!( write ! ( self . writer, "{}" , spaces ( self . indent) ) ) ;
703
+ try!( spaces ( self . writer, self . indent) ) ;
681
704
f( self )
682
705
}
683
706
@@ -691,7 +714,9 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
691
714
self . indent += 2 ;
692
715
try!( f( self ) ) ;
693
716
self . indent -= 2 ;
694
- write ! ( self . writer, "\n {}}}" , spaces( self . indent) )
717
+ try!( write ! ( self . writer, "\n " ) ) ;
718
+ try!( spaces( self . writer, self . indent) ) ;
719
+ write ! ( self . writer, "}}" )
695
720
}
696
721
}
697
722
@@ -703,7 +728,7 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
703
728
} else {
704
729
try!( write ! ( self . writer, ",\n " ) ) ;
705
730
}
706
- try!( write ! ( self . writer, "{}" , spaces ( self . indent) ) ) ;
731
+ try!( spaces ( self . writer, self . indent) ) ;
707
732
// ref #12967, make sure to wrap a key in double quotes,
708
733
// in the event that its of a type that omits them (eg numbers)
709
734
let mut buf = MemWriter :: new( ) ;
0 commit comments