metamodel: rename 'universal' to 'enum'
[nit.git] / src / compiling / table_computation.nit
index 24e5fb2..20461ff 100644 (file)
@@ -52,14 +52,14 @@ end
 
 # All information and results of the global analysis.
 class TableInformation
-special ColorContext
+       super ColorContext
        # FIXME: do something better.
        readable writable var _max_class_table_length: Int = 0
 end
 
 # A compiled class is a class in a program
 class CompiledClass
-special ColorContext
+       super ColorContext
        # The corresponding local class in the main module of the prgram
        readable var _local_class: MMLocalClass
 
@@ -93,7 +93,7 @@ redef class MMConcreteClass
        readable var _instance_layout: Array[TableElt] = new Array[TableElt]
 
        # Build the local layout of the class and feed the module table
-       private fun build_layout_in(tc: ToolContext, module_table: Array[ModuleTableElt])
+       private fun build_layout_in(module_table: Array[ModuleTableElt])
        do
                var clt = _class_layout
                var ilt = _instance_layout
@@ -140,22 +140,21 @@ redef class Program
        # Associate global classes to compiled classes
        readable var _compiled_classes: HashMap[MMGlobalClass, CompiledClass] = new HashMap[MMGlobalClass, CompiledClass]
 
-       fun do_table_computation(tc: ToolContext)
+       fun do_table_computation
        do
                tc.info("Building tables",1)
-               for m in module.mhe.greaters_and_self do
+               for m in main_module.mhe.greaters_and_self do
                        tc.info("Building tables for module: {m.name}",2)
-                       m.local_analysis(tc)
+                       m.local_analysis
                end
 
                tc.info("Merging all tables",2)
-               do_global_table_analysis(tc)
+               do_global_table_analysis
        end
 
        # Do the complete global analysis
-       private fun do_global_table_analysis(cctx: ToolContext)
+       private fun do_global_table_analysis
        do
-               #print "Do the complete global analysis"
                var smallest_classes = new Array[MMLocalClass]
                var global_properties = new HashSet[MMGlobalProperty]
                var ctab = new Array[TableElt]
@@ -171,17 +170,10 @@ redef class Program
 
                # We have to work on ALL the classes of the module
                var classes = new Array[MMLocalClass]
-               for c in module.local_classes do
-                       c.compute_super_classes
-                       classes.add(c)
-               end
-               (new ClassSorter).sort(classes)
+               for c in main_module.local_classes do classes.add(c)
+               classes.sort !cmp(x,y) = x.total_order_compare(y)
 
                for c in classes do
-                       # Finish processing the class (if invisible)
-                       c.compute_ancestors
-                       c.inherit_global_properties
-
                        # Associate a CompiledClass to the class
                        var cc = new CompiledClass(c)
                        compiled_classes[c.global] = cc
@@ -189,7 +181,7 @@ redef class Program
                        # Assign a unique class identifier
                        # (negative are for primitive classes)
                        var gc = c.global
-                       var bm = gc.module
+                       var bm = gc.mmmodule
                        if c.primitive_info != null then
                                cc.id = pclassid
                                pclassid = pclassid - 4
@@ -402,11 +394,11 @@ redef class MMModule
        readable var _local_table: Array[ModuleTableElt] = new Array[ModuleTableElt]
 
        # Builds the local tables and local classes layouts
-       private fun local_analysis(tc: ToolContext)
+       private fun local_analysis
        do
                for c in local_classes do
                        if c isa MMConcreteClass then
-                               c.build_layout_in(tc, _local_table)
+                               c.build_layout_in(_local_table)
                        end
                end
        end
@@ -421,7 +413,7 @@ end
 # An element of a class or an instance table
 # Such an elements represent method function pointers, attribute values, etc.
 abstract class TableElt
-special AbsTableElt
+       super AbsTableElt
        # Is the element conflict to class `c' (used for coloring)
        fun is_related_to(c: MMLocalClass): Bool is abstract
 
@@ -435,18 +427,18 @@ end
 # An element of a module table
 # Such an elements represent colors or identifiers
 abstract class ModuleTableElt
-special AbsTableElt
+       super AbsTableElt
 end
 
 # An element of a module table that represents a group of TableElt defined in the same local class
 class ModuleTableEltGroup
-special ModuleTableElt
+       super ModuleTableElt
        readable var _elements: Array[TableElt] = new Array[TableElt]
 end
 
 # An element that represents a class property
 abstract class TableEltProp
-special TableElt
+       super TableElt
        readable var _property: MMLocalProperty
 
        init(p: MMLocalProperty)
@@ -457,22 +449,22 @@ end
 
 # An element that represents a function pointer to a global method
 class TableEltMeth
-special TableEltProp
+       super TableEltProp
 end
 
 # An element that represents a function pointer to the super method of a local method
 class TableEltSuper
-special TableEltProp
+       super TableEltProp
 end
 
 # An element that represents the value stored for a global attribute
 class TableEltAttr
-special TableEltProp
+       super TableEltProp
 end
 
 # An element representing a class information
 class AbsTableEltClass
-special AbsTableElt
+       super AbsTableElt
        # The local class where the information comes from
        readable var _local_class: MMLocalClass
 
@@ -484,24 +476,24 @@ end
 
 # An element of a class table representing a class information
 class TableEltClass
-special TableElt
-special AbsTableEltClass
+       super TableElt
+       super AbsTableEltClass
        redef fun is_related_to(c)
        do
-               var bc = c.module[_local_class.global]
+               var bc = c.mmmodule[_local_class.global]
                return c.cshe <= bc
        end
 end
 
 # An element representing the id of a class in a module table
 class TableEltClassId
-special ModuleTableElt
-special AbsTableEltClass
+       super ModuleTableElt
+       super AbsTableEltClass
 end
 
 # An element representing the constructor marker position in a class table
 class TableEltClassInitTable
-special TableEltClass
+       super TableEltClass
 end
 
 # An element used for a cast
@@ -509,13 +501,13 @@ end
 # At the TableElt offset, there is the id of the super-class
 # At the ModuleTableElt offset, there is the TableElt offset (ie. the color of the super-class).
 class TableEltClassColor
-special TableEltClass
-special ModuleTableElt
+       super TableEltClass
+       super ModuleTableElt
 end
 
 # A Group of elements introduced in the same global-class that are colored together
 class TableEltComposite
-special TableElt
+       super TableElt
        var _table: Array[TableElt]
        var _cc: CompiledClass
        var _offsets: HashMap[MMLocalClass, Int]
@@ -540,58 +532,24 @@ end
 
 # The element that represent the class id
 class TableEltClassSelfId
-special TableElt
+       super TableElt
        redef fun is_related_to(c) do return true
 end
 
 # The element that represent the Object Size
 class TableEltClassObjectSize
-special TableElt
+       super TableElt
        redef fun is_related_to(c) do return true
 end
 
 # The element that represent the object id
 class TableEltObjectId
-special TableElt
+       super TableElt
        redef fun is_related_to(c) do return true
 end
 
 # The element that
 class TableEltVftPointer
-special TableElt
+       super TableElt
        redef fun is_related_to(c) do return true
 end
-
-###############################################################################
-
-# Used to sort local class in a deterministic total order
-# The total order superset the class refinement and the class specialisation relations
-class ClassSorter
-special AbstractSorter[MMLocalClass]
-       redef fun compare(a, b) do return a.compare(b)
-       init do end
-end
-
-redef class MMLocalClass
-       # Comparaison in a total order that superset the class refinement and the class specialisation relations
-       fun compare(b: MMLocalClass): Int
-       do
-               var a = self
-               if a == b then
-                       return 0
-               else if a.module.mhe < b.module then
-                       return 1
-               else if b.module.mhe < a.module then
-                       return -1
-               end
-               var ar = a.cshe.rank
-               var br = b.cshe.rank
-               if ar > br then
-                       return 1
-               else if br > ar then
-                       return -1
-               else
-                       return b.name.to_s <=> a.name.to_s
-               end
-       end
-end