JavaScript から Node.js アドオンに渡されたオブジェクトをvoid *
. これをコンパイルできないようです。node-gyp でビルドすると、 が生成されerror: no matching function for call to 'Cast'
ます。
私がやろうとしていることの長いバージョンは、Csound を実行する Node.js アドオンを作成することです。概観すると、Csound は、不透明な Csound 構造体へのポインターを (通常は) 最初の引数として受け取る C 関数で機能します。この構造体には、void *
Csound をホストするプログラムによって設定された任意のデータ「<code>hostData」が含まれます。メッセージの投稿など、Csound が行ういくつかのことは、コールバック (この場合は関数ポインター) で変更されます。Csound の各インスタンスのコールバックを格納する場所が必要なので、誰かが JavaScript からオブジェクトに設定できるようにしようとしていますが、Csound インスタンスのコールバックをこのオブジェクトの隠しプロパティhostData
として設定したいとも考えています。hostData
コードは次のようにする必要があると思います
#include "csound.h"
#include <node.h>
static void CsoundMessageCallback(CSOUND *Csound, int attributes,
const char *format, va_list valist)
{
// Call the JavaScript function we stored in the hostData of Csound.
}
static void _wrap_csoundSetMessageCallback(
const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::HandleScope scope(v8::Isolate::GetCurrent());
CSOUND *Csound;
// Pretend we get the Csound instance from args[0] here. This is actually done
// by SWIG <http://www.swig.org>.
// This does not compile. csoundGetHostData() returns a void *, but I’m assuming
// hostData was set to an object from JavaScript.
v8::Persistent<v8::Object> hostData =
v8::Persistent<v8::Object>::Cast(csoundGetHostData(Csound));
hostData.SetHiddenValue(
v8::String::New("CsoundMessageCallback"),
v8::Persistent<v8::Function>::Cast(args[1])
);
csoundSetMessageCallback(Csound, CsoundMessageCallback);
}
V8 の内部フィールドを詳しく調べる必要があると思いますが、よくわかりません。