1
Fork 0

Remove filling drop to prep for elaborated drops.

This commit is contained in:
Scott Olson 2016-06-30 21:30:03 -06:00
parent 339e703e0b
commit 756d73b3ca
4 changed files with 8 additions and 38 deletions

View file

@ -820,9 +820,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
fn move_(&mut self, src: Pointer, dest: Pointer, ty: Ty<'tcx>) -> EvalResult<'tcx, ()> { fn move_(&mut self, src: Pointer, dest: Pointer, ty: Ty<'tcx>) -> EvalResult<'tcx, ()> {
let size = self.type_size(ty); let size = self.type_size(ty);
self.memory.copy(src, dest, size)?; self.memory.copy(src, dest, size)?;
if self.type_needs_drop(ty) {
self.memory.drop_fill(src, size)?;
}
Ok(()) Ok(())
} }

View file

@ -6,7 +6,7 @@ use rustc::ty::layout::Layout;
use rustc::ty::subst::{self, Substs}; use rustc::ty::subst::{self, Substs};
use rustc::ty::{self, Ty, TyCtxt, BareFnTy}; use rustc::ty::{self, Ty, TyCtxt, BareFnTy};
use std::rc::Rc; use std::rc::Rc;
use std::{iter, mem}; use std::iter;
use syntax::{ast, attr}; use syntax::{ast, attr};
use syntax::codemap::{DUMMY_SP, Span}; use syntax::codemap::{DUMMY_SP, Span};
@ -303,11 +303,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
self.memory.write_uint(dest, discr_val, 8)?; self.memory.write_uint(dest, discr_val, 8)?;
} }
"forget" => { "forget" => {}
let arg_ty = *substs.types.get(subst::FnSpace, 0);
let arg_size = self.type_size(arg_ty);
self.memory.drop_fill(args_ptrs[0], arg_size)?;
}
"init" => self.memory.write_repeat(dest, 0, dest_layout.size(&self.tcx.data_layout).bytes() as usize)?, "init" => self.memory.write_repeat(dest, 0, dest_layout.size(&self.tcx.data_layout).bytes() as usize)?,
@ -549,35 +545,17 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
// TODO(solson): Call user-defined Drop::drop impls. // TODO(solson): Call user-defined Drop::drop impls.
match ty.sty { match ty.sty {
ty::TyBox(contents_ty) => { ty::TyBox(_contents_ty) => {
match self.memory.read_ptr(ptr) { let contents_ptr = self.memory.read_ptr(ptr)?;
Ok(contents_ptr) => { // self.drop(contents_ptr, contents_ty)?;
self.drop(contents_ptr, contents_ty)?;
trace!("-deallocating box"); trace!("-deallocating box");
self.memory.deallocate(contents_ptr)?; self.memory.deallocate(contents_ptr)?;
} }
Err(EvalError::ReadBytesAsPointer) => {
let size = self.memory.pointer_size();
let possible_drop_fill = self.memory.read_bytes(ptr, size)?;
if possible_drop_fill.iter().all(|&b| b == mem::POST_DROP_U8) {
return Ok(());
} else {
return Err(EvalError::ReadBytesAsPointer);
}
}
Err(e) => return Err(e),
}
}
// TODO(solson): Implement drop for other relevant types (e.g. aggregates). // TODO(solson): Implement drop for other relevant types (e.g. aggregates).
_ => {} _ => {}
} }
// Filling drop.
// FIXME(solson): Trait objects (with no static size) probably get filled, too.
let size = self.type_size(ty);
self.memory.drop_fill(ptr, size)?;
Ok(()) Ok(())
} }
} }

View file

@ -2,7 +2,6 @@
btree_range, btree_range,
collections, collections,
collections_bound, collections_bound,
filling_drop,
question_mark, question_mark,
rustc_private, rustc_private,
pub_restricted, pub_restricted,

View file

@ -1,7 +1,7 @@
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian, BigEndian, self}; use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian, BigEndian, self};
use std::collections::Bound::{Included, Excluded}; use std::collections::Bound::{Included, Excluded};
use std::collections::{btree_map, BTreeMap, HashMap, HashSet, VecDeque}; use std::collections::{btree_map, BTreeMap, HashMap, HashSet, VecDeque};
use std::{fmt, iter, mem, ptr}; use std::{fmt, iter, ptr};
use rustc::hir::def_id::DefId; use rustc::hir::def_id::DefId;
use rustc::ty::BareFnTy; use rustc::ty::BareFnTy;
@ -340,10 +340,6 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
Ok(()) Ok(())
} }
pub fn drop_fill(&mut self, ptr: Pointer, size: usize) -> EvalResult<'tcx, ()> {
self.write_repeat(ptr, mem::POST_DROP_U8, size)
}
pub fn read_ptr(&self, ptr: Pointer) -> EvalResult<'tcx, Pointer> { pub fn read_ptr(&self, ptr: Pointer) -> EvalResult<'tcx, Pointer> {
let size = self.pointer_size(); let size = self.pointer_size();
self.check_defined(ptr, size)?; self.check_defined(ptr, size)?;