X-Git-Url: http://nitlanguage.org diff --git a/src/ffi/c.nit b/src/ffi/c.nit index 1790f48..e09a80f 100644 --- a/src/ffi/c.nit +++ b/src/ffi/c.nit @@ -18,88 +18,19 @@ module c import ffi_base +import light_c -redef class FFILanguageAssignationPhase - var c_language: FFILanguage = new CLanguage(self) -end - -class CLanguage - super FFILanguage - - redef fun identify_language(n) do return n.is_c - - redef fun compile_module_block(block, ecc, mmodule) - do - if block.is_c_header then - ecc.header_custom.add block.location.as_line_pragma - ecc.header_custom.add "\n" - ecc.header_custom.add block.code - else if block.is_c_body then - ecc.body_impl.add block.location.as_line_pragma - ecc.body_impl.add "\n" - ecc.body_impl.add block.code - end - end - - redef fun compile_extern_method(block, m, ecc, mmodule) - do - var fc = new ExternCFunction(m, mmodule) - fc.decls.add( block.location.as_line_pragma ) - fc.exprs.add( block.code ) - ecc.add_exported_function( fc ) - end - - redef fun compile_extern_class(block, m, ecc, mmodule) do end - - redef fun get_ftype(block, m) do return new ForeignCType(block.code) - +redef class CLanguage redef fun compile_callback(callback, mmodule, mainmodule, ecc) do callback.compile_callback_to_c(mainmodule, ecc) end end -redef class AExternCodeBlock - fun is_c: Bool do return language_name == null or - language_name_lowered == "c" or language_name_lowered.has_prefix( "c " ) - - fun is_c_body: Bool do return language_name == null or - language_name_lowered == "c" or language_name_lowered == "c body" - - fun is_c_header: Bool do return language_name_lowered == "c header" -end - -redef class Location - fun as_line_pragma: String do return "#line {line_start-1} \"{file.filename}\"\n" -end - -redef class MModule - var cflags = "" is writable - var ldflags = "" is writable - - # Additional libraries needed for the compilation - # Will be used with pkg-config - var pkgconfigs = new Array[String] -end - -class ForeignCType - super ForeignType - - redef var ctype: String -end - redef class NitniCallback fun compile_callback_to_c(mmodule: MModule, ffi_ccu: CCompilationUnit) do end end -redef class Object - # Context when calling user C code from generated code - fun to_c_call_context: ToCCallContext do return once new ToCCallContext - - # Context when calling generated code from user C code - fun from_c_call_context: FromCCallContext do return once new FromCCallContext -end - redef class MExplicitCall redef fun compile_callback_to_c(mmodule, ffi_ccu) do @@ -110,41 +41,3 @@ redef class MExplicitCall ffi_ccu.body_decl.add("#define {friendly_cname} {full_cname}\n") end end - -# Context when calling user C code from generated code -class ToCCallContext - super CallContext - - # TODO: private init because singleton instance (see `to_c_call_context`) - - redef fun name_mtype(mtype) - do - if mtype isa MClassType and mtype.mclass.kind == extern_kind then return "void *" - return mtype.cname - end -end - -# Context when calling generated code from user C code -class FromCCallContext - super CallContext - - # TODO: private init because singleton instance (see `from_c_call_context`) - - redef fun name_mtype(mtype) do return mtype.cname -end - -class ExternCFunction - super CFunction - - var method: AMethPropdef - - init (method: AMethPropdef, mmodule: MModule) - do - self.method = method - - var recv_mtype = method.mpropdef.mclassdef.bound_mtype - var csignature = method.mpropdef.mproperty.build_csignature(recv_mtype, mmodule, "___impl", long_signature, from_c_call_context) - - super( csignature ) - end -end