+ self.livetypes_colors = entries_coloring.colorize(mtypes)
+ self.livetypes_tables = entries_coloring.build_livetype_tables(mtypes)
+ self.livetypes_tables_sizes = entries_coloring.livetypes_tables_sizes
+ else
+ self.compile_unanchored_tables(mtypes)
+ end
+
+ # colorize types
+ if modelbuilder.toolcontext.opt_bm_typing.value then
+ var type_coloring = new NaiveTypeColoring(self.mainmodule, mtypes)
+ self.type_colors = type_coloring.colorize(mtypes)
+ self.type_tables = type_coloring.build_type_tables(mtypes, type_colors)
+ else if modelbuilder.toolcontext.opt_phmod_typing.value then
+ var type_coloring = new TypeModPerfectHashing(self.mainmodule, mtypes)
+ self.type_colors = type_coloring.compute_masks(mtypes, typeids)
+ self.type_tables = type_coloring.hash_type_tables(mtypes, typeids, type_colors)
+ self.header.add_decl("#define HASH(mask, id) ((mask)%(id))")
+ else if modelbuilder.toolcontext.opt_phand_typing.value then
+ var type_coloring = new TypeAndPerfectHashing(self.mainmodule, mtypes)
+ self.type_colors = type_coloring.compute_masks(mtypes, typeids)
+ self.type_tables = type_coloring.hash_type_tables(mtypes, typeids, type_colors)
+ self.header.add_decl("#define HASH(mask, id) ((mask)&(id))")
+ else
+ var type_coloring = new TypeColoring(self.mainmodule, mtypes)
+ self.type_colors = type_coloring.colorize(mtypes)
+ self.type_tables = type_coloring.build_type_tables(mtypes, type_colors)
+ end
+
+
+ return mtypes
+ end
+
+ protected fun compile_unanchored_tables(mtypes: Set[MType]) do
+ var mtype2anchored = new HashMap[MClassType, Set[MClassType]]
+
+ for mtype in self.runtime_type_analysis.live_types do
+ for cd in mtype.collect_mclassdefs(self.mainmodule) do
+ if self.live_unanchored_types.has_key(cd) then
+ if not mtype2anchored.has_key(mtype) then
+ mtype2anchored[mtype] = new HashSet[MClassType]
+ end
+ for unanchored in self.live_unanchored_types[cd] do
+ var anchored = unanchored.anchor_to(self.mainmodule, mtype)
+ if anchored isa MClassType then
+ mtype2anchored[mtype].add(anchored)
+ else if anchored isa MNullableType then
+ mtype2anchored[mtype].add(anchored.mtype.as(MClassType))
+ else
+ print "NOT YET IMPLEMENTED: try compile_unanchored_tables with {unanchored}"
+ end
+ end