Skip to content

Commit

Permalink
don't use drop_in_place as an intrinsic
Browse files Browse the repository at this point in the history
  • Loading branch information
Gankra authored and apasel422 committed Oct 30, 2015
1 parent e72c226 commit e351595
Show file tree
Hide file tree
Showing 9 changed files with 20 additions and 20 deletions.
15 changes: 6 additions & 9 deletions src/doc/nomicon/destructors.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,11 @@ this is totally fine.
For instance, a custom implementation of `Box` might write `Drop` like this:

```rust
#![feature(alloc, heap_api, core_intrinsics, unique)]
#![feature(alloc, heap_api, drop_in_place, unique)]

extern crate alloc;

use std::ptr::Unique;
use std::intrinsics::drop_in_place;
use std::ptr::{drop_in_place, Unique};
use std::mem;

use alloc::heap;
Expand All @@ -58,12 +57,11 @@ use-after-free the `ptr` because when drop exits, it becomes inaccessible.
However this wouldn't work:

```rust
#![feature(alloc, heap_api, core_intrinsics, unique)]
#![feature(alloc, heap_api, drop_in_place, unique)]

extern crate alloc;

use std::ptr::Unique;
use std::intrinsics::drop_in_place;
use std::ptr::{drop_in_place, Unique};
use std::mem;

use alloc::heap;
Expand Down Expand Up @@ -137,12 +135,11 @@ The classic safe solution to overriding recursive drop and allowing moving out
of Self during `drop` is to use an Option:

```rust
#![feature(alloc, heap_api, core_intrinsics, unique)]
#![feature(alloc, heap_api, drop_in_place, unique)]

extern crate alloc;

use std::ptr::Unique;
use std::intrinsics::drop_in_place;
use std::ptr::{drop_in_place, Unique};
use std::mem;

use alloc::heap;
Expand Down
4 changes: 2 additions & 2 deletions src/liballoc/arc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ use core::borrow;
use core::fmt;
use core::cmp::Ordering;
use core::mem::{align_of_val, size_of_val};
use core::intrinsics::{drop_in_place, abort};
use core::intrinsics::abort;
use core::mem;
use core::ops::{Deref, CoerceUnsized};
use core::ptr::{self, Shared};
Expand Down Expand Up @@ -304,7 +304,7 @@ impl<T: ?Sized> Arc<T> {

// Destroy the data at this time, even though we may not free the box
// allocation itself (there may still be weak pointers lying around).
drop_in_place(&mut (*ptr).data);
ptr::drop_in_place(&mut (*ptr).data);

if self.inner().weak.fetch_sub(1, Release) == 1 {
atomic::fence(Acquire);
Expand Down
4 changes: 2 additions & 2 deletions src/liballoc/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ use core::cell::Cell;
use core::cmp::Ordering;
use core::fmt;
use core::hash::{Hasher, Hash};
use core::intrinsics::{assume, drop_in_place, abort};
use core::intrinsics::{assume, abort};
use core::marker::{self, Unsize};
use core::mem::{self, align_of_val, size_of_val, forget};
use core::ops::{CoerceUnsized, Deref};
Expand Down Expand Up @@ -460,7 +460,7 @@ impl<T: ?Sized> Drop for Rc<T> {
self.dec_strong();
if self.strong() == 0 {
// destroy the contained object
drop_in_place(&mut (*ptr).value);
ptr::drop_in_place(&mut (*ptr).value);

// remove the implicit "strong weak" pointer now that we've
// destroyed the contents.
Expand Down
1 change: 1 addition & 0 deletions src/libcollections/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
#![feature(dropck_parametricity)]
#![feature(unsafe_no_drop_flag, filling_drop)]
#![feature(decode_utf16)]
#![feature(drop_in_place)]
#![cfg_attr(test, feature(clone_from_slice, rand, test))]

#![feature(no_std)]
Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ use alloc::heap::EMPTY;
use core::cmp::Ordering;
use core::fmt;
use core::hash::{self, Hash};
use core::intrinsics::{arith_offset, assume, drop_in_place, needs_drop};
use core::intrinsics::{arith_offset, assume, needs_drop};
use core::iter::FromIterator;
use core::mem;
use core::ops::{Index, IndexMut, Deref};
Expand Down Expand Up @@ -1394,7 +1394,7 @@ impl<T> Drop for Vec<T> {
// Without the branch, dropping Vec<u8> takes linear time.
if needs_drop::<T>() {
for x in self.iter_mut() {
drop_in_place(x);
ptr::drop_in_place(x);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/libcore/intrinsics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ extern "rust-intrinsic" {

/// Executes the destructor (if any) of the pointed-to value.
///
/// This has two usecases:
/// This has two use cases:
///
/// * It is *required* to use `drop_in_place` to drop unsized types like
/// trait objects, because they can't be read out onto the stack and
Expand All @@ -209,7 +209,7 @@ extern "rust-intrinsic" {
/// as the compiler doesn't need to prove that it's sound to elide the
/// copy.
///
/// # Undefined Behaviour
/// # Undefined Behavior
///
/// This has all the same safety problems as `ptr::read` with respect to
/// invalid pointers, types, and double drops.
Expand Down
2 changes: 2 additions & 0 deletions src/libstd/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,8 @@
#![feature(vec_push_all)]
#![feature(wrapping)]
#![feature(zero_one)]
#![feature(drop_in_place)]

#![cfg_attr(windows, feature(str_utf16))]
#![cfg_attr(test, feature(float_from_str_radix, range_inclusive, float_extras))]
#![cfg_attr(test, feature(test, rustc_private))]
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/thread/local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ mod imp {
if cfg!(target_os = "macos") {
ptr::read((*ptr).inner.get());
} else {
intrinsics::drop_in_place((*ptr).inner.get());
ptr::drop_in_place((*ptr).inner.get());
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/run-pass/extern_fat_drop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@

// aux-build:fat_drop.rs

#![feature(core_intrinsics)]
#![feature(drop_in_place)]

extern crate fat_drop;

fn main() {
unsafe {
let s: &mut fat_drop::S = std::mem::uninitialized();
std::intrinsics::drop_in_place(s);
std::ptr::drop_in_place(s);
assert!(fat_drop::DROPPED);
}
}

0 comments on commit e351595

Please sign in to comment.