Skip to content

Commit b15f3da

Browse files
committed
0.8.5 include jsonchecker tests, fail on whitespace in strings
1 parent 9173efd commit b15f3da

File tree

3 files changed

+977
-689
lines changed

3 files changed

+977
-689
lines changed

src/codegen.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use JsonValue;
44

55
extern crate itoa;
66

7-
const _Q: u8 = b'"';
8-
const _S: u8 = b'\\';
7+
const QU: u8 = b'"';
8+
const BS: u8 = b'\\';
99
const B: u8 = b'b';
1010
const T: u8 = b't';
1111
const N: u8 = b'n';
@@ -17,10 +17,10 @@ static ESCAPED: [u8; 256] = [
1717
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
1818
U, U, U, U, U, U, U, U, B, T, N, U, F, R, U, U, // 0
1919
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, // 1
20-
0, 0, _Q, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2
20+
0, 0, QU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2
2121
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3
2222
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4
23-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _S, 0, 0, 0, // 5
23+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BS, 0, 0, 0, // 5
2424
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6
2525
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U, // 7
2626
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8
@@ -45,7 +45,7 @@ pub trait Generator {
4545

4646
#[inline(always)]
4747
fn write_char(&mut self, ch: u8) {
48-
self.get_writer().write(&[ch]).unwrap();
48+
self.get_writer().write_all(&[ch]).unwrap();
4949
}
5050

5151
fn write_min(&mut self, slice: &[u8], min: u8);
@@ -284,6 +284,6 @@ impl<'a, W> Generator for WriterGenerator<'a, W> where W: Write {
284284

285285
#[inline(always)]
286286
fn write_min(&mut self, _: &[u8], min: u8) {
287-
self.writer.write(&[min]).unwrap();
287+
self.writer.write_all(&[min]).unwrap();
288288
}
289289
}

src/parser.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,21 +103,51 @@ macro_rules! expect {
103103
})
104104
}
105105

106+
const QU: u8 = 1; // quote
107+
const BS: u8 = 2; // backslash
108+
const CT: u8 = 4; // control character
109+
110+
static CHARCODES: [u8; 256] = [
111+
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
112+
CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 0
113+
CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 1
114+
0, 0, QU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2
115+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3
116+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4
117+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BS, 0, 0, 0, // 5
118+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6
119+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CT, // 7
120+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8
121+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9
122+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A
123+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B
124+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C
125+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D
126+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E
127+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // F
128+
];
129+
106130
macro_rules! expect_string {
107131
($parser:ident) => ({
108132
let result: String;// = unsafe { mem::uninitialized() };
109133
let start = $parser.index;
110134

111135
loop {
112136
let ch = next_byte!($parser);
137+
let code = CHARCODES[ch as usize];
138+
if code == 0 {
139+
continue;
140+
}
113141
if ch == b'"' {
114142
result = (&$parser.source[start .. $parser.index - 1]).into();
115143
break;
116-
};
144+
}
117145
if ch == b'\\' {
118146
result = try!($parser.read_complex_string(start));
119147
break;
120148
}
149+
150+
return $parser.unexpected_character(ch);
121151
}
122152

123153
result
@@ -351,6 +381,12 @@ impl<'a> Parser<'a> {
351381
buffer.extend_from_slice(self.source[start .. self.index - 1].as_bytes());
352382

353383
loop {
384+
let code = CHARCODES[ch as usize];
385+
if code == 0 {
386+
buffer.push(ch);
387+
ch = next_byte!(self);
388+
continue;
389+
}
354390
match ch {
355391
b'"' => break,
356392
b'\\' => {
@@ -373,7 +409,7 @@ impl<'a> Parser<'a> {
373409
};
374410
buffer.push(escaped);
375411
},
376-
_ => buffer.push(ch)
412+
_ => return self.unexpected_character(ch)
377413
}
378414
ch = next_byte!(self);
379415
}

0 commit comments

Comments
 (0)