X-Git-Url: http://nitlanguage.org diff --git a/src/compiler/separate_compiler.nit b/src/compiler/separate_compiler.nit index 6797978..e0500e2 100644 --- a/src/compiler/separate_compiler.nit +++ b/src/compiler/separate_compiler.nit @@ -92,33 +92,35 @@ redef class ModelBuilder var compiler = new SeparateCompiler(mainmodule, self, runtime_type_analysis) compiler.compile_header + var c_name = mainmodule.c_name + # compile class structures self.toolcontext.info("Property coloring", 2) - compiler.new_file("{mainmodule.name}.classes") + compiler.new_file("{c_name}.classes") compiler.do_property_coloring for m in mainmodule.in_importation.greaters do for mclass in m.intro_mclasses do - if mclass.kind == abstract_kind or mclass.kind == interface_kind then continue + #if mclass.kind == abstract_kind or mclass.kind == interface_kind then continue compiler.compile_class_to_c(mclass) end end # The main function of the C - compiler.new_file("{mainmodule.name}.main") + compiler.new_file("{c_name}.main") compiler.compile_nitni_global_ref_functions compiler.compile_main_function compiler.compile_finalizer_function # compile methods for m in mainmodule.in_importation.greaters do - self.toolcontext.info("Generate C for module {m}", 2) - compiler.new_file("{m.name}.sep") + self.toolcontext.info("Generate C for module {m.full_name}", 2) + compiler.new_file("{m.c_name}.sep") compiler.compile_module_to_c(m) end # compile live & cast type structures self.toolcontext.info("Type coloring", 2) - compiler.new_file("{mainmodule.name}.types") + compiler.new_file("{c_name}.types") var mtypes = compiler.do_type_coloring for t in mtypes do compiler.compile_type_to_c(t) @@ -156,17 +158,15 @@ class SeparateCompiler private var undead_types: Set[MType] = new HashSet[MType] private var live_unresolved_types: Map[MClassDef, Set[MType]] = new HashMap[MClassDef, HashSet[MType]] - private var type_ids: Map[MType, Int] - private var type_colors: Map[MType, Int] - private var opentype_colors: Map[MType, Int] - protected var method_colors: Map[PropertyLayoutElement, Int] - protected var attr_colors: Map[MAttribute, Int] + private var type_ids: Map[MType, Int] is noinit + private var type_colors: Map[MType, Int] is noinit + private var opentype_colors: Map[MType, Int] is noinit + protected var method_colors: Map[PropertyLayoutElement, Int] is noinit + protected var attr_colors: Map[MAttribute, Int] is noinit - init(mainmodule: MModule, mmbuilder: ModelBuilder, runtime_type_analysis: nullable RapidTypeAnalysis) do - super(mainmodule, mmbuilder) + init do var file = new_file("nit.common") self.header = new CodeWriter(file) - self.runtime_type_analysis = runtime_type_analysis self.compile_box_kinds end @@ -418,13 +418,12 @@ class SeparateCompiler var live_cast_types = runtime_type_analysis.live_cast_types var mtypes = new HashSet[MType] mtypes.add_all(live_types) - mtypes.add_all(live_cast_types) for c in self.box_kinds.keys do mtypes.add(c.mclass_type) end # Compute colors - var poset = poset_from_mtypes(mtypes) + var poset = poset_from_mtypes(mtypes, live_cast_types) var colorer = new POSetColorer[MType] colorer.colorize(poset) type_ids = colorer.ids @@ -437,12 +436,13 @@ class SeparateCompiler return poset end - private fun poset_from_mtypes(mtypes: Set[MType]): POSet[MType] do + private fun poset_from_mtypes(mtypes, cast_types: Set[MType]): POSet[MType] do var poset = new POSet[MType] for e in mtypes do poset.add_node(e) - for o in mtypes do + for o in cast_types do if e == o then continue + poset.add_node(o) if e.is_subtype(mainmodule, null, o) then poset.add_edge(e, o) end @@ -1063,8 +1063,8 @@ class SeparateCompilerVisitor do var rta = compiler.runtime_type_analysis var mmethod = callsite.mproperty - # TODO: Inlining of new-style constructors - if compiler.modelbuilder.toolcontext.opt_direct_call_monomorph.value and rta != null and not mmethod.is_root_init then + # TODO: Inlining of new-style constructors with initializers + if compiler.modelbuilder.toolcontext.opt_direct_call_monomorph.value and rta != null and callsite.mpropdef.initializers.is_empty then var tgs = rta.live_targets(callsite) if tgs.length == 1 then # DIRECT CALL