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.
This commit is contained in:
14
alisp.h
14
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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
6
sys.c
6
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:
|
||||
|
||||
12
tag.c
12
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user