Merge: doc: fixed some typos and other misc. corrections
[nit.git] / src / ffi / c.nit
index 329d9a3..e09a80f 100644 (file)
@@ -1,6 +1,6 @@
 # This file is part of NIT ( http://www.nitlanguage.org ).
 #
-# Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
+# Copyright 2012-2014 Alexis Laferrière <alexis.laf@xymus.net>
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Handles C inline code
-# Wraps all  code in a thin wrapper.
+# Support for nesting C code within a Nit program using its FFI
 module c
 
 import ffi_base
+import light_c
 
-redef class ExternCode
-       fun is_c : Bool do return language == null or
-               language_lowered == "c" or language_lowered.has_prefix( "c " )
-
-       fun is_c_body : Bool do return language == null or
-               language_lowered == "c" or language_lowered ==  "c body"
-
-       fun is_c_header : Bool do return language_lowered == "c header"
-
-       redef fun accept_ffi_visitor( v )
+redef class CLanguage
+       redef fun compile_callback(callback, mmodule, mainmodule, ecc)
        do
-               if is_c_header then
-                       v.compilation_unit.header_custom.add( code )
-               else if is_c_body then
-                       v.compilation_unit.body_custom.add( code )
-               end
+               callback.compile_callback_to_c(mainmodule, ecc)
        end
 end
 
-redef class MMMethod
-       redef fun accept_ffi_visitor( v )
-       do
-               if extern_implementation.is_c then
-                       var fc = new CFunction( impl_csignature )
-                       fc.decls.add( extern_implementation.location.as_line_pragma )
-                       fc.exprs.add( extern_implementation.code )
-                       v.compilation_unit.add_exported_function( fc )
-               else
-                       super
-               end
-       end
+redef class NitniCallback
+       fun compile_callback_to_c(mmodule: MModule, ffi_ccu: CCompilationUnit) do end
 end
 
-redef class Location
-       fun as_line_pragma : String
+redef class MExplicitCall
+       redef fun compile_callback_to_c(mmodule, ffi_ccu)
        do
-               return "#line {line_start} \"{file.filename}\"\n"
+               var mproperty = mproperty.as(MMethod)
+
+               var full_cname = mproperty.build_cname(recv_mtype, mmodule, null, long_signature)
+               var friendly_cname = mproperty.build_cname(recv_mtype, mmodule, null, short_signature)
+               ffi_ccu.body_decl.add("#define {friendly_cname} {full_cname}\n")
        end
 end