diff options
Diffstat (limited to 'src/value.c')
-rw-r--r-- | src/value.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/src/value.c b/src/value.c index 94a7acd..547da96 100644 --- a/src/value.c +++ b/src/value.c @@ -1,21 +1,27 @@ +#include <stdio.h> #include <stdlib.h> #include <string.h> #include "common.h" #include "value.h" + #include "lexer.h" -#include "mempool.h" -MEMPOOL_GENERATE(value, struct value, 64) -#define NOT_IMPLEMENTED() die("Not Implemented. ABORTING") +// #ifdef ENABLE_MEMPOOL + #include "mempool.h" + MEMPOOL_GENERATE(value, struct value, 64) + #define value_alloc() value_mempool_allocate() + #define value_free(v) value_mempool_free(v) +// #else + // #define value_alloc() malloc(sizeof(struct value)) + // #define value_free(v) free(v) +// #endif const char * const value_type_string[] = { VALUE_TYPES(TO_STRING) }; -#define VALUE(_value) (_value)->value - #define FN(fn, ...) return fn(buf, buf_sz, __VA_ARGS__) #define VALUE_STRING_TABLE(X, v, buf, buf_sz) \ X(VALUE_NIL, FN(snprintf, "(nil)")) \ @@ -34,9 +40,9 @@ const char * const value_type_string[] = { X(VALUE_ATOM, if(NOREFS(v)) free(vvalue_atom(v))) \ X(VALUE_STR, if(NOREFS(v)) free(vvalue_str(v))) \ X(VALUE_INT, (void)NOREFS(v)) \ - X(VALUE_CONS, (void)NOREFS(v); \ + X(VALUE_CONS, if(NOREFS(v)) { \ value_destroy(vvalue_cons(v).left); \ - value_destroy(vvalue_cons(v).right)) \ + value_destroy(vvalue_cons(v).right);}) \ X(VALUE_PROC, if(NOREFS(v)) proc_destroy(&vvalue_proc(v))) \ X(VALUE_MACRO, if(NOREFS(v)) proc_destroy(&vvalue_proc(v))) \ X(VALUE_PROC_BUILTIN, (void)NOREFS(v)) @@ -63,12 +69,6 @@ const char * const value_type_string[] = { X(VALUE_MACRO, proc) \ X(VALUE_PROC_BUILTIN, proc_builtin) -// #define value_alloc() malloc(sizeof(struct value)) -// #define value_dealloc(v) free(v) -#define value_alloc() value_mempool_allocate() -#define value_free(v) value_mempool_free(v) - - static char *str_alloc_copy(char *src); static int cons_print(char *buf, size_t buf_sz, struct cons *cons); @@ -123,14 +123,8 @@ value_t value_from_token(struct token *token) value_t value_copy(value_t value) { if(!value) return value; - + value_inc_refs(value); - - if(vvalue_type(value) == VALUE_CONS) { - value_copy(vvalue_cons(value).left); - value_copy(vvalue_cons(value).right); - } - return value; } @@ -145,6 +139,24 @@ int value_string(value_t value, size_t buf_sz, char *buf) return 0; } +char *value_static_string(value_t value) +{ + static char str[1024] = {0}; + + if(value_string(value, sizeof(str), str) > 0) + return str; + return NULL; +} + +#ifdef DEBUG +void value_print(value_t value) +{ + printf("%-12s %s", value ? + value_type_string[vvalue_type(value)] : "", + value_static_string(value)); +} +#endif + static char *str_alloc_copy(char *src) { if(!src) return src; @@ -204,10 +216,10 @@ exit: static int proc_print(char *buf, size_t buf_sz, struct proc *proc) { - return 0; (void)buf; (void)buf_sz; (void)proc; NOT_IMPLEMENTED(); + return 0; } static void proc_destroy(struct proc *proc) @@ -215,6 +227,6 @@ static void proc_destroy(struct proc *proc) for(size_t i = 0; i < proc->argc; i++) value_destroy(proc->arg_keys[i]); free(proc->arg_keys); - toklist_destroy(proc->body); + toklist_dealloc(proc->body); env_destroy(proc->parent_env); } |