9#define PM_ARENA_BLOCK_SIZE(data_size) (offsetof(pm_arena_block_t, data) + (data_size))
12#define PM_ARENA_INITIAL_SIZE 8192
15#define PM_ARENA_GROWTH_INTERVAL 8
18#define PM_ARENA_MAX_SIZE (1024 * 1024)
24pm_arena_next_block_size(
const pm_arena_t *arena,
size_t min_size) {
25 size_t size = PM_ARENA_INITIAL_SIZE;
27 for (
size_t exp = PM_ARENA_GROWTH_INTERVAL; exp <= arena->
block_count; exp += PM_ARENA_GROWTH_INTERVAL) {
28 if (size < PM_ARENA_MAX_SIZE) size *= 2;
31 return size > min_size ? size : min_size;
39pm_arena_block_new(
pm_arena_t *arena,
size_t data_size,
size_t initial_used) {
40 assert(initial_used <= data_size);
44 fprintf(stderr,
"prism: out of memory; aborting\n");
49 block->
used = initial_used;
64 if (capacity <= PM_ARENA_INITIAL_SIZE)
return;
66 pm_arena_block_new(arena, capacity, 0);
75 size_t block_data_size = pm_arena_next_block_size(arena, size);
87 while (block != NULL) {
89 xfree_sized(block, PM_ARENA_BLOCK_SIZE(block->
capacity));
#define xmalloc
Old name of ruby_xmalloc.
A bump allocator for the prism parser.
A single block of memory in the arena.
struct pm_arena_block * prev
The previous block in the chain (for freeing).
char data[PM_FLEX_ARY_LEN]
The block's data.
size_t used
The number of bytes consumed so far.
size_t capacity
The total usable bytes in data[].
size_t block_count
The number of blocks allocated.
pm_arena_block_t * current
The active block (allocate from here).