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]
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]
class PHTypeLayoutBuilder
super TypingLayoutBuilder[MType]
- redef type LAYOUT: PHLayout[MType]
+ redef type LAYOUT: PHLayout[MType, MType]
private var hasher: PerfectHasher[MType, MType]
# 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)
class PHClassLayoutBuilder
super TypingLayoutBuilder[MClass]
- redef type LAYOUT: PHLayout[MClass]
+ redef type LAYOUT: PHLayout[MClass, MClass]
private var hasher: PerfectHasher[MClass, MClass]
# 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)
class PHResolutionLayoutBuilder
super ResolutionLayoutBuilder
- redef type LAYOUT: PHResolutionLayout
+ redef type LAYOUT: PHLayout[MClassType, MType]
private var hasher: PerfectHasher[MClassType, MType]
# 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)
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]
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]
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]},")
# 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}];")
# 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("\{")
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]
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]},")
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) \{")