void visit(TypeFunction *t) { size_t nparams = Parameter::dim(t->parameters); type *tmp[10]; type **ptypes = tmp; if (nparams > 10) ptypes = (type **)malloc(sizeof(type*) * nparams); for (size_t i = 0; i < nparams; i++) { Parameter *p = Parameter::getNth(t->parameters, i); type *tp = Type_toCtype(p->type); if (p->storageClass & (STCout | STCref)) tp = type_allocn(TYref, tp); else if (p->storageClass & STClazy) { // Mangle as delegate type *tf = type_function(TYnfunc, NULL, 0, false, tp); tp = type_delegate(tf); } ptypes[i] = tp; } t->ctype = type_function(totym(t), ptypes, nparams, t->varargs == 1, Type_toCtype(t->next)); if (nparams > 10) free(ptypes); }
type *TypeDelegate::toCtype() { if (!ctype) ctype = type_delegate(next->toCtype()); if (!ctype->Tnext) ctype->Tnext = next->toCtype(); // assume recursion checked elsewhere return ctype; }
void visit(TypeDelegate *t) { t->ctype = type_delegate(Type_toCtype(t->next)); }