@@ -465,36 +465,38 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
465
465
/// Return the size and alignment of the value at the given type.
466
466
/// Note that the value does not matter if the type is sized. For unsized types,
467
467
/// the value has to be a fat pointer, and we only care about the "extra" data in it.
468
- pub fn size_and_align_of_dst (
468
+ pub fn size_and_align_of_val (
469
469
& self ,
470
470
val : ValTy < ' tcx > ,
471
471
) -> EvalResult < ' tcx , ( Size , Align ) > {
472
- if !val. layout . is_unsized ( ) {
473
- Ok ( val. layout . size_and_align ( ) )
472
+ let pointee_ty = val. layout . ty . builtin_deref ( true ) . unwrap ( ) . ty ;
473
+ let layout = self . layout_of ( pointee_ty) ?;
474
+ if !layout. is_unsized ( ) {
475
+ Ok ( layout. size_and_align ( ) )
474
476
} else {
475
- match val . layout . ty . sty {
477
+ match layout. ty . sty {
476
478
ty:: TyAdt ( ..) | ty:: TyTuple ( ..) => {
477
479
// First get the size of all statically known fields.
478
480
// Don't use type_of::sizing_type_of because that expects t to be sized,
479
481
// and it also rounds up to alignment, which we want to avoid,
480
482
// as the unsized field's alignment could be smaller.
481
- assert ! ( !val . layout. ty. is_simd( ) ) ;
482
- debug ! ( "DST layout: {:?}" , val . layout) ;
483
+ assert ! ( !layout. ty. is_simd( ) ) ;
484
+ debug ! ( "DST layout: {:?}" , layout) ;
483
485
484
- let sized_size = val . layout . fields . offset ( val . layout . fields . count ( ) - 1 ) ;
485
- let sized_align = val . layout . align ;
486
+ let sized_size = layout. fields . offset ( layout. fields . count ( ) - 1 ) ;
487
+ let sized_align = layout. align ;
486
488
debug ! (
487
489
"DST {} statically sized prefix size: {:?} align: {:?}" ,
488
- val . layout. ty,
490
+ layout. ty,
489
491
sized_size,
490
492
sized_align
491
493
) ;
492
494
493
495
// Recurse to get the size of the dynamically sized field (must be
494
496
// the last field).
495
- let field_layout = val . layout . field ( self , val . layout . fields . count ( ) - 1 ) ?;
497
+ let field_layout = layout. field ( self , layout. fields . count ( ) - 1 ) ?;
496
498
let ( unsized_size, unsized_align) =
497
- self . size_and_align_of_dst ( ValTy {
499
+ self . size_and_align_of_val ( ValTy {
498
500
value : val. value ,
499
501
layout : field_layout
500
502
} ) ?;
@@ -533,12 +535,12 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
533
535
}
534
536
535
537
ty:: TySlice ( _) | ty:: TyStr => {
536
- let ( elem_size, align) = val . layout . field ( self , 0 ) ?. size_and_align ( ) ;
538
+ let ( elem_size, align) = layout. field ( self , 0 ) ?. size_and_align ( ) ;
537
539
let ( _, len) = val. to_scalar_slice ( self ) ?;
538
540
Ok ( ( elem_size * len, align) )
539
541
}
540
542
541
- _ => bug ! ( "size_of_val::<{:?}>" , val . layout. ty) ,
543
+ _ => bug ! ( "size_of_val::<{:?}>" , layout. ty) ,
542
544
}
543
545
}
544
546
}
@@ -963,10 +965,9 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
963
965
self . memory . dump_allocs ( allocs) ;
964
966
}
965
967
Place :: Ptr ( mplace) => {
966
- let ( ptr, align) = mplace. to_scalar_ptr_align ( ) ;
967
- match ptr {
968
+ match mplace. ptr {
968
969
Scalar :: Ptr ( ptr) => {
969
- trace ! ( "by align({}) ref:" , align. abi( ) ) ;
970
+ trace ! ( "by align({}) ref:" , mplace . align. abi( ) ) ;
970
971
self . memory . dump_alloc ( ptr. alloc_id ) ;
971
972
}
972
973
ptr => trace ! ( " integral by ref: {:?}" , ptr) ,
0 commit comments