src: add some asserts on `super` related things
[nit.git] / src / separate_erasure_compiler.nit
index 4de1a05..dcb9d6c 100644 (file)
@@ -32,6 +32,15 @@ redef class ToolContext
                self.option_context.add_option(self.opt_erasure, self.opt_no_check_erasure_cast, opt_rta)
        end
 
+       redef fun process_options(args)
+       do
+               super
+
+               if opt_no_check_all.value then
+                       opt_no_check_erasure_cast.value = true
+               end
+       end
+
        var erasure_compiler_phase = new ErasureCompilerPhase(self, null)
 end
 
@@ -71,6 +80,7 @@ redef class ModelBuilder
 
                # The main function of the C
                compiler.new_file("{mainmodule.name}.main")
+               compiler.compile_nitni_global_ref_functions
                compiler.compile_main_function
 
                # compile methods
@@ -99,8 +109,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
@@ -338,6 +348,7 @@ class SeparateErasureCompiler
                        v.require_declaration("class_{c_name}")
                        v.add("{res}->class = &class_{c_name};")
                        self.generate_init_attr(v, res, mtype)
+                       v.set_finalizer res
                        v.add("return {res};")
                end
                v.add("\}")
@@ -581,24 +592,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