8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use leb128:: { read_signed_leb128 , read_unsigned_leb128 , write_signed_leb128, write_unsigned_leb128 } ;
11
+ use leb128:: { self , read_signed_leb128 , write_signed_leb128} ;
12
12
use std:: borrow:: Cow ;
13
13
use std:: io:: { self , Write } ;
14
14
use serialize;
@@ -31,9 +31,9 @@ impl<'a> Encoder<'a> {
31
31
32
32
33
33
macro_rules! write_uleb128 {
34
- ( $enc: expr, $value: expr) => { {
34
+ ( $enc: expr, $value: expr, $fun : ident ) => { {
35
35
let pos = $enc. cursor. position( ) as usize ;
36
- let bytes_written = write_unsigned_leb128 ( $enc. cursor. get_mut( ) , pos, $value as u128 ) ;
36
+ let bytes_written = leb128 :: $fun ( $enc. cursor. get_mut( ) , pos, $value) ;
37
37
$enc. cursor. set_position( ( pos + bytes_written) as u64 ) ;
38
38
Ok ( ( ) )
39
39
} }
@@ -51,61 +51,76 @@ macro_rules! write_sleb128 {
51
51
impl < ' a > serialize:: Encoder for Encoder < ' a > {
52
52
type Error = io:: Error ;
53
53
54
+ #[ inline]
54
55
fn emit_nil ( & mut self ) -> EncodeResult {
55
56
Ok ( ( ) )
56
57
}
57
58
59
+ #[ inline]
58
60
fn emit_usize ( & mut self , v : usize ) -> EncodeResult {
59
- write_uleb128 ! ( self , v)
61
+ write_uleb128 ! ( self , v, write_usize_leb128 )
60
62
}
61
63
64
+ #[ inline]
62
65
fn emit_u128 ( & mut self , v : u128 ) -> EncodeResult {
63
- write_uleb128 ! ( self , v)
66
+ write_uleb128 ! ( self , v, write_u128_leb128 )
64
67
}
65
68
69
+ #[ inline]
66
70
fn emit_u64 ( & mut self , v : u64 ) -> EncodeResult {
67
- write_uleb128 ! ( self , v)
71
+ write_uleb128 ! ( self , v, write_u64_leb128 )
68
72
}
69
73
74
+ #[ inline]
70
75
fn emit_u32 ( & mut self , v : u32 ) -> EncodeResult {
71
- write_uleb128 ! ( self , v)
76
+ write_uleb128 ! ( self , v, write_u32_leb128 )
72
77
}
73
78
79
+ #[ inline]
74
80
fn emit_u16 ( & mut self , v : u16 ) -> EncodeResult {
75
- write_uleb128 ! ( self , v)
81
+ write_uleb128 ! ( self , v, write_u16_leb128 )
76
82
}
77
83
84
+ #[ inline]
78
85
fn emit_u8 ( & mut self , v : u8 ) -> EncodeResult {
79
- let _ = self . cursor . write_all ( & [ v] ) ;
86
+ let pos = self . cursor . position ( ) as usize ;
87
+ leb128:: write_to_vec ( self . cursor . get_mut ( ) , pos, v) ;
88
+ self . cursor . set_position ( ( pos + 1 ) as u64 ) ;
80
89
Ok ( ( ) )
81
90
}
82
91
92
+ #[ inline]
83
93
fn emit_isize ( & mut self , v : isize ) -> EncodeResult {
84
94
write_sleb128 ! ( self , v)
85
95
}
86
96
97
+ #[ inline]
87
98
fn emit_i128 ( & mut self , v : i128 ) -> EncodeResult {
88
99
write_sleb128 ! ( self , v)
89
100
}
90
101
102
+ #[ inline]
91
103
fn emit_i64 ( & mut self , v : i64 ) -> EncodeResult {
92
104
write_sleb128 ! ( self , v)
93
105
}
94
106
107
+ #[ inline]
95
108
fn emit_i32 ( & mut self , v : i32 ) -> EncodeResult {
96
109
write_sleb128 ! ( self , v)
97
110
}
98
111
112
+ #[ inline]
99
113
fn emit_i16 ( & mut self , v : i16 ) -> EncodeResult {
100
114
write_sleb128 ! ( self , v)
101
115
}
102
116
117
+ #[ inline]
103
118
fn emit_i8 ( & mut self , v : i8 ) -> EncodeResult {
104
119
let as_u8: u8 = unsafe { :: std:: mem:: transmute ( v) } ;
105
- let _ = self . cursor . write_all ( & [ as_u8] ) ;
106
- Ok ( ( ) )
120
+ self . emit_u8 ( as_u8)
107
121
}
108
122
123
+ #[ inline]
109
124
fn emit_bool ( & mut self , v : bool ) -> EncodeResult {
110
125
self . emit_u8 ( if v {
111
126
1
@@ -114,20 +129,24 @@ impl<'a> serialize::Encoder for Encoder<'a> {
114
129
} )
115
130
}
116
131
132
+ #[ inline]
117
133
fn emit_f64 ( & mut self , v : f64 ) -> EncodeResult {
118
134
let as_u64: u64 = unsafe { :: std:: mem:: transmute ( v) } ;
119
135
self . emit_u64 ( as_u64)
120
136
}
121
137
138
+ #[ inline]
122
139
fn emit_f32 ( & mut self , v : f32 ) -> EncodeResult {
123
140
let as_u32: u32 = unsafe { :: std:: mem:: transmute ( v) } ;
124
141
self . emit_u32 ( as_u32)
125
142
}
126
143
144
+ #[ inline]
127
145
fn emit_char ( & mut self , v : char ) -> EncodeResult {
128
146
self . emit_u32 ( v as u32 )
129
147
}
130
148
149
+ #[ inline]
131
150
fn emit_str ( & mut self , v : & str ) -> EncodeResult {
132
151
self . emit_usize ( v. len ( ) ) ?;
133
152
let _ = self . cursor . write_all ( v. as_bytes ( ) ) ;
@@ -136,6 +155,7 @@ impl<'a> serialize::Encoder for Encoder<'a> {
136
155
}
137
156
138
157
impl < ' a > Encoder < ' a > {
158
+ #[ inline]
139
159
pub fn position ( & self ) -> usize {
140
160
self . cursor . position ( ) as usize
141
161
}
@@ -158,24 +178,27 @@ impl<'a> Decoder<'a> {
158
178
}
159
179
}
160
180
181
+ #[ inline]
161
182
pub fn position ( & self ) -> usize {
162
183
self . position
163
184
}
164
185
186
+ #[ inline]
165
187
pub fn set_position ( & mut self , pos : usize ) {
166
188
self . position = pos
167
189
}
168
190
191
+ #[ inline]
169
192
pub fn advance ( & mut self , bytes : usize ) {
170
193
self . position += bytes;
171
194
}
172
195
}
173
196
174
197
macro_rules! read_uleb128 {
175
- ( $dec: expr, $t: ty) => ( {
176
- let ( value, bytes_read) = read_unsigned_leb128 ( $dec. data, $dec. position) ;
198
+ ( $dec: expr, $t: ty, $fun : ident ) => ( {
199
+ let ( value, bytes_read) = leb128 :: $fun ( & $dec. data[ $dec. position .. ] ) ;
177
200
$dec. position += bytes_read;
178
- Ok ( value as $t )
201
+ Ok ( value)
179
202
} )
180
203
}
181
204
@@ -198,22 +221,22 @@ impl<'a> serialize::Decoder for Decoder<'a> {
198
221
199
222
#[ inline]
200
223
fn read_u128 ( & mut self ) -> Result < u128 , Self :: Error > {
201
- read_uleb128 ! ( self , u128 )
224
+ read_uleb128 ! ( self , u128 , read_u128_leb128 )
202
225
}
203
226
204
227
#[ inline]
205
228
fn read_u64 ( & mut self ) -> Result < u64 , Self :: Error > {
206
- read_uleb128 ! ( self , u64 )
229
+ read_uleb128 ! ( self , u64 , read_u64_leb128 )
207
230
}
208
231
209
232
#[ inline]
210
233
fn read_u32 ( & mut self ) -> Result < u32 , Self :: Error > {
211
- read_uleb128 ! ( self , u32 )
234
+ read_uleb128 ! ( self , u32 , read_u32_leb128 )
212
235
}
213
236
214
237
#[ inline]
215
238
fn read_u16 ( & mut self ) -> Result < u16 , Self :: Error > {
216
- read_uleb128 ! ( self , u16 )
239
+ read_uleb128 ! ( self , u16 , read_u16_leb128 )
217
240
}
218
241
219
242
#[ inline]
@@ -225,7 +248,7 @@ impl<'a> serialize::Decoder for Decoder<'a> {
225
248
226
249
#[ inline]
227
250
fn read_usize ( & mut self ) -> Result < usize , Self :: Error > {
228
- read_uleb128 ! ( self , usize )
251
+ read_uleb128 ! ( self , usize , read_usize_leb128 )
229
252
}
230
253
231
254
#[ inline]
0 commit comments