@@ -21,7 +21,8 @@ use middle::typeck::check::{FnCtxt, SelfInfo};
2121use middle:: typeck:: infer:: { force_all, resolve_all, resolve_region} ;
2222use middle:: typeck:: infer:: { resolve_type} ;
2323use 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} ;
2526use middle:: typeck:: { vtable_param, write_substs_to_tcx} ;
2627use middle:: typeck:: { write_ty_to_tcx} ;
2728use util:: ppaux;
@@ -51,21 +52,60 @@ fn resolve_type_vars_in_type(fcx: @mut FnCtxt, sp: span, typ: ty::t)
5152 }
5253}
5354
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+
5465fn resolve_method_map_entry ( fcx : @mut FnCtxt , sp : span , id : ast:: node_id ) {
5566 // Resolve any method map entry
56- match fcx. ccx . method_map . find ( & id) {
67+ match fcx. inh . method_map . find ( & id) {
5768 None => { }
5869 Some ( ref mme) => {
5970 for resolve_type_vars_in_type( fcx, sp, mme. self_arg. ty) . each |t| {
6071 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)
69109 }
70110 }
71111 }
@@ -185,6 +225,8 @@ fn visit_expr(e: @ast::expr, &&wbcx: @mut WbCtxt, v: wb_vt) {
185225 resolve_type_vars_for_node ( wbcx, e. span , e. id ) ;
186226 resolve_method_map_entry ( wbcx. fcx , e. span , e. id ) ;
187227 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 ) ;
188230 match e. node {
189231 ast:: expr_fn_block( ref decl, _) => {
190232 for vec:: each( decl. inputs) |input| {
0 commit comments