add reference counter for future smarter allocations
[lambda.git] / mem.c
diff --git a/mem.c b/mem.c
index 333038b..a0b18da 100644 (file)
--- a/mem.c
+++ b/mem.c
@@ -4,21 +4,25 @@
 void lambda_free(struct lambda *t)
 {
        if(t != NULL){
-               switch(t->which){
-               case lambda_ident:
-                       free(t->data.identifier.ident);
-                       break;
-               case lambda_abs:
-                       free(t->data.abstraction.ident);
-                       lambda_free(t->data.abstraction.expr);
-                       break;
-               case lambda_app:
-                       lambda_free(t->data.application.expr1);
-                       lambda_free(t->data.application.expr2);
-                       break;
+               if(t->refcount == 1){
+                       switch(t->which){
+                       case lambda_ident:
+                               free(t->data.identifier.ident);
+                               break;
+                       case lambda_abs:
+                               free(t->data.abstraction.ident);
+                               lambda_free(t->data.abstraction.expr);
+                               break;
+                       case lambda_app:
+                               lambda_free(t->data.application.expr1);
+                               lambda_free(t->data.application.expr2);
+                               break;
+                       }
+                       free(t);
+               } else {
+                       t->refcount--;
                }
        }
-       free(t);
 }
 
 struct lambda *copy(struct lambda *t)