# 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