On Wed, Aug 14, 2024 at 05:02:53PM +0000, Benno Lossin wrote: > On 14.08.24 18:59, Danilo Krummrich wrote: > > On Wed, Aug 14, 2024 at 04:21:38PM +0000, Benno Lossin wrote: > >> On 12.08.24 20:22, Danilo Krummrich wrote: > >>> + unsafe fn call( > >>> + &self, > >>> + ptr: Option<NonNull<u8>>, > >>> + layout: Layout, > >>> + flags: Flags, > >>> + ) -> Result<NonNull<[u8]>, AllocError> { > >>> + let size = aligned_size(layout); > >>> + let ptr = match ptr { > >>> + Some(ptr) => ptr.as_ptr(), > >>> + None => ptr::null(), > >>> + }; > >>> + > >>> + // SAFETY: `ptr` is either NULL or valid by the safety requirements of this function. > >>> + let raw_ptr = unsafe { > >>> + // If `size == 0` and `ptr != NULL` the memory behind the pointer is freed. > >>> + self.0(ptr.cast(), size, flags.0).cast() > >>> + }; > >>> + > >>> + let ptr = if size == 0 { > >> > >> Why do you do this check *after* calling `self.0`? > > > > Because I need `raw_ptr` in the else case below. > > But you can just return early above? I would prefer the check be done > before `self.0` is called. No, we can't return early, we need `self.0` to be called, because if `size == 0` we free the given allocation, if any. > > --- > Cheers, > Benno >