Mercurial > projects > ldc
diff gen/typinf.c @ 1:c53b6e3fe49a trunk
[svn r5] Initial commit. Most things are very rough.
author | lindquist |
---|---|
date | Sat, 01 Sep 2007 21:43:27 +0200 |
parents | |
children | e116aa1488e6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/typinf.c Sat Sep 01 21:43:27 2007 +0200 @@ -0,0 +1,403 @@ + + +// Copyright (c) 1999-2004 by Digital Mars +// All Rights Reserved +// written by Walter Bright +// www.digitalmars.com +// License for redistribution is by either the Artistic License +// in artistic.txt, or the GNU General Public License in gnu.txt. +// See the included readme.txt for details. + +#include <cstdio> +#include <cassert> + +#include "mars.h" +#include "module.h" +#include "mtype.h" +#include "scope.h" +#include "init.h" +#include "expression.h" +#include "attrib.h" +#include "declaration.h" +#include "template.h" +#include "id.h" +#include "enum.h" +#include "import.h" +#include "aggregate.h" + +#include "logger.h" + +/******************************************* + + * Get a canonicalized form of the TypeInfo for use with the internal + + * runtime library routines. Canonicalized in that static arrays are + + * represented as dynamic arrays, enums are represented by their + + * underlying type, etc. This reduces the number of TypeInfo's needed, + + * so we can use the custom internal ones more. + + */ + + + +Expression *Type::getInternalTypeInfo(Scope *sc) + +{ TypeInfoDeclaration *tid; + + Expression *e; + + Type *t; + + static TypeInfoDeclaration *internalTI[TMAX]; + + + + //printf("Type::getInternalTypeInfo() %s\n", toChars()); + + t = toBasetype(); + + switch (t->ty) + + { + + case Tsarray: + + t = t->next->arrayOf(); // convert to corresponding dynamic array type + + break; + + + + case Tclass: + + if (((TypeClass *)t)->sym->isInterfaceDeclaration()) + + break; + + goto Linternal; + + + + case Tarray: + + if (t->next->ty != Tclass) + + break; + + goto Linternal; + + + + case Tfunction: + + case Tdelegate: + + case Tpointer: + + Linternal: + + tid = internalTI[t->ty]; + + if (!tid) + + { tid = new TypeInfoDeclaration(t, 1); + + internalTI[t->ty] = tid; + + } + + e = new VarExp(0, tid); + + e = e->addressOf(sc); + + e->type = tid->type; // do this so we don't get redundant dereference + + return e; + + + + default: + + break; + + } + + //printf("\tcalling getTypeInfo() %s\n", t->toChars()); + + return t->getTypeInfo(sc); + +} + + + + + +/**************************************************** + + * Get the exact TypeInfo. + + */ + + + +Expression *Type::getTypeInfo(Scope *sc) + +{ + + Expression *e; + + Type *t; + + + + //printf("Type::getTypeInfo() %p, %s\n", this, toChars()); + + t = merge(); // do this since not all Type's are merge'd + + if (!t->vtinfo) + + { t->vtinfo = t->getTypeInfoDeclaration(); + + assert(t->vtinfo); + + + + /* If this has a custom implementation in std/typeinfo, then + + * do not generate a COMDAT for it. + + */ + + if (!t->builtinTypeInfo()) + + { // Generate COMDAT + + if (sc) // if in semantic() pass + + { // Find module that will go all the way to an object file + + Module *m = sc->module->importedFrom; + + m->members->push(t->vtinfo); + + } + + else // if in obj generation pass + + { + + t->vtinfo->toObjFile(); + + } + + } + + } + + e = new VarExp(0, t->vtinfo); + + //e = e->addressOf(sc); + e->type = t->vtinfo->type; // do this so we don't get redundant dereference + + return e; + +} + + + +TypeInfoDeclaration *Type::getTypeInfoDeclaration() + +{ + + //printf("Type::getTypeInfoDeclaration() %s\n", toChars()); + + return new TypeInfoDeclaration(this, 0); + +} + + + +TypeInfoDeclaration *TypeTypedef::getTypeInfoDeclaration() + +{ + + return new TypeInfoTypedefDeclaration(this); + +} + + + +TypeInfoDeclaration *TypePointer::getTypeInfoDeclaration() + +{ + + return new TypeInfoPointerDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeDArray::getTypeInfoDeclaration() + +{ + + return new TypeInfoArrayDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeSArray::getTypeInfoDeclaration() + +{ + + return new TypeInfoStaticArrayDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeAArray::getTypeInfoDeclaration() + +{ + + return new TypeInfoAssociativeArrayDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeStruct::getTypeInfoDeclaration() + +{ + + return new TypeInfoStructDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeClass::getTypeInfoDeclaration() + +{ + + if (sym->isInterfaceDeclaration()) + + return new TypeInfoInterfaceDeclaration(this); + + else + + return new TypeInfoClassDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeEnum::getTypeInfoDeclaration() + +{ + + return new TypeInfoEnumDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeFunction::getTypeInfoDeclaration() + +{ + + return new TypeInfoFunctionDeclaration(this); + +} +enum RET TypeFunction::retStyle() + +{ + + return RETstack; + +} + + +TypeInfoDeclaration *TypeDelegate::getTypeInfoDeclaration() + +{ + + return new TypeInfoDelegateDeclaration(this); + +} + + + +TypeInfoDeclaration *TypeTuple::getTypeInfoDeclaration() + +{ + + return new TypeInfoTupleDeclaration(this); + +} + + +void TypeInfoDeclaration::toDt(dt_t **pdt) +{ +} + +void TypeInfoTypedefDeclaration::toDt(dt_t **pdt) +{ +} + +void TypeInfoStructDeclaration::toDt(dt_t **pdt) +{ +} + +void TypeInfoClassDeclaration::toDt(dt_t **pdt) +{ +} + +void TypeInfoDeclaration::toObjFile() +{ + Logger::println("TypeInfoDeclaration::toObjFile()"); + LOG_SCOPE; + Logger::println("type = '%s'", tinfo->toChars()); + + +} + +/* ========================================================================= */ + +/* These decide if there's an instance for them already in std.typeinfo, + * because then the compiler doesn't need to build one. + */ + +int Type::builtinTypeInfo() +{ + return 0; +} + +int TypeBasic::builtinTypeInfo() +{ + return 1; +} + +int TypeDArray::builtinTypeInfo() +{ + return 0; +} + +/* ========================================================================= */ + +/*************************************** + * Create a static array of TypeInfo references + * corresponding to an array of Expression's. + * Used to supply hidden _arguments[] value for variadic D functions. + */ + +Expression *createTypeInfoArray(Scope *sc, Expression *args[], int dim) +{ + assert(0); + return 0; +} +