Fix for issue #60.

This commit is contained in:
kai
2012-02-03 17:20:18 +01:00
parent 37ed7cdbae
commit 04b3d72cfe

View File

@@ -1,6 +1,6 @@
// Compiler implementation of the D programming language
// Copyright (c) 1999-2011 by Digital Mars
// Copyright (c) 1999-2011 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
@@ -64,9 +64,9 @@ ClassDeclaration *Module::moduleinfo;
Module *Module::rootModule;
DsymbolTable *Module::modules;
Modules Module::amodules;
Modules Module::amodules;
Dsymbols Module::deferred; // deferred Dsymbol's needing semantic() run on them
Dsymbols Module::deferred; // deferred Dsymbol's needing semantic() run on them
unsigned Module::dprogress;
void Module::init()
@@ -78,8 +78,8 @@ Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen
: Package(ident)
{
FileName *srcfilename;
FileName *objfilename;
FileName *symfilename;
FileName *objfilename;
FileName *symfilename;
// printf("Module::Module(filename = '%s', ident = '%s')\n", filename, ident->toChars());
this->arg = filename;
@@ -159,7 +159,7 @@ Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen
this->doDocComment = doDocComment;
this->doHdrGen = doHdrGen;
this->isRoot = false;
//this->arrayfuncs = 0;
this->arrayfuncs.init();
#endif
}
@@ -303,7 +303,7 @@ const char *Module::kind()
return "module";
}
Module *Module::load(Loc loc, Identifiers *packages, Identifier *ident)
Module *Module::load(Loc loc, Identifiers *packages, Identifier *ident)
{ Module *m;
char *filename;
@@ -318,8 +318,8 @@ Module *Module::load(Loc loc, Identifiers *packages, Identifier *ident)
{
OutBuffer buf;
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
buf.writestring(pid->toChars());
#if _WIN32
@@ -356,7 +356,7 @@ Module *Module::load(Loc loc, Identifiers *packages, Identifier *ident)
{
for (size_t i = 0; i < global.path->dim; i++)
{
char *p = (*global.path)[i];
char *p = (*global.path)[i];
char *n = FileName::combine(p, sdi);
if (FileName::exists(n))
{ result = n;
@@ -380,7 +380,7 @@ Module *Module::load(Loc loc, Identifiers *packages, Identifier *ident)
if (packages)
{
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
{ Identifier *pid = packages->tdata()[i];
printf("%s.", pid->toChars());
}
}
@@ -407,10 +407,10 @@ void Module::read(Loc loc)
*/
if (global.path)
{
for (size_t i = 0; i < global.path->dim; i++)
for (size_t i = 0; i < global.path->dim; i++)
{
char *p = global.path->tdata()[i];
fprintf(stdmsg, "import path[%zd] = %s\n", i, p);
char *p = global.path->tdata()[i];
fprintf(stdmsg, "import path[%zd] = %s\n", i, p);
}
}
else
@@ -422,7 +422,7 @@ void Module::read(Loc loc)
inline unsigned readwordLE(unsigned short *p)
{
#if LITTLE_ENDIAN
#if LITTLE_ENDIAN
return *p;
#else
return (((unsigned char *)p)[1] << 8) | ((unsigned char *)p)[0];
@@ -436,7 +436,7 @@ inline unsigned readwordBE(unsigned short *p)
inline unsigned readlongLE(unsigned *p)
{
#if LITTLE_ENDIAN
#if LITTLE_ENDIAN
return *p;
#else
return ((unsigned char *)p)[0] |
@@ -672,11 +672,11 @@ void Module::parse()
#endif
p.nextToken();
members = p.parseModule();
::free(srcfile->buffer);
srcfile->buffer = NULL;
srcfile->len = 0;
::free(srcfile->buffer);
srcfile->buffer = NULL;
srcfile->len = 0;
md = p.md;
numlines = p.loc.linnum;
@@ -736,7 +736,7 @@ void Module::importAll(Scope *prevsc)
// Add import of "object" if this module isn't "object"
if (ident != Id::object)
{
if (members->dim == 0 || ((*members)[0])->ident != Id::object)
if (members->dim == 0 || ((*members)[0])->ident != Id::object)
{
Import *im = new Import(0, NULL, Id::object, NULL, 0);
members->shift(im);
@@ -747,9 +747,9 @@ void Module::importAll(Scope *prevsc)
{
// Add all symbols into module's symbol table
symtab = new DsymbolTable();
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{
Dsymbol *s = members->tdata()[i];
Dsymbol *s = members->tdata()[i];
s->addMember(NULL, sc->scopesym, 1);
}
}
@@ -761,14 +761,14 @@ void Module::importAll(Scope *prevsc)
* before any semantic() on any of them.
*/
setScope(sc); // remember module scope for semantic
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
s->setScope(sc);
}
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{
Dsymbol *s = members->tdata()[i];
Dsymbol *s = members->tdata()[i];
s->importAll(sc);
}
@@ -776,7 +776,7 @@ void Module::importAll(Scope *prevsc)
sc->pop(); // 2 pops because Scope::createGlobal() created 2
}
void Module::semantic()
void Module::semantic()
{
if (semanticstarted)
return;
@@ -805,7 +805,7 @@ void Module::semantic()
// Add all symbols into module's symbol table
symtab = new DsymbolTable();
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = (Dsymbol *)members->data[i];
s->addMember(NULL, sc->scopesym, 1);
}
@@ -815,23 +815,23 @@ void Module::semantic()
* If this works out well, it can be extended to all modules
* before any semantic() on any of them.
*/
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = (Dsymbol *)members->data[i];
s->setScope(sc);
}
#endif
// Do semantic() on members that don't depend on others
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
//printf("\tModule('%s'): '%s'.semantic0()\n", toChars(), s->toChars());
s->semantic0(sc);
}
// Pass 1 semantic routines: do public side of the definition
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
//printf("\tModule('%s'): '%s'.semantic()\n", toChars(), s->toChars());
s->semantic(sc);
@@ -846,13 +846,13 @@ void Module::semantic()
//printf("-Module::semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
}
void Module::semantic2()
{
void Module::semantic2()
{
if (deferred.dim)
{
for (size_t i = 0; i < deferred.dim; i++)
for (size_t i = 0; i < deferred.dim; i++)
{
Dsymbol *sd = deferred.tdata()[i];
Dsymbol *sd = deferred.tdata()[i];
sd->error("unable to resolve forward reference in definition");
}
@@ -871,10 +871,10 @@ void Module::semantic2()
//printf("Module = %p\n", sc.scopesym);
// Pass 2 semantic routines: do initializers and function bodies
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s;
s = members->tdata()[i];
s = members->tdata()[i];
s->semantic2(sc);
}
@@ -884,8 +884,8 @@ void Module::semantic2()
//printf("-Module::semantic2('%s'): parent = %p\n", toChars(), parent);
}
void Module::semantic3()
{
void Module::semantic3()
{
//printf("Module::semantic3('%s'): parent = %p\n", toChars(), parent);
if (semanticstarted >= 3)
return;
@@ -899,10 +899,10 @@ void Module::semantic3()
//printf("Module = %p\n", sc.scopesym);
// Pass 3 semantic routines: do initializers and function bodies
for (size_t i = 0; i < members->dim; i++)
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s;
s = members->tdata()[i];
s = members->tdata()[i];
//printf("Module %s: %s.semantic3()\n", toChars(), s->toChars());
s->semantic3(sc);
}
@@ -924,8 +924,8 @@ void Module::inlineScan()
// gets imported, it is unaffected by context.
//printf("Module = %p\n", sc.scopesym);
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
//if (global.params.verbose)
//printf("inline scan symbol %s\n", s->toChars());
@@ -949,8 +949,8 @@ void Module::gensymfile()
buf.printf("// Sym file generated from '%s'", srcfile->toChars());
buf.writenl();
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
for (size_t i = 0; i < members->dim; i++)
{ Dsymbol *s = members->tdata()[i];
s->toCBuffer(&buf, &hgs);
}
@@ -1010,8 +1010,8 @@ Dsymbol *Module::symtabInsert(Dsymbol *s)
void Module::clearCache()
{
for (size_t i = 0; i < amodules.dim; i++)
{ Module *m = amodules.tdata()[i];
for (size_t i = 0; i < amodules.dim; i++)
{ Module *m = amodules.tdata()[i];
m->searchCacheIdent = NULL;
}
}
@@ -1023,9 +1023,9 @@ void Module::clearCache()
void Module::addDeferredSemantic(Dsymbol *s)
{
// Don't add it if it is already there
for (size_t i = 0; i < deferred.dim; i++)
for (size_t i = 0; i < deferred.dim; i++)
{
Dsymbol *sd = deferred.tdata()[i];
Dsymbol *sd = deferred.tdata()[i];
if (sd == s)
return;
@@ -1070,10 +1070,10 @@ void Module::runDeferredSemantic()
todo = (Dsymbol **)alloca(len * sizeof(Dsymbol *));
assert(todo);
}
memcpy(todo, deferred.tdata(), len * sizeof(Dsymbol *));
memcpy(todo, deferred.tdata(), len * sizeof(Dsymbol *));
deferred.setDim(0);
for (size_t i = 0; i < len; i++)
for (size_t i = 0; i < len; i++)
{
Dsymbol *s = todo[i];
@@ -1097,13 +1097,13 @@ int Module::imports(Module *m)
//printf("%s Module::imports(%s)\n", toChars(), m->toChars());
int aimports_dim = aimports.dim;
#if 0
for (size_t i = 0; i < aimports.dim; i++)
for (size_t i = 0; i < aimports.dim; i++)
{ Module *mi = (Module *)aimports.data[i];
printf("\t[%d] %s\n", i, mi->toChars());
}
#endif
for (size_t i = 0; i < aimports.dim; i++)
{ Module *mi = aimports.tdata()[i];
for (size_t i = 0; i < aimports.dim; i++)
{ Module *mi = aimports.tdata()[i];
if (mi == m)
return TRUE;
if (!mi->insearch)
@@ -1126,16 +1126,16 @@ int Module::selfImports()
//printf("Module::selfImports() %s\n", toChars());
if (!selfimports)
{
for (size_t i = 0; i < amodules.dim; i++)
{ Module *mi = amodules.tdata()[i];
for (size_t i = 0; i < amodules.dim; i++)
{ Module *mi = amodules.tdata()[i];
//printf("\t[%d] %s\n", i, mi->toChars());
mi->insearch = 0;
}
selfimports = imports(this) + 1;
for (size_t i = 0; i < amodules.dim; i++)
{ Module *mi = amodules.tdata()[i];
for (size_t i = 0; i < amodules.dim; i++)
{ Module *mi = amodules.tdata()[i];
//printf("\t[%d] %s\n", i, mi->toChars());
mi->insearch = 0;
}
@@ -1146,7 +1146,7 @@ int Module::selfImports()
/* =========================== ModuleDeclaration ===================== */
ModuleDeclaration::ModuleDeclaration(Identifiers *packages, Identifier *id)
ModuleDeclaration::ModuleDeclaration(Identifiers *packages, Identifier *id)
{
this->packages = packages;
this->id = id;
@@ -1158,8 +1158,8 @@ char *ModuleDeclaration::toChars()
if (packages && packages->dim)
{
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
buf.writestring(pid->toChars());
buf.writeByte('.');
@@ -1184,7 +1184,7 @@ const char *Package::kind()
}
DsymbolTable *Package::resolve(Identifiers *packages, Dsymbol **pparent, Package **ppkg)
DsymbolTable *Package::resolve(Identifiers *packages, Dsymbol **pparent, Package **ppkg)
{
DsymbolTable *dst = Module::modules;
Dsymbol *parent = NULL;
@@ -1194,9 +1194,9 @@ DsymbolTable *Package::resolve(Identifiers *packages, Dsymbol **pparent, Package
*ppkg = NULL;
if (packages)
{
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
{
for (size_t i = 0; i < packages->dim; i++)
{ Identifier *pid = packages->tdata()[i];
Dsymbol *p;
p = dst->lookup(pid);