114
114
//! Ok(())
115
115
//! }
116
116
//!
117
- //! fn next_key(&mut self) -> Result<SinkHandle, Error> {
117
+ //! fn next_key(&mut self, _state: &DeserializerState ) -> Result<SinkHandle, Error> {
118
118
//! // directly attach to the key field which can hold any
119
119
//! // string value. This means that any string is accepted
120
120
//! // as key.
121
121
//! Ok(Deserialize::deserialize_into(&mut self.key))
122
122
//! }
123
123
//!
124
- //! fn next_value(&mut self) -> Result<SinkHandle, Error> {
124
+ //! fn next_value(&mut self, _state: &DeserializerState ) -> Result<SinkHandle, Error> {
125
125
//! // whenever we are looking for a value slot, look at the last key
126
126
//! // to decide which value slot to connect.
127
127
//! match self.key.take().as_deref() {
@@ -337,12 +337,14 @@ pub trait Sink {
337
337
}
338
338
339
339
/// Returns a sink for the next key in a map.
340
- fn next_key ( & mut self ) -> Result < SinkHandle , Error > {
340
+ fn next_key ( & mut self , state : & DeserializerState ) -> Result < SinkHandle , Error > {
341
+ let _ = state;
341
342
Ok ( SinkHandle :: null ( ) )
342
343
}
343
344
344
345
/// Returns a sink for the next value in a map or sequence.
345
- fn next_value ( & mut self ) -> Result < SinkHandle , Error > {
346
+ fn next_value ( & mut self , state : & DeserializerState ) -> Result < SinkHandle , Error > {
347
+ let _ = state;
346
348
Ok ( SinkHandle :: null ( ) )
347
349
}
348
350
@@ -370,7 +372,7 @@ pub trait Sink {
370
372
/// Gives access to the deserializer state.
371
373
pub struct DeserializerState < ' a > {
372
374
extensions : Extensions ,
373
- stack : ManuallyDrop < Vec < ( SinkHandleWrapper , Layer ) > > ,
375
+ descriptor_stack : Vec < & ' a dyn Descriptor > ,
374
376
_marker : PhantomData < & ' a Driver < ' a > > ,
375
377
}
376
378
@@ -387,14 +389,14 @@ impl<'a> DeserializerState<'a> {
387
389
388
390
/// Returns the current recursion depth.
389
391
pub fn depth ( & self ) -> usize {
390
- self . stack . len ( )
392
+ self . descriptor_stack . len ( )
391
393
}
392
394
393
395
/// Returns the topmost descriptor.
394
396
///
395
397
/// This descriptor always points to a container as the descriptor.
396
398
pub fn top_descriptor ( & self ) -> Option < & dyn Descriptor > {
397
- self . stack . last ( ) . map ( |x| x . 0 . sink . descriptor ( ) )
399
+ self . descriptor_stack . last ( ) . copied ( )
398
400
}
399
401
}
400
402
@@ -405,8 +407,9 @@ impl<'a> DeserializerState<'a> {
405
407
/// internally impossible with safe code, this is a safe abstractiont that
406
408
/// hides the unsafety internally.
407
409
pub struct Driver < ' a > {
408
- state : ManuallyDrop < DeserializerState < ' a > > ,
410
+ state : DeserializerState < ' a > ,
409
411
current_sink : Option < SinkHandleWrapper > ,
412
+ sink_stack : ManuallyDrop < Vec < ( SinkHandleWrapper , Layer ) > > ,
410
413
}
411
414
412
415
struct SinkHandleWrapper {
@@ -437,11 +440,12 @@ impl<'a> Driver<'a> {
437
440
/// Creates a new deserializer driver from a sink.
438
441
pub fn from_sink ( sink : SinkHandle ) -> Driver < ' a > {
439
442
Driver {
440
- state : ManuallyDrop :: new ( DeserializerState {
443
+ state : DeserializerState {
441
444
extensions : Extensions :: default ( ) ,
442
- stack : ManuallyDrop :: new ( Vec :: new ( ) ) ,
445
+ descriptor_stack : Vec :: new ( ) ,
443
446
_marker : PhantomData ,
444
- } ) ,
447
+ } ,
448
+ sink_stack : ManuallyDrop :: new ( Default :: default ( ) ) ,
445
449
current_sink : Some ( unsafe { SinkHandleWrapper :: from ( sink) } ) ,
446
450
}
447
451
}
@@ -467,19 +471,20 @@ impl<'a> Driver<'a> {
467
471
fn _emit ( & mut self , event : Event ) -> Result < ( ) , Error > {
468
472
macro_rules! target_sink {
469
473
( ) => { {
470
- match self . state . stack . last_mut( ) {
474
+ match self . sink_stack . last_mut( ) {
471
475
Some ( ( map_sink, Layer :: Map ( ref mut is_key) ) ) => {
472
476
let next_sink = if * is_key {
473
- map_sink. sink. next_key( ) ?
477
+ map_sink. sink. next_key( & self . state ) ?
474
478
} else {
475
- map_sink. sink. next_value( ) ?
479
+ map_sink. sink. next_value( & self . state ) ?
476
480
} ;
477
481
* is_key = !* is_key;
478
482
self . current_sink = Some ( unsafe { SinkHandleWrapper :: from( next_sink) } ) ;
479
483
}
480
484
Some ( ( seq_sink, Layer :: Seq ) ) => {
481
- self . current_sink =
482
- Some ( unsafe { SinkHandleWrapper :: from( seq_sink. sink. next_value( ) ?) } ) ;
485
+ self . current_sink = Some ( unsafe {
486
+ SinkHandleWrapper :: from( seq_sink. sink. next_value( & self . state) ?)
487
+ } ) ;
483
488
}
484
489
_ => { }
485
490
}
@@ -501,29 +506,37 @@ impl<'a> Driver<'a> {
501
506
Event :: MapStart => {
502
507
let current_sink = target_sink ! ( ) ;
503
508
current_sink. map ( & self . state ) ?;
509
+ let descriptor = current_sink. descriptor ( ) ;
504
510
self . state
505
- . stack
511
+ . descriptor_stack
512
+ . push ( unsafe { extend_lifetime ! ( descriptor, & dyn Descriptor ) } ) ;
513
+ self . sink_stack
506
514
. push ( ( self . current_sink . take ( ) . unwrap ( ) , Layer :: Map ( true ) ) ) ;
507
515
return Ok ( ( ) ) ;
508
516
}
509
- Event :: MapEnd => match self . state . stack . pop ( ) {
517
+ Event :: MapEnd => match self . sink_stack . pop ( ) {
510
518
Some ( ( mut map_sink, Layer :: Map ( _) ) ) => {
511
519
map_sink. sink . finish ( & self . state ) ?;
520
+ self . state . descriptor_stack . pop ( ) ;
512
521
self . current_sink = Some ( map_sink) ;
513
522
}
514
523
_ => panic ! ( "not inside a MapSink" ) ,
515
524
} ,
516
525
Event :: SeqStart => {
517
526
let current_sink = target_sink ! ( ) ;
518
527
current_sink. seq ( & self . state ) ?;
528
+ let descriptor = current_sink. descriptor ( ) ;
519
529
self . state
520
- . stack
530
+ . descriptor_stack
531
+ . push ( unsafe { extend_lifetime ! ( descriptor, & dyn Descriptor ) } ) ;
532
+ self . sink_stack
521
533
. push ( ( self . current_sink . take ( ) . unwrap ( ) , Layer :: Seq ) ) ;
522
534
return Ok ( ( ) ) ;
523
535
}
524
- Event :: SeqEnd => match self . state . stack . pop ( ) {
536
+ Event :: SeqEnd => match self . sink_stack . pop ( ) {
525
537
Some ( ( mut seq_sink, Layer :: Seq ) ) => {
526
538
seq_sink. sink . finish ( & self . state ) ?;
539
+ self . state . descriptor_stack . pop ( ) ;
527
540
self . current_sink = Some ( seq_sink) ;
528
541
}
529
542
_ => panic ! ( "not inside a SeqSink" ) ,
@@ -538,13 +551,11 @@ impl<'a> Driver<'a> {
538
551
539
552
impl < ' a > Drop for Driver < ' a > {
540
553
fn drop ( & mut self ) {
541
- // it's important that we drop the values in inverse order.
542
- while let Some ( _last) = self . state . stack . pop ( ) {
543
- // drop in inverse order
544
- }
545
554
unsafe {
546
- ManuallyDrop :: drop ( & mut self . state . stack ) ;
547
- ManuallyDrop :: drop ( & mut self . state ) ;
555
+ while let Some ( _item) = self . sink_stack . pop ( ) {
556
+ // drop in inverse order
557
+ }
558
+ ManuallyDrop :: drop ( & mut self . sink_stack ) ;
548
559
}
549
560
}
550
561
}
0 commit comments