diff --git a/Cargo.toml b/Cargo.toml index f96220e..4cd5160 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,4 +42,5 @@ debug = [] # Enable experimental support for the standard library's unstable allocator API. allocator-api = [] +nightly = [] rustc-dep-of-std = ['core', 'compiler_builtins/rustc-dep-of-std'] diff --git a/src/lib.rs b/src/lib.rs index de1f1c9..cba745f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,8 +17,12 @@ #![no_std] #![deny(missing_docs)] +#[cfg(all(feature = "allocator-api", not(feature = "nightly")))] +use core::alloc::Alloc; +#[cfg(all(feature = "allocator-api", feature = "nightly"))] +use core::alloc::AllocRef; #[cfg(feature = "allocator-api")] -use core::alloc::{Alloc, AllocErr, Layout}; +use core::alloc::{AllocErr, Layout}; use core::cmp; use core::ptr; @@ -130,7 +134,7 @@ impl Dlmalloc { } } -#[cfg(feature = "allocator-api")] +#[cfg(all(feature = "allocator-api", not(feature = "nightly")))] unsafe impl Alloc for Dlmalloc { #[inline] unsafe fn alloc(&mut self, layout: Layout) -> Result, AllocErr> { @@ -160,3 +164,45 @@ unsafe impl Alloc for Dlmalloc { ptr::NonNull::new(ptr).ok_or(AllocErr) } } + +#[cfg(all(feature = "allocator-api", feature = "nightly"))] +unsafe impl AllocRef for Dlmalloc { + #[inline] + unsafe fn alloc(&mut self, layout: Layout) -> Result<(ptr::NonNull, usize), AllocErr> { + let layout_size = layout.size(); + let ptr = ::malloc(self, layout_size, layout.align()); + ptr::NonNull::new(ptr) + .ok_or(AllocErr) + .map(|ptr| (ptr, layout_size)) + } + + #[inline] + unsafe fn dealloc(&mut self, ptr: ptr::NonNull, layout: Layout) { + ::free(self, ptr.as_ptr(), layout.size(), layout.align()) + } + + #[inline] + unsafe fn realloc( + &mut self, + ptr: ptr::NonNull, + layout: Layout, + new_size: usize, + ) -> Result<(ptr::NonNull, usize), AllocErr> { + let ptr = ::realloc(self, ptr.as_ptr(), layout.size(), layout.align(), new_size); + ptr::NonNull::new(ptr) + .ok_or(AllocErr) + .map(|ptr| (ptr, new_size)) + } + + #[inline] + unsafe fn alloc_zeroed( + &mut self, + layout: Layout, + ) -> Result<(ptr::NonNull, usize), AllocErr> { + let layout_size = layout.size(); + let ptr = ::calloc(self, layout_size, layout.align()); + ptr::NonNull::new(ptr) + .ok_or(AllocErr) + .map(|ptr| (ptr, layout_size)) + } +}