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);
 }