layout_builders: merged PHLayout & PHResolutionLayout
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 4 Mar 2013 23:22:44 +0000 (18:22 -0500)
committerAlexandre Terrasa <alexandre@moz-code.org>
Mon, 4 Mar 2013 23:22:44 +0000 (18:22 -0500)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/layout_builders.nit
src/separate_compiler.nit
src/separate_erasure_compiler.nit

index 0cda800..5c8184b 100644 (file)
@@ -26,12 +26,12 @@ class Layout[E: Object]
        var pos: Map[E, Int] = new HashMap[E, Int]
 end
 
-class PHLayout[E: Object]
+class PHLayout[HOLDER: Object, E: Object]
        super Layout[E]
        # Masks used by hash function
-       var masks: Map[E, Int] = new HashMap[E, Int]
+       var masks: Map[HOLDER, Int] = new HashMap[HOLDER, Int]
        # Positions of each element for each tables
-       var hashes: Map[E, Map[E, Int]] = new HashMap[E, Map[E, Int]]
+       var hashes: Map[HOLDER, Map[E, Int]] = new HashMap[HOLDER, Map[E, Int]]
 end
 
 class PropertyLayout[E: Object]
@@ -39,14 +39,6 @@ class PropertyLayout[E: Object]
        var pos: Map[E, Int] = new HashMap[E, Int]
 end
 
-class PHResolutionLayout
-       super Layout[MType]
-       # Masks associated to each owner of a resolution table
-       var masks: Map[MClassType, Int] = new HashMap[MClassType, Int]
-       # Positions of each resolvec type for resolution tables
-       var hashes: Map[MClassType, Map[MType, Int]] = new HashMap[MClassType, Map[MType, Int]]
-end
-
 # Builders
 
 abstract class TypingLayoutBuilder[E: Object]
@@ -115,7 +107,7 @@ end
 class PHTypeLayoutBuilder
        super TypingLayoutBuilder[MType]
 
-       redef type LAYOUT: PHLayout[MType]
+       redef type LAYOUT: PHLayout[MType, MType]
 
        private var hasher: PerfectHasher[MType, MType]
 
@@ -136,7 +128,7 @@ class PHTypeLayoutBuilder
 
        # Compute mtypes ids and position using BM
        redef fun build_layout(mtypes) do
-               var result = new PHLayout[MType]
+               var result = new PHLayout[MType, MType]
                var conflicts = build_conflicts(mtypes)
                result.ids = self.compute_ids(mtypes)
                result.masks = self.hasher.compute_masks(conflicts, result.ids)
@@ -200,7 +192,7 @@ end
 class PHClassLayoutBuilder
        super TypingLayoutBuilder[MClass]
 
-       redef type LAYOUT: PHLayout[MClass]
+       redef type LAYOUT: PHLayout[MClass, MClass]
 
        private var hasher: PerfectHasher[MClass, MClass]
 
@@ -221,7 +213,7 @@ class PHClassLayoutBuilder
 
        # Compute mclasses ids and position using BM
        redef fun build_layout(mclasses) do
-               var result = new PHLayout[MClass]
+               var result = new PHLayout[MClass, MClass]
                var conflicts = build_conflicts(mclasses)
                result.ids = self.compute_ids(mclasses)
                result.masks = self.hasher.compute_masks(conflicts, result.ids)
@@ -332,7 +324,7 @@ end
 class PHResolutionLayoutBuilder
        super ResolutionLayoutBuilder
 
-       redef type LAYOUT: PHResolutionLayout
+       redef type LAYOUT: PHLayout[MClassType, MType]
 
        private var hasher: PerfectHasher[MClassType, MType]
 
@@ -340,7 +332,7 @@ class PHResolutionLayoutBuilder
 
        # Compute resolved types masks and hashes
        redef fun build_layout(elements) do
-               var result = new PHResolutionLayout
+               var result = new PHLayout[MClassType, MType]
                result.ids = self.compute_ids(elements)
                result.pos = result.ids
                result.masks = self.hasher.compute_masks(elements, result.ids)
index 3692de6..55b3219 100644 (file)
@@ -361,7 +361,7 @@ class SeparateCompiler
                        supers.add(mtype)
                        for sup in supers do
                                var color: Int
-                               if layout isa PHLayout[MType] then
+                               if layout isa PHLayout[MType, MType] then
                                        color = layout.hashes[mtype][sup]
                                else
                                        color = layout.pos[sup]
@@ -441,7 +441,7 @@ class SeparateCompiler
                        var table = new Array[nullable MType]
                        for mtype in mtypes do
                                var color: Int
-                               if layout isa PHResolutionLayout then
+                               if layout isa PHLayout[MClassType, MType] then
                                        color = layout.hashes[mclasstype][mtype]
                                else
                                        color = layout.pos[mtype]
@@ -530,7 +530,7 @@ class SeparateCompiler
                v.add_decl("{self.type_layout.ids[mtype]},")
                v.add_decl("\"{mtype}\", /* class_name_string */")
                var layout = self.type_layout
-               if layout isa PHLayout[MType] then
+               if layout isa PHLayout[MType, MType] then
                        v.add_decl("{layout.masks[mtype]},")
                else
                        v.add_decl("{layout.pos[mtype]},")
@@ -573,7 +573,7 @@ class SeparateCompiler
                # extern const struct resolution_table_X resolution_table_X
                self.header.add_decl("extern const struct resolution_table_{mtype.c_name} resolution_table_{mtype.c_name};")
                self.header.add_decl("struct resolution_table_{mtype.c_name} \{")
-               if layout isa PHResolutionLayout then
+               if layout isa PHLayout[MClassType, MType] then
                        self.header.add_decl("int mask;")
                end
                self.header.add_decl("struct type *types[{self.resolution_tables[mclass_type].length}];")
@@ -582,7 +582,7 @@ class SeparateCompiler
                # const struct fts_table_X fts_table_X
                var v = new_visitor
                v.add_decl("const struct resolution_table_{mtype.c_name} resolution_table_{mtype.c_name} = \{")
-               if layout isa PHResolutionLayout then
+               if layout isa PHLayout[MClassType, MType] then
                        v.add_decl("{layout.masks[mclass_type]},")
                end
                v.add_decl("\{")
index edd4c92..17217c9 100644 (file)
@@ -151,7 +151,7 @@ class SeparateErasureCompiler
                        supers.add(mclass)
                        for sup in supers do
                                var color: Int
-                               if layout isa PHLayout[MClass] then
+                               if layout isa PHLayout[MClass, MClass] then
                                        color = layout.hashes[mclass][sup]
                                else
                                        color = layout.pos[sup]
@@ -219,7 +219,7 @@ class SeparateErasureCompiler
                v.add_decl("\"{mclass.name}\", /* class_name_string */")
                v.add_decl("{self.box_kind_of(mclass)}, /* box_kind */")
                var layout = self.class_layout
-               if layout isa PHLayout[MClass] then
+               if layout isa PHLayout[MClass, MClass] then
                        v.add_decl("{layout.masks[mclass]},")
                else
                        v.add_decl("{layout.pos[mclass]},")
@@ -541,7 +541,7 @@ class SeparateErasureCompilerVisitor
                        self.add("{res} = {accept_null};")
                        self.add("\} else \{")
                end
-               if self.compiler.as(SeparateErasureCompiler).class_layout isa PHLayout[MClass] then
+               if self.compiler.as(SeparateErasureCompiler).class_layout isa PHLayout[MClass, MClass] then
                        self.add("{cltype} = HASH({class_ptr}color, {idtype});")
                end
                self.add("if({cltype} >= {class_ptr}type_table->size) \{")