Merge branch 'fix-vt' into wip
[nit.git] / src / compiling / compiling_base.nit
index 0f1918f..a53a4e2 100644 (file)
@@ -43,7 +43,7 @@ class CProgram
        do
                _program = p
                _compdir = p.tc.compdir.as(not null)
-               _build_file = "{compdir}/{program.main_module.name}._build.sh"
+               _build_file = "{compdir}/{program.main_module.cname}._build.sh"
        end
 
        # The Nit program compiled to C
@@ -67,7 +67,7 @@ class CProgram
                if _module_include.has_key(m) then
                        return _module_include[m]
                end
-               var filename = "{m.name}.{get_file_ending}.h"
+               var filename = "{m.cname}.{get_file_ending}.h"
                _module_include[m] = filename
                return filename
        end
@@ -94,7 +94,7 @@ class CProgram
                end
 
                f.write("#!/bin/sh\n")
-               f.write("# This shell script is generated by NIT to compile the program {program.main_module.name}.\n")
+               f.write("# This shell script is generated by NIT to compile the program {program.main_module.full_name}.\n")
                f.write("CLIBDIR=\"{tc.clibdir.as(not null)}\"\n")
                f.write("{tc.bindir.as(not null)}/gccx {verbose} -d {compdir} -I $CLIBDIR {include_dirs.join(" ")}")
                if tc.output_file != null then
@@ -261,25 +261,68 @@ redef class MMGlobalProperty
 end
 
 redef class MMGlobalClass
+       # Cacher result of cname
+       var _cname_cache: nullable String
+
+       # The mangled name of the global class
+       fun cname: String
+       do
+               var cname = _cname_cache
+               if cname == null then
+                       cname = intro.mmmodule.cname + "___" + cmangle(intro.name)
+                       _cname_cache = cname
+               end
+               return cname
+       end
+
        # C symbol refering the identifier of the class
        fun id_id: String
        do
-               return "ID_{intro.name}"
+               return "ID_{cname}"
        end
 
        # C symbol refering the color of the class (for subtype tests)
        fun color_id: String
        do
-               return "COLOR_{intro.name}"
+               return "COLOR_{cname}"
        end
 
        # C symbol refering the init table position of the class (for constructor linearization)
        fun init_table_pos_id: String
        do
-               return "INIT_TABLE_POS_{intro.name}"
+               return "INIT_TABLE_POS_{cname}"
+       end
+end
+
+redef class MMModule
+       # Cacher result of cname
+       var _cname_cache: nullable String
+
+       # The mangled name of the module
+       fun cname: String
+       do
+               var cname = _cname_cache
+               if cname == null then
+                       var l = new List[String]
+                       var m: nullable MMModule = self
+                       while m != null do
+                               l.unshift(cmangle(m.name))
+                               var d: nullable MMDirectory = m.directory
+                               while d != null and d.owner == m do d = d.parent
+                               if d == null then m = null else m = d.owner
+                       end
+                       cname = l.to_a.join("___")
+                       _cname_cache = cname
+               end
+               return cname
        end
 end
 
+redef class MMLocalClass
+       # The mangled name of the global class
+       fun cname: String do return global.cname
+end
+
 redef class MMLocalProperty
        # Cacher result of cname
        var _cname_cache: nullable String
@@ -289,7 +332,7 @@ redef class MMLocalProperty
        do
                var cname = _cname_cache
                if cname == null then
-                       cname = cmangle(mmmodule.name, local_class.name, name)
+                       cname = mmmodule.cname + "___" + cmangle(local_class.name, name)
                        _cname_cache = cname
                end
                return cname