2.1 The Basicsメモ

この記事は、libffi (http://sourceware.org/libffi/) 3.0.9の中にあるdoc/libffi.infoの"2.1 The Basics"の日本語訳っぽい個人的なメモです。

ffi_status ffi_prep_cif(ffi_cif* CIF, ffi_abi ABI, unsigned int NARGS, ffi_type* RTYPE, ffi_type** ARGTYPES)

  • CIFを初期化する。
  • ABIは、FFI_DEFAULT_ABIにしておく。
  • NARGSはこの関数が受け入れる引数の数。可変長引数は扱えない。
  • RTYPEはこの関数の戻り値を記述するffi_type構造体へのポインタ。
  • ARGTYPESはffi_typeポインタの配列。ARGTYPESはNARGSだけ要素がなければならない。NARGSが0ならば、引数は無視される。
  • ffi_prep_cifは、libffi終了コードを返し、これの型はffi_statusである。すべてがうまくいったら、FFI_OKになる。ffi_typeオブジェクトのひとつが間違っていたら、FFI_BAD_TYPEDEFになる。ABIパラメータが不正なら、FFI_BAD_ABIとなる。

void ffi_call(ffi_cif* CIF, void* FN, void* RVALUE, void** AVALUES)

  • 初期化されたffi_cifを使って関数を呼び出すときは、ffi_call関数を使う。
  • この関数は、CIFで与えられる記述にしたがって関数FNを呼び出す。
  • RVALUEは関数呼び出しの結果を保持するメモリ領域へのポインタである。これは結果を受け取るのに充分な大きさがなければならず、適切にアラインメントされていなければならない。これを保証するのは呼出側の責任である。CIFが、関数がvoidを返すと宣言している(ffi_type_voidを使って)場合、RVALUEは無視される。
  • AVALUESは、呼び出しのための引数の値を保持するメモリ領域へのポインタの配列である。CIFが、この関数は引数を必要としない(すなわち、NARGSが0)と宣言しているのなら、AVALUESは無視される。