From 13142dc7f38e6b148efadc97edffca8664b9cde7 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Wed, 20 Aug 2025 22:43:23 +0100 Subject: refactor lisp runtime to use vec_t* instead of ivec_t* bit nicer to look at, should have about the same painful performance hit anyway. --- alisp.h | 14 +++++--------- constructor.c | 6 +++--- sys.c | 6 +++--- tag.c | 12 ++++-------- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/alisp.h b/alisp.h index fe24c74..bf12784 100644 --- a/alisp.h +++ b/alisp.h @@ -53,7 +53,9 @@ typedef struct Vector void *data; } vec_t; -#define VEC_MULT 2 +#define VEC_MULT 2 +#define VEC_DEFAULT_CAPACITY 8 + void vec_free(vec_t *); void vec_ensure_free(vec_t *, u64); void vec_append(vec_t *, void *, u64); @@ -103,12 +105,6 @@ typedef struct lisp_t *car, *cdr; } cons_t; -typedef struct -{ - // 2 levels of indirection... disgusting - void *data; -} lvec_t; - /// System context - essentially something to help with system management typedef struct { @@ -129,7 +125,7 @@ lisp_t *cons(sys_t *, lisp_t *, lisp_t *); i64 as_int(lisp_t *); sv_t *as_sym(lisp_t *); cons_t *as_cons(lisp_t *); -void *as_vec(lisp_t *); +vec_t *as_vec(lisp_t *); #define CAR(L) (as_cons(L)->car) #define CDR(L) (as_cons(L)->cdr) @@ -174,6 +170,6 @@ tag_t get_tag(lisp_t *); lisp_t *tag_int(i64); lisp_t *tag_sym(sv_t *); lisp_t *tag_cons(cons_t *); -lisp_t *tag_vec(lvec_t *); +lisp_t *tag_vec(vec_t *); #endif diff --git a/constructor.c b/constructor.c index a20e66a..910ed2a 100644 --- a/constructor.c +++ b/constructor.c @@ -34,9 +34,9 @@ lisp_t *cons(sys_t *sys, lisp_t *car, lisp_t *cdr) lisp_t *make_vec(sys_t *sys, u64 capacity) { - lvec_t *lvec = calloc(1, sizeof(*lvec)); - ivec_make(&lvec->data, capacity); - lisp_t *ptr = tag_vec(lvec); + vec_t *vec = calloc(1, sizeof(*vec)); + vec_ensure_free(vec, MAX(capacity, VEC_DEFAULT_CAPACITY)); + lisp_t *ptr = tag_vec(vec); sys_register(sys, ptr); return ptr; } diff --git a/sys.c b/sys.c index 195b2a1..d3a9bb2 100644 --- a/sys.c +++ b/sys.c @@ -57,9 +57,9 @@ void sys_cleanup(sys_t *sys) break; case TAG_VEC: { - lvec_t *lvec = as_vec(allocated); - ivec_free(&lvec->data); - free(lvec); + vec_t *vec = as_vec(allocated); + vec_free(vec); + free(vec); break; } case TAG_NIL: diff --git a/tag.c b/tag.c index f5338d6..874d532 100644 --- a/tag.c +++ b/tag.c @@ -27,9 +27,9 @@ lisp_t *tag_sym(sv_t *str) return TAG((u64)str, SYM); } -lisp_t *tag_vec(lvec_t *lvec) +lisp_t *tag_vec(vec_t *vec) { - return TAG((u64)lvec, VEC); + return TAG((u64)vec, VEC); } lisp_t *tag_cons(cons_t *cons) @@ -69,12 +69,8 @@ cons_t *as_cons(lisp_t *obj) return (cons_t *)UNTAG(obj, CONS); } -void *as_vec(lisp_t *obj) +vec_t *as_vec(lisp_t *obj) { assert(IS_TAG(obj, VEC)); - lvec_t *vec = (lvec_t *)UNTAG(obj, VEC); - if (vec) - return vec->data; - else - return NULL; + return (vec_t *)UNTAG(obj, VEC); } -- cgit v1.2.3-13-gbd6f