NCCCバインディングI/F仕様
NCCC 仕様でバインディングされたライブラリが提供するNCCC呼出しの仕様。WASM用のものとは一旦完全に分離することにした。特に 番号が被っているがユーザ側で頑張って呼び分けることにする 。そのうちWASMライブラリの方をこちらに揃えたい。
DLLインターフェース
NCCCコレクションは以下のシンボルをエクスポートする。
void <LIBNAME>_nccc_root_00(const uint64_t* in, uint64_t* out);
<LIBNAME>
はコレクションのシンボル名でDLLファイル名となる。コレクションは複数のNCCCライブラリを格納でき、それらはインデックス番号で識別される。
stub types
NCCCライブラリからエクスポートされるAPIはいずれかのstub typeを持つ。現在はforward_0のみ。
forward_0
非NCCC APIをNCCCプロトコルで呼出すためのスタブ。取得するアドレスは関数ポインタで、直接呼出しを行う。
rootシンボル <LIBNAME>_nccc_root_00
もforward_0スタブとして実装される。
forward_1
非NCCC APIをNCCCプロトコルで呼出すためのスタブ。取得するアドレスはディスパッチャとコンテキスト(ctx)の2つで、間接呼出しを行う。ディスパッチャはforward_0スタブであり2引数を取る。
[ctx param_addr] => out
forward_1スタブは動的に実行コードを生成できないプラットフォーム(iPhone等)でスクリプト言語からコールバックを提供する場合などに使用する。
forward_2
非NCCC APIをNCCCプロトコルで呼出すためのスタブ。予約。関数ポインタを特定の関数型でwrapするために使用する。
コアライブラリ
コアライブラリはシンボルのlookupなどライブラリの動的リンクに使用する。一度lookupした結果はコレクションのビルドIDが一致する場合はキャッシュして良い。
エラーコード
エラーとなる可能性のあるAPIはエラーコードを返却する。今のところエラーコードの意味は特に設定していない。エラーが無い場合はエラーコードとしてゼロを返却する。
any => [res ret ...]
エラーコードは必ず先頭に返却される。呼出しがエラーになった場合は以降を解釈すべきではない。特に、可変長レスポンスに対するバッファサイズ不足エラーは存在しない(十分なサイズのバッファを確保するのは呼出し側の責任となる)。
0:0 collection_info
[0 0 version] => [buildid32_L buildid32_H libcount maxversion]
versionは 1
でなければならない。ライブラリのビルドIDを返却する。
1:LIB:1 library_info
[1 lib 1] => [nameptr0 nameptr1 maxexport maximport maxvariables maxstubs]
ライブラリの情報を取得する。 nameptr0
nameptr1
はライブラリ名のASCIIZポインタとなる。
(FIXME: variablesは定数も含む)
1:LIB:2 library_export_info
[1 lib 2 exportid] => [res objid32 nameptr stubtype addr0 addr1 incount outcount]
★ このリクエストはキャッシュできない ★
(ASLRによってアドレスはロード毎に変化する可能性があるため)
library_import_info
library_variable_info
library_stub_info
1:LIB:6 library_arg_info
[1 lib 6 objid] => [res incount outcount intype ... outtype ...]