X-Git-Url: http://nitlanguage.org diff --git a/src/compiler/compiler_ffi/compiler_ffi.nit b/src/compiler/compiler_ffi/compiler_ffi.nit index 9b0dc27..7a536b1 100644 --- a/src/compiler/compiler_ffi/compiler_ffi.nit +++ b/src/compiler/compiler_ffi/compiler_ffi.nit @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# FFI support for the compilers +# Full FFI support for the compiler module compiler_ffi intrude import light @@ -107,11 +107,11 @@ redef class MExplicitCall if mproperty.is_init then var recv_mtype = recv_mtype recv_var = nitni_visitor.init_instance_or_extern(recv_mtype) - nitni_visitor.add("{mtype.ctype} recv /* var self: {mtype} */;") - nitni_visitor.add("recv = {recv_var};") + nitni_visitor.add("{mtype.ctype} self /* var self: {mtype} */;") + nitni_visitor.add("self = {recv_var};") else mtype = mtype.anchor_to(v.compiler.mainmodule, recv_mtype) - recv_var = nitni_visitor.var_from_c("recv", mtype) + recv_var = nitni_visitor.var_from_c("self", mtype) recv_var = nitni_visitor.box_extern(recv_var, mtype) end @@ -226,7 +226,7 @@ redef class MExplicitSuper var vars = new Array[RuntimeVariable] - var recv_var = nitni_visitor.var_from_c("recv", mclass_type) + var recv_var = nitni_visitor.var_from_c("self", mclass_type) recv_var = nitni_visitor.box_extern(recv_var, mclass_type) vars.add(recv_var) @@ -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