fixup tramp
[nit.git] / src / compiler / abstract_compiler.nit
index dfe463c..f286f02 100644 (file)
@@ -856,6 +856,12 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
 
                v.add("return 0;")
                v.add("\}")
+
+               for m in mainmodule.in_importation.greaters do
+                       var f = "FILE_"+m.c_name
+                       v.add "const char {f}[] = \"{m.location.file.filename.escape_to_c}\";"
+                       provide_declaration(f, "extern const char {f}[];")
+               end
        end
 
        # Copile all C functions related to the [incr|decr]_ref features of the FFI
@@ -1381,6 +1387,24 @@ abstract class AbstractCompilerVisitor
        # Generate a alloc-instance + init-attributes
        fun init_instance(mtype: MClassType): RuntimeVariable is abstract
 
+       # Allocate and init attributes of an instance of a standard or extern class
+       #
+       # Does not support universals and the pseudo-internal `NativeArray` class.
+       fun init_instance_or_extern(mtype: MClassType): RuntimeVariable
+       do
+               var recv
+               var ctype = mtype.ctype
+               assert mtype.mclass.name != "NativeArray"
+               if ctype == "val*" then
+                       recv = init_instance(mtype)
+               else if ctype == "char*" then
+                       recv = new_expr("NULL/*special!*/", mtype)
+               else
+                       recv = new_expr("({ctype})0/*special!*/", mtype)
+               end
+               return recv
+       end
+
        # Set a GC finalizer on `recv`, only if `recv` isa Finalizable
        fun set_finalizer(recv: RuntimeVariable)
        do
@@ -1525,8 +1549,11 @@ abstract class AbstractCompilerVisitor
 
        fun add_raw_abort
        do
-               if self.current_node != null and self.current_node.location.file != null then
-                       self.add("PRINT_ERROR(\" (%s:%d)\\n\", \"{self.current_node.location.file.filename.escape_to_c}\", {current_node.location.line_start});")
+               if self.current_node != null and self.current_node.location.file != null and
+                               self.current_node.location.file.mmodule != null then
+                       var f = "FILE_{self.current_node.location.file.mmodule.c_name}"
+                       self.require_declaration(f)
+                       self.add("PRINT_ERROR(\" (%s:%d)\\n\", {f}, {current_node.location.line_start});")
                else
                        self.add("PRINT_ERROR(\"\\n\");")
                end
@@ -2874,22 +2901,17 @@ redef class ANewExpr
        do
                var mtype = self.recvtype
                assert mtype != null
-               var recv
-               var ctype = mtype.ctype
+
                if mtype.mclass.name == "NativeArray" then
                        assert self.n_args.n_exprs.length == 1
                        var l = v.expr(self.n_args.n_exprs.first, null)
                        assert mtype isa MGenericType
                        var elttype = mtype.arguments.first
                        return v.native_array_instance(elttype, l)
-               else if ctype == "val*" then
-                       recv = v.init_instance(mtype)
-               else if ctype == "char*" then
-                       recv = v.new_expr("NULL/*special!*/", mtype)
-               else
-                       recv = v.new_expr("({ctype})0/*special!*/", mtype)
                end
 
+               var recv = v.init_instance_or_extern(mtype)
+
                var callsite = self.callsite.as(not null)
                var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
                var res2 = v.compile_callsite(callsite, args)
@@ -2990,7 +3012,7 @@ redef class MModule
 
        # Give requided addinional system libraries (as given to LD_LIBS)
        # Note: can return null instead of an empty set
-       fun collect_linker_libs: nullable Set[String] do return null
+       fun collect_linker_libs: nullable Array[String] do return null
 end
 
 # Create a tool context to handle options and paths