- v.add_decl("{self.typeids[stype]}, /* {stype} */")
- end
- end
- v.add_decl("\},")
- v.add_decl("\};")
- end
-
- protected fun compile_type_fts_table(mtype: MType): Bool do
-
- var mclass_type: MClassType
- if mtype isa MNullableType then
- mclass_type = mtype.mtype.as(MClassType)
- else
- mclass_type = mtype.as(MClassType)
- end
- if self.ft_tables[mclass_type.mclass].is_empty then return false
-
- # extern const struct fst_table_X fst_table_X
- self.header.add_decl("extern const struct fts_table_{mtype.c_name} fts_table_{mtype.c_name};")
- self.header.add_decl("struct fts_table_{mtype.c_name} \{")
- if modelbuilder.toolcontext.opt_phmod_typing.value or modelbuilder.toolcontext.opt_phand_typing.value then
- self.header.add_decl("int mask;")
- end
- self.header.add_decl("struct type *types[{self.ft_tables[mclass_type.mclass].length}];")
- self.header.add_decl("\};")
-
- # const struct fts_table_X fts_table_X
- var v = new_visitor
- v.add_decl("const struct fts_table_{mtype.c_name} fts_table_{mtype.c_name} = \{")
- if modelbuilder.toolcontext.opt_phmod_typing.value or modelbuilder.toolcontext.opt_phand_typing.value then
- v.add_decl("{self.ft_masks[mclass_type.mclass]},")
- end
- v.add_decl("\{")
- for ft in self.ft_tables[mclass_type.mclass] do
- if ft == null then
- v.add_decl("NULL, /* empty */")
- else
- var ntype: MType
- if ft.mclass == mclass_type.mclass then
- ntype = mclass_type.arguments[ft.rank]
- else
- ntype = ft.anchor_to(self.mainmodule, mclass_type)
- end
- if self.typeids.has_key(ntype) then
- v.add_decl("(struct type*)&type_{ntype.c_name}, /* {ft} ({ntype}) */")
- else
- v.add_decl("NULL, /* empty ({ft} not a live type) */")
- end