void TypeInfoAssociativeArrayDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoAssociativeArrayDeclaration::toDt()\n"); #if DMDV2 verifyStructSize(Type::typeinfoassociativearray, 5 * Target::ptrsize); #else verifyStructSize(Type::typeinfoassociativearray, 4 * Target::ptrsize); #endif dtxoff(pdt, Type::typeinfoassociativearray->toVtblSymbol(), 0); // vtbl for TypeInfo_AssociativeArray dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Taarray); TypeAArray *tc = (TypeAArray *)tinfo; tc->next->getTypeInfo(NULL); dtxoff(pdt, tc->next->vtinfo->toSymbol(), 0); // TypeInfo for array of type tc->index->getTypeInfo(NULL); dtxoff(pdt, tc->index->vtinfo->toSymbol(), 0); // TypeInfo for array of type #if DMDV2 tc->getImpl()->type->getTypeInfo(NULL); dtxoff(pdt, tc->getImpl()->type->vtinfo->toSymbol(), 0); // impl #endif }
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 }
void TypeInfoDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::dtypeinfo, 2 * Target::ptrsize); dtxoff(pdt, Type::dtypeinfo->toVtblSymbol(), 0); // vtbl for TypeInfo dtsize_t(pdt, 0); // monitor }
void TypeInfoWildDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoWildDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfowild, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfowild->toVtblSymbol(), 0); // vtbl for TypeInfo_Wild dtsize_t(pdt, 0); // monitor Type *tm = tinfo->mutableOf(); tm = tm->merge(); dtxoff(pdt, tm->buildTypeInfo(NULL)->toSymbol(), 0); }
void TypeInfoInvariantDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoInvariantDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfoinvariant, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoinvariant->toVtblSymbol(), 0); // vtbl for TypeInfo_Invariant dtsize_t(pdt, 0); // monitor Type *tm = tinfo->mutableOf(); tm = tm->merge(); tm->getTypeInfo(NULL); dtxoff(pdt, tm->vtinfo->toSymbol(), 0); }
void TypeInfoSharedDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoSharedDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfoshared, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoshared->toVtblSymbol(), 0); // vtbl for TypeInfo_Shared dtsize_t(pdt, 0); // monitor Type *tm = tinfo->unSharedOf(); tm = tm->merge(); tm->getTypeInfo(NULL); dtxoff(pdt, tm->vtinfo->toSymbol(), 0); }
void visit(TypeInfoConstDeclaration *d) { //printf("TypeInfoConstDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfoconst, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoconst->toVtblSymbol(), 0); // vtbl for TypeInfo_Const dtsize_t(pdt, 0); // monitor Type *tm = d->tinfo->mutableOf(); tm = tm->merge(); tm->genTypeInfo(NULL); dtxoff(pdt, toSymbol(tm->vtinfo), 0); }
void TypeInfoConstDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoConstDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfoconst, 3 * PTRSIZE); dtxoff(pdt, Type::typeinfoconst->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Const dtsize_t(pdt, 0); // monitor Type *tm = tinfo->mutableOf(); tm = tm->merge(); tm->getTypeInfo(NULL); dtxoff(pdt, tm->vtinfo->toSymbol(), 0, TYnptr); }
void TypeInfoArrayDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoArrayDeclaration::toDt()\n"); verifyStructSize(Type::typeinfoarray, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoarray->toVtblSymbol(), 0); // vtbl for TypeInfo_Array dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tarray); TypeDArray *tc = (TypeDArray *)tinfo; dtxoff(pdt, tc->next->buildTypeInfo(NULL)->toSymbol(), 0); // TypeInfo for array of type }
void TypeInfoPointerDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoPointerDeclaration::toDt()\n"); verifyStructSize(Type::typeinfopointer, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfopointer->toVtblSymbol(), 0); // vtbl for TypeInfo_Pointer dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tpointer); TypePointer *tc = (TypePointer *)tinfo; dtxoff(pdt, tc->next->buildTypeInfo(NULL)->toSymbol(), 0); // TypeInfo for type being pointed to }
void TypeInfoVectorDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoVectorDeclaration::toDt()\n"); verifyStructSize(Type::typeinfovector, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfovector->toVtblSymbol(), 0); // vtbl for TypeInfo_Vector dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tvector); TypeVector *tc = (TypeVector *)tinfo; dtxoff(pdt, tc->basetype->buildTypeInfo(NULL)->toSymbol(), 0); // TypeInfo for equivalent static array }
void visit(TypeInfoPointerDeclaration *d) { //printf("TypeInfoPointerDeclaration::toDt()\n"); verifyStructSize(Type::typeinfopointer, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfopointer->toVtblSymbol(), 0); // vtbl for TypeInfo_Pointer dtsize_t(pdt, 0); // monitor assert(d->tinfo->ty == Tpointer); TypePointer *tc = (TypePointer *)d->tinfo; tc->next->genTypeInfo(NULL); dtxoff(pdt, toSymbol(tc->next->vtinfo), 0); // TypeInfo for type being pointed to }
void visit(TypeInfoArrayDeclaration *d) { //printf("TypeInfoArrayDeclaration::toDt()\n"); verifyStructSize(Type::typeinfoarray, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoarray->toVtblSymbol(), 0); // vtbl for TypeInfo_Array dtsize_t(pdt, 0); // monitor assert(d->tinfo->ty == Tarray); TypeDArray *tc = (TypeDArray *)d->tinfo; tc->next->genTypeInfo(NULL); dtxoff(pdt, toSymbol(tc->next->vtinfo), 0); // TypeInfo for array of type }
void TypeInfoStaticArrayDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoStaticArrayDeclaration::toDt()\n"); verifyStructSize(Type::typeinfostaticarray, 4 * Target::ptrsize); dtxoff(pdt, Type::typeinfostaticarray->toVtblSymbol(), 0); // vtbl for TypeInfo_StaticArray dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tsarray); TypeSArray *tc = (TypeSArray *)tinfo; dtxoff(pdt, tc->next->buildTypeInfo(NULL)->toSymbol(), 0); // TypeInfo for array of type dtsize_t(pdt, tc->dim->toInteger()); // length }
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 TypeInfoInterfaceDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoInterfaceDeclaration::toDt() %s\n", tinfo->toChars()); verifyStructSize(Type::typeinfointerface, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfointerface->toVtblSymbol(), 0); // vtbl for TypeInfoInterface dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tclass); TypeClass *tc = (TypeClass *)tinfo; Symbol *s; if (!tc->sym->vclassinfo) tc->sym->vclassinfo = new TypeInfoClassDeclaration(tc); s = tc->sym->vclassinfo->toSymbol(); dtxoff(pdt, s, 0); // ClassInfo for tinfo }
void visit(TypeInfoTypedefDeclaration *d) { //printf("TypeInfoTypedefDeclaration::toDt() %s\n", toChars()); verifyStructSize(Type::typeinfotypedef, 7 * Target::ptrsize); dtxoff(pdt, Type::typeinfotypedef->toVtblSymbol(), 0); // vtbl for TypeInfo_Typedef dtsize_t(pdt, 0); // monitor assert( d->tinfo->ty == Ttypedef); TypeTypedef *tc = (TypeTypedef *)d->tinfo; TypedefDeclaration *sd = tc->sym; //printf("basetype = %s\n", sd->basetype->toChars()); /* Put out: * TypeInfo base; * char[] name; * void[] m_init; */ sd->basetype = sd->basetype->merge(); sd->basetype->genTypeInfo(NULL); // generate vtinfo assert(sd->basetype->vtinfo); dtxoff(pdt, sd->basetype->vtinfo->toSymbol(), 0); // TypeInfo for basetype const char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); // void[] init; if (d->tinfo->isZeroInit() || !sd->init) { // 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 TypeInfoDelegateDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoDelegateDeclaration::toDt()\n"); verifyStructSize(Type::typeinfodelegate, 5 * Target::ptrsize); dtxoff(pdt, Type::typeinfodelegate->toVtblSymbol(), 0); // vtbl for TypeInfo_Delegate dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tdelegate); TypeDelegate *tc = (TypeDelegate *)tinfo; dtxoff(pdt, tc->next->nextOf()->buildTypeInfo(NULL)->toSymbol(), 0); // TypeInfo for delegate return value const char *name = tinfo->deco; assert(name); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); }
void TypeInfoFunctionDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoFunctionDeclaration::toDt()\n"); verifyStructSize(Type::typeinfofunction, 5 * Target::ptrsize); dtxoff(pdt, Type::typeinfofunction->toVtblSymbol(), 0); // vtbl for TypeInfo_Function dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tfunction); TypeFunction *tc = (TypeFunction *)tinfo; tc->next->getTypeInfo(NULL); dtxoff(pdt, tc->next->vtinfo->toSymbol(), 0); // TypeInfo for function return value const char *name = tinfo->deco; assert(name); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); }
void TypeInfoClassDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoClassDeclaration::toDt() %s\n", tinfo->toChars()); #if DMDV1 verifyStructSize(Type::typeinfoclass, 3 * Target::ptrsize); dtxoff(pdt, Type::typeinfoclass->toVtblSymbol(), 0); // vtbl for TypeInfoClass dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tclass); TypeClass *tc = (TypeClass *)tinfo; Symbol *s; if (!tc->sym->vclassinfo) tc->sym->vclassinfo = new ClassInfoDeclaration(tc->sym); s = tc->sym->vclassinfo->toSymbol(); dtxoff(pdt, s, 0); // ClassInfo for tinfo #else assert(0); #endif }
void TypeInfoStructDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoStructDeclaration::toDt() '%s'\n", toChars()); if (global.params.is64bit) verifyStructSize(Type::typeinfostruct, 17 * Target::ptrsize); else verifyStructSize(Type::typeinfostruct, 15 * Target::ptrsize); dtxoff(pdt, Type::typeinfostruct->toVtblSymbol(), 0); // vtbl for TypeInfo_Struct dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tstruct); TypeStruct *tc = (TypeStruct *)tinfo; StructDeclaration *sd = tc->sym; if (!sd->members) return; /* Put out: * char[] name; * void[] init; * hash_t function(in void*) xtoHash; * bool function(in void*, in void*) xopEquals; * int function(in void*, in void*) xopCmp; * string function(const(void)*) xtoString; * StructFlags m_flags; * //xgetMembers; * xdtor; * xpostblit; * uint m_align; * version (X86_64) * TypeInfo m_arg1; * TypeInfo m_arg2; * xgetRTInfo */ const char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, 0, namelen + 1, name); // void[] init; dtsize_t(pdt, sd->structsize); // init.length if (sd->zeroInit) dtsize_t(pdt, 0); // NULL for 0 initialization else dtxoff(pdt, sd->toInitializer(), 0); // init.ptr if (FuncDeclaration *fd = search_toHash(sd)) { dtxoff(pdt, fd->toSymbol(), 0); TypeFunction *tf = (TypeFunction *)fd->type; assert(tf->ty == Tfunction); /* I'm a little unsure this is the right way to do it. Perhaps a better * way would to automatically add these attributes to any struct member * function with the name "toHash". * So I'm leaving this here as an experiment for the moment. */ if (!tf->isnothrow || tf->trust == TRUSTsystem /*|| tf->purity == PUREimpure*/) warning(fd->loc, "toHash() must be declared as extern (D) size_t toHash() const nothrow @safe, not %s", tf->toChars()); } else dtsize_t(pdt, 0); if (sd->xeq) dtxoff(pdt, sd->xeq->toSymbol(), 0); else dtsize_t(pdt, 0); if (sd->xcmp) dtxoff(pdt, sd->xcmp->toSymbol(), 0); else dtsize_t(pdt, 0); if (FuncDeclaration *fd = search_toString(sd)) { dtxoff(pdt, fd->toSymbol(), 0); } else dtsize_t(pdt, 0); // StructFlags m_flags; StructFlags::Type m_flags = 0; if (tc->hasPointers()) m_flags |= StructFlags::hasPointers; dtsize_t(pdt, m_flags); #if DMDV2 #if 0 // xgetMembers FuncDeclaration *sgetmembers = sd->findGetMembers(); if (sgetmembers) dtxoff(pdt, sgetmembers->toSymbol(), 0); else dtsize_t(pdt, 0); // xgetMembers #endif // xdtor FuncDeclaration *sdtor = sd->dtor; if (sdtor) dtxoff(pdt, sdtor->toSymbol(), 0); else dtsize_t(pdt, 0); // xdtor // xpostblit FuncDeclaration *spostblit = sd->postblit; if (spostblit && !(spostblit->storage_class & STCdisable)) dtxoff(pdt, spostblit->toSymbol(), 0); else dtsize_t(pdt, 0); // xpostblit #endif // uint m_align; dtsize_t(pdt, tc->alignsize()); if (global.params.is64bit) { Type *t = sd->arg1type; for (int i = 0; i < 2; i++) { // m_argi if (t) { t->getTypeInfo(NULL); dtxoff(pdt, t->vtinfo->toSymbol(), 0); } else dtsize_t(pdt, 0); t = sd->arg2type; } } // xgetRTInfo if (sd->getRTInfo) sd->getRTInfo->toDt(pdt); else if (m_flags & StructFlags::hasPointers) dtsize_t(pdt, 1); else dtsize_t(pdt, 0); }
void TypeInfoStructDeclaration::toDt(dt_t **pdt) { //printf("TypeInfoStructDeclaration::toDt() '%s'\n", toChars()); if (global.params.is64bit) verifyStructSize(Type::typeinfostruct, 17 * PTRSIZE); else verifyStructSize(Type::typeinfostruct, 15 * PTRSIZE); dtxoff(pdt, Type::typeinfostruct->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Struct dtsize_t(pdt, 0); // monitor assert(tinfo->ty == Tstruct); TypeStruct *tc = (TypeStruct *)tinfo; StructDeclaration *sd = tc->sym; /* Put out: * char[] name; * void[] init; * hash_t function(in void*) xtoHash; * bool function(in void*, in void*) xopEquals; * int function(in void*, in void*) xopCmp; * string function(const(void)*) xtoString; * uint m_flags; * //xgetMembers; * xdtor; * xpostblit; * uint m_align; * version (X86_64) * TypeInfo m_arg1; * TypeInfo m_arg2; * xgetRTInfo */ const char *name = sd->toPrettyChars(); size_t namelen = strlen(name); dtsize_t(pdt, namelen); dtabytes(pdt, TYnptr, 0, namelen + 1, name); // void[] init; dtsize_t(pdt, sd->structsize); // init.length if (sd->zeroInit) dtsize_t(pdt, 0); // NULL for 0 initialization else dtxoff(pdt, sd->toInitializer(), 0, TYnptr); // init.ptr FuncDeclaration *fd; FuncDeclaration *fdx; Dsymbol *s; static TypeFunction *tftohash; static TypeFunction *tftostring; if (!tftohash) { Scope sc; /* const hash_t toHash(); */ tftohash = new TypeFunction(NULL, Type::thash_t, 0, LINKd); tftohash->mod = MODconst; tftohash = (TypeFunction *)tftohash->semantic(0, &sc); tftostring = new TypeFunction(NULL, Type::tchar->invariantOf()->arrayOf(), 0, LINKd); tftostring = (TypeFunction *)tftostring->semantic(0, &sc); } TypeFunction *tfcmpptr; { Scope sc; /* const int opCmp(ref const KeyType s); */ Parameters *arguments = new Parameters; #if STRUCTTHISREF // arg type is ref const T Parameter *arg = new Parameter(STCref, tc->constOf(), NULL, NULL); #else // arg type is const T* Parameter *arg = new Parameter(STCin, tc->pointerTo(), NULL, NULL); #endif arguments->push(arg); tfcmpptr = new TypeFunction(arguments, Type::tint32, 0, LINKd); tfcmpptr->mod = MODconst; tfcmpptr = (TypeFunction *)tfcmpptr->semantic(0, &sc); } s = search_function(sd, Id::tohash); fdx = s ? s->isFuncDeclaration() : NULL; if (fdx) { fd = fdx->overloadExactMatch(tftohash); if (fd) { dtxoff(pdt, fd->toSymbol(), 0, TYnptr); TypeFunction *tf = (TypeFunction *)fd->type; assert(tf->ty == Tfunction); /* I'm a little unsure this is the right way to do it. Perhaps a better * way would to automatically add these attributes to any struct member * function with the name "toHash". * So I'm leaving this here as an experiment for the moment. */ if (!tf->isnothrow || tf->trust == TRUSTsystem /*|| tf->purity == PUREimpure*/) warning(fd->loc, "toHash() must be declared as extern (D) size_t toHash() const nothrow @safe, not %s", tf->toChars()); } else { //fdx->error("must be declared as extern (D) uint toHash()"); dtsize_t(pdt, 0); } } else dtsize_t(pdt, 0); if (sd->xeq) dtxoff(pdt, sd->xeq->toSymbol(), 0, TYnptr); else dtsize_t(pdt, 0); s = search_function(sd, Id::cmp); fdx = s ? s->isFuncDeclaration() : NULL; if (fdx) { //printf("test1 %s, %s, %s\n", fdx->toChars(), fdx->type->toChars(), tfeqptr->toChars()); fd = fdx->overloadExactMatch(tfcmpptr); if (fd) { dtxoff(pdt, fd->toSymbol(), 0, TYnptr); //printf("test2\n"); } else //fdx->error("must be declared as extern (D) int %s(%s*)", fdx->toChars(), sd->toChars()); dtsize_t(pdt, 0); } else dtsize_t(pdt, 0); s = search_function(sd, Id::tostring); fdx = s ? s->isFuncDeclaration() : NULL; if (fdx) { fd = fdx->overloadExactMatch(tftostring); if (fd) dtxoff(pdt, fd->toSymbol(), 0, TYnptr); else //fdx->error("must be declared as extern (D) char[] toString()"); dtsize_t(pdt, 0); } else dtsize_t(pdt, 0); // uint m_flags; size_t m_flags = tc->hasPointers(); dtsize_t(pdt, m_flags); #if DMDV2 #if 0 // xgetMembers FuncDeclaration *sgetmembers = sd->findGetMembers(); if (sgetmembers) dtxoff(pdt, sgetmembers->toSymbol(), 0, TYnptr); else dtsize_t(pdt, 0); // xgetMembers #endif // xdtor FuncDeclaration *sdtor = sd->dtor; if (sdtor) dtxoff(pdt, sdtor->toSymbol(), 0, TYnptr); else dtsize_t(pdt, 0); // xdtor // xpostblit FuncDeclaration *spostblit = sd->postblit; if (spostblit && !(spostblit->storage_class & STCdisable)) dtxoff(pdt, spostblit->toSymbol(), 0, TYnptr); else dtsize_t(pdt, 0); // xpostblit #endif // uint m_align; dtsize_t(pdt, tc->alignsize()); if (global.params.is64bit) { Type *t = sd->arg1type; for (int i = 0; i < 2; i++) { // m_argi if (t) { t->getTypeInfo(NULL); dtxoff(pdt, t->vtinfo->toSymbol(), 0, TYnptr); } else dtsize_t(pdt, 0); t = sd->arg2type; } } // xgetRTInfo if (sd->getRTInfo) sd->getRTInfo->toDt(pdt); else if (m_flags) dtsize_t(pdt, 1); // has pointers else dtsize_t(pdt, 0); // no pointers }