Skip to content

Commit 073f916

Browse files
committed
don't force allocate for most Unsize casts
only Arc<T> -> Arc<Trait> unsize casts are left
1 parent 9af5a0a commit 073f916

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

src/interpreter/mod.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
656656
use rustc::mir::repr::CastKind::*;
657657
match kind {
658658
Unsize => {
659-
// FIXME(solson)
660-
let dest = self.force_allocation(dest)?.to_ptr();
661659
let src = self.eval_operand(operand)?;
662660
let src_ty = self.operand_ty(operand);
663661
self.unsize_into(src, src_ty, dest, dest_ty)?;
@@ -1484,7 +1482,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
14841482
&mut self,
14851483
src: Value,
14861484
src_ty: Ty<'tcx>,
1487-
dest: Pointer,
1485+
dest: Lvalue<'tcx>,
14881486
dest_ty: Ty<'tcx>,
14891487
) -> EvalResult<'tcx, ()> {
14901488
match (&src_ty.sty, &dest_ty.sty) {
@@ -1498,33 +1496,32 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
14981496
match (&src_pointee_ty.sty, &dest_pointee_ty.sty) {
14991497
(&ty::TyArray(_, length), &ty::TySlice(_)) => {
15001498
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)?;
15051502
}
15061503
(&ty::TyTrait(_), &ty::TyTrait(_)) => {
15071504
// For now, upcasts are limited to changes in marker
15081505
// traits, and hence never actually require an actual
15091506
// change to the vtable.
1510-
self.write_value_to_ptr(src, dest, dest_ty)?;
1507+
self.write_value(src, dest, dest_ty)?;
15111508
},
15121509
(_, &ty::TyTrait(ref data)) => {
15131510
let trait_ref = data.principal.with_self_ty(self.tcx, src_pointee_ty);
15141511
let trait_ref = self.tcx.erase_regions(&trait_ref);
15151512
let vtable = self.get_vtable(trait_ref)?;
15161513
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)?;
15221517
},
15231518

15241519
_ => bug!("invalid unsizing {:?} -> {:?}", src_ty, dest_ty),
15251520
}
15261521
}
15271522
(&ty::TyAdt(def_a, substs_a), &ty::TyAdt(def_b, substs_b)) => {
1523+
// FIXME(solson)
1524+
let dest = self.force_allocation(dest)?.to_ptr();
15281525
// unsizing of generic struct with pointer fields
15291526
// Example: `Arc<T>` -> `Arc<Trait>`
15301527
// 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> {
15551552
if src_fty == dst_fty {
15561553
self.copy(src_f_ptr, dst_f_ptr, src_fty)?;
15571554
} 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)?;
15591556
}
15601557
}
15611558
}

0 commit comments

Comments
 (0)