Skip to content

Commit

Permalink
Merge pull request #3792 from AndrewEdwards/2.066
Browse files Browse the repository at this point in the history
Merge pull request #3790 from 9rnsr/fix13152
  • Loading branch information
AndrewEdwards committed Jul 21, 2014
2 parents 0f27686 + 84874c7 commit 822b199
Show file tree
Hide file tree
Showing 31 changed files with 733 additions and 6 deletions.
1 change: 1 addition & 0 deletions src/dsymbol.c
Expand Up @@ -420,6 +420,7 @@ void *symbol_search_fp(void *arg, const char *seed)
assert(id);

Dsymbol *s = (Dsymbol *)arg;
Module::clearCache();
return (void *)s->search(Loc(), id, IgnoreErrors | IgnoreAmbiguous);
}

Expand Down
44 changes: 38 additions & 6 deletions src/module.c
Expand Up @@ -62,6 +62,9 @@ Module::Module(const char *filename, Identifier *ident, int doDocComment, int do
needmoduleinfo = 0;
selfimports = 0;
insearch = 0;
searchCacheIdent = NULL;
searchCacheSymbol = NULL;
searchCacheFlags = 0;
decldefs = NULL;
massert = NULL;
munittest = NULL;
Expand Down Expand Up @@ -825,18 +828,47 @@ Dsymbol *Module::search(Loc loc, Identifier *ident, int flags)
*/

//printf("%s Module::search('%s', flags = %d) insearch = %d\n", toChars(), ident->toChars(), flags, insearch);
Dsymbol *s;
if (insearch)
s = NULL;
else
return NULL;
if (searchCacheIdent == ident && searchCacheFlags == flags)
{
//printf("%s Module::search('%s', flags = %d) insearch = %d searchCacheSymbol = %s\n",
// toChars(), ident->toChars(), flags, insearch, searchCacheSymbol ? searchCacheSymbol->toChars() : "null");
return searchCacheSymbol;
}

unsigned int errors = global.errors;

insearch = 1;
Dsymbol *s = ScopeDsymbol::search(loc, ident, flags);
insearch = 0;

if (errors == global.errors)
{
insearch = 1;
s = ScopeDsymbol::search(loc, ident, flags);
insearch = 0;
// Bugzilla 10752: We can cache the result only when it does not cause
// access error so the side-effect should be reproduced in later search.
searchCacheIdent = ident;
searchCacheSymbol = s;
searchCacheFlags = flags;
}
return s;
}

Dsymbol *Module::symtabInsert(Dsymbol *s)
{
searchCacheIdent = NULL; // symbol is inserted, so invalidate cache
return Package::symtabInsert(s);
}

void Module::clearCache()
{
for (size_t i = 0; i < amodules.dim; i++)
{
Module *m = amodules[i];
m->searchCacheIdent = NULL;
}
}

/*******************************************
* Can't run semantic on s now, try again later.
*/
Expand Down
5 changes: 5 additions & 0 deletions src/module.h
Expand Up @@ -91,6 +91,9 @@ class Module : public Package
int selfImports(); // returns !=0 if module imports itself

int insearch;
Identifier *searchCacheIdent;
Dsymbol *searchCacheSymbol; // cached value of search
int searchCacheFlags; // cached flags

Module *importedFrom; // module from command line we're imported from,
// i.e. a module that will be taken all the
Expand Down Expand Up @@ -134,11 +137,13 @@ class Module : public Package
void gensymfile();
int needModuleInfo();
Dsymbol *search(Loc loc, Identifier *ident, int flags = IgnoreNone);
Dsymbol *symtabInsert(Dsymbol *s);
void deleteObjFile();
static void addDeferredSemantic(Dsymbol *s);
static void runDeferredSemantic();
static void addDeferredSemantic3(Dsymbol *s);
static void runDeferredSemantic3();
static void clearCache();
int imports(Module *m);

bool isRoot() { return this->importedFrom == this; }
Expand Down
1 change: 1 addition & 0 deletions src/scope.c
Expand Up @@ -544,6 +544,7 @@ void *scope_search_fp(void *arg, const char *seed)
assert(id);

Scope *sc = (Scope *)arg;
Module::clearCache();
Dsymbol *s = sc->search(Loc(), id, NULL);
return (void*)s;
}
Expand Down
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152a.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152b.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152c.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152d.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152e.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152f.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152g.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152h.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152i.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;
26 changes: 26 additions & 0 deletions test/fail_compilation/imports/test13152j.d
@@ -0,0 +1,26 @@
public import imports.test13152a;
public import imports.test13152b;
public import imports.test13152c;
public import imports.test13152d;
public import imports.test13152e;
public import imports.test13152f;
public import imports.test13152g;
public import imports.test13152h;
public import imports.test13152i;
public import imports.test13152j;
public import imports.test13152k;
public import imports.test13152l;
public import imports.test13152m;
public import imports.test13152n;
public import imports.test13152o;
public import imports.test13152p;
public import imports.test13152q;
public import imports.test13152r;
public import imports.test13152s;
public import imports.test13152t;
public import imports.test13152u;
public import imports.test13152v;
public import imports.test13152w;
public import imports.test13152x;
public import imports.test13152y;
public import imports.test13152z;

0 comments on commit 822b199

Please sign in to comment.