void hklr_function_free(HklrFunction* function) { hkl_list_traverse(function->stmt_list, free_statements, NULL); hkl_list_free(function->stmt_list); hkl_list_traverse(function->args_list, free_names, NULL); hkl_list_free(function->args_list); hkl_tree_traverse(function->closure_list, dec_closures, NULL); hkl_tree_free(function->closure_list); hkl_free_object(function); }
void hklr_statement_free(HklrStatement* stmt) { assert(stmt != NULL); switch (stmt->type) { case HKL_STMT_PUTS: // Free the expression hklr_expression_free(stmt->arg[0].expression); break; case HKL_STMT_INIT: hklr_expression_free(stmt->arg[2].expression); break; case HKL_STMT_ASSIGN: hklr_expression_free(stmt->arg[0].expression); hklr_expression_free(stmt->arg[1].expression); break; case HKL_STMT_IF: case HKL_STMT_WHILE: hklr_expression_free(stmt->arg[0].expression); hkl_list_traverse(stmt->arg[1].list, hklr_statement_free_list, NULL); hkl_list_free(stmt->arg[1].list); break; default: break; } hkl_free_object(stmt); }
void hklr_expression_free(HklrExpression* expr) { assert(expr != NULL); switch (expr->type) { case HKL_EXPR_STRING: // free the internal string hkl_string_free(expr->arg[0].string); break; case HKL_EXPR_UNARY: hklr_expression_free(expr->arg[1].expression); break; case HKL_EXPR_BINARY: hklr_expression_free(expr->arg[0].expression); hklr_expression_free(expr->arg[2].expression); break; case HKL_EXPR_VAR: hkl_string_free(expr->arg[0].string); hkl_list_traverse(expr->arg[1].list, hklr_var_free_list, NULL); hkl_list_free(expr->arg[1].list); break; case HKL_EXPR_ARRAY: hkl_list_traverse(expr->arg[0].list, hklr_array_free_list, NULL); hkl_list_free(expr->arg[0].list); break; case HKL_EXPR_HASH: hkl_list_traverse(expr->arg[0].list, hklr_hash_free_list, NULL); hkl_list_free(expr->arg[0].list); break; default: break; } hkl_free_object(expr); }
void hklr_shutdown() { hklr_scope_pop(); // free globals hkl_hash_traverse(HKLR.globals, hklr_gc_dec_hash, NULL); hkl_hash_free(HKLR.globals); // collect garbage hklr_gc_collect(); hkl_list_free(HKLR.gc_to_free); hklr_object_free(HKLR.gc_roots); hklr_object_free(HKLR.gc_tail); }