@@ -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
// ______________________________________________________________________
@@ -595,21 +603,28 @@ impl tr for method_origin {
595
603
// ______________________________________________________________________
596
604
// Encoding and decoding vtable_res
597
605
598
- fn encode_vtable_res ( ecx : & e:: EncodeContext ,
606
+ pub fn encode_vtable_res ( ecx : & e:: EncodeContext ,
599
607
ebml_w : & mut writer:: Encoder ,
600
608
dr : typeck:: vtable_res ) {
601
609
// can't autogenerate this code because automatic code of
602
610
// ty::t doesn't work, and there is no way (atm) to have
603
611
// hand-written encoding routines combine with auto-generated
604
612
// ones. perhaps we should fix this.
605
613
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
- }
614
+ encode_vtable_param_res ( ecx, ebml_w, * param_tables) ;
609
615
}
610
616
}
611
617
612
- fn encode_vtable_origin ( ecx : & e:: EncodeContext ,
618
+ pub fn encode_vtable_param_res ( ecx : & e:: EncodeContext ,
619
+ ebml_w : & mut writer:: Encoder ,
620
+ param_tables : typeck:: vtable_param_res ) {
621
+ do ebml_w. emit_from_vec ( * param_tables) |ebml_w, vtable_origin| {
622
+ encode_vtable_origin ( ecx, ebml_w, vtable_origin)
623
+ }
624
+ }
625
+
626
+
627
+ pub fn encode_vtable_origin ( ecx : & e:: EncodeContext ,
613
628
ebml_w : & mut writer:: Encoder ,
614
629
vtable_origin : & typeck:: vtable_origin ) {
615
630
do ebml_w. emit_enum ( "vtable_origin" ) |ebml_w| {
@@ -648,22 +663,35 @@ fn encode_vtable_origin(ecx: &e::EncodeContext,
648
663
}
649
664
}
650
665
651
- trait vtable_decoder_helpers {
652
- fn read_vtable_res ( & mut self , xcx : @ExtendedDecodeContext )
666
+ pub trait vtable_decoder_helpers {
667
+ fn read_vtable_res ( & mut self ,
668
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
653
669
-> typeck:: vtable_res ;
654
- fn read_vtable_origin ( & mut self , xcx : @ExtendedDecodeContext )
670
+ fn read_vtable_param_res ( & mut self ,
671
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
672
+ -> typeck:: vtable_param_res ;
673
+ fn read_vtable_origin ( & mut self ,
674
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
655
675
-> typeck:: vtable_origin ;
656
676
}
657
677
658
678
impl vtable_decoder_helpers for reader:: Decoder {
659
- fn read_vtable_res ( & mut self , xcx : @ExtendedDecodeContext )
679
+ fn read_vtable_res ( & mut self ,
680
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
660
681
-> typeck:: vtable_res {
661
682
@self . read_to_vec ( |this|
662
- @this. read_to_vec ( |this|
663
- this. read_vtable_origin ( xcx) ) )
683
+ this. read_vtable_param_res ( tcx, cdata) )
664
684
}
665
685
666
- fn read_vtable_origin ( & mut self , xcx : @ExtendedDecodeContext )
686
+ fn read_vtable_param_res ( & mut self ,
687
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
688
+ -> typeck:: vtable_param_res {
689
+ @self . read_to_vec ( |this|
690
+ this. read_vtable_origin ( tcx, cdata) )
691
+ }
692
+
693
+ fn read_vtable_origin ( & mut self ,
694
+ tcx : ty:: ctxt , cdata : @cstore:: crate_metadata )
667
695
-> typeck:: vtable_origin {
668
696
do self . read_enum ( "vtable_origin" ) |this| {
669
697
do this. read_enum_variant ( [ "vtable_static" ,
@@ -674,13 +702,13 @@ impl vtable_decoder_helpers for reader::Decoder {
674
702
0 => {
675
703
typeck:: vtable_static (
676
704
do this. read_enum_variant_arg ( 0 u) |this| {
677
- this. read_def_id ( xcx )
705
+ this. read_def_id_noxcx ( cdata )
678
706
} ,
679
707
do this. read_enum_variant_arg ( 1 u) |this| {
680
- this. read_tys ( xcx )
708
+ this. read_tys_noxcx ( tcx , cdata )
681
709
} ,
682
710
do this. read_enum_variant_arg ( 2 u) |this| {
683
- this. read_vtable_res ( xcx )
711
+ this. read_vtable_res ( tcx , cdata )
684
712
}
685
713
)
686
714
}
@@ -697,7 +725,7 @@ impl vtable_decoder_helpers for reader::Decoder {
697
725
2 => {
698
726
typeck:: vtable_self (
699
727
do this. read_enum_variant_arg ( 0 u) |this| {
700
- this. read_def_id ( xcx )
728
+ this. read_def_id_noxcx ( cdata )
701
729
}
702
730
)
703
731
}
@@ -995,9 +1023,35 @@ trait ebml_decoder_decoder_helpers {
995
1023
source: DefIdSource ,
996
1024
did: ast:: def_id)
997
1025
-> ast:: def_id;
1026
+
1027
+ // Versions of the type reading functions that don't need the full
1028
+ // ExtendedDecodeContext.
1029
+ fn read_ty_noxcx( & mut self ,
1030
+ tcx: ty:: ctxt, cdata: @cstore:: crate_metadata) -> ty:: t;
1031
+ fn read_tys_noxcx( & mut self ,
1032
+ tcx: ty:: ctxt,
1033
+ cdata: @cstore:: crate_metadata) -> ~[ ty:: t] ;
998
1034
}
999
1035
1000
1036
impl ebml_decoder_decoder_helpers for reader:: Decoder {
1037
+ fn read_ty_noxcx( & mut self ,
1038
+ tcx: ty:: ctxt, cdata: @cstore:: crate_metadata) -> ty:: t {
1039
+ do self . read_opaque |_, doc| {
1040
+ tydecode:: parse_ty_data(
1041
+ * doc. data,
1042
+ cdata. cnum,
1043
+ doc. start,
1044
+ tcx,
1045
+ |_, id| decoder:: translate_def_id( cdata, id) )
1046
+ }
1047
+ }
1048
+
1049
+ fn read_tys_noxcx( & mut self ,
1050
+ tcx: ty:: ctxt,
1051
+ cdata: @cstore:: crate_metadata) -> ~[ ty:: t] {
1052
+ self . read_to_vec( |this| this. read_ty_noxcx( tcx, cdata) )
1053
+ }
1054
+
1001
1055
fn read_ty( & mut self , xcx: @ExtendedDecodeContext ) -> ty:: t {
1002
1056
// Note: regions types embed local node ids. In principle, we
1003
1057
// should translate these node ids into the new decode
@@ -1160,8 +1214,9 @@ fn decode_side_tables(xcx: @ExtendedDecodeContext,
1160
1214
val_dsr. read_method_map_entry ( xcx) ) ;
1161
1215
}
1162
1216
c:: tag_table_vtable_map => {
1163
- dcx. maps . vtable_map . insert ( id,
1164
- val_dsr. read_vtable_res ( xcx) ) ;
1217
+ dcx. maps . vtable_map . insert (
1218
+ id,
1219
+ val_dsr. read_vtable_res ( xcx. dcx . tcx , xcx. dcx . cdata ) ) ;
1165
1220
}
1166
1221
c:: tag_table_adjustments => {
1167
1222
let adj: @ty:: AutoAdjustment = @Decodable :: decode ( val_dsr) ;
0 commit comments