src/alloc.rs (29 lines of code) (raw):

// SPDX-License-Identifier: (Apache-2.0 OR MIT) use std::alloc::{GlobalAlloc, Layout}; use std::ffi::c_void; struct PyMemAllocator {} #[global_allocator] static ALLOCATOR: PyMemAllocator = PyMemAllocator {}; unsafe impl Sync for PyMemAllocator {} unsafe impl GlobalAlloc for PyMemAllocator { #[inline] unsafe fn alloc(&self, layout: Layout) -> *mut u8 { unsafe { pyo3_ffi::PyMem_Malloc(layout.size()) as *mut u8 } } #[inline] unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) { unsafe { pyo3_ffi::PyMem_Free(ptr as *mut c_void) } } #[inline] unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { unsafe { let len = layout.size(); let ptr = pyo3_ffi::PyMem_Malloc(len) as *mut u8; core::ptr::write_bytes(ptr, 0, len); ptr } } #[inline] unsafe fn realloc(&self, ptr: *mut u8, _layout: Layout, new_size: usize) -> *mut u8 { unsafe { pyo3_ffi::PyMem_Realloc(ptr as *mut c_void, new_size) as *mut u8 } } }