TinyCCを使う(5)

Squeakから共有ライブラリ構築を行うクラスの動作確認メモ。

リストからFFI呼び出しメソッドを作成

| lib |
lib := SharedLibraryBuilder new.
lib pluginName: 'libfoo'.
lib targetClass: 'Foo'.
lib addFunctionArray: #('int' 'foo' 'int,int').
lib buildFFICaller.

実行結果:

primfoo: t1 with: t2 
<cdecl: long 'foo' (long long ) module:'libfoo'>
	^self externalCallFailed

リストから#compile:でメソッドを登録しているんですが、あまりうまくないですね。いい方法さがしています。

Squeakから共有ライブラリ構築

TinyCCを使って共有ライブラリを作るSharedLibraryBuilderの動作確認

| lib |
lib := SharedLibraryBuilder new.
lib sourceCode: '
int foo(int t1, int t2)
{
return t1+t2;
}'.
lib compile.
lib newFileNamed: 'libfoo.so'.
lib delete.

実行結果:

> ls -l libfoo.so
-rwxr-xr-x 1 kawa90 kawa90 2664 2007-01-20 08:43 libfoo.so
> file libfoo.so 
libfoo.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped

FFI呼び出し

実際にFFIを呼び出せるかテスト。

Foo new primfoo: 5 with: 11.
--> 16

動きました。

まとめ

現段階ではFFI呼び出し部分を作成するのに関数リストを与える必要があったりで、使い勝手が悪い。まぁ徐々に直していきます。

今後の予定

まあ、予定というかやっていきたいもの。

  • configureのようにヘッダ/ライブラリなどの有無を自動検出
  • External VMプラグインの対応。VMソース無しでビルド可能としたい。
  • コンパイルしたオブジェクトをオンメモリに配置して、実行できるのでJIT的なものを..