0.20版における制限

構造体の中のchar型およびshort

これら型が構造体の中でパックされた表現をもつ処理系には対応していない.例えば,

struct S {char x; char y;};
int f(struct S* s);

と宣言された関数は,そのような処理系では1語データとして表現されているため,以下のような宣言は未定義となる.

val f = DynamicLink.dlsym(lib, "f") : _import (char * char) -> int;

ポインターとGC

現在の自動ごみ集め処理(GC)を基礎とするメモリー管理の技術では,ヒープブロックの途中を指すポインタを扱うことは困難である.したがって,ポインタ演算を許すCで生成されたポインタをSML#に安全にインポートすることはできない.また,現在のSML#のメモリー管理は,言語間のGCを実装していない.このため,現バージョンでは,ポインタの扱いに以下の制約がある.

  1. 外部で作られたデータへのポインターをSML#にインポートすることはできない.
  2. SML#から渡されたポインターデータを,外部関数が,その関数の呼び出し終了後も保存することはできない.

例えば,

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

のような関数を

val f = _external "f" of "libfoo" : {} -> string;
val s = f ();

と宣言して利用すると第1制約に違反し,SML#のごみ集め処理が未定義な動作し,通常システムエラーを引き起こす.

ただし,以下のように外部のポインターを値として扱うのは問題ない.

val f = _external "f" of "libfoo" : {} -> unit ptr;
val s = f ();

また,

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

のような関数の

val f = _external "f" of "libfoo" : {string} -> int;

のような宣言を通じて利用は,第二の制約に違反し,SML#のごみ集め処理が正常に動作しない.

将来のバージョンでは,これら問題に対応するための外部関数操作ユーティリティライブラリ や,より系統的な解決方法を構築する予定である.

Last modified:2007/03/30 04:53:54
Keyword(s):
References:[外部関数束縛] [SML#がサポートする相互運用型]