From: Bennet Bleßmann Date: Sat, 6 Jul 2024 21:08:21 +0000 (+0200) Subject: fix leak of ArenaAllocated IndexPtr X-Git-Tag: v0.10.0~127^2~8 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=89c1ea4232e4c2b66758b32c00e6adadea1acd3b;p=scryer-prolog.git fix leak of ArenaAllocated IndexPtr --- diff --git a/src/arena.rs b/src/arena.rs index fb42ac17..75ac69f0 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -627,6 +627,12 @@ impl ArenaAllocated for IndexPtr { arena.base = Some(NonNull::new(raw_box).unwrap()); allocated_ptr } + + /// # Safety + /// - ptr points to an allocated slab of the correct kind + unsafe fn dealloc(ptr: NonNull>) { + drop(unsafe { Box::from_raw(ptr.as_ptr().cast::()) }); + } } #[repr(C)] @@ -768,11 +774,15 @@ unsafe fn drop_slab_in_place(value: NonNull) { ArenaHeaderTag::StandardErrorStream => { drop_typed_slab_in_place!(StandardErrorStream, value); } - ArenaHeaderTag::NullStream - | ArenaHeaderTag::IndexPtrUndefined + ArenaHeaderTag::IndexPtrUndefined | ArenaHeaderTag::IndexPtrDynamicUndefined | ArenaHeaderTag::IndexPtrDynamicIndex - | ArenaHeaderTag::IndexPtrIndex => {} + | ArenaHeaderTag::IndexPtrIndex => { + drop_typed_slab_in_place!(IndexPtr, value); + } + ArenaHeaderTag::NullStream => { + unreachable!("NullStream is never arena allocated!"); + } } }