layout_builders: Added perfect hashing for mproperties
authorAlexandre Terrasa <alexandre@moz-code.org>
Thu, 30 May 2013 18:58:31 +0000 (14:58 -0400)
committerJean Privat <jean@pryen.org>
Mon, 15 Jul 2013 18:21:24 +0000 (14:21 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/layout_builders.nit
src/separate_compiler.nit

index 56ee306..ec9f905 100644 (file)
@@ -710,10 +710,76 @@ class MClassHasher
        end
 end
 
-# Layout builder for MProperty using Perfect Hashing (PH)
-# TODO implement this class without sublcassing CL builder
+# Abstract perfect hasher for MProperties
 class MPropertyHasher[E: MProperty]
-       super MPropertyColorer[E]
+       super PerfectHasher[MClass, E]
+       super PropertyLayoutBuilder[E]
+
+       type MPROP: MProperty
+
+       var mmodule: MModule
+
+       init(operator: PHOperator, mmodule: MModule) do
+               super(operator)
+               self.mmodule = mmodule
+       end
+
+       redef fun build_layout(mclasses) do
+               var result = new PHLayout[MClass, E]
+               var ids = new HashMap[E, Int]
+               var elements = new HashMap[MClass, Set[E]]
+               var lin = linearize_mclasses(mclasses)
+               for mclass in lin do
+                       var mproperties = properties(mclass)
+                       for mproperty in mproperties do
+                               if ids.has_key(mproperty) then continue
+                               ids[mproperty] = ids.length + 1
+                       end
+                       elements[mclass] = mproperties
+               end
+               result.ids = ids
+               result.pos = ids
+               result.masks = self.compute_masks(elements, ids)
+               result.hashes = self.compute_hashes(elements, ids, result.masks)
+               return result
+       end
+
+       private fun properties(mclass: MClass): Set[E] do
+               var properties = new HashSet[E]
+               for mprop in self.mmodule.properties(mclass) do
+                       if mprop isa MPROP then properties.add(mprop)
+               end
+               return properties
+       end
+
+       private fun linearize_mclasses(mclasses: Set[MClass]): Array[MClass] is abstract
+end
+
+# Perfect hashing for MMethods
+class MMethodHasher
+       super MPropertyHasher[MMethod]
+
+       redef type MPROP: MMethod
+       init(operator: PHOperator, mmodule: MModule) do super(operator, mmodule)
+       redef fun linearize_mclasses(mclasses) do return self.mmodule.reverse_linearize_mclasses(mclasses)
+end
+
+# Perfect hashing for MMAttributes
+class MAttributeHasher
+       super MPropertyHasher[MAttribute]
+
+       redef type MPROP: MAttribute
+       init(operator: PHOperator, mmodule: MModule) do super(operator, mmodule)
+       redef fun linearize_mclasses(mclasses) do return self.mmodule.linearize_mclasses_2(mclasses)
+end
+
+# Perfect hashing for MVirtualTypeProps
+class MVirtualTypePropHasher
+       super MPropertyHasher[MVirtualTypeProp]
+
+       redef type MPROP: MVirtualTypeProp
+       init(operator: PHOperator, mmodule: MModule) do super(operator, mmodule)
+       redef fun linearize_mclasses(mclasses) do return self.mmodule.reverse_linearize_mclasses(mclasses)
 end
 
 class ResolutionHasher
index ee0299d..3aee9b1 100644 (file)
@@ -216,6 +216,12 @@ class SeparateCompiler
                if modelbuilder.toolcontext.opt_bm_typing.value then
                        method_layout_builder = new MMethodBMizer(self.mainmodule)
                        attribute_layout_builder = new MAttributeBMizer(self.mainmodule)
+               else if modelbuilder.toolcontext.opt_phmod_typing.value then
+                       method_layout_builder = new MMethodHasher(new PHModOperator, self.mainmodule)
+                       attribute_layout_builder = new MAttributeHasher(new PHModOperator, self.mainmodule)
+               else if modelbuilder.toolcontext.opt_phand_typing.value then
+                       method_layout_builder = new MMethodHasher(new PHAndOperator, self.mainmodule)
+                       attribute_layout_builder = new MAttributeHasher(new PHAndOperator, self.mainmodule)
                else
                        method_layout_builder = new MMethodColorer(self.mainmodule)
                        attribute_layout_builder = new MAttributeColorer(self.mainmodule)