void freeObject(Object* obj) { switch (obj->kind) { case OBJ_CONSTANT: free(obj->constAttrs->value); free(obj->constAttrs); break; case OBJ_TYPE: free(obj->typeAttrs->actualType); free(obj->typeAttrs); break; case OBJ_VARIABLE: free(obj->varAttrs->type); free(obj->varAttrs); break; case OBJ_FUNCTION: freeReferenceList(obj->funcAttrs->paramList); freeType(obj->funcAttrs->returnType); freeScope(obj->funcAttrs->scope); free(obj->funcAttrs); break; case OBJ_PROCEDURE: freeReferenceList(obj->procAttrs->paramList); freeScope(obj->procAttrs->scope); free(obj->procAttrs); break; case OBJ_PROGRAM: freeScope(obj->progAttrs->scope); free(obj->progAttrs); break; case OBJ_PARAMETER: freeType(obj->paramAttrs->type); free(obj->paramAttrs); } free(obj); }
void freeReferenceList(ObjectNode *objList) { if (objList != NULL) { freeObject(objList->object); freeReferenceList(objList->next); objList = NULL; } }