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)