From f6025fc7bcbcc4abd6ce3beaff2ba849cc1b495a Mon Sep 17 00:00:00 2001 From: RazvanN7 Date: Wed, 18 Jan 2017 12:51:22 +0200 Subject: [PATCH 1/3] Fix Issue 7016 - local import does not create -deps dependency --- src/mars.d | 26 +++++++++++++++++-- test/compilable/extra-files/depsOutput9948a.d | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/mars.d b/src/mars.d index dcb95eb17dae..4707a0db3942 100644 --- a/src/mars.d +++ b/src/mars.d @@ -186,7 +186,6 @@ extern (C++) __gshared Module entrypoint = null; /// Module in which the D main is extern (C++) __gshared Module rootHasMain = null; - /** * Generate C main() in response to seeing D main(). * @@ -241,6 +240,27 @@ extern (C++) void genCmain(Scope* sc) rootHasMain = sc._module; } +/** + * Recursevely call semantic3() on import tree nodes. + */ +private void semantic3OnDependencies(Module m) +{ + if (!m) + return; + else + { + if(global.params.verbose) + fprintf(global.stdmsg, "semantic3 %s\n", m.toChars()); + m.semantic3(null); + + // start from 1 to avoid calling semantic3 on object + for (int i=1; i Date: Wed, 25 Jan 2017 11:58:38 +0200 Subject: [PATCH 2/3] Added the feature to avoid infinite recursion + rebased --- src/mars.d | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mars.d b/src/mars.d index 4707a0db3942..5ed251ffd9f2 100644 --- a/src/mars.d +++ b/src/mars.d @@ -243,21 +243,25 @@ extern (C++) void genCmain(Scope* sc) /** * Recursevely call semantic3() on import tree nodes. */ -private void semantic3OnDependencies(Module m) +private void semantic3OnDependencies(Module m, bool[string] importArray) { - if (!m) + import std.conv : to; + string mName = to!string(m.toChars()); + if (!m || (mName in importArray)) return; else { if(global.params.verbose) fprintf(global.stdmsg, "semantic3 %s\n", m.toChars()); + + importArray[mName] = true; m.semantic3(null); // start from 1 to avoid calling semantic3 on object for (int i=1; i Date: Wed, 25 Jan 2017 15:30:23 +0200 Subject: [PATCH 3/3] Replaced AA with root.hashtable --- src/mars.d | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/mars.d b/src/mars.d index 5ed251ffd9f2..b0bb1080ea85 100644 --- a/src/mars.d +++ b/src/mars.d @@ -55,6 +55,7 @@ import ddmd.target; import ddmd.tokens; import ddmd.utils; +import ddmd.root.stringtable; /** * Print DMD's logo on stdout @@ -243,18 +244,23 @@ extern (C++) void genCmain(Scope* sc) /** * Recursevely call semantic3() on import tree nodes. */ -private void semantic3OnDependencies(Module m, bool[string] importArray) +private void semantic3OnDependencies(Module m, StringTable *importArray) { - import std.conv : to; - string mName = to!string(m.toChars()); - if (!m || (mName in importArray)) + if (!m) + return; + + const(char) *mName = m.toChars(); + size_t mNameLen = strlen(mName); + + if (importArray.lookup(mName, mNameLen)) return; else { if(global.params.verbose) - fprintf(global.stdmsg, "semantic3 %s\n", m.toChars()); + fprintf(global.stdmsg, "semantic3 %s\n", mName); - importArray[mName] = true; + // The value of the hashtable doesn't matter, just the key is important + importArray.insert(mName, mNameLen, cast(void*) mName); m.semantic3(null); // start from 1 to avoid calling semantic3 on object @@ -1521,12 +1527,14 @@ Language changes listed by -transition=id: fatal(); // inlineScan incrementally run semantic3 of each expanded functions. - // So deps file generation should be moved after the inlinig stage. + // So deps file generation should be moved after the inlining stage. if (global.params.moduleDeps) { // Bugzilla 7016 - bool[string] importArray; - semantic3OnDependencies(modules[0], importArray); + StringTable importArray; + importArray._init(); + + semantic3OnDependencies(modules[0], &importArray); OutBuffer* ob = global.params.moduleDeps; if (global.params.moduleDepsFile)