about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver 'ker' Schneider <git-spam-no-reply9815368754983@oli-obk.de>2016-11-11 11:55:47 +0100
committerOliver 'ker' Schneider <git-spam-no-reply9815368754983@oli-obk.de>2016-11-11 13:36:10 +0100
commit323c20c8a4747aa96285c90005a00aa43228af8e (patch)
tree763caab11bdebe7b3b6f4258ac72d83e8f426bd8
parent3ac9ec7dfdd3839f03b94e70d7187a30e7b7f759 (diff)
[breaking-change] change the `box_free` item to accept pointers to unsized types
-rw-r--r--src/doc/book/lang-items.md4
-rw-r--r--src/liballoc/heap.rs9
2 files changed, 7 insertions, 6 deletions
diff --git a/src/doc/book/lang-items.md b/src/doc/book/lang-items.md
index de7dbab3f12..9fb130845fb 100644
--- a/src/doc/book/lang-items.md
+++ b/src/doc/book/lang-items.md
@@ -46,8 +46,8 @@ unsafe fn deallocate(ptr: *mut u8, _size: usize, _align: usize) {
 }
 
 #[lang = "box_free"]
-unsafe fn box_free<T>(ptr: *mut T) {
-    deallocate(ptr as *mut u8, ::core::mem::size_of::<T>(), ::core::mem::align_of::<T>());
+unsafe fn box_free<T: ?Sized>(ptr: *mut T) {
+    deallocate(ptr as *mut u8, ::core::mem::size_of_val(&*ptr), ::core::mem::align_of_val(&*ptr));
 }
 
 #[start]
diff --git a/src/liballoc/heap.rs b/src/liballoc/heap.rs
index bfed8a8e83a..12809171b74 100644
--- a/src/liballoc/heap.rs
+++ b/src/liballoc/heap.rs
@@ -17,7 +17,7 @@
 
 use core::{isize, usize};
 #[cfg(not(test))]
-use core::intrinsics::{min_align_of, size_of};
+use core::intrinsics::{min_align_of_val, size_of_val};
 
 #[allow(improper_ctypes)]
 extern "C" {
@@ -152,11 +152,12 @@ unsafe fn exchange_free(ptr: *mut u8, old_size: usize, align: usize) {
 #[cfg(not(test))]
 #[lang = "box_free"]
 #[inline]
-unsafe fn box_free<T>(ptr: *mut T) {
-    let size = size_of::<T>();
+unsafe fn box_free<T: ?Sized>(ptr: *mut T) {
+    let size = size_of_val(&*ptr);
+    let align = min_align_of_val(&*ptr);
     // We do not allocate for Box<T> when T is ZST, so deallocation is also not necessary.
     if size != 0 {
-        deallocate(ptr as *mut u8, size, min_align_of::<T>());
+        deallocate(ptr as *mut u8, size, align);
     }
 }