@@ -41,7 +41,7 @@ pub trait Generator {
4141 self . get_buffer ( ) . push ( ch)
4242 }
4343
44- fn write_min ( & mut self , slice : & [ u8 ] , minslice : & [ u8 ] ) ;
44+ fn write_min ( & mut self , slice : & [ u8 ] , min : u8 ) ;
4545
4646 fn new_line ( & mut self ) { }
4747
@@ -76,42 +76,33 @@ pub trait Generator {
7676 self . write_char ( b'"' ) ;
7777 }
7878
79- fn write_number ( & mut self , mut num : f64 ) {
79+ fn write_number ( & mut self , num : f64 ) {
8080 match num. classify ( ) {
81- FpCategory :: Nan |
82- FpCategory :: Infinite => {
83- self . write ( b"null" ) ;
84- return ;
81+ FpCategory :: Normal |
82+ FpCategory :: Subnormal => {
83+ if num. fract ( ) == 0.0 && num < 1e19 {
84+ itoa:: write ( self . get_buffer ( ) , num as i64 ) . unwrap ( ) ;
85+ } else {
86+ let abs = num. abs ( ) ;
87+ if abs < 1e-15 || abs > 1e19 {
88+ write ! ( self . get_buffer( ) , "{:e}" , num) . unwrap ( ) ;
89+ } else {
90+ write ! ( self . get_buffer( ) , "{}" , num) . unwrap ( ) ;
91+ }
92+ }
8593 } ,
8694 FpCategory :: Zero => {
87- self . write ( if num. is_sign_negative ( ) { b"-0" } else { b"0" } ) ;
88- return ;
95+ if num. is_sign_negative ( ) {
96+ self . write ( b"-0" ) ;
97+ } else {
98+ self . write_char ( b'0' ) ;
99+ }
89100 } ,
90- _ => { } ,
91- }
92-
93- if num. is_sign_negative ( ) {
94- num = num. abs ( ) ;
95- self . write_char ( b'-' ) ;
96- }
97-
98- let fract = num. fract ( ) ;
99-
100- if fract > 0.0 {
101- if num < 1e-15 {
102- write ! ( self . get_buffer( ) , "{:e}" , num) . unwrap ( ) ;
103- } else {
104- write ! ( self . get_buffer( ) , "{}" , num) . unwrap ( ) ;
101+ FpCategory :: Nan |
102+ FpCategory :: Infinite => {
103+ self . write ( b"null" ) ;
105104 }
106- return ;
107- }
108-
109- if num > 1e19 {
110- write ! ( self . get_buffer( ) , "{:e}" , num) . unwrap ( ) ;
111- return ;
112105 }
113-
114- itoa:: write ( self . get_buffer ( ) , num as u64 ) . unwrap ( ) ;
115106 }
116107
117108 fn write_json ( & mut self , json : & JsonValue ) {
@@ -130,7 +121,7 @@ pub trait Generator {
130121 first = false ;
131122 self . new_line ( ) ;
132123 } else {
133- self . write ( b"," ) ;
124+ self . write_char ( b',' ) ;
134125 self . new_line ( ) ;
135126 }
136127 self . write_json ( item) ;
@@ -148,11 +139,11 @@ pub trait Generator {
148139 first = false ;
149140 self . new_line ( ) ;
150141 } else {
151- self . write ( b"," ) ;
142+ self . write_char ( b',' ) ;
152143 self . new_line ( ) ;
153144 }
154145 self . write_string ( key) ;
155- self . write_min ( b": " , b":" ) ;
146+ self . write_min ( b": " , b':' ) ;
156147 self . write_json ( value) ;
157148 }
158149 self . dedent ( ) ;
@@ -184,8 +175,8 @@ impl Generator for DumpGenerator {
184175 }
185176
186177 #[ inline( always) ]
187- fn write_min ( & mut self , _: & [ u8 ] , minslice : & [ u8 ] ) {
188- self . code . extend_from_slice ( minslice ) ;
178+ fn write_min ( & mut self , _: & [ u8 ] , min : u8 ) {
179+ self . code . push ( min ) ;
189180 }
190181
191182 fn consume ( self ) -> String {
@@ -216,7 +207,7 @@ impl Generator for PrettyGenerator {
216207 }
217208
218209 #[ inline( always) ]
219- fn write_min ( & mut self , slice : & [ u8 ] , _: & [ u8 ] ) {
210+ fn write_min ( & mut self , slice : & [ u8 ] , _: u8 ) {
220211 self . code . extend_from_slice ( slice) ;
221212 }
222213
0 commit comments