void type_term() { type *tn; param_t *pn; int i; for (i = 0; i < arraysize(tstypes); i++) { type *t = tsptr2types[i]; if (t) { assert(!(t->Tty & (mTYconst | mTYvolatile | mTYimmutable | mTYshared))); assert(!(t->Tflags)); assert(!(t->Tmangle)); type_free(t); } type_free(tstypes[i]); } type_free(tsclib); type_free(tspvoid); type_free(tspcvoid); type_free(tsjlib); #if TX86 type_free(tstrace); #endif while (type_list) { tn = type_list->Tnext; #if TX86 mem_ffree(type_list); #else MEM_PH_FREE(type_list); #endif type_list = tn; } while (param_list) { pn = param_list->Pnext; #if TX86 mem_ffree(param_list); #else MEM_PH_FREE(param_list); #endif param_list = pn; } #ifdef DEBUG dbg_printf("Max # of types = %d\n",type_max); if (type_num != 0) dbg_printf("type_num = %d\n",type_num); /* assert(type_num == 0);*/ #endif }
void param_free(param_t **pparamlst) { param_t *p,*pn; #if !TX86 debug_assert(PARSER); #endif for (p = *pparamlst; p; p = pn) { param_debug(p); pn = p->Pnext; type_free(p->Ptype); #if TX86 mem_free(p->Pident); #else MEM_PH_FREE(p->Pident); #endif el_free(p->Pelem); type_free(p->Pdeftype); if (p->Pptpl) param_free(&p->Pptpl); #ifdef DEBUG p->id = 0; #endif p->Pnext = param_list; param_list = p; } *pparamlst = NULL; }
void type_free(type *t) { type *tn; tym_t ty; while (t) { //dbg_printf("type_free(%p, Tcount = %d)\n", t, t->Tcount); type_debug(t); assert((int)t->Tcount != -1); if (--t->Tcount) /* if usage count doesn't go to 0 */ break; ty = tybasic(t->Tty); if (tyfunc(ty)) { param_free(&t->Tparamtypes); list_free(&t->Texcspec, (list_free_fp)type_free); } #if !MARS else if (ty == TYtemplate) param_free(&t->Tparamtypes); else if (ty == TYident) MEM_PH_FREE(t->Tident); #endif else if (t->Tflags & TFvla && t->Tel) el_free(t->Tel); #if SCPP else if (t->Talternate && typtr(ty)) type_free(t->Talternate); #endif #if MARS else if (t->Tkey && typtr(ty)) type_free(t->Tkey); #endif #ifdef DEBUG type_num--; //dbg_printf("Free'ing type %p ",t); WRTYxx(t->Tty); dbg_printf("\n"); t->id = 0; /* no longer a valid type */ #endif tn = t->Tnext; t->Tnext = type_list; type_list = t; /* link into free list */ t = tn; } }