Mercurial > lbo > hg > ylisp
changeset 141:08bf6c4a9017
value: Improve yvalue_free_all
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Sep 2019 09:41:58 +0200 |
parents | a4a6169cccc0 |
children | 4e0060d95d31 |
files | src/value.c |
diffstat | 1 files changed, 15 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/value.c Tue Sep 03 09:41:40 2019 +0200 +++ b/src/value.c Tue Sep 03 09:41:58 2019 +0200 @@ -12,7 +12,7 @@ // TODO: Adjust when programs are bigger. static const size_t YVALUE_INITIAL_VALUES = 256, YVALUE_MAX_VALUES = 1024; // ff marks IDs as such. -static const yvalue_id_t YVALUE_COUNTER_OFFSET = 0xffb0b0b0b0b0b0b0; +static const yvalue_id_t YVALUE_COUNTER_OFFSET = 0xff10101010101010; // ylisp keeps tables containing all named values. Unnamed values are // represented as yexpr_t, whereas named values are referenced by their name @@ -140,7 +140,9 @@ void yref_destroy(yref_t* ref) { if (ref == NULL) return; - if (yref_type(ref) == YREF_SYM) ystr_destroy(&ref->ref.sym); + if (yref_type(ref) == YREF_SYM) { + ystr_destroy(&ref->ref.sym); + } } void yvalue_destroy(yvalue_t* val) { @@ -225,12 +227,14 @@ } else { // Resolve reference. yvalue_id_t id; - if (typ == YREF_ID) + if (typ == YREF_ID) { id = ref.ref.id; - else + } else { id = yvalue_resolve_or_create_symbol(&ref.ref.sym); - assert(yvalue_is_valid(id)); - yvalue_t* valp = yvalue_get(yref_new_id(id)); + assert(yvalue_is_valid(id)); + ref = yref_new_id(id); + } + yvalue_t* valp = yvalue_get(ref); assert(valp != NULL); if (valp->typ == YVALUE_EXPR) yexpr_destroy(&valp->value.expr); *valp = *val; @@ -261,10 +265,15 @@ } void yvalue_free_all(void) { + size_t freed = 0; for (yvalue_id_t i = 0; i < yvalue_counter - YVALUE_COUNTER_OFFSET; i++) { yvalue_t* val = YVEC_AT(&yvalue_table, i, yvalue_t); if (val->typ == YVALUE_EXPR) yexpr_destroy(&val->value.expr); if (val->typ == YVALUE_FUNC) yfunc_destroy(&val->value.func); + freed += 1; } + hdestroy_r(&yvalue_name_table); + yvec_destroy(&yvalue_table); + fprintf(stderr, "freed %llu values\n", freed); }