diff dmd/module.c @ 1103:b30fe7e1dbb9

- Updated to DMD frontend 1.041. - Removed dmd/inifile.c , it's not under a free license, replaced with libconfig based config file.
author Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
date Thu, 12 Mar 2009 20:37:27 +0100
parents a8cb25d478c4
children eeb8b95ea92e
line wrap: on
line diff
--- a/dmd/module.c	Thu Mar 12 14:08:57 2009 +0100
+++ b/dmd/module.c	Thu Mar 12 20:37:27 2009 +0100
@@ -24,7 +24,7 @@
 #include "gdc_alloca.h"
 #endif
 
-#include "mem.h"
+#include "rmem.h"
 
 #include "mars.h"
 #include "module.h"
@@ -88,6 +88,7 @@
 #ifdef IN_GCC
     strictlyneedmoduleinfo = 0;
 #endif
+    selfimports = 0;
     insearch = 0;
     searchCacheIdent = NULL;
     searchCacheSymbol = NULL;
@@ -145,9 +146,9 @@
     this->doHdrGen = doHdrGen;
 }
 
-File* Module::buildFilePath(char* forcename, char* path, char* ext)
+File* Module::buildFilePath(const char* forcename, const char* path, const char* ext)
 {
-    char *argobj;
+    const char *argobj;
     if (forcename)
 	argobj = forcename;
     else
@@ -160,9 +161,9 @@
 	if (fqnNames)
 	{
 	    if(md)
-		argobj = FileName::replaceName(argobj, md->toChars());
+		argobj = FileName::replaceName((char*)argobj, md->toChars());
 	    else
-		argobj = FileName::replaceName(argobj, toChars());
+		argobj = FileName::replaceName((char*)argobj, toChars());
 
 	    // add ext, otherwise forceExt will make nested.module into nested.bc
 	    size_t len = strlen(argobj);
@@ -926,7 +927,6 @@
 	{
 	    mi->insearch = 1;
 	    int r = mi->imports(m);
-	    mi->insearch = 0;
 	    if (r)
 		return r;
 	}
@@ -934,6 +934,33 @@
     return FALSE;
 }
 
+/*************************************
+ * Return !=0 if module imports itself.
+ */
+
+int Module::selfImports()
+{
+    //printf("Module::selfImports() %s\n", toChars());
+    if (!selfimports)
+    {
+	for (int i = 0; i < amodules.dim; i++)
+	{   Module *mi = (Module *)amodules.data[i];
+	    //printf("\t[%d] %s\n", i, mi->toChars());
+	    mi->insearch = 0;
+	}
+
+	selfimports = imports(this) + 1;
+
+	for (int i = 0; i < amodules.dim; i++)
+	{   Module *mi = (Module *)amodules.data[i];
+	    //printf("\t[%d] %s\n", i, mi->toChars());
+	    mi->insearch = 0;
+	}
+    }
+    return selfimports - 1;
+}
+
+
 /* =========================== ModuleDeclaration ===================== */
 
 ModuleDeclaration::ModuleDeclaration(Array *packages, Identifier *id)