- var class_coloring = new ClassModPerfectHashing(mainmodule)
- self.class_colors = class_coloring.compute_masks(mclasses, class_ids)
- self.class_tables = class_coloring.hash_type_tables(mclasses, class_ids, class_colors)
-
- self.header.add_decl("int HASH(int, int);")
- var v = new_visitor
- v.add_decl("int HASH(int mask, int id) \{")
- v.add_decl("return mask % id;")
- v.add_decl("\}")
- else if modelbuilder.toolcontext.opt_use_and_perfect_hashing.value then
- # set type unique id
- for mclass in mclasses do
- self.class_ids[mclass] = self.class_ids.length + 1
+ # vt coloration
+ var vt_coloring = new MPropertyColorer[MVirtualTypeProp](mainmodule, class_colorer)
+ var vt_layout = vt_coloring.build_layout(vts)
+ self.vt_tables = build_vt_tables(mclasses, vt_layout)
+ self.vt_layout = vt_layout
+ end
+
+ fun build_vt_tables(mclasses: Set[MClass], layout: Layout[MProperty]): Map[MClass, Array[nullable MPropDef]] do
+ var tables = new HashMap[MClass, Array[nullable MPropDef]]
+ for mclass in mclasses do
+ var table = new Array[nullable MPropDef]
+ # first, fill table from parents by reverse linearization order
+ var parents = new Array[MClass]
+ if mainmodule.flatten_mclass_hierarchy.has(mclass) then
+ parents = mclass.in_hierarchy(mainmodule).greaters.to_a
+ self.mainmodule.linearize_mclasses(parents)
+ end
+ for parent in parents do
+ if parent == mclass then continue
+ for mproperty in self.mainmodule.properties(parent) do
+ if not mproperty isa MVirtualTypeProp then continue
+ var color = layout.pos[mproperty]
+ if table.length <= color then
+ for i in [table.length .. color[ do
+ table[i] = null
+ end
+ end
+ for mpropdef in mproperty.mpropdefs do
+ if mpropdef.mclassdef.mclass == parent then
+ table[color] = mpropdef
+ end
+ end
+ end