aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2025-08-20 22:43:23 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2025-08-20 22:43:23 +0100
commit13142dc7f38e6b148efadc97edffca8664b9cde7 (patch)
tree068eb442645caf65e2ac2ff0a4d5f44f158c5a88
parent6e2db6825d4ff4b57be3086f654a84cc9ff64bcf (diff)
downloadalisp-13142dc7f38e6b148efadc97edffca8664b9cde7.tar.gz
alisp-13142dc7f38e6b148efadc97edffca8664b9cde7.tar.bz2
alisp-13142dc7f38e6b148efadc97edffca8664b9cde7.zip
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.
-rw-r--r--alisp.h14
-rw-r--r--constructor.c6
-rw-r--r--sys.c6
-rw-r--r--tag.c12
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);
}