aboutsummaryrefslogtreecommitdiff
path: root/compiler/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/eval.c')
-rw-r--r--compiler/eval.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/compiler/eval.c b/compiler/eval.c
index 297a4d7..df39212 100644
--- a/compiler/eval.c
+++ b/compiler/eval.c
@@ -9,7 +9,9 @@
void free_rules_until(fuspel* new, fuspel* old) {
while (new != old) {
free_rewrite_rule(&new->rule);
- new = new->rest;
+ fuspel* _new = new->rest;
+ free(new);
+ new = _new;
}
}
@@ -88,12 +90,14 @@ fuspel* match_rule(fuspel* rules, rewrite_rule* rule, expression* expr) {
if (!empty_args_list(args) && !_expr) {
free_rules_until(_rules, rules);
+ free(expr_args);
return NULL;
}
}
free(expr_args);
return _rules;
}
+ free(expr_args);
default:
return NULL;
}
@@ -134,8 +138,9 @@ expression* eval_rnf(fuspel* rules, expression* expr) {
new_rules = match_rule(rules, &_rules->rule, expr);
if (new_rules) {
rules = new_rules;
+ free(result);
result = eval_rnf(rules, &_rules->rule.rhs);
- free_rules_until(new_rules, _rules);
+ free_rules_until(new_rules, rules);
return result;
}
_rules = _rules->rest;
@@ -154,7 +159,6 @@ expression* eval(fuspel* rules, expression* expr) {
expression *e1, *e2;
fuspel* _rules = rules;
- fuspel* new_rules;
switch (expr->kind) {
case EXPR_INT:
@@ -164,9 +168,9 @@ expression* eval(fuspel* rules, expression* expr) {
case EXPR_NAME:
case EXPR_APP:
while (_rules) {
- new_rules = match_rule(rules, &_rules->rule, expr);
+ fuspel* new_rules = match_rule(rules, &_rules->rule, expr);
if (new_rules) {
- rules = new_rules;
+ free(result);
result = eval(new_rules, &_rules->rule.rhs);
free_rules_until(new_rules, rules);
return result;