@@ -48,7 +48,8 @@ impl<'a, 'de, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::Deser
48
48
where
49
49
V : Visitor < ' de > ,
50
50
{
51
- visitor. visit_map ( BinaryReaderMap :: new ( self , true ) )
51
+ let me = std:: ptr:: addr_of!( self ) ;
52
+ visitor. visit_map ( BinaryReaderMap :: new ( me, true ) )
52
53
}
53
54
54
55
fn deserialize_struct < V > (
@@ -71,12 +72,12 @@ impl<'a, 'de, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::Deser
71
72
}
72
73
73
74
struct BinaryReaderMap < ' a : ' a , ' res , RES : ' a , F , R > {
74
- de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
75
+ de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
75
76
root : bool ,
76
77
}
77
78
78
79
impl < ' a , ' res , RES : ' a , F , R > BinaryReaderMap < ' a , ' res , RES , F , R > {
79
- fn new ( de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > , root : bool ) -> Self {
80
+ fn new ( de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > , root : bool ) -> Self {
80
81
BinaryReaderMap { de, root }
81
82
}
82
83
}
@@ -91,20 +92,23 @@ impl<'de, 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> MapAccess
91
92
where
92
93
K : DeserializeSeed < ' de > ,
93
94
{
94
- let de = unsafe { & mut * ( self . de as * mut _ ) } ;
95
95
loop {
96
- match self . de . reader . next ( ) {
96
+ match unsafe { self . de . read ( ) } . reader . next ( ) {
97
97
Ok ( Some ( Token :: Close ) ) => return Ok ( None ) ,
98
98
Ok ( Some ( Token :: Open ) ) => {
99
- let _ = self . de . reader . read ( ) ;
99
+ let _ = unsafe { self . de . read ( ) } . reader . read ( ) ;
100
100
}
101
101
Ok ( Some ( token) ) => {
102
102
return seed
103
- . deserialize ( BinaryReaderTokenDeserializer { de, token } )
103
+ . deserialize ( BinaryReaderTokenDeserializer { de : self . de , token } )
104
104
. map ( Some )
105
105
}
106
106
Ok ( None ) if self . root => return Ok ( None ) ,
107
- Ok ( None ) => return Err ( LexError :: Eof . at ( self . de . reader . position ( ) ) . into ( ) ) ,
107
+ Ok ( None ) => {
108
+ return Err ( LexError :: Eof
109
+ . at ( unsafe { self . de . read ( ) } . reader . position ( ) )
110
+ . into ( ) )
111
+ }
108
112
Err ( e) => return Err ( e. into ( ) ) ,
109
113
}
110
114
}
@@ -115,18 +119,17 @@ impl<'de, 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> MapAccess
115
119
where
116
120
V : DeserializeSeed < ' de > ,
117
121
{
118
- let de = unsafe { & mut * ( self . de as * mut _ ) } ;
119
- let mut token = self . de . reader . read ( ) ?;
122
+ let mut token = unsafe { self . de . read ( ) } . reader . read ( ) ?;
120
123
if matches ! ( token, Token :: Equal ) {
121
- token = self . de . reader . read ( ) ?;
124
+ token = unsafe { self . de . read ( ) } . reader . read ( ) ?;
122
125
}
123
126
124
- seed. deserialize ( BinaryReaderTokenDeserializer { de, token } )
127
+ seed. deserialize ( BinaryReaderTokenDeserializer { de : self . de , token } )
125
128
}
126
129
}
127
130
128
131
struct BinaryReaderTokenDeserializer < ' a , ' res , RES : ' a , F , R > {
129
- de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
132
+ de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
130
133
token : Token < ' a > ,
131
134
}
132
135
@@ -148,18 +151,22 @@ where
148
151
Token :: I32 ( x) => visitor. visit_i32 ( x) ,
149
152
Token :: Bool ( x) => visitor. visit_bool ( x) ,
150
153
Token :: Quoted ( x) | Token :: Unquoted ( x) => {
151
- match self . de . config . flavor . decode ( x. as_bytes ( ) ) {
154
+ match unsafe { self . de . read ( ) } . config . flavor . decode ( x. as_bytes ( ) ) {
152
155
Cow :: Borrowed ( x) => visitor. visit_str ( x) ,
153
156
Cow :: Owned ( x) => visitor. visit_string ( x) ,
154
157
}
155
158
}
156
- Token :: F32 ( x) => visitor. visit_f32 ( self . de . config . flavor . visit_f32 ( x) ) ,
157
- Token :: F64 ( x) => visitor. visit_f64 ( self . de . config . flavor . visit_f64 ( x) ) ,
159
+ Token :: F32 ( x) => {
160
+ visitor. visit_f32 ( unsafe { self . de . read ( ) } . config . flavor . visit_f32 ( x) )
161
+ }
162
+ Token :: F64 ( x) => {
163
+ visitor. visit_f64 ( unsafe { self . de . read ( ) } . config . flavor . visit_f64 ( x) )
164
+ }
158
165
Token :: Rgb ( x) => visitor. visit_seq ( ColorSequence :: new ( x) ) ,
159
166
Token :: I64 ( x) => visitor. visit_i64 ( x) ,
160
- Token :: Id ( s) => match self . de . config . resolver . resolve ( s) {
167
+ Token :: Id ( s) => match unsafe { self . de . read ( ) } . config . resolver . resolve ( s) {
161
168
Some ( id) => visitor. visit_borrowed_str ( id) ,
162
- None => match self . de . config . failed_resolve_strategy {
169
+ None => match unsafe { self . de . read ( ) } . config . failed_resolve_strategy {
163
170
FailedResolveStrategy :: Error => Err ( Error :: from ( DeserializeError {
164
171
kind : DeserializeErrorKind :: UnknownToken { token_id : s } ,
165
172
} ) ) ,
@@ -171,11 +178,11 @@ where
171
178
} ,
172
179
Token :: Close => Err ( Error :: invalid_syntax (
173
180
"did not expect end" ,
174
- self . de . reader . position ( ) ,
181
+ unsafe { self . de . read ( ) } . reader . position ( ) ,
175
182
) ) ,
176
183
Token :: Equal => Err ( Error :: invalid_syntax (
177
184
"did not expect equal" ,
178
- self . de . reader . position ( ) ,
185
+ unsafe { self . de . read ( ) } . reader . position ( ) ,
179
186
) ) ,
180
187
Token :: Open => visitor. visit_seq ( BinaryReaderSeq :: new ( self . de ) ) ,
181
188
}
@@ -286,7 +293,7 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::D
286
293
V : Visitor < ' de > ,
287
294
{
288
295
if let Token :: F32 ( x) = & self . token {
289
- visitor. visit_f32 ( self . de . config . flavor . visit_f32 ( * x) )
296
+ visitor. visit_f32 ( unsafe { self . de . read ( ) } . config . flavor . visit_f32 ( * x) )
290
297
} else {
291
298
self . deser ( visitor)
292
299
}
@@ -298,7 +305,7 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::D
298
305
V : Visitor < ' de > ,
299
306
{
300
307
if let Token :: F64 ( x) = & self . token {
301
- visitor. visit_f64 ( self . de . config . flavor . visit_f64 ( * x) )
308
+ visitor. visit_f64 ( unsafe { self . de . read ( ) } . config . flavor . visit_f64 ( * x) )
302
309
} else {
303
310
self . deser ( visitor)
304
311
}
@@ -319,7 +326,7 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::D
319
326
{
320
327
match self . token {
321
328
Token :: Quoted ( x) | Token :: Unquoted ( x) => {
322
- match self . de . config . flavor . decode ( x. as_bytes ( ) ) {
329
+ match unsafe { self . de . read ( ) } . config . flavor . decode ( x. as_bytes ( ) ) {
323
330
Cow :: Borrowed ( x) => visitor. visit_str ( x) ,
324
331
Cow :: Owned ( x) => visitor. visit_string ( x) ,
325
332
}
@@ -380,10 +387,10 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::D
380
387
if !seq. hit_end {
381
388
// For when we are deserializing an array that doesn't read
382
389
// the closing token
383
- if !matches ! ( self . de. reader. read( ) ?, Token :: Close ) {
390
+ if !matches ! ( unsafe { self . de. read ( ) } . reader. read( ) ?, Token :: Close ) {
384
391
return Err ( Error :: invalid_syntax (
385
392
"Expected sequence to be terminated with an end token" ,
386
- self . de . reader . position ( ) ,
393
+ unsafe { self . de . read ( ) } . reader . position ( ) ,
387
394
) ) ;
388
395
}
389
396
}
@@ -459,20 +466,20 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> de::D
459
466
V : Visitor < ' de > ,
460
467
{
461
468
if matches ! ( self . token, Token :: Open ) {
462
- self . de . reader . skip_container ( ) ?;
469
+ unsafe { self . de . read ( ) } . reader . skip_container ( ) ?;
463
470
}
464
471
465
472
visitor. visit_unit ( )
466
473
}
467
474
}
468
475
469
476
struct BinaryReaderSeq < ' a : ' a , ' res , RES : ' a , F , R > {
470
- de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
477
+ de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
471
478
hit_end : bool ,
472
479
}
473
480
474
481
impl < ' a , ' de : ' a , ' res : ' de , RES : ' a , F , R > BinaryReaderSeq < ' a , ' res , RES , F , R > {
475
- fn new ( de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ) -> Self {
482
+ fn new ( de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ) -> Self {
476
483
BinaryReaderSeq { de, hit_end : false }
477
484
}
478
485
}
@@ -486,26 +493,25 @@ impl<'de, 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, R: Read> SeqAccess
486
493
where
487
494
T : DeserializeSeed < ' de > ,
488
495
{
489
- let de = unsafe { & mut * ( self . de as * mut _ ) } ;
490
- match self . de . reader . read ( ) ? {
496
+ match unsafe { self . de . read ( ) } . reader . read ( ) ? {
491
497
Token :: Close => {
492
498
self . hit_end = true ;
493
499
Ok ( None )
494
500
}
495
501
token => seed
496
- . deserialize ( BinaryReaderTokenDeserializer { de, token } )
502
+ . deserialize ( BinaryReaderTokenDeserializer { de : self . de , token } )
497
503
. map ( Some ) ,
498
504
}
499
505
}
500
506
}
501
507
502
508
struct BinaryReaderEnum < ' a , ' res , RES : ' a , F , R > {
503
- de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
509
+ de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > ,
504
510
token : Token < ' a > ,
505
511
}
506
512
507
513
impl < ' a , ' res , RES : ' a , F , R > BinaryReaderEnum < ' a , ' res , RES , F , R > {
508
- fn new ( de : & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > , token : Token < ' a > ) -> Self {
514
+ fn new ( de : * const & ' a mut BinaryReaderDeserializer < ' res , RES , F , R > , token : Token < ' a > ) -> Self {
509
515
BinaryReaderEnum { de, token }
510
516
}
511
517
}
0 commit comments