@@ -21,7 +21,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
2121 & mut self ,
2222 ty : Ty < ' tcx > ,
2323 poly_trait_ref : Option < ty:: PolyExistentialTraitRef < ' tcx > > ,
24- ) -> InterpResult < ' tcx , Pointer < M :: PointerTag > > {
24+ ) -> InterpResult < ' tcx , Pointer < Option < M :: PointerTag > > > {
2525 trace ! ( "get_vtable(trait_ref={:?})" , poly_trait_ref) ;
2626
2727 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> {
3434
3535 let vtable_ptr = self . memory . global_base_pointer ( Pointer :: from ( vtable_allocation) ) ?;
3636
37- Ok ( vtable_ptr)
37+ Ok ( vtable_ptr. into ( ) )
3838 }
3939
4040 /// 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> {
126126 & self ,
127127 vtable : Pointer < Option < M :: PointerTag > > ,
128128 idx : u64 ,
129- ) -> InterpResult < ' tcx , Pointer < M :: PointerTag > > {
129+ ) -> InterpResult < ' tcx , Pointer < Option < M :: PointerTag > > > {
130130 let pointer_size = self . pointer_size ( ) ;
131131
132- let vtable = self
132+ let vtable_slot = vtable. offset ( pointer_size * idx, self ) ?;
133+ let new_vtable = self
133134 . 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 ) ?
139136 . 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 ( ) ?) ;
144139
145140 Ok ( new_vtable)
146141 }
0 commit comments