Skip to content

Commit 577f742

Browse files
committed
serialize: Avoid stray nul characters when auto-serializing char.
Fixes #19719.
1 parent 193390d commit 577f742

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

src/libserialize/json.rs

+28-26
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,8 @@ fn escape_str(writer: &mut io::Writer, v: &str) -> Result<(), io::IoError> {
367367

368368
fn escape_char(writer: &mut io::Writer, v: char) -> Result<(), io::IoError> {
369369
let mut buf = [0, .. 4];
370-
v.encode_utf8(&mut buf);
371-
escape_bytes(writer, &mut buf)
370+
let len = v.encode_utf8(&mut buf).unwrap();
371+
escape_bytes(writer, buf[mut ..len])
372372
}
373373

374374
fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
@@ -2694,37 +2694,39 @@ mod tests {
26942694
);
26952695
}
26962696

2697+
macro_rules! check_encoder_for_simple(
2698+
($value:expr, $expected:expr) => ({
2699+
let s = with_str_writer(|writer| {
2700+
let mut encoder = Encoder::new(writer);
2701+
$value.encode(&mut encoder).unwrap();
2702+
});
2703+
assert_eq!(s, $expected);
2704+
2705+
let s = with_str_writer(|writer| {
2706+
let mut encoder = PrettyEncoder::new(writer);
2707+
$value.encode(&mut encoder).unwrap();
2708+
});
2709+
assert_eq!(s, $expected);
2710+
})
2711+
)
2712+
26972713
#[test]
26982714
fn test_write_some() {
2699-
let value = Some("jodhpurs".into_string());
2700-
let s = with_str_writer(|writer| {
2701-
let mut encoder = Encoder::new(writer);
2702-
value.encode(&mut encoder).unwrap();
2703-
});
2704-
assert_eq!(s, "\"jodhpurs\"");
2705-
2706-
let value = Some("jodhpurs".into_string());
2707-
let s = with_str_writer(|writer| {
2708-
let mut encoder = PrettyEncoder::new(writer);
2709-
value.encode(&mut encoder).unwrap();
2710-
});
2711-
assert_eq!(s, "\"jodhpurs\"");
2715+
check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
27122716
}
27132717

27142718
#[test]
27152719
fn test_write_none() {
2716-
let value: Option<string::String> = None;
2717-
let s = with_str_writer(|writer| {
2718-
let mut encoder = Encoder::new(writer);
2719-
value.encode(&mut encoder).unwrap();
2720-
});
2721-
assert_eq!(s, "null");
2720+
check_encoder_for_simple!(None::<string::String>, "null");
2721+
}
27222722

2723-
let s = with_str_writer(|writer| {
2724-
let mut encoder = Encoder::new(writer);
2725-
value.encode(&mut encoder).unwrap();
2726-
});
2727-
assert_eq!(s, "null");
2723+
#[test]
2724+
fn test_write_char() {
2725+
check_encoder_for_simple!('a', "\"a\"");
2726+
check_encoder_for_simple!('\t', "\"\\t\"");
2727+
check_encoder_for_simple!('\u00a0', "\"\u00a0\"");
2728+
check_encoder_for_simple!('\uabcd', "\"\uabcd\"");
2729+
check_encoder_for_simple!('\U0010ffff', "\"\U0010ffff\"");
27282730
}
27292731

27302732
#[test]

0 commit comments

Comments
 (0)