X-Git-Url: http://nitlanguage.org diff --git a/src/compiler/separate_erasure_compiler.nit b/src/compiler/separate_erasure_compiler.nit index 8a33265..2a7f0fa 100644 --- a/src/compiler/separate_erasure_compiler.nit +++ b/src/compiler/separate_erasure_compiler.nit @@ -39,6 +39,11 @@ redef class ToolContext if opt_no_check_all.value then opt_no_check_erasure_cast.value = true end + + # Temporary disabled. TODO: implement tagging in the erasure compiler. + if opt_erasure.value then + opt_no_tag_primitives.value = true + end end var erasure_compiler_phase = new ErasureCompilerPhase(self, null) @@ -201,7 +206,7 @@ class SeparateErasureCompiler var rta = runtime_type_analysis var is_dead = false # mclass.kind == abstract_kind or mclass.kind == interface_kind - if not is_dead and rta != null and not rta.live_classes.has(mclass) and mtype.ctype == "val*" and mclass.name != "NativeArray" then + if not is_dead and rta != null and not rta.live_classes.has(mclass) and not mtype.is_c_primitive and mclass.name != "NativeArray" then is_dead = true end @@ -235,13 +240,9 @@ class SeparateErasureCompiler v.add_decl("NULL, /* DEAD {mclass.intro_mmodule}:{mclass}:{mpropdef} */") continue end - if true or mpropdef.mclassdef.bound_mtype.ctype != "val*" then - v.require_declaration("VIRTUAL_{mpropdef.c_name}") - v.add_decl("(nitmethod_t)VIRTUAL_{mpropdef.c_name}, /* pointer to {mclass.intro_mmodule}:{mclass}:{mpropdef} */") - else - v.require_declaration("{mpropdef.c_name}") - v.add_decl("(nitmethod_t){mpropdef.c_name}, /* pointer to {mclass.intro_mmodule}:{mclass}:{mpropdef} */") - end + var rf = mpropdef.virtual_runtime_function + v.require_declaration(rf.c_name) + v.add_decl("(nitmethod_t){rf.c_name}, /* pointer to {mpropdef.full_name} */") end end v.add_decl("\}") @@ -263,7 +264,7 @@ class SeparateErasureCompiler v.add_decl("\}") v.add_decl("\};") - if mtype.ctype != "val*" or mtype.mclass.name == "Pointer" then + if mtype.is_c_primitive or mtype.mclass.name == "Pointer" then #Build instance struct self.header.add_decl("struct instance_{c_name} \{") self.header.add_decl("const struct class *class;") @@ -528,7 +529,7 @@ class SeparateErasureCompilerVisitor end var class_ptr - if value.mtype.ctype == "val*" then + if not value.mtype.is_c_primitive then class_ptr = "{value}->class->" else var mclass = value.mtype.as(MClassType).mclass @@ -547,7 +548,7 @@ class SeparateErasureCompilerVisitor else if mtype isa MVirtualType then var recv = self.frame.arguments.first var recv_ptr - if recv.mtype.ctype == "val*" then + if not recv.mtype.is_c_primitive then recv_ptr = "{recv}->class->" else var mclass = recv.mtype.as(MClassType).mclass @@ -614,7 +615,7 @@ class SeparateErasureCompilerVisitor var res = self.new_var(mtype) if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */") - self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);") + self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);") return res end self.require_declaration("BOX_{valtype.c_name}") @@ -631,7 +632,7 @@ class SeparateErasureCompilerVisitor do var res = self.get_name("var_class_name") self.add_decl("const char* {res};") - if value.mtype.ctype == "val*" then + if not value.mtype.is_c_primitive then self.add "{res} = {value} == NULL ? \"null\" : {value}->class->name;" else self.require_declaration("class_{value.mtype.c_name}") @@ -642,7 +643,7 @@ class SeparateErasureCompilerVisitor redef fun native_array_instance(elttype, length) do - var nclass = self.get_class("NativeArray") + var nclass = mmodule.native_array_class var mtype = nclass.get_mtype([elttype]) var res = self.new_var(mtype) res.is_exact = true