benchs: add --inline-some-methods and --direct-call-monomorph to bench_nitg-s_options...
[nit.git] / src / compiler_ffi.nit
index efb3fec..ee2f52f 100644 (file)
@@ -29,7 +29,7 @@ redef class AModule
 
        redef fun finalize_ffi(v: AbstractCompilerVisitor, modelbuilder: ModelBuilder)
        do
-               finalize_ffi_wrapper(".nit_compile", v.compiler.mainmodule)
+               finalize_ffi_wrapper(v.compiler.modelbuilder.compile_dir, v.compiler.mainmodule)
                for file in ffi_files do v.compiler.extern_bodies.add(file)
        end
 
@@ -46,7 +46,7 @@ redef class AModule
 
                nitni_ccu.header_c_types.add("#include \"{mmodule.name}._ffi.h\"\n")
 
-               nitni_ccu.write_as_nitni(self, ".nit_compile")
+               nitni_ccu.write_as_nitni(self, v.compiler.modelbuilder.compile_dir)
 
                for file in nitni_ccu.files do
                        v.compiler.extern_bodies.add(new ExternCFile(file, c_compiler_options))
@@ -305,28 +305,35 @@ redef class MNullableType
        do
                super
 
+               var base_cname = "null_{mtype.mangled_cname}"
+               var full_cname = "NIT_NULL___{base_cname}"
+
                # In nitni files, declare internal function as extern 
-               var full_friendly_csignature = "{cname} {v.compiler.mainmodule.name}___null_{mtype.mangled_cname}()"
+               var full_friendly_csignature = "{cname_blind} {full_cname}()"
                ccu.header_decl.add("extern {full_friendly_csignature};\n")
 
                # In nitni files, #define friendly as extern
-               var base_cname = "null_{mtype.mangled_cname}"
-               ccu.header_decl.add("#define {base_cname} {v.compiler.mainmodule.name}___{base_cname}\n")
+               ccu.header_decl.add("#define {base_cname} {full_cname}\n")
+
+               # FIXME: This is ugly an broke the separate compilation principle
+               # The real function MUST be compiled only once, #define pragma only protect the compiler, not the loader
+               # However, I am not sure of the right approach here (eg. week refs are ugly)
+               if is_already_compiled then return
+               is_already_compiled = true
 
                # Internally, implement internal function
                var nitni_visitor = v.compiler.new_visitor
                nitni_visitor.frame = v.frame
-               var full_internal_csignature = "{cname_blind} {v.compiler.mainmodule.name}___null_{mtype.mangled_cname}()"
-               nitni_visitor.add("#ifndef NIT_NULL_null_{mtype.mangled_cname}")
-               nitni_visitor.add("#define NIT_NULL_null_{mtype.mangled_cname}")
+               var full_internal_csignature = "{cname_blind} {full_cname}()"
                nitni_visitor.add("{full_internal_csignature} \{")
                nitni_visitor.add("struct nitni_instance* ret_for_c;")
                nitni_visitor.add("ret_for_c = malloc(sizeof(struct nitni_instance));")
                nitni_visitor.add("ret_for_c->value = NULL;")
                nitni_visitor.add("return ret_for_c;")
                nitni_visitor.add("\}")
-               nitni_visitor.add("#endif")
        end
+
+       private var is_already_compiled = false # FIXME to remove, show above
 end
 
 redef class MExplicitCall
@@ -342,7 +349,7 @@ redef class MExplicitCall
                # Internally, implement internal function
                var nitni_visitor = v.compiler.new_visitor
                nitni_visitor.frame = v.frame
-               var msignature = mproperty.intro.msignature
+               var msignature = mproperty.lookup_first_definition(v.compiler.mainmodule, recv_mtype).msignature
                var csignature_blind = mproperty.build_csignature(recv_mtype, v.compiler.mainmodule, null, long_signature, internal_call_context)
 
                nitni_visitor.add_decl("/* nitni callback for {mproperty.full_name} */")
@@ -383,6 +390,7 @@ redef class MExplicitCall
                if return_mtype != null then
                        assert ret_var != null
                        return_mtype = return_mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
+                       ret_var = nitni_visitor.autobox(ret_var, return_mtype)
                        nitni_visitor.ret_to_c(ret_var, return_mtype)
                end
                nitni_visitor.add("\}")
@@ -398,7 +406,7 @@ redef class MExplicitSuper
                var mmodule = from.mclassdef.mmodule
 
                # In nitni files, declare internal function as extern
-               var internal_csignature = mproperty.build_csignature(mclass_type, v.compiler.mainmodule, null, long_signature, from_c_call_context)
+               var internal_csignature = mproperty.build_csignature(mclass_type, v.compiler.mainmodule, "___super", long_signature, internal_call_context)
                ccu.header_decl.add("extern {internal_csignature};\n")
 
                # In nitni files, #define friendly as extern
@@ -409,7 +417,7 @@ redef class MExplicitSuper
                # Internally, implement internal function
                var nitni_visitor = v.compiler.new_visitor
                nitni_visitor.frame = v.frame
-               var msignature = mproperty.intro.msignature
+               var msignature = mproperty.lookup_first_definition(v.compiler.mainmodule, mclass_type).msignature
 
                var csignature_blind = mproperty.build_csignature(mclass_type, v.compiler.mainmodule, "___super", long_signature, internal_call_context)
 
@@ -473,7 +481,7 @@ redef class MExplicitCast
                # special checks
                if from == to.as_nullable then
                        # format A_is_null
-                       ccu.header_decl.add("#define {from.mangled_cname}_is_null {from.mangled_cname}_is_a_{to.mangled_cname}\n")
+                       ccu.header_decl.add("#define {from.mangled_cname}_is_null !{from.mangled_cname}_is_a_{to.mangled_cname}\n")
                end
 
                #
@@ -481,7 +489,7 @@ redef class MExplicitCast
                #
 
                # In nitni files, declare internal function as extern
-               full_friendly_csignature = "{to.cname} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({from.cname_blind})"
+               full_friendly_csignature = "{to.cname_blind} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({from.cname_blind})"
                ccu.header_decl.add("extern {full_friendly_csignature};\n")
 
                # In nitni files, #define friendly as extern