SML# - Library/FFI Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

このライブラリは, SML#0.20のFFI機能を利用したコーディングを支援するユーティリティ関数を提供する.

2008年に予定している完成版では, SML#はより統一的で透過的な相互運用メモリ管理機能を提供する予定である.

:[[API|smlsharp:lib/FFI/doc/api/]]:API ドキュメント

このライブラリはデフォルトのプレリュードで読み込まれる.

もしFFIライブラリを含まない他のプレリュードを使用しているならば

# use "FFI.sml";

によりFFIライブラリを読み込むことができる.

!! 外部メモリユーティリティ
SML#ヒープの外部に割り当てられたメモリブロックへのポインタは, stringやWord8Vector.vectorといったSML#内部に割り当てられる値とは互換性がない.
したがって, [[foreign function binding]]に述べるように, メモリブロックポインタをSML#と外部ライブラリとの間で受け渡す際には二点制限がある.

* SML#ヒープの外部に割り当てられたメモリブロックへのポインタをSML#に取り込んではならない.
* 外部ライブラリは, SML#ヒープに割り当てられたメモリブロックへのポインタを外部関数呼び出し終了後も保持し続けてはならない

UnmanagedMemory, UnmanagedStringおよびSMLSharp.FLOBは, SML#と外部ライブラリ間でのメモリブロックの共有を可能とする機能を提供する.

!!! 外部メモリポインタのSML#へのインポート

SML#ヒープの外部に割り当てられたメモリブロックへのポインタは, stringやWord8Vector.vectorといったSML#内部に割り当てられる値とは互換性がない.

通常のSMLの値と同様に外部メモリブロックの内部にアクセスしたいならば, このライブラリを用いて, SML#ヒープ内に新たに割り当てるブロックに, 外部メモリブロックの内容をコピーすることができる

char* gs = "abc";
char* f(){ return gs; }

val libfoo = DynamicLink.dlopen "libfoo";
val fptr = DynamicLink.dlsym (libfoo, "f");
val f = fptr : _import () -> UnmanagedString.unmanagedString;
val ums = f ();
val s = UnmanagedString.import ums;

''s'' は通常の ''string'' と同様に扱える.

!!! SML#ヒープブロックポインタの外部ライブラリへのエクスポート

FFIライブラリは, 外部メモリにブロックを割り当て, その内容を参照および更新する関数を提供する.
また, SML#の''string''を外部メモリブロックにコピーする関数も提供する.
これらの外部メモリブロックへのポインタを, 外部ライブラリに渡すことができる.

これらのメモリブロックはGCでは管理されないため, これらを解放するためには'UnmagedMemory.release'を呼ばなければならない.

char* gs;
int f(char* s){ gs = s; return 0; }

val libfoo = DynamicLink.dlopen "libfoo";
val fptr = DynamicLink.dlsym (libfoo, "f");
val f = fptr : _import (UnmanagedString.unmanagedString) -> int;
val s = "abc";
val ums = UnmanagedString.export s;
val _ = f ums;
val _ = UnmanagedString.release ums;