@@ -250,13 +250,21 @@ impl<S:serialize::Encoder> def_id_encoder_helpers for S {
250
250
251
251
trait def_id_decoder_helpers {
252
252
fn read_def_id ( & mut self , xcx : @ExtendedDecodeContext ) -> ast:: def_id ;
253
+ fn read_def_id_noxcx ( & mut self ,
254
+ cdata : @cstore:: crate_metadata ) -> ast:: def_id ;
253
255
}
254
256
255
257
impl < D : serialize:: Decoder > def_id_decoder_helpers for D {
256
258
fn read_def_id ( & mut self , xcx : @ExtendedDecodeContext ) -> ast:: def_id {
257
259
let did: ast:: def_id = Decodable :: decode ( self ) ;
258
260
did. tr ( xcx)
259
261
}
262
+
263
+ fn read_def_id_noxcx ( & mut self ,
264
+ cdata : @cstore:: crate_metadata ) -> ast:: def_id {
265
+ let did: ast:: def_id = Decodable :: decode ( self ) ;
266
+ decoder:: translate_def_id ( cdata, did)
267
+ }
260
268
}
261
269
262
270
// ______________________________________________________________________
@@ -582,34 +590,35 @@ impl tr for method_origin {
582
590
typeck:: method_trait( did, m, vstore) => {
583
591
typeck:: method_trait ( did. tr ( xcx) , m, vstore)
584
592
}
585
- typeck:: method_self( did, m) => {
586
- typeck:: method_self ( did. tr ( xcx) , m)
587
- }
588
- typeck:: method_super( trait_did, m) => {
589
- typeck:: method_super ( trait_did. tr ( xcx) , m)
590
- }
591
593
}
592
594
}
593
595
}
594
596
595
597
// ______________________________________________________________________
596
598
// Encoding and decoding vtable_res
597
599
598
- fn encode_vtable_res ( ecx : & e:: EncodeContext ,
600
+ pub fn encode_vtable_res ( ecx : & e:: EncodeContext ,
599
601
ebml_w : & mut writer:: Encoder ,
600
602
dr : typeck:: vtable_res ) {
601
603
// can't autogenerate this code because automatic code of
602
604
// ty::t doesn't work, and there is no way (atm) to have
603
605
// hand-written encoding routines combine with auto-generated
604
606
// ones. perhaps we should fix this.
605
607
do ebml_w. emit_from_vec ( * dr) |ebml_w, param_tables| {
606
- do ebml_w. emit_from_vec ( * * param_tables) |ebml_w, vtable_origin| {
607
- encode_vtable_origin ( ecx, ebml_w, vtable_origin)
608
- }
608
+ encode_vtable_param_res ( ecx, ebml_w, * param_tables) ;
609
609
}
610
610
}
611
611
612
- fn encode_vtable_origin ( ecx : & e:: EncodeContext ,
612
+ pub fn encode_vtable_param_res ( ecx : & e:: EncodeContext ,
613
+ ebml_w : & mut writer:: Encoder ,
614
+ param_tables : typeck:: vtable_param_res ) {
615
+ do ebml_w. emit_from_vec ( * param_tables) |ebml_w, vtable_origin| {
616
+ encode_vtable_origin ( ecx, ebml_w, vtable_origin)
617
+ }
618
+ }
619
+
620
+
621
+ pub fn encode_vtable_origin ( ecx : & e:: EncodeContext ,
613
622
ebml_w : & mut writer:: Encoder ,
614
623
vtable_origin : & typeck:: vtable_origin ) {
615
624
do ebml_w. emit_enum ( "vtable_origin" ) |ebml_w| {
@@ -630,40 +639,46 @@ fn encode_vtable_origin(ecx: &e::EncodeContext,
630
639
typeck:: vtable_param( pn, bn) => {
631
640
do ebml_w. emit_enum_variant ( "vtable_param" , 1 u, 2 u) |ebml_w| {
632
641
do ebml_w. emit_enum_variant_arg ( 0 u) |ebml_w| {
633
- ebml_w . emit_uint ( pn ) ;
642
+ pn . encode ( ebml_w ) ;
634
643
}
635
644
do ebml_w. emit_enum_variant_arg ( 1 u) |ebml_w| {
636
645
ebml_w. emit_uint ( bn) ;
637
646
}
638
647
}
639
648
}
640
- typeck:: vtable_self( def_id) => {
641
- do ebml_w. emit_enum_variant ( "vtable_self" , 2 u, 1 u) |ebml_w| {
642
- do ebml_w. emit_enum_variant_arg ( 0 u) |ebml_w| {
643
- ebml_w. emit_def_id ( def_id)
644
- }
645
- }
646
- }
647
649
}
648
650
}
649
651
}
650
652
651
- trait vtable_decoder_helpers {
652
- fn read_vtable_res ( & mut self , xcx : @ExtendedDecodeContext )
653
+ pub trait vtable_decoder_helpers {
654
+ fn read_vtable_res ( & mut self ,
655
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
653
656
-> typeck:: vtable_res ;
654
- fn read_vtable_origin ( & mut self , xcx : @ExtendedDecodeContext )
657
+ fn read_vtable_param_res ( & mut self ,
658
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
659
+ -> typeck:: vtable_param_res ;
660
+ fn read_vtable_origin ( & mut self ,
661
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
655
662
-> typeck:: vtable_origin ;
656
663
}
657
664
658
665
impl vtable_decoder_helpers for reader:: Decoder {
659
- fn read_vtable_res ( & mut self , xcx : @ExtendedDecodeContext )
666
+ fn read_vtable_res ( & mut self ,
667
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
660
668
-> typeck:: vtable_res {
661
669
@self . read_to_vec ( |this|
662
- @this. read_to_vec ( |this|
663
- this. read_vtable_origin ( xcx) ) )
670
+ this. read_vtable_param_res ( tcx, cdata) )
664
671
}
665
672
666
- fn read_vtable_origin ( & mut self , xcx : @ExtendedDecodeContext )
673
+ fn read_vtable_param_res ( & mut self ,
674
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
675
+ -> typeck:: vtable_param_res {
676
+ @self . read_to_vec ( |this|
677
+ this. read_vtable_origin ( tcx, cdata) )
678
+ }
679
+
680
+ fn read_vtable_origin ( & mut self ,
681
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
667
682
-> typeck:: vtable_origin {
668
683
do self . read_enum ( "vtable_origin" ) |this| {
669
684
do this. read_enum_variant ( [ "vtable_static" ,
@@ -674,33 +689,26 @@ impl vtable_decoder_helpers for reader::Decoder {
674
689
0 => {
675
690
typeck:: vtable_static (
676
691
do this. read_enum_variant_arg ( 0 u) |this| {
677
- this. read_def_id ( xcx )
692
+ this. read_def_id_noxcx ( cdata )
678
693
} ,
679
694
do this. read_enum_variant_arg ( 1 u) |this| {
680
- this. read_tys ( xcx )
695
+ this. read_tys_noxcx ( tcx , cdata )
681
696
} ,
682
697
do this. read_enum_variant_arg ( 2 u) |this| {
683
- this. read_vtable_res ( xcx )
698
+ this. read_vtable_res ( tcx , cdata )
684
699
}
685
700
)
686
701
}
687
702
1 => {
688
703
typeck:: vtable_param (
689
704
do this. read_enum_variant_arg ( 0 u) |this| {
690
- this . read_uint ( )
705
+ Decodable :: decode ( this )
691
706
} ,
692
707
do this. read_enum_variant_arg ( 1 u) |this| {
693
708
this. read_uint ( )
694
709
}
695
710
)
696
711
}
697
- 2 => {
698
- typeck:: vtable_self (
699
- do this. read_enum_variant_arg ( 0 u) |this| {
700
- this. read_def_id ( xcx)
701
- }
702
- )
703
- }
704
712
// hard to avoid - user input
705
713
_ => fail ! ( "bad enum variant" )
706
714
}
@@ -995,9 +1003,35 @@ trait ebml_decoder_decoder_helpers {
995
1003
source: DefIdSource ,
996
1004
did: ast:: def_id)
997
1005
-> ast:: def_id;
1006
+
1007
+ // Versions of the type reading functions that don't need the full
1008
+ // ExtendedDecodeContext.
1009
+ fn read_ty_noxcx( & mut self ,
1010
+ tcx: ty:: ctxt, cdata: @cstore:: crate_metadata) -> ty:: t;
1011
+ fn read_tys_noxcx( & mut self ,
1012
+ tcx: ty:: ctxt,
1013
+ cdata: @cstore:: crate_metadata) -> ~[ ty:: t] ;
998
1014
}
999
1015
1000
1016
impl ebml_decoder_decoder_helpers for reader:: Decoder {
1017
+ fn read_ty_noxcx( & mut self ,
1018
+ tcx: ty:: ctxt, cdata: @cstore:: crate_metadata) -> ty:: t {
1019
+ do self . read_opaque |_, doc| {
1020
+ tydecode:: parse_ty_data(
1021
+ * doc. data,
1022
+ cdata. cnum,
1023
+ doc. start,
1024
+ tcx,
1025
+ |_, id| decoder:: translate_def_id( cdata, id) )
1026
+ }
1027
+ }
1028
+
1029
+ fn read_tys_noxcx( & mut self ,
1030
+ tcx: ty:: ctxt,
1031
+ cdata: @cstore:: crate_metadata) -> ~[ ty:: t] {
1032
+ self . read_to_vec( |this| this. read_ty_noxcx( tcx, cdata) )
1033
+ }
1034
+
1001
1035
fn read_ty( & mut self , xcx: @ExtendedDecodeContext ) -> ty:: t {
1002
1036
// Note: regions types embed local node ids. In principle, we
1003
1037
// should translate these node ids into the new decode
@@ -1160,8 +1194,9 @@ fn decode_side_tables(xcx: @ExtendedDecodeContext,
1160
1194
val_dsr. read_method_map_entry ( xcx) ) ;
1161
1195
}
1162
1196
c:: tag_table_vtable_map => {
1163
- dcx. maps . vtable_map . insert ( id,
1164
- val_dsr. read_vtable_res ( xcx) ) ;
1197
+ dcx. maps . vtable_map . insert (
1198
+ id,
1199
+ val_dsr. read_vtable_res ( xcx. dcx . tcx , xcx. dcx . cdata ) ) ;
1165
1200
}
1166
1201
c:: tag_table_adjustments => {
1167
1202
let adj: @ty:: AutoAdjustment = @Decodable :: decode ( val_dsr) ;
0 commit comments