@@ -581,41 +581,48 @@ impl tr for moves::CaptureVar {
581
581
// Encoding and decoding of MethodCallee
582
582
583
583
trait read_method_callee_helper {
584
- fn read_method_callee ( & mut self , xcx : & ExtendedDecodeContext ) -> MethodCallee ;
584
+ fn read_method_callee ( & mut self , xcx : & ExtendedDecodeContext ) -> ( u32 , MethodCallee ) ;
585
585
}
586
586
587
587
fn encode_method_callee ( ecx : & e:: EncodeContext ,
588
588
ebml_w : & mut writer:: Encoder ,
589
+ autoderef : u32 ,
589
590
method : & MethodCallee ) {
590
- ebml_w. emit_struct ( "MethodCallee" , 3 , |ebml_w| {
591
- ebml_w. emit_struct_field ( "origin" , 0 u, |ebml_w| {
591
+ ebml_w. emit_struct ( "MethodCallee" , 4 , |ebml_w| {
592
+ ebml_w. emit_struct_field ( "autoderef" , 0 u, |ebml_w| {
593
+ autoderef. encode ( ebml_w) ;
594
+ } ) ;
595
+ ebml_w. emit_struct_field ( "origin" , 1 u, |ebml_w| {
592
596
method. origin . encode ( ebml_w) ;
593
597
} ) ;
594
- ebml_w. emit_struct_field ( "ty" , 1 u , |ebml_w| {
598
+ ebml_w. emit_struct_field ( "ty" , 2 u , |ebml_w| {
595
599
ebml_w. emit_ty ( ecx, method. ty ) ;
596
600
} ) ;
597
- ebml_w. emit_struct_field ( "substs" , 2 u , |ebml_w| {
601
+ ebml_w. emit_struct_field ( "substs" , 3 u , |ebml_w| {
598
602
ebml_w. emit_substs ( ecx, & method. substs ) ;
599
603
} ) ;
600
604
} )
601
605
}
602
606
603
607
impl < ' a > read_method_callee_helper for reader:: Decoder < ' a > {
604
- fn read_method_callee ( & mut self , xcx : & ExtendedDecodeContext ) -> MethodCallee {
605
- self . read_struct ( "MethodCallee" , 3 , |this| {
606
- MethodCallee {
607
- origin : this. read_struct_field ( "origin" , 0 , |this| {
608
+ fn read_method_callee ( & mut self , xcx : & ExtendedDecodeContext ) -> ( u32 , MethodCallee ) {
609
+ self . read_struct ( "MethodCallee" , 4 , |this| {
610
+ let autoderef = this. read_struct_field ( "autoderef" , 0 , |this| {
611
+ Decodable :: decode ( this)
612
+ } ) ;
613
+ ( autoderef, MethodCallee {
614
+ origin : this. read_struct_field ( "origin" , 1 , |this| {
608
615
let method_origin: MethodOrigin =
609
616
Decodable :: decode ( this) ;
610
617
method_origin. tr ( xcx)
611
618
} ) ,
612
- ty : this. read_struct_field ( "ty" , 1 , |this| {
619
+ ty : this. read_struct_field ( "ty" , 2 , |this| {
613
620
this. read_ty ( xcx)
614
621
} ) ,
615
- substs : this. read_struct_field ( "substs" , 2 , |this| {
622
+ substs : this. read_struct_field ( "substs" , 3 , |this| {
616
623
this. read_substs ( xcx)
617
624
} )
618
- }
625
+ } )
619
626
} )
620
627
}
621
628
}
@@ -647,6 +654,20 @@ impl tr for MethodOrigin {
647
654
// ______________________________________________________________________
648
655
// Encoding and decoding vtable_res
649
656
657
+ fn encode_vtable_res_with_key ( ecx : & e:: EncodeContext ,
658
+ ebml_w : & mut writer:: Encoder ,
659
+ autoderef : u32 ,
660
+ dr : typeck:: vtable_res ) {
661
+ ebml_w. emit_struct ( "VtableWithKey" , 2 , |ebml_w| {
662
+ ebml_w. emit_struct_field ( "autoderef" , 0 u, |ebml_w| {
663
+ autoderef. encode ( ebml_w) ;
664
+ } ) ;
665
+ ebml_w. emit_struct_field ( "vtable_res" , 1 u, |ebml_w| {
666
+ encode_vtable_res ( ecx, ebml_w, dr) ;
667
+ } ) ;
668
+ } )
669
+ }
670
+
650
671
pub fn encode_vtable_res ( ecx : & e:: EncodeContext ,
651
672
ebml_w : & mut writer:: Encoder ,
652
673
dr : typeck:: vtable_res ) {
@@ -701,6 +722,10 @@ pub fn encode_vtable_origin(ecx: &e::EncodeContext,
701
722
}
702
723
703
724
pub trait vtable_decoder_helpers {
725
+ fn read_vtable_res_with_key ( & mut self ,
726
+ tcx : & ty:: ctxt ,
727
+ cdata : @cstore:: crate_metadata )
728
+ -> ( u32 , typeck:: vtable_res ) ;
704
729
fn read_vtable_res ( & mut self ,
705
730
tcx : & ty:: ctxt , cdata : @cstore:: crate_metadata )
706
731
-> typeck:: vtable_res ;
@@ -713,6 +738,20 @@ pub trait vtable_decoder_helpers {
713
738
}
714
739
715
740
impl < ' a > vtable_decoder_helpers for reader:: Decoder < ' a > {
741
+ fn read_vtable_res_with_key ( & mut self ,
742
+ tcx : & ty:: ctxt ,
743
+ cdata : @cstore:: crate_metadata )
744
+ -> ( u32 , typeck:: vtable_res ) {
745
+ self . read_struct ( "VtableWithKey" , 2 , |this| {
746
+ let autoderef = this. read_struct_field ( "autoderef" , 0 , |this| {
747
+ Decodable :: decode ( this)
748
+ } ) ;
749
+ ( autoderef, this. read_struct_field ( "vtable_res" , 1 , |this| {
750
+ this. read_vtable_res ( tcx, cdata)
751
+ } ) )
752
+ } )
753
+ }
754
+
716
755
fn read_vtable_res ( & mut self ,
717
756
tcx : & ty:: ctxt , cdata : @cstore:: crate_metadata )
718
757
-> typeck:: vtable_res {
@@ -1018,21 +1057,48 @@ fn encode_side_tables_for_id(ecx: &e::EncodeContext,
1018
1057
ebml_w. tag ( c:: tag_table_method_map, |ebml_w| {
1019
1058
ebml_w. id ( id) ;
1020
1059
ebml_w. tag ( c:: tag_table_val, |ebml_w| {
1021
- encode_method_callee ( ecx, ebml_w, method)
1060
+ encode_method_callee ( ecx, ebml_w, method_call . autoderef , method)
1022
1061
} )
1023
1062
} )
1024
1063
}
1025
1064
1026
- for & dr in maps. vtable_map . borrow ( ) . find ( & id ) . iter ( ) {
1065
+ for & dr in maps. vtable_map . borrow ( ) . find ( & method_call ) . iter ( ) {
1027
1066
ebml_w. tag ( c:: tag_table_vtable_map, |ebml_w| {
1028
1067
ebml_w. id ( id) ;
1029
1068
ebml_w. tag ( c:: tag_table_val, |ebml_w| {
1030
- encode_vtable_res ( ecx, ebml_w, * dr) ;
1069
+ encode_vtable_res_with_key ( ecx, ebml_w, method_call . autoderef , * dr) ;
1031
1070
} )
1032
1071
} )
1033
1072
}
1034
1073
1035
1074
for adj in tcx. adjustments . borrow ( ) . find ( & id) . iter ( ) {
1075
+ match * * * adj {
1076
+ ty:: AutoDerefRef ( adj) => {
1077
+ for autoderef in range ( 0 , adj. autoderefs ) {
1078
+ let method_call = MethodCall :: autoderef ( id, autoderef as u32 ) ;
1079
+ for & method in maps. method_map . borrow ( ) . find ( & method_call) . iter ( ) {
1080
+ ebml_w. tag ( c:: tag_table_method_map, |ebml_w| {
1081
+ ebml_w. id ( id) ;
1082
+ ebml_w. tag ( c:: tag_table_val, |ebml_w| {
1083
+ encode_method_callee ( ecx, ebml_w, method_call. autoderef , method)
1084
+ } )
1085
+ } )
1086
+ }
1087
+
1088
+ for & dr in maps. vtable_map . borrow ( ) . find ( & method_call) . iter ( ) {
1089
+ ebml_w. tag ( c:: tag_table_vtable_map, |ebml_w| {
1090
+ ebml_w. id ( id) ;
1091
+ ebml_w. tag ( c:: tag_table_val, |ebml_w| {
1092
+ encode_vtable_res_with_key ( ecx, ebml_w,
1093
+ method_call. autoderef , * dr) ;
1094
+ } )
1095
+ } )
1096
+ }
1097
+ }
1098
+ }
1099
+ _ => { }
1100
+ }
1101
+
1036
1102
ebml_w. tag ( c:: tag_table_adjustments, |ebml_w| {
1037
1103
ebml_w. id ( id) ;
1038
1104
ebml_w. tag ( c:: tag_table_val, |ebml_w| {
@@ -1336,15 +1402,22 @@ fn decode_side_tables(xcx: &ExtendedDecodeContext,
1336
1402
dcx. tcx . ty_param_defs . borrow_mut ( ) . insert ( id, bounds) ;
1337
1403
}
1338
1404
c:: tag_table_method_map => {
1339
- let method = val_dsr. read_method_callee ( xcx) ;
1340
- let method_call = MethodCall :: expr ( id) ;
1405
+ let ( autoderef, method) = val_dsr. read_method_callee ( xcx) ;
1406
+ let method_call = MethodCall {
1407
+ expr_id : id,
1408
+ autoderef : autoderef
1409
+ } ;
1341
1410
dcx. maps . method_map . borrow_mut ( ) . insert ( method_call, method) ;
1342
1411
}
1343
1412
c:: tag_table_vtable_map => {
1344
- let vtable_res =
1345
- val_dsr. read_vtable_res ( xcx. dcx . tcx ,
1346
- xcx. dcx . cdata ) ;
1347
- dcx. maps . vtable_map . borrow_mut ( ) . insert ( id, vtable_res) ;
1413
+ let ( autoderef, vtable_res) =
1414
+ val_dsr. read_vtable_res_with_key ( xcx. dcx . tcx ,
1415
+ xcx. dcx . cdata ) ;
1416
+ let vtable_key = MethodCall {
1417
+ expr_id : id,
1418
+ autoderef : autoderef
1419
+ } ;
1420
+ dcx. maps . vtable_map . borrow_mut ( ) . insert ( vtable_key, vtable_res) ;
1348
1421
}
1349
1422
c:: tag_table_adjustments => {
1350
1423
let adj: @ty:: AutoAdjustment = @val_dsr. read_auto_adjustment ( xcx) ;
0 commit comments