Fix memory leaks and verbosify reduction
[lambda.git] / reduce.c
index 429b038..7106743 100644 (file)
--- a/reduce.c
+++ b/reduce.c
@@ -41,17 +41,18 @@ void lambda_alpha(struct lambda *expr, struct lambda *ident)
 
 void lambda_beta(struct lambda *ident, struct lambda *body, struct lambda *target, struct lambda *total)
 {
-       struct lambda cpy;
+       struct lambda *cpy;
        switch(body->which){
        case lambda_ident:
                if(lambda_ident_eq(body, ident)){
                        lambda_print(total, NULL);
                        printf("β -> ");
-                       cpy = *copy(target);
+                       cpy = copy(target);
                        free(body->data.identifier.ident);
                        if(total == body)
-                               *total = cpy;
-                       *body = cpy;
+                               *total = *cpy;
+                       *body = *cpy;
+                       free(cpy);
                }
                break;
        case lambda_abs:
@@ -79,7 +80,7 @@ void lambda_reduce(struct lambda *t, struct lambda *total, int *maxdepth)
        case lambda_ident:
                break;
        case lambda_abs:
-               lambda_reduce(t->data.abstraction.expr, total, maxdepth);
+//             lambda_reduce(t->data.abstraction.expr, total, maxdepth);
                break;
        case lambda_app:
                t1 = t->data.application.expr1;
@@ -89,10 +90,14 @@ void lambda_reduce(struct lambda *t, struct lambda *total, int *maxdepth)
                        lambda_print(total, t);
                        printf("β -> ");
                        lambda_beta(t1, t1->data.abstraction.expr, t2, total);
-                       (*maxdepth)--;
+                       lambda_free(t2);
+                       t2 = copy(t1->data.abstraction.expr);
                        if(total == t)
-                               *total = *t1->data.abstraction.expr;
-                       *t = *t1->data.abstraction.expr;
+                               *total = *t2;
+                       lambda_free(t1);
+                       *t = *t2;
+                       free(t2);
+                       (*maxdepth)--;
                        lambda_reduce(t, total, maxdepth);
                }
                break;