Mercurial > projects > ddmd
diff dmd/TypeInfoTypedefDeclaration.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | 2e2a5c3f943a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/TypeInfoTypedefDeclaration.d Sat Oct 24 08:42:06 2009 +0400 @@ -0,0 +1,65 @@ +module dmd.TypeInfoTypedefDeclaration; + +import dmd.Type; +import dmd.TypeInfoDeclaration; +import dmd.TypedefDeclaration; +import dmd.TypeTypedef; +import dmd.TY; +import dmd.Loc; +import dmd.backend.dt_t; +import dmd.backend.TYM; +import dmd.backend.Util; + +import std.string; + +class TypeInfoTypedefDeclaration : TypeInfoDeclaration +{ + this(Type tinfo) + { + super(tinfo, 0); + } + + void toDt(dt_t** pdt) + { + //printf("TypeInfoTypedefDeclaration.toDt() %s\n", toChars()); + + dtxoff(pdt, Type.typeinfotypedef.toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Typedef + dtdword(pdt, 0); // monitor + + assert(tinfo.ty == Ttypedef); + + TypeTypedef tc = cast(TypeTypedef)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.getTypeInfo(null); // generate vtinfo + assert(sd.basetype.vtinfo); + dtxoff(pdt, sd.basetype.vtinfo.toSymbol(), 0, TYnptr); // TypeInfo for basetype + + string name = sd.toPrettyChars(); + size_t namelen = name.length; + dtdword(pdt, namelen); + dtabytes(pdt, TYnptr, 0, namelen + 1, toStringz(name)); + + // void[] init; + if (tinfo.isZeroInit(Loc(0)) || !sd.init) + { + // 0 initializer, or the same as the base type + dtdword(pdt, 0); // init.length + dtdword(pdt, 0); // init.ptr + } + else + { + dtdword(pdt, cast(int)sd.type.size()); // init.length + dtxoff(pdt, sd.toInitializer(), 0, TYnptr); // init.ptr + } + } +} +