On 14.08.24 19:15, Danilo Krummrich wrote: > 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. Oh yeah of course... I don't know how I arrived at that comment... --- Cheers, Benno