mirror of
https://github.com/bearlanguageorg/bear.git
synced 2026-08-26 17:07:01 +00:00
53 lines
1.2 KiB
V
53 lines
1.2 KiB
V
// toolchain alloc
|
|
// A tiny byte arena for toolchain scratch memory: allocate fixed-size blocks
|
|
// from a pre-sized arena and release them all at once.
|
|
// Run standalone with: v run bin/tl_alloc.v
|
|
|
|
module main
|
|
|
|
struct Arena {
|
|
mut:
|
|
data []u8
|
|
used int
|
|
}
|
|
|
|
// new_arena reserves `cap` bytes of scratch memory.
|
|
fn new_arena(cap int) Arena {
|
|
return Arena{
|
|
data: []u8{len: cap}
|
|
used: 0
|
|
}
|
|
}
|
|
|
|
// alloc returns an offset into the arena for a block of `n` bytes.
|
|
fn (mut a Arena) alloc(n int) !int {
|
|
if a.used + n > a.data.len {
|
|
return error('arena out of memory: need ${n} bytes, ${a.data.len - a.used} left')
|
|
}
|
|
off := a.used
|
|
a.used += n
|
|
return off
|
|
}
|
|
|
|
// free_all releases everything allocated so far.
|
|
fn (mut a Arena) free_all() {
|
|
a.used = 0
|
|
}
|
|
|
|
fn (a Arena) stats() string {
|
|
return 'arena: ${a.used} / ${a.data.len} bytes used'
|
|
}
|
|
|
|
fn main() {
|
|
mut arena := new_arena(1024 * 1024) // 1 MiB
|
|
println('toolchain alloc: arena ready')
|
|
println(arena.stats())
|
|
off1 := arena.alloc(64) or { eprintln(err); exit(1) }
|
|
off2 := arena.alloc(4096) or { eprintln(err); exit(1) }
|
|
println('allocated 64 bytes at offset ${off1}')
|
|
println('allocated 4096 bytes at offset ${off2}')
|
|
println(arena.stats())
|
|
arena.free_all()
|
|
println('after free_all: ${arena.stats()}')
|
|
}
|