lisp: split memory into its own structure

This commit is contained in:
2026-02-12 08:28:49 +00:00
committed by oreodave
parent b51aaa3d65
commit 042cc48e8c
2 changed files with 20 additions and 12 deletions

View File

@@ -71,6 +71,12 @@ typedef struct
{ {
vec_t conses; vec_t conses;
vec_t vectors; vec_t vectors;
u64 num_conses, num_vectors;
} sys_mem_t;
typedef struct
{
sys_mem_t memory;
sym_table_t symtable; sym_table_t symtable;
} sys_t; } sys_t;

View File

@@ -23,21 +23,22 @@ lisp_t *sys_alloc(sys_t *sys, tag_t type)
{ {
cons_t *cons = calloc(1, sizeof(*cons)); cons_t *cons = calloc(1, sizeof(*cons));
lisp_t *lisp = tag_cons(cons); lisp_t *lisp = tag_cons(cons);
vec_append(&sys->conses, &lisp, sizeof(&lisp)); vec_append(&sys->memory.conses, &lisp, sizeof(&lisp));
sys->memory.num_conses++;
return lisp; return lisp;
} }
case TAG_VEC: case TAG_VEC:
{ {
vec_t *vec = calloc(1, sizeof(*vec)); vec_t *vec = calloc(1, sizeof(*vec));
lisp_t *lisp = tag_vec(vec); lisp_t *lisp = tag_vec(vec);
vec_append(&sys->vectors, &lisp, sizeof(&lisp)); vec_append(&sys->memory.vectors, &lisp, sizeof(&lisp));
sys->memory.num_vectors++;
return lisp; return lisp;
} }
// Shouldn't be registered // Shouldn't be registered
case TAG_NIL: case TAG_NIL:
case TAG_INT: case TAG_INT:
case TAG_SYM: case TAG_SYM:
case NUM_TAGS:
default: default:
FAIL("Unreachable"); FAIL("Unreachable");
} }
@@ -47,12 +48,13 @@ lisp_t *sys_alloc(sys_t *sys, tag_t type)
u64 sys_cost(sys_t *sys) u64 sys_cost(sys_t *sys)
{ {
u64 vec_capacity = 0; u64 vec_capacity = 0;
for (u64 i = 0; i < VEC_SIZE(&sys->vectors, lisp_t *); ++i) for (u64 i = 0; i < sys->memory.num_vectors; ++i)
{ {
lisp_t *vec = VEC_GET(&sys->vectors, i, lisp_t *); lisp_t *vec = VEC_GET(&sys->memory.vectors, i, lisp_t *);
vec_capacity += as_vec(vec)->capacity; vec_capacity += as_vec(vec)->capacity;
} }
return sym_table_cost(&sys->symtable) + sys->conses.capacity + vec_capacity; return sym_table_cost(&sys->symtable) +
(sys->memory.num_conses * sizeof(cons_t)) + vec_capacity;
} }
void sys_free(sys_t *sys) void sys_free(sys_t *sys)
@@ -60,22 +62,22 @@ void sys_free(sys_t *sys)
sym_table_free(&sys->symtable); sym_table_free(&sys->symtable);
// Iterate through each cell of memory currently allocated and free them // Iterate through each cell of memory currently allocated and free them
for (size_t i = 0; i < VEC_SIZE(&sys->conses, lisp_t **); ++i) for (size_t i = 0; i < VEC_SIZE(&sys->memory.conses, lisp_t **); ++i)
{ {
lisp_t *allocated = VEC_GET(&sys->conses, i, lisp_t *); lisp_t *allocated = VEC_GET(&sys->memory.conses, i, lisp_t *);
lisp_free(allocated); lisp_free(allocated);
} }
// Iterate through each cell of memory currently allocated and free them // Iterate through each cell of memory currently allocated and free them
for (size_t i = 0; i < VEC_SIZE(&sys->vectors, lisp_t **); ++i) for (size_t i = 0; i < VEC_SIZE(&sys->memory.vectors, lisp_t **); ++i)
{ {
lisp_t *allocated = VEC_GET(&sys->vectors, i, lisp_t *); lisp_t *allocated = VEC_GET(&sys->memory.vectors, i, lisp_t *);
lisp_free(allocated); lisp_free(allocated);
} }
// Free the containers // Free the containers
vec_free(&sys->conses); vec_free(&sys->memory.conses);
vec_free(&sys->vectors); vec_free(&sys->memory.vectors);
// Ensure no one treats this as active in any sense // Ensure no one treats this as active in any sense
memset(sys, 0, sizeof(*sys)); memset(sys, 0, sizeof(*sys));