From 299accb717ff376bbb063cde7585d582b658d405 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 14:17:32 +1100 Subject: [PATCH] [mem]: Put panic allocator after nil allocator, adjust @require_results --- core/mem/allocators.odin | 115 +++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 2ee397316..649d5466a 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -3,6 +3,7 @@ package mem import "base:intrinsics" import "base:runtime" +@(require_results) nil_allocator :: proc() -> Allocator { return Allocator{ procedure = nil_allocator_proc, @@ -21,6 +22,62 @@ nil_allocator_proc :: proc( return nil, nil } + + +@(require_results) +panic_allocator :: proc() -> Allocator { + return Allocator{ + procedure = panic_allocator_proc, + data = nil, + } +} + +panic_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + switch mode { + case .Alloc: + if size > 0 { + panic("mem: panic allocator, .Alloc called", loc=loc) + } + case .Alloc_Non_Zeroed: + if size > 0 { + panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc) + } + case .Resize: + if size > 0 { + panic("mem: panic allocator, .Resize called", loc=loc) + } + case .Resize_Non_Zeroed: + if size > 0 { + panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc) + } + case .Free: + if old_memory != nil { + panic("mem: panic allocator, .Free called", loc=loc) + } + case .Free_All: + panic("mem: panic allocator, .Free_All called", loc=loc) + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory) + if set != nil { + set^ = {.Query_Features} + } + return nil, nil + + case .Query_Info: + panic("mem: panic allocator, .Query_Info called", loc=loc) + } + return nil, nil +} + + + Arena :: struct { data: []byte, offset: int, @@ -300,7 +357,6 @@ scratch_alloc_bytes_non_zeroed :: proc( return ptr, err } -@(require_results) scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) @@ -555,7 +611,6 @@ stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -@(require_results) stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -824,7 +879,6 @@ small_stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -@(require_results) small_stack_free :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -1254,60 +1308,6 @@ dynamic_arena_allocator_proc :: proc( -panic_allocator_proc :: proc( - allocator_data: rawptr, - mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, - old_size: int, - loc := #caller_location, -) -> ([]byte, Allocator_Error) { - switch mode { - case .Alloc: - if size > 0 { - panic("mem: panic allocator, .Alloc called", loc=loc) - } - case .Alloc_Non_Zeroed: - if size > 0 { - panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc) - } - case .Resize: - if size > 0 { - panic("mem: panic allocator, .Resize called", loc=loc) - } - case .Resize_Non_Zeroed: - if size > 0 { - panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc) - } - case .Free: - if old_memory != nil { - panic("mem: panic allocator, .Free called", loc=loc) - } - case .Free_All: - panic("mem: panic allocator, .Free_All called", loc=loc) - case .Query_Features: - set := (^Allocator_Mode_Set)(old_memory) - if set != nil { - set^ = {.Query_Features} - } - return nil, nil - - case .Query_Info: - panic("mem: panic allocator, .Query_Info called", loc=loc) - } - return nil, nil -} - -@(require_results) -panic_allocator :: proc() -> Allocator { - return Allocator{ - procedure = panic_allocator_proc, - data = nil, - } -} - - - Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool, @@ -1513,7 +1513,6 @@ buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) return nil, nil } -@(require_results) buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Error { if ptr != nil { if !(b.head <= ptr && ptr <= b.tail) {