type *type_copy(type *t) { type *tn; param_t *p; type_debug(t); if (tybasic(t->Tty) == TYtemplate) { tn = type_alloc_template(((typetemp_t *)t)->Tsym); } else tn = type_alloc(t->Tty); *tn = *t; switch (tybasic(tn->Tty)) { case TYtemplate: ((typetemp_t *)tn)->Tsym = ((typetemp_t *)t)->Tsym; goto L1; case TYident: tn->Tident = (char *)MEM_PH_STRDUP(t->Tident); break; case TYarray: if (tn->Tflags & TFvla) tn->Tel = el_copytree(tn->Tel); break; default: if (tyfunc(tn->Tty)) { L1: tn->Tparamtypes = NULL; for (p = t->Tparamtypes; p; p = p->Pnext) { param_t *pn; pn = param_append_type(&tn->Tparamtypes,p->Ptype); if (p->Pident) { pn->Pident = (char *)MEM_PH_STRDUP(p->Pident); } assert(!p->Pelem); } } #if SCPP else if (tn->Talternate && typtr(tn->Tty)) tn->Talternate->Tcount++; #endif #if MARS else if (tn->Tkey && typtr(tn->Tty)) tn->Tkey->Tcount++; #endif break; } if (tn->Tnext) { type_debug(tn->Tnext); tn->Tnext->Tcount++; } tn->Tcount = 0; return tn; }
void type_hydrate(type **pt) { type *t; assert(pt); while (isdehydrated(*pt)) { t = (type *) ph_hydrate(pt); type_debug(t); #if !TX86 if (t->Tflags & TFhydrated) return; #if SOURCE_4TYPES t->Tsrcpos.Sfilnum += File_Hydrate_Num; /* file number relative header build */ #endif t->Tflags |= TFhydrated; #endif switch (tybasic(t->Tty)) { case TYstruct: case TYenum: case TYmemptr: case TYvtshape: // Cannot assume symbol is hydrated, because entire HX file // may not have been hydrated. Classsym_hydrate(&t->Ttag); symbol_debug(t->Ttag); break; case TYident: ph_hydrate(&t->Tident); break; case TYtemplate: symbol_hydrate(&((typetemp_t *)t)->Tsym); param_hydrate(&t->Tparamtypes); break; case TYarray: if (t->Tflags & TFvla) el_hydrate(&t->Tel); break; default: if (tyfunc(t->Tty)) { param_hydrate(&t->Tparamtypes); list_hydrate(&t->Texcspec, (list_free_fp)type_hydrate); } #if SCPP else if (t->Talternate && typtr(t->Tty)) type_hydrate(&t->Talternate); #endif #if MARS else if (t->Tkey && typtr(t->Tty)) type_hydrate(&t->Tkey); #endif break; } pt = &t->Tnext; } }
void type_dehydrate(type **pt) { type *t; while ((t = *pt) != NULL && !isdehydrated(t)) { ph_dehydrate(pt); #if DEBUG_XSYMGEN /* don't dehydrate types in HEAD when creating XSYM */ if (xsym_gen && (t->Tflags & TFhydrated)) return; #endif type_debug(t); switch (tybasic(t->Tty)) { case TYstruct: case TYenum: case TYmemptr: case TYvtshape: Classsym_dehydrate(&t->Ttag); break; case TYident: ph_dehydrate(&t->Tident); break; case TYtemplate: symbol_dehydrate(&((typetemp_t *)t)->Tsym); param_dehydrate(&t->Tparamtypes); break; case TYarray: if (t->Tflags & TFvla) el_dehydrate(&t->Tel); break; default: if (tyfunc(t->Tty)) { param_dehydrate(&t->Tparamtypes); list_dehydrate(&t->Texcspec, (list_free_fp)type_dehydrate); } #if SCPP else if (t->Talternate && typtr(t->Tty)) type_dehydrate(&t->Talternate); #endif #if MARS else if (t->Tkey && typtr(t->Tty)) type_dehydrate(&t->Tkey); #endif break; } pt = &t->Tnext; } }
void type_hydrate(type **pt) { type *t; assert(pt); while (isdehydrated(*pt)) { t = (type *) ph_hydrate(pt); type_debug(t); switch (tybasic(t->Tty)) { case TYstruct: case TYenum: case TYmemptr: case TYvtshape: // Cannot assume symbol is hydrated, because entire HX file // may not have been hydrated. Classsym_hydrate(&t->Ttag); symbol_debug(t->Ttag); break; case TYident: ph_hydrate(&t->Tident); break; case TYtemplate: symbol_hydrate(&((typetemp_t *)t)->Tsym); param_hydrate(&t->Tparamtypes); break; case TYarray: if (t->Tflags & TFvla) el_hydrate(&t->Tel); break; default: if (tyfunc(t->Tty)) { param_hydrate(&t->Tparamtypes); list_hydrate(&t->Texcspec, (list_free_fp)type_hydrate); } else if (t->Talternate && typtr(t->Tty)) type_hydrate(&t->Talternate); else if (t->Tkey && typtr(t->Tty)) type_hydrate(&t->Tkey); break; } pt = &t->Tnext; } }
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; } }
type *type_fake(tym_t ty) { type *t; #if MARS assert(ty != TYstruct); #endif t = type_alloc(ty); if (typtr(ty) || tyfunc(ty)) { t->Tnext = type_alloc(TYvoid); /* fake with pointer to void */ t->Tnext->Tcount = 1; } return t; }