void visit(TypeInfoEnumDeclaration *d) { //printf("TypeInfoEnumDeclaration::toDt()\n"); verifyStructSize(Type::typeinfoenum, 7 * Target::ptrsize); dtxoff(pdt, Type::typeinfoenum->toVtblSymbol(), 0); // vtbl for TypeInfo_Enum dtsize_t(pdt, 0); // monitor assert(d->tinfo->ty == Tenum); TypeEnum *tc = (TypeEnum *)d->tinfo; EnumDeclaration *sd = tc->sym; /* Put out: * TypeInfo base; * char[] name; * void[] m_init; */ if (sd->memtype) { sd->memtype->genTypeInfo(NULL); dtxoff(pdt, toSymbol(sd->memtype->vtinfo), 0); // TypeInfo for enum members } else dtsize_t(pdt, 0); const char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); // void[] init; if (!sd->members || d->tinfo->isZeroInit()) { // 0 initializer, or the same as the base type dtsize_t(pdt, 0); // init.length dtsize_t(pdt, 0); // init.ptr } else { dtsize_t(pdt, sd->type->size()); // init.length dtxoff(pdt, sd->toInitializer(), 0); // init.ptr } }
void TypeInfoEnumDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoEnumDeclaration::toDt()\n"); dtxoff(pdt, Type::typeinfoenum->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Enum dtdword(pdt, 0); // monitor assert(tinfo->ty == Tenum); TypeEnum *tc = (TypeEnum *)tinfo; EnumDeclaration *sd = tc->sym; /* Put out: * TypeInfo base; * char[] name; * void[] m_init; */ if (sd->memtype) { sd->memtype->getTypeInfo(NULL); dtxoff(pdt, sd->memtype->vtinfo->toSymbol(), 0, TYnptr); // TypeInfo for enum members } else dtdword(pdt, 0); char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtdword(pdt, namelen); dtabytes(pdt, TYnptr, 0, namelen + 1, name); // void[] init; if (!sd->defaultval || tinfo->isZeroInit()) { // 0 initializer, or the same as the base type dtdword(pdt, 0); // init.length dtdword(pdt, 0); // init.ptr } else { dtdword(pdt, sd->type->size()); // init.length dtxoff(pdt, sd->toInitializer(), 0, TYnptr); // init.ptr } }