void TypeInfoTupleDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoTupleDeclaration::toDt() %s\n", tinfo->toChars()); verifyStructSize(Type::typeinfotypelist, 4 * Target::ptrsize); dtxoff(pdt, Type::typeinfotypelist->toVtblSymbol(), 0); // vtbl for TypeInfoInterface dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Ttuple); TypeTuple *tu = (TypeTuple *)tinfo; size_t dim = tu->arguments->dim; dtsize_t(pdt, dim); // elements.length dt_t *d = NULL; for (size_t i = 0; i < dim; i++) { Parameter *arg = (*tu->arguments)[i]; Expression *e = arg->type->getTypeInfo(NULL); e = e->optimize(WANTvalue); e->toDt(&d); } dtdtoff(pdt, d, 0); // elements.ptr }
dt_t *ArrayInitializer::toDt() { //printf("ArrayInitializer::toDt('%s')\n", toChars()); Type *tb = type->toBasetype(); if (tb->ty == Tvector) tb = ((TypeVector *)tb)->basetype; Type *tn = tb->nextOf()->toBasetype(); //printf("\tdim = %d\n", dim); Dts dts; dts.setDim(dim); dts.zero(); unsigned size = tn->size(); unsigned length = 0; for (size_t i = 0; i < index.dim; i++) { Expression *idx = index[i]; if (idx) length = idx->toInteger(); //printf("\tindex[%d] = %p, length = %u, dim = %u\n", i, idx, length, dim); assert(length < dim); Initializer *val = value[i]; dt_t *dt = val->toDt(); if (dts[length]) error(loc, "duplicate initializations for index %d", length); dts[length] = dt; length++; } Expression *edefault = tb->nextOf()->defaultInit(); size_t n = 1; for (Type *tbn = tn; tbn->ty == Tsarray; tbn = tbn->nextOf()->toBasetype()) { TypeSArray *tsa = (TypeSArray *)tbn; n *= tsa->dim->toInteger(); } dt_t *d = NULL; dt_t **pdtend = &d; for (size_t i = 0; i < dim; i++) { dt_t *dt = dts[i]; if (dt) pdtend = dtcat(pdtend, dt); else { for (size_t j = 0; j < n; j++) pdtend = edefault->toDt(pdtend); } } switch (tb->ty) { case Tsarray: { size_t tadim; TypeSArray *ta = (TypeSArray *)tb; tadim = ta->dim->toInteger(); if (dim < tadim) { if (edefault->isBool(false)) // pad out end of array pdtend = dtnzeros(pdtend, size * (tadim - dim)); else { for (size_t i = dim; i < tadim; i++) { for (size_t j = 0; j < n; j++) pdtend = edefault->toDt(pdtend); } } } else if (dim > tadim) { error(loc, "too many initializers, %d, for array[%d]", dim, tadim); } break; } case Tpointer: case Tarray: { dt_t *dtarray = d; d = NULL; if (tb->ty == Tarray) dtsize_t(&d, dim); dtdtoff(&d, dtarray, 0); break; } default: assert(0); } return d; }