@@ -21,7 +21,8 @@ use middle::typeck::check::{FnCtxt, SelfInfo};
21
21
use middle:: typeck:: infer:: { force_all, resolve_all, resolve_region} ;
22
22
use middle:: typeck:: infer:: { resolve_type} ;
23
23
use middle:: typeck:: infer;
24
- use middle:: typeck:: method_map_entry;
24
+ use middle:: typeck:: { method_map_entry} ;
25
+ use middle:: typeck:: { vtable_origin, vtable_static, vtable_param} ;
25
26
use middle:: typeck:: { vtable_param, write_substs_to_tcx} ;
26
27
use middle:: typeck:: { write_ty_to_tcx} ;
27
28
use util:: ppaux;
@@ -51,21 +52,60 @@ fn resolve_type_vars_in_type(fcx: @mut FnCtxt, sp: span, typ: ty::t)
51
52
}
52
53
}
53
54
55
+ fn resolve_type_vars_in_types ( fcx : @mut FnCtxt , sp : span , tys : & [ ty:: t ] )
56
+ -> ~[ ty:: t ] {
57
+ tys. map ( |t| {
58
+ match resolve_type_vars_in_type ( fcx, sp, * t) {
59
+ Some ( t1) => t1,
60
+ None => ty:: mk_err ( fcx. ccx . tcx )
61
+ }
62
+ } )
63
+ }
64
+
54
65
fn resolve_method_map_entry ( fcx : @mut FnCtxt , sp : span , id : ast:: node_id ) {
55
66
// Resolve any method map entry
56
- match fcx. ccx . method_map . find ( & id) {
67
+ match fcx. inh . method_map . find ( & id) {
57
68
None => { }
58
69
Some ( ref mme) => {
59
70
for resolve_type_vars_in_type( fcx, sp, mme. self_arg. ty) . each |t| {
60
71
let method_map = fcx. ccx . method_map ;
61
- method_map. insert ( id,
62
- method_map_entry {
63
- self_arg : arg {
64
- mode : mme. self_arg . mode ,
65
- ty : * t
66
- } ,
67
- .. * mme
68
- } ) ;
72
+ let new_entry = method_map_entry {
73
+ self_arg : arg { mode : mme. self_arg . mode , ty : * t } ,
74
+ ..* mme
75
+ } ;
76
+ debug ! ( "writeback::resolve_method_map_entry(id=%?, \
77
+ new_entry=%?)",
78
+ id, new_entry) ;
79
+ method_map. insert ( id, new_entry) ;
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ fn resolve_vtable_map_entry ( fcx : @mut FnCtxt , sp : span , id : ast:: node_id ) {
86
+ // Resolve any method map entry
87
+ match fcx. inh . vtable_map . find ( & id) {
88
+ None => { }
89
+ Some ( origins) => {
90
+ let r_origins = @origins. map ( |o| resolve_origin ( fcx, sp, o) ) ;
91
+ let vtable_map = fcx. ccx . vtable_map ;
92
+ vtable_map. insert ( id, r_origins) ;
93
+ debug ! ( "writeback::resolve_vtable_map_entry(id=%d, vtables=%?)" ,
94
+ id, r_origins. map( |v| v. to_str( fcx. tcx( ) ) ) ) ;
95
+ }
96
+ }
97
+
98
+ fn resolve_origin ( fcx : @mut FnCtxt ,
99
+ sp : span ,
100
+ origin : & vtable_origin ) -> vtable_origin {
101
+ match origin {
102
+ & vtable_static( def_id, ref tys, origins) => {
103
+ let r_tys = resolve_type_vars_in_types ( fcx, sp, * tys) ;
104
+ let r_origins = @origins. map ( |o| resolve_origin ( fcx, sp, o) ) ;
105
+ vtable_static ( def_id, r_tys, r_origins)
106
+ }
107
+ & vtable_param( n, b) => {
108
+ vtable_param ( n, b)
69
109
}
70
110
}
71
111
}
@@ -185,6 +225,8 @@ fn visit_expr(e: @ast::expr, &&wbcx: @mut WbCtxt, v: wb_vt) {
185
225
resolve_type_vars_for_node ( wbcx, e. span , e. id ) ;
186
226
resolve_method_map_entry ( wbcx. fcx , e. span , e. id ) ;
187
227
resolve_method_map_entry ( wbcx. fcx , e. span , e. callee_id ) ;
228
+ resolve_vtable_map_entry ( wbcx. fcx , e. span , e. id ) ;
229
+ resolve_vtable_map_entry ( wbcx. fcx , e. span , e. callee_id ) ;
188
230
match e. node {
189
231
ast:: expr_fn_block( ref decl, _) => {
190
232
for vec:: each( decl. inputs) |input| {
0 commit comments