Skip to content

Commit 8c228e8

Browse files
committed
0.7.1 codegen time sliced in half
1 parent 77307ce commit 8c228e8

File tree

1 file changed

+54
-52
lines changed

1 file changed

+54
-52
lines changed

src/codegen.rs

Lines changed: 54 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,78 +3,80 @@ use JsonValue;
33
pub trait Generator {
44
fn new_line(&mut self) {}
55

6-
fn write(&mut self, slice: &str);
6+
fn write(&mut self, slice: &[u8]);
77

8-
fn write_min(&mut self, slice: &str, minslice: &str);
8+
fn write_min(&mut self, slice: &[u8], minslice: &[u8]);
99

10-
fn write_char(&mut self, ch: char);
10+
fn write_char(&mut self, ch: u8);
1111

1212
fn indent(&mut self) {}
1313

1414
fn dedent(&mut self) {}
1515

16+
fn write_string(&mut self, string: &str) {
17+
self.write_char(b'"');
18+
19+
for ch in string.bytes() {
20+
match ch {
21+
b'\\' | b'"' => {
22+
self.write_char(b'\\');
23+
self.write_char(ch);
24+
},
25+
b'\n' => self.write(b"\\n"),
26+
b'\r' => self.write(b"\\r"),
27+
b'\t' => self.write(b"\\t"),
28+
0xC => self.write(b"\\f"),
29+
0x8 => self.write(b"\\b"),
30+
_ => self.write_char(ch)
31+
}
32+
}
33+
34+
self.write_char(b'"');
35+
}
36+
1637
fn write_json(&mut self, json: &JsonValue) {
1738
match *json {
18-
JsonValue::String(ref string) => {
19-
self.write_char('"');
20-
21-
for ch in string.chars() {
22-
match ch {
23-
'\\' | '"' => {
24-
self.write_char('\\');
25-
self.write_char(ch);
26-
},
27-
'\n' => self.write("\\n"),
28-
'\r' => self.write("\\r"),
29-
'\t' => self.write("\\t"),
30-
'\u{000C}' => self.write("\\f"),
31-
'\u{0008}' => self.write("\\b"),
32-
_ => self.write_char(ch)
33-
}
34-
}
35-
36-
self.write_char('"');
37-
},
38-
JsonValue::Number(ref number) => self.write(&number.to_string()),
39-
JsonValue::Boolean(ref value) => self.write(if *value { "true" } else { "false" }),
40-
JsonValue::Null => self.write("null"),
39+
JsonValue::String(ref string) => self.write_string(string),
40+
JsonValue::Number(ref number) => self.write(number.to_string().as_bytes()),
41+
JsonValue::Boolean(ref value) => self.write(if *value { b"true" } else { b"false" }),
42+
JsonValue::Null => self.write(b"null"),
4143
JsonValue::Array(ref array) => {
42-
self.write_char('[');
44+
self.write_char(b'[');
4345
self.indent();
4446
let mut first = true;
4547
for item in array {
4648
if first {
4749
first = false;
4850
self.new_line();
4951
} else {
50-
self.write(",");
52+
self.write(b",");
5153
self.new_line();
5254
}
5355
self.write_json(item);
5456
}
5557
self.dedent();
5658
self.new_line();
57-
self.write_char(']');
59+
self.write_char(b']');
5860
},
5961
JsonValue::Object(ref object) => {
60-
self.write_char('{');
62+
self.write_char(b'{');
6163
self.indent();
6264
let mut first = true;
6365
for (key, value) in object.iter() {
6466
if first {
6567
first = false;
6668
self.new_line();
6769
} else {
68-
self.write(",");
70+
self.write(b",");
6971
self.new_line();
7072
}
71-
self.write(&format!("{:?}", key));
72-
self.write_min(": ", ":");
73+
self.write_string(key);
74+
self.write_min(b": ", b":");
7375
self.write_json(value);
7476
}
7577
self.dedent();
7678
self.new_line();
77-
self.write_char('}');
79+
self.write_char(b'}');
7880
}
7981
}
8082
}
@@ -83,45 +85,45 @@ pub trait Generator {
8385
}
8486

8587
pub struct DumpGenerator {
86-
code: String,
88+
code: Vec<u8>,
8789
}
8890

8991
impl DumpGenerator {
9092
pub fn new() -> Self {
9193
DumpGenerator {
92-
code: String::with_capacity(1024),
94+
code: Vec::with_capacity(1024),
9395
}
9496
}
9597
}
9698

9799
impl Generator for DumpGenerator {
98-
fn write(&mut self, slice: &str) {
99-
self.code.push_str(slice);
100+
fn write(&mut self, slice: &[u8]) {
101+
self.code.extend_from_slice(slice);
100102
}
101103

102-
fn write_min(&mut self, _: &str, minslice: &str) {
103-
self.write(minslice);
104+
fn write_min(&mut self, _: &[u8], minslice: &[u8]) {
105+
self.code.extend_from_slice(minslice);
104106
}
105107

106-
fn write_char(&mut self, ch: char) {
108+
fn write_char(&mut self, ch: u8) {
107109
self.code.push(ch);
108110
}
109111

110112
fn consume(self) -> String {
111-
self.code
113+
String::from_utf8(self.code).unwrap()
112114
}
113115
}
114116

115117
pub struct PrettyGenerator {
116-
code: String,
118+
code: Vec<u8>,
117119
dent: u16,
118120
spaces_per_indent: u16,
119121
}
120122

121123
impl PrettyGenerator {
122124
pub fn new(spaces: u16) -> Self {
123125
PrettyGenerator {
124-
code: String::with_capacity(1024),
126+
code: Vec::with_capacity(1024),
125127
dent: 0,
126128
spaces_per_indent: spaces
127129
}
@@ -130,21 +132,21 @@ impl PrettyGenerator {
130132

131133
impl Generator for PrettyGenerator {
132134
fn new_line(&mut self) {
133-
self.code.push('\n');
135+
self.code.push(b'\n');
134136
for _ in 0..(self.dent * self.spaces_per_indent) {
135-
self.code.push(' ');
137+
self.code.push(b' ');
136138
}
137139
}
138140

139-
fn write(&mut self, slice: &str) {
140-
self.code.push_str(slice);
141+
fn write(&mut self, slice: &[u8]) {
142+
self.code.extend_from_slice(slice);
141143
}
142144

143-
fn write_min(&mut self, slice: &str, _: &str) {
144-
self.write(slice);
145+
fn write_min(&mut self, slice: &[u8], _: &[u8]) {
146+
self.code.extend_from_slice(slice);
145147
}
146148

147-
fn write_char(&mut self, ch: char) {
149+
fn write_char(&mut self, ch: u8) {
148150
self.code.push(ch);
149151
}
150152

@@ -157,6 +159,6 @@ impl Generator for PrettyGenerator {
157159
}
158160

159161
fn consume(self) -> String {
160-
self.code
162+
String::from_utf8(self.code).unwrap()
161163
}
162164
}

0 commit comments

Comments
 (0)