Skip to content

Commit a8035fc

Browse files
authored
Break semantic dependency of dmd/dmodule.d on dmd/dsymbolsem.d (dlang#21886)
1 parent d01182b commit a8035fc

15 files changed

Lines changed: 215 additions & 173 deletions

File tree

compiler/src/dmd/cxxfrontend.d

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,53 @@ uinteger_t size(Dsymbol ds, Loc loc)
254254
return dmd.dsymbolsem.size(ds, loc);
255255
}
256256

257+
void semantic3OnDependencies(Module m)
258+
{
259+
import dmd.dsymbolsem;
260+
return dmd.dsymbolsem.semantic3OnDependencies(m);
261+
}
262+
263+
void addDeferredSemantic(Dsymbol s)
264+
{
265+
import dmd.dsymbolsem;
266+
return dmd.dsymbolsem.addDeferredSemantic(s);
267+
}
268+
269+
void addDeferredSemantic2(Dsymbol s)
270+
{
271+
import dmd.dsymbolsem;
272+
return dmd.dsymbolsem.addDeferredSemantic2(s);
273+
}
274+
275+
void addDeferredSemantic3(Dsymbol s)
276+
{
277+
import dmd.dsymbolsem;
278+
return dmd.dsymbolsem.addDeferredSemantic3(s);
279+
}
280+
281+
void runDeferredSemantic()
282+
{
283+
import dmd.dsymbolsem;
284+
return dmd.dsymbolsem.runDeferredSemantic();
285+
}
286+
287+
void runDeferredSemantic2()
288+
{
289+
import dmd.dsymbolsem;
290+
return dmd.dsymbolsem.runDeferredSemantic2();
291+
}
292+
293+
void runDeferredSemantic3()
294+
{
295+
import dmd.dsymbolsem;
296+
return dmd.dsymbolsem.runDeferredSemantic3();
297+
}
298+
257299
bool isOverlappedWith(VarDeclaration vd, VarDeclaration v){
258300
import dmd.dsymbolsem;
259301
return dmd.dsymbolsem.isOverlappedWith(vd, v);
260302
}
261303

262-
263304
/***********************************************************
264305
* dtemplate.d
265306
*/

compiler/src/dmd/dmodule.d

Lines changed: 0 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import dmd.dmacro;
3030
import dmd.doc;
3131
import dmd.dscope;
3232
import dmd.dsymbol;
33-
import dmd.dsymbolsem : dsymbolSemantic;
3433
import dmd.errors;
3534
import dmd.errorsink;
3635
import dmd.expression;
@@ -65,21 +64,6 @@ else version (Posix)
6564
else
6665
static assert(0);
6766

68-
// function used to call semantic3 on a module's dependencies
69-
void semantic3OnDependencies(Module m)
70-
{
71-
if (!m)
72-
return;
73-
74-
if (m.semanticRun > PASS.semantic3)
75-
return;
76-
77-
m.semantic3(null);
78-
79-
foreach (i; 1 .. m.aimports.length)
80-
semantic3OnDependencies(m.aimports[i]);
81-
}
82-
8367
/**
8468
* Remove generated .di files on error and exit
8569
*/
@@ -964,125 +948,6 @@ extern (C++) final class Module : Package
964948
File.remove(docfile.toChars());
965949
}
966950

967-
/*******************************************
968-
* Can't run semantic on s now, try again later.
969-
*/
970-
extern (D) static void addDeferredSemantic(Dsymbol s)
971-
{
972-
//printf("Module::addDeferredSemantic('%s')\n", s.toChars());
973-
if (!s.deferred)
974-
{
975-
s.deferred = true;
976-
deferred.push(s);
977-
}
978-
}
979-
980-
extern (D) static void addDeferredSemantic2(Dsymbol s)
981-
{
982-
//printf("Module::addDeferredSemantic2('%s')\n", s.toChars());
983-
if (!s.deferred2)
984-
{
985-
s.deferred2 = true;
986-
deferred2.push(s);
987-
}
988-
}
989-
990-
extern (D) static void addDeferredSemantic3(Dsymbol s)
991-
{
992-
//printf("Module::addDeferredSemantic3('%s')\n", s.toChars());
993-
if (!s.deferred3)
994-
{
995-
s.deferred3 = true;
996-
deferred3.push(s);
997-
}
998-
}
999-
1000-
/******************************************
1001-
* Run semantic() on deferred symbols.
1002-
*/
1003-
static void runDeferredSemantic()
1004-
{
1005-
__gshared int nested;
1006-
if (nested)
1007-
return;
1008-
//if (deferred.length) printf("+Module::runDeferredSemantic(), len = %ld\n", deferred.length);
1009-
nested++;
1010-
1011-
size_t len;
1012-
do
1013-
{
1014-
len = deferred.length;
1015-
if (!len)
1016-
break;
1017-
1018-
Dsymbol* todo;
1019-
Dsymbol* todoalloc = null;
1020-
Dsymbol tmp;
1021-
if (len == 1)
1022-
{
1023-
todo = &tmp;
1024-
}
1025-
else
1026-
{
1027-
todo = cast(Dsymbol*)Mem.check(malloc(len * Dsymbol.sizeof));
1028-
todoalloc = todo;
1029-
}
1030-
memcpy(todo, deferred.tdata(), len * Dsymbol.sizeof);
1031-
foreach (Dsymbol s; Module.deferred[])
1032-
s.deferred = false;
1033-
deferred.setDim(0);
1034-
1035-
foreach (i; 0..len)
1036-
{
1037-
Dsymbol s = todo[i];
1038-
s.dsymbolSemantic(null);
1039-
//printf("deferred: %s, parent = %s\n", s.toChars(), s.parent.toChars());
1040-
}
1041-
//printf("\tdeferred.length = %ld, len = %ld\n", deferred.length, len);
1042-
if (todoalloc)
1043-
free(todoalloc);
1044-
}
1045-
while (deferred.length != len); // while making progress
1046-
nested--;
1047-
//printf("-Module::runDeferredSemantic(), len = %ld\n", deferred.length);
1048-
}
1049-
1050-
static void runDeferredSemantic2()
1051-
{
1052-
Module.runDeferredSemantic();
1053-
1054-
Dsymbols* a = &Module.deferred2;
1055-
for (size_t i = 0; i < a.length; i++)
1056-
{
1057-
Dsymbol s = (*a)[i];
1058-
s.deferred2 = false;
1059-
//printf("[%d] %s semantic2a\n", i, s.toPrettyChars());
1060-
s.semantic2(null);
1061-
1062-
if (global.errors)
1063-
break;
1064-
}
1065-
a.setDim(0);
1066-
}
1067-
1068-
static void runDeferredSemantic3()
1069-
{
1070-
Module.runDeferredSemantic2();
1071-
1072-
Dsymbols* a = &Module.deferred3;
1073-
for (size_t i = 0; i < a.length; i++)
1074-
{
1075-
Dsymbol s = (*a)[i];
1076-
s.deferred3 = false;
1077-
//printf("[%d] %s semantic3a\n", i, s.toPrettyChars());
1078-
s.semantic3(null);
1079-
1080-
if (global.errors)
1081-
break;
1082-
}
1083-
a.setDim(0);
1084-
}
1085-
1086951
extern (D) static void clearCache() nothrow
1087952
{
1088953
foreach (Module m; amodules)

compiler/src/dmd/dsymbol.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,5 +428,12 @@ namespace dmd
428428
bool hasPointers(Dsymbol *d);
429429
Type *getType(Dsymbol *d);
430430
uinteger_t size(Dsymbol *ds, Loc loc);
431+
void semantic3OnDependencies(Module *m);
432+
void addDeferredSemantic(Dsymbol *s);
433+
void addDeferredSemantic2(Dsymbol *s);
434+
void addDeferredSemantic3(Dsymbol *s);
435+
void runDeferredSemantic();
436+
void runDeferredSemantic2();
437+
void runDeferredSemantic3();
431438
bool isOverlappedWith(VarDeclaration *vd, VarDeclaration *v);
432439
}

0 commit comments

Comments
 (0)