Callref bugfix in interpreter and compilers + autosav
[nit.git] / src / compiler / compiler_ffi / compiler_ffi.nit
index edf0a16..7a536b1 100644 (file)
@@ -262,25 +262,27 @@ redef class MExplicitCast
                #
 
                # In nitni files, declare internal function as extern
-               var full_friendly_csignature = "int {v.compiler.mainmodule.name }___{from.mangled_cname}_is_a_{to.mangled_cname}({from.cname_blind})"
+               var full_friendly_csignature = "int {v.compiler.mainmodule.c_name }___{from.mangled_cname}_is_a_{to.mangled_cname}({from.cname_blind})"
                ccu.header_decl.add("extern {full_friendly_csignature};\n")
 
                # In nitni files, #define friendly as extern
-               ccu.header_decl.add("#define {check_cname} {v.compiler.mainmodule.name}___{check_cname}\n")
+               ccu.header_decl.add "#ifndef {check_cname}\n"
+               ccu.header_decl.add "#define {check_cname} {v.compiler.mainmodule.c_name}___{check_cname}\n"
+               ccu.header_decl.add "#endif\n"
 
                if compile_implementation_too then
                        # Internally, implement internal function
                        var nitni_visitor = v.compiler.new_visitor
                        nitni_visitor.frame = v.frame
 
-                       var full_internal_csignature = "int {v.compiler.mainmodule.name }___{from.mangled_cname}_is_a_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
+                       var full_internal_csignature = "int {v.compiler.mainmodule.c_name }___{from.mangled_cname}_is_a_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
 
                        nitni_visitor.add_decl("/* nitni check for {from} to {to} */")
                        nitni_visitor.add_decl("{full_internal_csignature} \{")
 
                        var from_var = nitni_visitor.var_from_c("from", from)
                        from_var = nitni_visitor.box_extern(from_var, from)
-                       var recv_var = nitni_visitor.type_test(from_var, to, "FFI isa")
+                       var recv_var = nitni_visitor.type_test(from_var, to, "isa")
                        nitni_visitor.add("return {recv_var};")
 
                        nitni_visitor.add("\}")
@@ -289,7 +291,9 @@ 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 "#ifndef {from.mangled_cname}_is_null\n"
+                       ccu.header_decl.add "#define {from.mangled_cname}_is_null !{from.mangled_cname}_is_a_{to.mangled_cname}\n"
+                       ccu.header_decl.add "#endif\n"
                end
 
                #
@@ -297,18 +301,20 @@ redef class MExplicitCast
                #
 
                # In nitni files, declare internal function as extern
-               full_friendly_csignature = "{to.cname_blind} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({from.cname_blind})"
+               full_friendly_csignature = "{to.cname_blind} {v.compiler.mainmodule.c_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
-               ccu.header_decl.add("#define {cast_cname} {v.compiler.mainmodule.name}___{cast_cname}\n")
+               ccu.header_decl.add "#ifndef {cast_cname}\n"
+               ccu.header_decl.add "#define {cast_cname} {v.compiler.mainmodule.c_name}___{cast_cname}\n"
+               ccu.header_decl.add "#endif\n"
 
                if compile_implementation_too then
                        # Internally, implement internal function
                        var nitni_visitor = v.compiler.new_visitor
                        nitni_visitor.frame = v.frame
 
-                       var full_internal_csignature = "{to.cname_blind} {v.compiler.mainmodule.name }___{from.mangled_cname}_as_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
+                       var full_internal_csignature = "{to.cname_blind} {v.compiler.mainmodule.c_name }___{from.mangled_cname}_as_{to.mangled_cname}({internal_call_context.name_mtype(from)} from)"
                        nitni_visitor.add_decl("/* nitni cast for {from} to {to} */")
                        nitni_visitor.add_decl("{full_internal_csignature} \{")
 
@@ -316,7 +322,7 @@ redef class MExplicitCast
                        from_var = nitni_visitor.box_extern(from_var, from)
 
                        ## test type
-                       var check = nitni_visitor.type_test(from_var, to, "FFI cast")
+                       var check = nitni_visitor.type_test(from_var, to, "as")
                        nitni_visitor.add("if (!{check}) \{")
                        nitni_visitor.add_abort("FFI cast failed")
                        nitni_visitor.add("\}")
@@ -333,12 +339,16 @@ redef class MExplicitCast
                # special casts
                if from.as_nullable == to then
                        # format A_as_nullable
-                       ccu.header_decl.add("#define {from.mangled_cname}_as_nullable {from.mangled_cname}_as_{to.mangled_cname}\n")
+                       ccu.header_decl.add "#ifndef {from.mangled_cname}_as_nullable\n"
+                       ccu.header_decl.add "#define {from.mangled_cname}_as_nullable {from.mangled_cname}_as_{to.mangled_cname}\n"
+                       ccu.header_decl.add "#endif\n"
                end
 
                if from == to.as_nullable then
                        # format A_as_nullable
-                       ccu.header_decl.add("#define {to.mangled_cname}_as_not_nullable {from.mangled_cname}_as_{to.mangled_cname}\n")
+                       ccu.header_decl.add "#ifndef {to.mangled_cname}_as_not_nullable\n"
+                       ccu.header_decl.add "#define {to.mangled_cname}_as_not_nullable {from.mangled_cname}_as_{to.mangled_cname}\n"
+                       ccu.header_decl.add "#endif\n"
                end
        end
 end