]> Repositorios git - scryer-prolog.git/commitdiff
fix leak of ArenaAllocated IndexPtr
authorBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 21:08:21 +0000 (23:08 +0200)
committerBennet Bleßmann <[email protected]>
Sun, 7 Jul 2024 09:30:56 +0000 (11:30 +0200)
src/arena.rs

index fb42ac17f033624b206be0cbebe4a81d436d3804..75ac69f00a251203b37c19288117e3fc40b05097 100644 (file)
@@ -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<TypedAllocSlab<Self>>) {
+        drop(unsafe { Box::from_raw(ptr.as_ptr().cast::<AllocSlab>()) });
+    }
 }
 
 #[repr(C)]
@@ -768,11 +774,15 @@ unsafe fn drop_slab_in_place(value: NonNull<AllocSlab>) {
         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!");
+        }
     }
 }