changeset 151:fe5d01fa28ee

value, expr: Test "==" methods and enable freeing all symbols
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 03 Sep 2019 12:57:53 +0200
parents a4a714456110
children 88fec15abdbc
files gen/y.lex src/built-ins_test.c src/expr_test.c src/value.c
diffstat 4 files changed, 53 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gen/y.lex	Tue Sep 03 12:17:34 2019 +0200
+++ b/gen/y.lex	Tue Sep 03 12:57:53 2019 +0200
@@ -23,7 +23,7 @@
 NUMBER  -?[1-9][0-9]*|0
 ATOM    [a-z+*/=<>-][a-z0-9=-]*
 QUOTE   '
-STRING_LIT \"[[:alnum:][:blank:][:punct:]]*\"
+STRING_LIT \"[^"]*\"
 
 %%
 
--- a/src/built-ins_test.c	Tue Sep 03 12:17:34 2019 +0200
+++ b/src/built-ins_test.c	Tue Sep 03 12:57:53 2019 +0200
@@ -216,8 +216,8 @@
     fprintf(stderr, "test_builtin_let_recall ============\n");
 
     ystr_t input = ystr_new(
-            "(let my-var ('a 'b) \"cd\")"
-            "(my-var)");
+        "(let my-var ('a 'b) \"cd\")"
+        "(my-var)");
     ystr_t error = ystr_new(NULL);
     yexpr_t program = yexpr_new();
     assert(yparse_str(&input, &program, &error));
@@ -225,7 +225,7 @@
 
     ypreprocess_resolve_builtins(&program);
 
-    yeval_state_t state = { .call_stack = YVEC_NEW(NULL, 0, yexpr_t) };
+    yeval_state_t state = {.call_stack = YVEC_NEW(NULL, 0, yexpr_t)};
     // Evaluate whole program
     yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0);
 
@@ -243,6 +243,43 @@
     yexpr_destroy(&program);
 }
 
+void test_builtin_eq(void) {
+    fprintf(stderr, "test_builtin_eq ============\n");
+
+    ystr_t input = ystr_new(
+        "(let var-a 1)"
+        "(let var-b 'atom)"
+        "(let var-c \"string\")"
+        "((== var-a 1) (== 1 var-a) (== var-a var-a) (== for for) (== (1 2 3) "
+        "(var-a 2 3)) (== var-b 'atom) (== "
+        "'atom2 'atom2) (== "
+        "var-c \"string\"))");
+    ystr_t error = ystr_new(NULL);
+    yexpr_t program = yexpr_new();
+    assert(yparse_str(&input, &program, &error));
+
+    yexpr_debug(&program);
+    ypreprocess(&program);
+    yexpr_debug(&program);
+
+    yeval_state_t state;
+    YVEC_INIT(&state.call_stack, 4, yexpr_t);
+    yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0);
+    assert(result.typ == YEXPR_LIST);
+    yexpr_debug(&result);
+    for (size_t i = 0; i < result.value.list.len; i++) {
+        yexpr_t* elem = YVEC_AT(&result.value.list, i, yexpr_t);
+        assert(YEXPR_ATOM == elem->typ &&
+               yatom_get_or_add("true") == elem->value.atom);
+    }
+
+    yexpr_destroy(&result);
+    yexpr_destroy(&program);
+    ystr_destroy(&input);
+    ystr_destroy(&error);
+    yvec_destroy(&state.call_stack);
+}
+
 int main(void) {
     test_builtin_translate();
     test_builtin_for();
@@ -251,6 +288,7 @@
     test_builtin_let();
     test_builtin_let_parsed();
     test_builtin_let_recall();
+    test_builtin_eq();
     yvalue_free_all();
     yatom_free_all();
     return 0;
--- a/src/expr_test.c	Tue Sep 03 12:17:34 2019 +0200
+++ b/src/expr_test.c	Tue Sep 03 12:57:53 2019 +0200
@@ -26,7 +26,7 @@
 
     ref = yref_new();
     assert(YREF_ID == yref_type(&ref));
-    assert(ref.ref.id == ref0.ref.id+1);
+    assert(ref.ref.id == ref0.ref.id + 1);
 }
 
 void test_expr_copy(void) {
@@ -35,7 +35,8 @@
 
     yexpr_set_ref(&expr, ref);
     yexpr_t copy = yexpr_copy(&expr);
-    assert(ystr_at(&expr.value.ref.ref.sym, 0) != ystr_at(&copy.value.ref.ref.sym, 0));
+    assert(ystr_at(&expr.value.ref.ref.sym, 0) !=
+           ystr_at(&copy.value.ref.ref.sym, 0));
 
     yexpr_destroy(&expr);
     yexpr_destroy(&copy);
--- a/src/value.c	Tue Sep 03 12:17:34 2019 +0200
+++ b/src/value.c	Tue Sep 03 12:57:53 2019 +0200
@@ -31,7 +31,8 @@
 
 static bool yvalue_table_initialized = false;
 static struct hsearch_data yvalue_name_table;
-static yvec_t yvalue_table;
+static yvec_t yvalue_table;  // vector of yvalue_t
+static yvec_t yvalue_names;  // vector of char*
 // TODO: Enable garbage collection/reuse instead of monotonic counter. (e.g.
 // reference-counting in different table)
 static yvalue_id_t yvalue_counter = YVALUE_COUNTER_OFFSET;
@@ -45,6 +46,7 @@
     yvalue_table_initialized = true;
     hcreate_r(YVALUE_MAX_VALUES, &yvalue_name_table);
     YVEC_INIT(&yvalue_table, YVALUE_INITIAL_VALUES, yvalue_t);
+    YVEC_INIT(&yvalue_names, YVALUE_INITIAL_VALUES, char*);
 }
 
 bool yvalue_is_valid(yvalue_id_t id) {
@@ -210,6 +212,7 @@
     ENTRY new = {.key = strdup(ystr_str(sym)), .data = (void*)new_id};
     ENTRY* result;
     hsearch_r(new, ENTER, &result, &yvalue_name_table);
+    YVEC_PUSH(&yvalue_names, &new.key);
     return new_id;
 }
 
@@ -287,6 +290,10 @@
         if (val->typ == YVALUE_FUNC) yfunc_destroy(&val->value.func);
         freed += 1;
     }
+    for (size_t i = 0; i < yvalue_names.len; i++) {
+        free(*YVEC_AT(&yvalue_names, i, char*));
+    }
+    yvec_destroy(&yvalue_names);
     hdestroy_r(&yvalue_name_table);
     yvec_destroy(&yvalue_table);
 }