@@ -24,22 +24,28 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
24
24
pub fn get_vtable (
25
25
& mut self ,
26
26
ty : Ty < ' tcx > ,
27
- trait_ref : ty:: PolyTraitRef < ' tcx > ,
27
+ poly_trait_ref : ty:: PolyExistentialTraitRef < ' tcx > ,
28
28
) -> EvalResult < ' tcx , Pointer < M :: PointerTag > > {
29
- debug ! ( "get_vtable(trait_ref={:?})" , trait_ref ) ;
29
+ debug ! ( "get_vtable(trait_ref={:?})" , poly_trait_ref ) ;
30
30
31
- if let Some ( & vtable) = self . vtables . get ( & ( ty, trait_ref) ) {
31
+ let ( ty, poly_trait_ref) = self . tcx . erase_regions ( & ( ty, poly_trait_ref) ) ;
32
+
33
+ if let Some ( & vtable) = self . vtables . get ( & ( ty, poly_trait_ref) ) {
32
34
return Ok ( Pointer :: from ( vtable) . with_default_tag ( ) ) ;
33
35
}
34
36
35
- let layout = self . layout_of ( trait_ref. self_ty ( ) ) ?;
37
+ let trait_ref = poly_trait_ref. with_self_ty ( * self . tcx , ty) ;
38
+ let trait_ref = self . tcx . erase_regions ( & trait_ref) ;
39
+
40
+ let methods = self . tcx . vtable_methods ( trait_ref) ;
41
+
42
+ let layout = self . layout_of ( ty) ?;
36
43
assert ! ( !layout. is_unsized( ) , "can't create a vtable for an unsized type" ) ;
37
44
let size = layout. size . bytes ( ) ;
38
45
let align = layout. align . abi ( ) ;
39
46
40
47
let ptr_size = self . pointer_size ( ) ;
41
48
let ptr_align = self . tcx . data_layout . pointer_align ;
42
- let methods = self . tcx . vtable_methods ( trait_ref) ;
43
49
let vtable = self . memory . allocate (
44
50
ptr_size * ( 3 + methods. len ( ) as u64 ) ,
45
51
ptr_align,
@@ -66,7 +72,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
66
72
}
67
73
68
74
self . memory . mark_immutable ( vtable. alloc_id ) ?;
69
- assert ! ( self . vtables. insert( ( ty, trait_ref ) , vtable. alloc_id) . is_none( ) ) ;
75
+ assert ! ( self . vtables. insert( ( ty, poly_trait_ref ) , vtable. alloc_id) . is_none( ) ) ;
70
76
71
77
Ok ( vtable)
72
78
}
0 commit comments