- var compdir = tc.compdir.as(not null)
- var base_name = "{mmmodule.cname}._ffi"
- var c_file = "{base_name}.c"
- var h_file = "{base_name}.h"
-
- # header comments
- var module_info = "/*\n\tExtern implementation of Nit module {mmmodule.name}\n*/\n"
-
- # header file guard
- var guard = "{mmmodule.cname.to_s.to_upper}_NIT_H"
-
- # .h
- var stream = new OFStream.open( "{compdir}/{h_file}" )
- stream.write( module_info )
- stream.write( "#include <{mmmodule.name}._nitni.h>\n\n" )
- stream.write( "#ifndef {guard}\n" )
- stream.write( "#define {guard}\n\n" )
- compilation_unit.header_c_base.write_to_stream( stream )
- compilation_unit.header_custom.write_to_stream( stream )
- compilation_unit.header_c_types.write_to_stream( stream )
- compilation_unit.header_decl.write_to_stream( stream )
- stream.write( "#endif\n" )
- stream.close
-
- # .c
- stream = new OFStream.open( "{compdir}/{c_file}" )
- stream.write( module_info )
- stream.write( "#include \"{h_file}\"\n" )
- compilation_unit.body_decl.write_to_stream( stream )
- compilation_unit.body_custom.write_to_stream( stream )
- compilation_unit.body_impl.write_to_stream( stream )
- stream.close
+ assert n_extern_code_block != null
+
+ if mmodule.compiled_ffi_methods.has(self) then return
+ mmodule.compiled_ffi_methods.add self
+
+ var language = n_extern_code_block.language
+ assert language != null
+ mmodule.present_languages.add(language)
+ n_extern_code_block.language.compile_extern_method(
+ n_extern_code_block.as(not null), self, mmodule.ffi_ccu.as(not null), mmodule)
+ end
+end
+
+redef class VerifyNitniCallbacksPhase
+ redef fun process_npropdef(npropdef)
+ do
+ super
+
+ if not npropdef isa AMethPropdef then return
+
+ var code_block = npropdef.n_extern_code_block
+ if code_block == null then return
+
+ var lang = code_block.language
+ assert lang != null
+
+ # Associate callbacks used by an extern method to its foreign language
+ for callback in npropdef.foreign_callbacks.all do
+ var map = npropdef.mpropdef.mclassdef.mmodule.ffi_callbacks
+ if not map.keys.has(lang) then map[lang] = new HashSet[NitniCallback]
+ map[lang].add(callback)
+ end