mirror of
https://github.com/odin-lang/Odin.git
synced 2026-03-02 06:38:21 +00:00
Wrap intrinsics.overflow_add to safe_add
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package mem_virtual
|
||||
|
||||
import "core:mem"
|
||||
import "core:intrinsics"
|
||||
|
||||
Arena_Kind :: enum uint {
|
||||
Growing = 0, // chained memory blocks (singly linked list)
|
||||
@@ -57,7 +56,7 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l
|
||||
|
||||
switch arena.kind {
|
||||
case .Growing:
|
||||
if arena.curr_block == nil || (intrinsics.overflow_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.reserved {
|
||||
if arena.curr_block == nil || (safe_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.reserved {
|
||||
size = mem.align_forward_uint(size, alignment)
|
||||
if arena.minimum_block_size == 0 {
|
||||
arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE
|
||||
@@ -299,6 +298,3 @@ arena_temp_end :: proc(temp: Arena_Temp, loc := #caller_location) {
|
||||
arena_check_temp :: proc(arena: ^Arena, loc := #caller_location) {
|
||||
assert(arena.temp_count == 0, "Arena_Temp not been ended", loc)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
package mem_virtual
|
||||
|
||||
// arena_init :: proc{
|
||||
// static_arena_init,
|
||||
// growing_arena_init,
|
||||
// }
|
||||
|
||||
// arena_temp_begin :: proc{
|
||||
// static_arena_temp_begin,
|
||||
// growing_arena_temp_begin,
|
||||
// }
|
||||
|
||||
// arena_temp_end :: proc{
|
||||
// static_arena_temp_end,
|
||||
// growing_arena_temp_end,
|
||||
// }
|
||||
|
||||
// arena_check_temp :: proc{
|
||||
// static_arena_check_temp,
|
||||
// growing_arena_check_temp,
|
||||
// }
|
||||
|
||||
// arena_allocator :: proc{
|
||||
// static_arena_allocator,
|
||||
// growing_arena_allocator,
|
||||
// }
|
||||
|
||||
// arena_alloc :: proc{
|
||||
// static_arena_alloc,
|
||||
// growing_arena_alloc,
|
||||
// }
|
||||
|
||||
// arena_free_all :: proc{
|
||||
// static_arena_free_all,
|
||||
// growing_arena_free_all,
|
||||
// }
|
||||
|
||||
// arena_destroy :: proc{
|
||||
// static_arena_destroy,
|
||||
// growing_arena_destroy,
|
||||
// }
|
||||
@@ -136,13 +136,13 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint)
|
||||
}
|
||||
|
||||
alignment_offset := calc_alignment_offset(block, uintptr(alignment))
|
||||
size, size_ok := intrinsics.overflow_add(min_size, alignment_offset)
|
||||
size, size_ok := safe_add(min_size, alignment_offset)
|
||||
if !size_ok {
|
||||
err = .Out_Of_Memory
|
||||
return
|
||||
}
|
||||
|
||||
if to_be_used, ok := intrinsics.overflow_add(block.used, size); !ok || to_be_used > block.reserved {
|
||||
if to_be_used, ok := safe_add(block.used, size); !ok || to_be_used > block.reserved {
|
||||
err = .Out_Of_Memory
|
||||
return
|
||||
}
|
||||
@@ -166,3 +166,10 @@ memory_block_dealloc :: proc(block_to_free: ^Memory_Block) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@(private)
|
||||
safe_add :: #force_inline proc "contextless" (x, y: uint) -> (uint, bool) {
|
||||
z, did_overflow := intrinsics.overflow_add(x, y)
|
||||
return z, !did_overflow
|
||||
}
|
||||
Reference in New Issue
Block a user