mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
Fix for issue #60.
This commit is contained in:
138
dmd/module.c
138
dmd/module.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user