mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-07 21:43:15 +00:00
[mem]: Put panic allocator after nil allocator, adjust @require_results
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user