summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ast.nim1
-rw-r--r--compiler/cgen.nim4
-rw-r--r--compiler/modules.nim9
-rw-r--r--compiler/options.nim28
4 files changed, 18 insertions, 24 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index bd8bdb30b..61b8ca795 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -481,6 +481,7 @@ type
     skStub,               # symbol is a stub and not yet loaded from the ROD
                           # file (it is loaded on demand, which may
                           # mean: never)
+    skPackage             # symbol is a package (used for canonicalization)
   TSymKinds* = set[TSymKind]
 
 const
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 8da753d04..c3a28527e 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -1044,8 +1044,10 @@ proc genMainProc(m: BModule) =
     appcg(m, m.s[cfsProcs], otherMain, [])
 
 proc getSomeInitName(m: PSym, suffix: string): PRope =
+  assert m.kind == skModule
+  assert m.owner.kind == skPackage
   if {sfSystemModule, sfMainModule} * m.flags == {}:
-    result = m.info.toFullPath.getPackageName.mangle.toRope
+    result = m.owner.name.s.mangle.toRope
   result.app m.name.s
   result.app suffix
   
diff --git a/compiler/modules.nim b/compiler/modules.nim
index 6a1491682..fb1940741 100644
--- a/compiler/modules.nim
+++ b/compiler/modules.nim
@@ -1,7 +1,7 @@
 #
 #
 #           The Nimrod Compiler
-#        (c) Copyright 2013 Andreas Rumpf
+#        (c) Copyright 2014 Andreas Rumpf
 #
 #    See the file "copying.txt", included in this
 #    distribution, for details about the copyright.
@@ -20,7 +20,7 @@ type
   TModuleInMemory* = object
     compiledAt*: float
     crc*: TCrc32
-    deps*: seq[int32] ## XXX: slurped files are not currently tracked
+    deps*: seq[int32] ## XXX: slurped files are currently not tracked
     needsRecompile*: TNeedRecompile
     crcStatus*: TCrcStatus
 
@@ -83,7 +83,7 @@ proc resetAllModules* =
   for i in 0..gCompiledModules.high:
     if gCompiledModules[i] != nil:
       resetModule(i.int32)
-
+  resetPackageCache()
   # for m in cgenModules(): echo "CGEN MODULE FOUND"
 
 proc checkDepMem(fileIdx: int32): TNeedRecompile =
@@ -120,8 +120,9 @@ proc newModule(fileIdx: int32): PSym =
   if not isNimrodIdentifier(result.name.s):
     rawMessage(errInvalidModuleName, result.name.s)
   
-  result.owner = result       # a module belongs to itself
   result.info = newLineInfo(fileIdx, 1, 1)
+  result.owner = newSym(skPackage, getIdent(getPackageName(filename)), nil,
+                        result.info)
   result.position = fileIdx
   
   growCache gMemCacheData, fileIdx
diff --git a/compiler/options.nim b/compiler/options.nim
index 69d41c562..102ebc386 100644
--- a/compiler/options.nim
+++ b/compiler/options.nim
@@ -209,10 +209,15 @@ proc getGeneratedPath: string =
   result = if nimcacheDir.len > 0: nimcacheDir else: gProjectPath.shortenDir /
                                                          genSubDir
 
-var packageCache = newStringTable(when FileSystemCaseSensitive:
-                                    modeCaseInsensitive
-                                  else:
-                                    modeCaseSensitive)
+template newPackageCache(): expr =
+  newStringTable(when FileSystemCaseSensitive:
+                   modeCaseInsensitive
+                 else:
+                   modeCaseSensitive)
+
+var packageCache = newPackageCache()
+
+proc resetPackageCache*() = packageCache = newPackageCache()
 
 iterator myParentDirs(p: string): string =
   # XXX os's parentDirs is stupid (multiple yields) and triggers an old bug...
@@ -240,21 +245,6 @@ proc getPackageName*(path: string): string =
     packageCache[d] = result
     dec parents
     if parents <= 0: break
-  when false:
-    var q = 1
-    var b = 0
-    if path[len(path)-1] in {DirSep, AltSep}: q = 2
-    for i in countdown(len(path)-q, 0):
-      if path[i] in {DirSep, AltSep}:
-        if b == 0: b = i
-        else:
-          let x = path.substr(i+1, b-1)
-          case x.normalize
-          of "lib", "src", "source", "package", "pckg", "library", "private":
-            b = i
-          else:
-            return x.replace('.', '_')
-    result = ""
 
 proc withPackageName*(path: string): string =
   let x = path.getPackageName