Bug 3719 – forward references can cause out-of-memory error
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2010-01-18T11:29:00Z
Last change time
2015-06-09T01:27:22Z
Keywords
patch
Assigned to
nobody
Creator
r.sagitario
Comments
Comment #0 by r.sagitario — 2010-01-18T11:29:00Z
If there are forward references that are not resolved for a long time, dmd can waste a lot of memory and cpu-cycles.
It's not easy to create a small test case, but qtd fails to compile with "out of memory" without the following patch:
Module::runDeferredSemantic() should not retry between every new symbol in a class or struct, but only when some sensible progress is made (e.g. if Module::dprogress > 0). runDeferredSemantic() must then be forced to run once before running semantic2() on the modules.
Index: mars.c
===================================================================
--- mars.c (revision 336)
+++ mars.c (working copy)
@@ -1109,6 +1109,12 @@
if (global.errors)
fatal();
+ if(modules.dim)
+ { // last chance to resolve deferred symbols
+ Module::dprogress = 1;
+ ((Module *)modules.data[0])->runDeferredSemantic(); // should be static instead
+ }
+
// Do pass 2 semantic analysis
for (i = 0; i < modules.dim; i++)
{
Index: module.c
===================================================================
--- module.c (revision 336)
+++ module.c (working copy)
@@ -938,6 +938,8 @@
{
size_t len;
+ if(dprogress == 0)
+ return;
static int nested;
if (nested)
return;