X-Git-Url: http://nitlanguage.org diff --git a/src/separate_erasure_compiler.nit b/src/separate_erasure_compiler.nit index 1942898..126cde0 100644 --- a/src/separate_erasure_compiler.nit +++ b/src/separate_erasure_compiler.nit @@ -99,8 +99,8 @@ class SeparateErasureCompiler super # Class coloring - var mclasses = new HashSet[MClass].from(mmbuilder.model.mclasses) var poset = mainmodule.flatten_mclass_hierarchy + var mclasses = new HashSet[MClass].from(poset) var colorer = new POSetColorer[MClass] colorer.colorize(poset) class_ids = colorer.ids @@ -453,7 +453,7 @@ class SeparateErasureCompilerVisitor self.add("if (!{cond}) \{") #var x = self.class_name_string(res) #var y = self.class_name_string(arguments.first) - #self.add("fprintf(stderr, \"Erasure cast: expected {mtype} (self is %s), got %s for {res}\\n\", {y}, {x});") + #self.add("PRINT_ERROR(\"Erasure cast: expected {mtype} (self is %s), got %s for {res}\\n\", {y}, {x});") self.add_abort("Cast failed") self.add("\}") end @@ -581,24 +581,14 @@ class SeparateErasureCompilerVisitor return res end - redef fun array_instance(array, elttype) + redef fun native_array_instance(elttype, length) do var nclass = self.get_class("NativeArray") - elttype = self.anchor(elttype) - var arraytype = self.get_class("Array").get_mtype([elttype]) - var res = self.init_instance(arraytype) - self.add("\{ /* {res} = array_instance Array[{elttype}] */") - var nat = self.new_var(self.get_class("NativeArray").get_mtype([elttype])) - nat.is_exact = true + var mtype = nclass.get_mtype([elttype]) + var res = self.new_var(mtype) + res.is_exact = true self.require_declaration("NEW_{nclass.c_name}") - self.add("{nat} = NEW_{nclass.c_name}({array.length});") - for i in [0..array.length[ do - var r = self.autobox(array[i], self.object_type) - self.add("((struct instance_{nclass.c_instance_name}*){nat})->values[{i}] = (val*) {r};") - end - var length = self.int_instance(array.length) - self.send(self.get_property("with_native", arraytype), [res, nat, length]) - self.add("\}") + self.add("{res} = NEW_{nclass.c_name}({length});") return res end