Skip to content

Commit

Permalink
[Refactoring] Add Module::rootImports() and use it in TemplateInstanc…
Browse files Browse the repository at this point in the history
…e::needsCodegen()

it would make compilation a little faster so `rootImports` cache the result.
  • Loading branch information
9rnsr committed Sep 5, 2014
1 parent 5c44275 commit 01fa21e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 35 deletions.
47 changes: 34 additions & 13 deletions src/module.c
Expand Up @@ -60,6 +60,7 @@ Module::Module(const char *filename, Identifier *ident, int doDocComment, int do
isPackageFile = false;
needmoduleinfo = 0;
selfimports = 0;
rootimports = 0;
insearch = 0;
searchCacheIdent = NULL;
searchCacheSymbol = NULL;
Expand Down Expand Up @@ -981,34 +982,54 @@ int Module::imports(Module *m)
}

/*************************************
* Return !=0 if module imports itself.
* Return true if module imports itself.
*/

int Module::selfImports()
bool Module::selfImports()
{
//printf("Module::selfImports() %s\n", toChars());
if (!selfimports)
if (selfimports == 0)
{
for (size_t i = 0; i < amodules.dim; i++)
{
Module *mi = amodules[i];
//printf("\t[%d] %s\n", i, mi->toChars());
mi->insearch = 0;
}
amodules[i]->insearch = 0;

selfimports = imports(this) + 1;

for (size_t i = 0; i < amodules.dim; i++)
amodules[i]->insearch = 0;
}
return selfimports == 2;
}

/*************************************
* Return true if module imports root module.
*/

bool Module::rootImports()
{
//printf("Module::rootImports() %s\n", toChars());
if (rootimports == 0)
{
for (size_t i = 0; i < amodules.dim; i++)
amodules[i]->insearch = 0;

rootimports = 1;
for (size_t i = 0; i < amodules.dim; ++i)
{
Module *mi = amodules[i];
//printf("\t[%d] %s\n", i, mi->toChars());
mi->insearch = 0;
Module *m = amodules[i];
if (m->isRoot() && imports(m))
{
rootimports = 2;
break;
}
}

for (size_t i = 0; i < amodules.dim; i++)
amodules[i]->insearch = 0;
}
return selfimports - 1;
return rootimports == 2;
}


/* =========================== ModuleDeclaration ===================== */

ModuleDeclaration::ModuleDeclaration(Loc loc, Identifiers *packages, Identifier *id, bool safe)
Expand Down
5 changes: 4 additions & 1 deletion src/module.h
Expand Up @@ -89,7 +89,10 @@ class Module : public Package
int needmoduleinfo;

int selfimports; // 0: don't know, 1: does not, 2: does
int selfImports(); // returns !=0 if module imports itself
bool selfImports(); // returns true if module imports itself

int rootimports; // 0: don't know, 1: does not, 2: does
bool rootImports(); // returns true if module imports root module

int insearch;
Identifier *searchCacheIdent;
Expand Down
22 changes: 1 addition & 21 deletions src/template.c
Expand Up @@ -7844,27 +7844,7 @@ bool TemplateInstance::needsCodegen()
* See bugzilla 2500.
*/

for (size_t i = 0; i < Module::amodules.dim; ++i)
{
Module *m = Module::amodules[i];
m->insearch = 0;
}
bool importsRoot = false;
for (size_t i = 0; i < Module::amodules.dim; ++i)
{
Module *m = Module::amodules[i];
if (m->isRoot() && mi->imports(m))
{
importsRoot = true;
break;
}
}
for (size_t i = 0; i < Module::amodules.dim; ++i)
{
Module *m = Module::amodules[i];
m->insearch = 0;
}
if (!importsRoot)
if (!mi->rootImports())
{
//printf("instantiated by %s %s\n", instantiatingModule->toChars(), toChars());
return false;
Expand Down

0 comments on commit 01fa21e

Please sign in to comment.