从v8 SWIG C++seg调用的NodeJS函数.故障



我有一些c++代码,我正在用SWIG编译(你可以在这里克隆代码(,它定义了javascript"函数";将从C++执行一次设置:

v8::Persistent<v8::Function> theFunction;
/** Class to test the wasm setup
*/
class Test {
...
}

我在我的swigTest.I模板中扩展了它,以设置javascript回调,这样C++就可以这样调用它:

%extend Test {
void setCallback(const std::string& fnName){
SWIGV8_HANDLESCOPE();
v8::Isolate* isolate = v8::Isolate::GetCurrent();
// first find the global js function
v8::Local<v8::Value> fnObj = SWIGV8_CURRENT_CONTEXT()->Global()->Get(SWIGV8_CURRENT_CONTEXT(), v8::String::NewFromUtf8(isolate, fnName.c_str())).ToLocalChecked();
if (!fnObj->IsFunction()){
printf("setupCallback : error no function foundn");
return;
} else
printf("setupCallback : %s function foundn", fnName.c_str());
v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(fnObj);
theFunction.Reset(isolate, func);
// now call the global javascript function from C++
v8::Local<v8::Function> func2 = v8::Local<v8::Function>::New(isolate, theFunction);
if (!func2.IsEmpty()) {
const unsigned argc = 1;
v8::Local<v8::Value> argv[argc] = { v8::String::NewFromUtf8(isolate, "hello world") };
v8::Local<v8::Value> ret;
func2->Call(SWIGV8_CURRENT_CONTEXT(), ret, argc, argv);
}
}
}

当我运行javascript时,函数是从全局变量中找到的,但当C++试图执行它时,它会发生变化:

global.fnName = function (str) {
console.log(str);
}
test.setCallback("fnName");

但不幸的是,C++seg。执行javascript之前的错误";函数":

setupCallback : fnName function found
Segmentation fault (core dumped)

v8代码中是否缺少一些东西来使回调正常工作?

在提供的测试代码中,文件swigCNodejw_wrap_wrap.cxx是自动生成的,其中包含v8代码。

更改以下调用方法:

func2->Call(SWIGV8_CURRENT_CONTEXT(), ret, argc, argv);

对此:

func2->Call(SWIGV8_CURRENT_CONTEXT(), func2, argc, argv);

最新更新