@@ -656,8 +656,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
656
656
use rustc:: mir:: repr:: CastKind :: * ;
657
657
match kind {
658
658
Unsize => {
659
- // FIXME(solson)
660
- let dest = self . force_allocation ( dest) ?. to_ptr ( ) ;
661
659
let src = self . eval_operand ( operand) ?;
662
660
let src_ty = self . operand_ty ( operand) ;
663
661
self . unsize_into ( src, src_ty, dest, dest_ty) ?;
@@ -1484,7 +1482,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
1484
1482
& mut self ,
1485
1483
src : Value ,
1486
1484
src_ty : Ty < ' tcx > ,
1487
- dest : Pointer ,
1485
+ dest : Lvalue < ' tcx > ,
1488
1486
dest_ty : Ty < ' tcx > ,
1489
1487
) -> EvalResult < ' tcx , ( ) > {
1490
1488
match ( & src_ty. sty , & dest_ty. sty ) {
@@ -1498,33 +1496,32 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
1498
1496
match ( & src_pointee_ty. sty , & dest_pointee_ty. sty ) {
1499
1497
( & ty:: TyArray ( _, length) , & ty:: TySlice ( _) ) => {
1500
1498
let ptr = src. read_ptr ( & self . memory ) ?;
1501
- self . memory . write_ptr ( dest, ptr) ?;
1502
- let ptr_size = self . memory . pointer_size ( ) as isize ;
1503
- let dest_extra = dest. offset ( ptr_size) ;
1504
- self . memory . write_usize ( dest_extra, length as u64 ) ?;
1499
+ let len = self . usize_primval ( length as u64 ) ;
1500
+ let ptr = PrimVal :: from_ptr ( ptr) ;
1501
+ self . write_value ( Value :: ByValPair ( ptr, len) , dest, dest_ty) ?;
1505
1502
}
1506
1503
( & ty:: TyTrait ( _) , & ty:: TyTrait ( _) ) => {
1507
1504
// For now, upcasts are limited to changes in marker
1508
1505
// traits, and hence never actually require an actual
1509
1506
// change to the vtable.
1510
- self . write_value_to_ptr ( src, dest, dest_ty) ?;
1507
+ self . write_value ( src, dest, dest_ty) ?;
1511
1508
} ,
1512
1509
( _, & ty:: TyTrait ( ref data) ) => {
1513
1510
let trait_ref = data. principal . with_self_ty ( self . tcx , src_pointee_ty) ;
1514
1511
let trait_ref = self . tcx . erase_regions ( & trait_ref) ;
1515
1512
let vtable = self . get_vtable ( trait_ref) ?;
1516
1513
let ptr = src. read_ptr ( & self . memory ) ?;
1517
-
1518
- self . memory . write_ptr ( dest, ptr) ?;
1519
- let ptr_size = self . memory . pointer_size ( ) as isize ;
1520
- let dest_extra = dest. offset ( ptr_size) ;
1521
- self . memory . write_ptr ( dest_extra, vtable) ?;
1514
+ let ptr = PrimVal :: from_ptr ( ptr) ;
1515
+ let extra = PrimVal :: from_ptr ( vtable) ;
1516
+ self . write_value ( Value :: ByValPair ( ptr, extra) , dest, dest_ty) ?;
1522
1517
} ,
1523
1518
1524
1519
_ => bug ! ( "invalid unsizing {:?} -> {:?}" , src_ty, dest_ty) ,
1525
1520
}
1526
1521
}
1527
1522
( & ty:: TyAdt ( def_a, substs_a) , & ty:: TyAdt ( def_b, substs_b) ) => {
1523
+ // FIXME(solson)
1524
+ let dest = self . force_allocation ( dest) ?. to_ptr ( ) ;
1528
1525
// unsizing of generic struct with pointer fields
1529
1526
// Example: `Arc<T>` -> `Arc<Trait>`
1530
1527
// here we need to increase the size of every &T thin ptr field to a fat ptr
@@ -1555,7 +1552,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
1555
1552
if src_fty == dst_fty {
1556
1553
self . copy ( src_f_ptr, dst_f_ptr, src_fty) ?;
1557
1554
} else {
1558
- self . unsize_into ( Value :: ByRef ( src_f_ptr) , src_fty, dst_f_ptr, dst_fty) ?;
1555
+ self . unsize_into ( Value :: ByRef ( src_f_ptr) , src_fty, Lvalue :: from_ptr ( dst_f_ptr) , dst_fty) ?;
1559
1556
}
1560
1557
}
1561
1558
}
0 commit comments