From: Alexandre Terrasa Date: Mon, 4 Mar 2013 23:22:44 +0000 (-0500) Subject: layout_builders: merged PHLayout & PHResolutionLayout X-Git-Tag: v0.6~77^2~19 X-Git-Url: http://nitlanguage.org layout_builders: merged PHLayout & PHResolutionLayout Signed-off-by: Alexandre Terrasa --- diff --git a/src/layout_builders.nit b/src/layout_builders.nit index 0cda800..5c8184b 100644 --- a/src/layout_builders.nit +++ b/src/layout_builders.nit @@ -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) diff --git a/src/separate_compiler.nit b/src/separate_compiler.nit index 3692de6..55b3219 100644 --- a/src/separate_compiler.nit +++ b/src/separate_compiler.nit @@ -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("\{") diff --git a/src/separate_erasure_compiler.nit b/src/separate_erasure_compiler.nit index edd4c92..17217c9 100644 --- a/src/separate_erasure_compiler.nit +++ b/src/separate_erasure_compiler.nit @@ -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) \{")