Skip to content

Commit a61366c

Browse files
committed
0.7.1 codegen is now blazing fast
1 parent 8c228e8 commit a61366c

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

src/codegen.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,48 @@ pub trait Generator {
3434
self.write_char(b'"');
3535
}
3636

37+
fn write_digits_from_u64(&mut self, mut num: u64, length: &mut u8) {
38+
let digit = (num % 10) as u8;
39+
num /= 10;
40+
if num > 0 {
41+
self.write_digits_from_u64(num, length);
42+
}
43+
*length += 1;
44+
self.write_char(digit + b'0');
45+
}
46+
47+
fn write_number(&mut self, mut num: f64) {
48+
let mut length = 0;
49+
if num < 0.0 {
50+
num = -num;
51+
self.write_char(b'-');
52+
}
53+
54+
self.write_digits_from_u64(num as u64, &mut length);
55+
56+
let mut fract = num.fract();
57+
if fract < 1e-10 {
58+
return;
59+
}
60+
61+
fract *= 10.0;
62+
self.write_char(b'.');
63+
self.write_char((fract as u8) + b'0');
64+
fract = fract.fract();
65+
length += 2;
66+
67+
while length < 17 && fract > 0.01 {
68+
fract *= 10.0;
69+
self.write_char((fract as u8) + b'0');
70+
fract = fract.fract();
71+
length += 1;
72+
}
73+
}
74+
3775
fn write_json(&mut self, json: &JsonValue) {
3876
match *json {
3977
JsonValue::String(ref string) => self.write_string(string),
40-
JsonValue::Number(ref number) => self.write(number.to_string().as_bytes()),
78+
JsonValue::Number(ref number) => self.write_number(*number),
4179
JsonValue::Boolean(ref value) => self.write(if *value { b"true" } else { b"false" }),
4280
JsonValue::Null => self.write(b"null"),
4381
JsonValue::Array(ref array) => {

src/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ impl<'a> Tokenizer<'a> {
150150
Some(b'.') | Some(b'e') | Some(b'E') => {},
151151
_ => {
152152
return if first == b'-' {
153-
Ok((num as f64) * -1.0)
153+
Ok(-(num as f64))
154154
} else {
155155
Ok(num as f64)
156156
};

tests/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ fn stringify_string() {
111111

112112
#[test]
113113
fn stringify_number() {
114-
assert_eq!(stringify(3.14), "3.14");
114+
assert_eq!(stringify(3.141592653589793), "3.141592653589793");
115115
}
116116

117117
#[test]
@@ -283,7 +283,7 @@ fn parse_null() {
283283

284284
#[test]
285285
fn parse_number() {
286-
assert_eq!(parse("3.14").unwrap(), 3.14);
286+
assert_eq!(parse("3.141592653589793").unwrap(), 3.141592653589793);
287287
}
288288

289289
#[test]

0 commit comments

Comments
 (0)