static Node * traitfn(Srcloc loc, Trait *tr, char *fn, Type *ty) { Node *proto, *dcl, *var; char *name; size_t i; for (i = 0; i < tr->nproto; i++) { name = declname(tr->proto[i]); if (!strcmp(fn, name)) { proto = tr->proto[i]; dcl = htget(proto->decl.impls, ty); var = mkexpr(loc, Ovar, dcl->decl.name, NULL); var->expr.type = dcl->decl.type; var->expr.did = dcl->decl.did; return var; } } return NULL; }
/* gets the byte offset of 'memb' within the aggregate type 'aggr' */ static size_t offset(Node *aggr, Node *memb) { Type *ty; Node **nl; size_t i; size_t off; ty = tybase(exprtype(aggr)); if (ty->type == Typtr) ty = tybase(ty->sub[0]); assert(ty->type == Tystruct); nl = ty->sdecls; off = 0; for (i = 0; i < ty->nmemb; i++) { off = tyalign(off, size(nl[i])); if (!strcmp(namestr(memb), declname(nl[i]))) return off; off += size(nl[i]); } die("Could not find member %s in struct", namestr(memb)); return -1; }