@@ -21,7 +21,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
21
21
& mut self ,
22
22
ty : Ty < ' tcx > ,
23
23
poly_trait_ref : Option < ty:: PolyExistentialTraitRef < ' tcx > > ,
24
- ) -> InterpResult < ' tcx , Pointer < M :: PointerTag > > {
24
+ ) -> InterpResult < ' tcx , Pointer < Option < M :: PointerTag > > > {
25
25
trace ! ( "get_vtable(trait_ref={:?})" , poly_trait_ref) ;
26
26
27
27
let ( ty, poly_trait_ref) = self . tcx . erase_regions ( ( ty, poly_trait_ref) ) ;
@@ -34,7 +34,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
34
34
35
35
let vtable_ptr = self . memory . global_base_pointer ( Pointer :: from ( vtable_allocation) ) ?;
36
36
37
- Ok ( vtable_ptr)
37
+ Ok ( vtable_ptr. into ( ) )
38
38
}
39
39
40
40
/// Resolves the function at the specified slot in the provided
@@ -126,21 +126,16 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
126
126
& self ,
127
127
vtable : Pointer < Option < M :: PointerTag > > ,
128
128
idx : u64 ,
129
- ) -> InterpResult < ' tcx , Pointer < M :: PointerTag > > {
129
+ ) -> InterpResult < ' tcx , Pointer < Option < M :: PointerTag > > > {
130
130
let pointer_size = self . pointer_size ( ) ;
131
131
132
- let vtable = self
132
+ let vtable_slot = vtable. offset ( pointer_size * idx, self ) ?;
133
+ let new_vtable = self
133
134
. memory
134
- . get (
135
- vtable,
136
- pointer_size * idx. checked_add ( 1 ) . unwrap ( ) ,
137
- self . tcx . data_layout . pointer_align . abi ,
138
- ) ?
135
+ . get ( vtable_slot, pointer_size, self . tcx . data_layout . pointer_align . abi ) ?
139
136
. expect ( "cannot be a ZST" ) ;
140
- let new_vtable = self
141
- . scalar_to_ptr ( vtable. read_ptr_sized ( pointer_size * idx) ?. check_init ( ) ?)
142
- . into_pointer_or_addr ( )
143
- . expect ( "should be a pointer" ) ;
137
+
138
+ let new_vtable = self . scalar_to_ptr ( new_vtable. read_ptr_sized ( Size :: ZERO ) ?. check_init ( ) ?) ;
144
139
145
140
Ok ( new_vtable)
146
141
}
0 commit comments