Full FFI support, independent of the compiler

The full FFI support all the features of the light FFI and more:

  • More foreign languages: C++, Java and Objective-C.
  • Callbacks to Nit from foreign codes. The callbacks are declared in Nit using the import annotation on extern methods. They are then generated on demand for the target foreign language.
  • Static Nit types in C for precise typing and static typing errors in C.
  • Propagating public code blocks at the module level (C Header). This allows to use extern classes in foreign code in other modules without having to import the related headers. This is optional in C as it is easy to find the correct importation. However it is important in Java and other complex FFIs.
  • Reference pinning of Nit objects from foreign code. This ensure that objects referenced from foreign code are not liberated by the GC.
  • FFI annotations:
  • cflags, ldflags and cppflags pass arguments to the C and C++ compilers and linker.
  • pkgconfig calls the pkg-config program to get the arguments to pass to the C copiler and linker.
  • extra_java_files adds Java source file to the compilation chain.

Redefined classes

redef class MModule

nitc :: ffi $ MModule

A Nit module is usually associated with a Nit source file.
redef class VerifyNitniCallbacksPhase

nitc :: ffi $ VerifyNitniCallbacksPhase

  • checks for the validity of callbacks

All class definitions

redef class MModule

nitc :: ffi $ MModule

A Nit module is usually associated with a Nit source file.
redef class VerifyNitniCallbacksPhase

nitc :: ffi $ VerifyNitniCallbacksPhase

  • checks for the validity of callbacks
package_diagram nitc::ffi ffi nitc::header_dependency header_dependency nitc::ffi->nitc::header_dependency nitc::pkgconfig pkgconfig nitc::ffi->nitc::pkgconfig nitc::extra_java_files extra_java_files nitc::ffi->nitc::extra_java_files nitc::objc objc nitc::ffi->nitc::objc nitc::light_ffi light_ffi nitc::ffi->nitc::light_ffi nitc::c c nitc::header_dependency->nitc::c nitc::pkgconfig->nitc::c nitc::java java nitc::extra_java_files->nitc::java nitc::objc->nitc::c nitc::extern_classes extern_classes nitc::objc->nitc::extern_classes nitc::light_ffi->nitc::extern_classes nitc::light_c light_c nitc::light_ffi->nitc::light_c ...nitc::c ... ...nitc::c->nitc::c ...nitc::java ... ...nitc::java->nitc::java ...nitc::extern_classes ... ...nitc::extern_classes->nitc::extern_classes ...nitc::light_c ... ...nitc::light_c->nitc::light_c nitc::on_demand_compiler on_demand_compiler nitc::on_demand_compiler->nitc::ffi nitc::android android nitc::android->nitc::ffi nitc::dynamic_loading_ffi dynamic_loading_ffi nitc::dynamic_loading_ffi->nitc::on_demand_compiler nitc::dynamic_loading_ffi... ... nitc::dynamic_loading_ffi...->nitc::dynamic_loading_ffi nitc::compiler compiler nitc::compiler->nitc::android nitc::compiler... ... nitc::compiler...->nitc::compiler

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module annotation

nitc :: annotation

Management and utilities on annotations
module array

core :: array

This module introduces the standard array structure.
module auto_super_init

nitc :: auto_super_init

Computing of super-constructors that must be implicitly called at the begin of constructors.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module c

nitc :: c

Support for nesting C code within a Nit program using its FFI
module c_compiler_options

nitc :: c_compiler_options

Offers the annotations cflags and ldflags to specify
module c_tools

nitc :: c_tools

provides tools to write C .c and .h files
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module console

console :: console

Defines some ANSI Terminal Control Escape Sequences.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module cpp

nitc :: cpp

Supports the use of the C++ language through the FFI
module csv

csv :: csv

CSV document handling.
module digraph

graph :: digraph

Implementation of directed graphs, also called digraphs.
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module explain_assert_api

nitc :: explain_assert_api

Explain failed assert to the console (service declaration only)
module extern_classes

nitc :: extern_classes

Manages all extern classes and their associated foreign type.
module ffi_base

nitc :: ffi_base

Tools and utilities for implement FFI with different languages
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module flow

nitc :: flow

Intraprocedural static flow.
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module ini

ini :: ini

Read and write INI configuration files
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module java

nitc :: java

FFI support for the Java language
module kernel

core :: kernel

Most basic classes and methods.
module lexer

nitc :: lexer

Lexer and its tokens.
module lexer_work

nitc :: lexer_work

Internal algorithm and data structures for the Nit lexer
module light_c

nitc :: light_c

Support for nesting C code within a Nit program using its FFI
module light_ffi_base

nitc :: light_ffi_base

Tools and utilities for implement FFI with different languages
module list

core :: list

This module handle double linked lists
module literal

nitc :: literal

Parsing of literal values in the abstract syntax tree.
module loader

nitc :: loader

Loading of Nit source files
module local_var_init

nitc :: local_var_init

Verify that local variables are initialized before their usage
module location

nitc :: location

Nit source-file and locations in source-file
module math

core :: math

Mathematical operations
module mdoc

nitc :: mdoc

Documentation of model entities
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module mmodule

nitc :: mmodule

modules and module hierarchies in the metamodel
module mmodule_data

nitc :: mmodule_data

Define and retrieve data in modules
module model

nitc :: model

Classes, types and properties
module model_base

nitc :: model_base

The abstract concept of model and related common things
module modelbuilder_base

nitc :: modelbuilder_base

Load nit source files and build the associated model
module modelize

nitc :: modelize

Create a model from nit source files
module modelize_class

nitc :: modelize_class

Analysis and verification of class definitions to instantiate model element
module modelize_property

nitc :: modelize_property

Analysis and verification of property definitions to instantiate model element
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module mpackage

nitc :: mpackage

Modelisation of a Nit package
module native

core :: native

Native structures for text and bytes
module nitni

nitc :: nitni

Native interface related services (used underneath the FFI)
module nitni_base

nitc :: nitni_base

Native interface related services (used underneath the FFI)
module nitni_callbacks

nitc :: nitni_callbacks

nitni services related to callbacks (used underneath the FFI)
module nitpm_shared

nitc :: nitpm_shared

Services related to the Nit package manager
module numeric

core :: numeric

Advanced services for Numeric types
module opts

opts :: opts

Management of options on the command line
module ordered_tree

ordered_tree :: ordered_tree

Manipulation and presentation of ordered trees.
module parser

nitc :: parser

Parser.
module parser_nodes

nitc :: parser_nodes

AST nodes of the Nit language
module parser_prod

nitc :: parser_prod

Production AST nodes full definition.
module parser_util

nitc :: parser_util

Utils and tools related to parsers and AST
module parser_work

nitc :: parser_work

Internal algorithm and data structures for the Nit parser
module phase

nitc :: phase

Phases of the processing of nit programs
module platform

nitc :: platform

Platform system, used to customize the behavior of the compiler.
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module rapid_type_analysis

nitc :: rapid_type_analysis

Rapid type analysis on the AST
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module scope

nitc :: scope

Identification and scoping of local variables and labels.
module semantize

nitc :: semantize

Process bodies of methods in regard with the model.
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module tables

nitc :: tables

Module that interfaces the parsing tables.
module template

template :: template

Basic template system
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module toolcontext

nitc :: toolcontext

Common command-line tool infrastructure than handle options and error messages
module typing

nitc :: typing

Intraprocedural resolution of static types and OO-services
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O
module version

nitc :: version

This file was generated by git-gen-version.sh

Parents

module extra_java_files

nitc :: extra_java_files

Intro the annotation extra_java_files to compile extra java files
module header_dependency

nitc :: header_dependency

Tracks which modules has public header code that must be imported
module light_ffi

nitc :: light_ffi

Light FFI support, independent of the compiler
module objc

nitc :: objc

FFI support for Objective-C
module pkgconfig

nitc :: pkgconfig

Offers the PkgconfigPhase to use the external program "pkg-config" in order

Children

module android

nitc :: android

Compile program for the Android platform
module on_demand_compiler

nitc :: on_demand_compiler

Compiles extern code within a module to a static library, as needed

Descendants

module a_star-m

a_star-m

module compiler

nitc :: compiler

Compilation to C
module dynamic_loading_ffi

nitc :: dynamic_loading_ffi

Execute FFI code by creating and loading shared libraries
module interpreter

nitc :: interpreter

Interpretation of Nit programs
module nit

nitc :: nit

A naive Nit interpreter
module nitc

nitc :: nitc

A Nit compiler
module test_astbuilder

nitc :: test_astbuilder

Program used to test the clone method of the astbuilder tool
# Full FFI support, independent of the compiler
#
# The full FFI support all the features of the light FFI and more:
#
# * More foreign languages: **C++, Java and Objective-C**.
# * **Callbacks** to Nit from foreign codes.
#   The callbacks are declared in Nit using the `import` annotation on extern methods.
#   They are then generated on demand for the target foreign language.
# * **Static Nit types** in C for precise typing and static typing errors in C.
# * **Propagating public code blocks** at the module level (C Header).
#   This allows to use extern classes in foreign code in other modules
#   without having to import the related headers.
#   This is optional in C as it is easy to find the correct importation.
#   However it is important in Java and other complex FFIs.
# * **Reference pinning** of Nit objects from foreign code.
#   This ensure that objects referenced from foreign code are not liberated by the GC.
# * FFI **annotations**:
#   * `cflags`, `ldflags` and `cppflags` pass arguments to the C and C++
# compilers and linker.
#   * `pkgconfig` calls the `pkg-config` program to get the arguments
# to pass to the C copiler and linker.
#   * `extra_java_files` adds Java source file to the compilation chain.
module ffi

import modelbuilder

import nitni

intrude import ffi_base
import extern_classes
import header_dependency
import pkgconfig
import c_compiler_options
import c
import cpp
import java
import extra_java_files
import objc
intrude import light_ffi

redef class MModule
	# Complete the compilation of the FFI code
	redef fun finalize_ffi_wrapper(compdir, mainmodule)
	do
		for language in ffi_callbacks.keys do
			for callback in ffi_callbacks[language] do
				language.compile_callback(callback, self, mainmodule, ffi_ccu.as(not null))
			end

			language.compile_to_files(self, compdir)
		end

		# include dependancies FFI
		for mod in header_dependencies do
			if mod.uses_ffi then ffi_ccu.header_custom.add("#include \"{mod.c_name}._ffi.h\"\n")
		end

		super
	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
	end
end
src/ffi/ffi.nit:17,1--99,3