调用V8函数会导致访问冲突
Calling V8 function causes access violation
我有一个全局事件管理器,允许您使用lambdas侦听string
事件名称。
// somewhere in the ModuleScript class
Event->Listen("WindowResize", [=]{
// ...
});
现在,我也想从JavaScript注册到事件。因此,我写了这个回调。
v8::Handle<v8::Value> ModuleScript::jsOn(const v8::Arguments& args)
{
// get pointer to class since we're in a static method
ModuleScript *module = (ModuleScript*)HelperScript::Unwrap(args.Data());
// get event name we want to register to from arguments
if(args.Length() < 1 || !args[0]->IsString())
return v8::Undefined();
string name = *v8::String::Utf8Value(args[0]);
// get callback function from arguments
if(args.Length() < 2 || !args[1]->IsFunction())
return v8::Undefined();
v8::Handle<v8::Function> callback =
v8::Local<v8::Function>::Cast(args[1]->ToObject());
// register event on global event manager
module->Event->Listen(name, [=]{
// create persistent handle so that function stays valid
// maybe this doesn't work, I don't know
v8::Persistent<v8::Function> function =
v8::Persistent<v8::Function>::New(args.GetIsolate(), callback);
// execute callback function
// causes the access violation
function->Call(function, 0, NULL);
});
return v8::Undefined();
}
当触发该事件时,应用程序将因访问冲突而崩溃。我的想法是,函数对象此时不再有效,或者是JavaScript作用域问题。但是我想不明白。
是什么导致了访问冲突,如何克服它?
我认为这里有几个潜在的问题。
首先,在ModuleScript::jsOn()
终止后没有使用持久句柄来保存JavaScript函数。在调用事件处理程序时,该函数可能已经消失。考虑将callback
作为持久句柄
第二,在调用JavaScript函数之前,你的事件处理程序需要进入一个适当的V8上下文。根据您的体系结构,可能还需要显式锁定和进入V8隔离。
第三点(这在您的特定场景中可能不是问题),您需要管理V8隔离的生命周期。如果您的事件管理器在后台线程上触发事件,您必须确保您的事件处理程序以某种方式阻止隔离从另一个线程被处置。不幸的是,这是V8 API不能提供太多帮助的地方。
第四,为了防止泄漏,您的事件处理程序应该在调用函数后释放持久函数句柄。
祝你好运!
相关文章:
- 访问布局信息是否也会导致浏览器重排
- Javascript,访问一个主要对象模块模式中的每个对象
- 如何访问声音管理器2创建的声音对象
- 在Twitter上用ie9中的空白src访问iframe的contentWindow
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何访问fastOpt.js
- 访问JSON对象内部的数组元素
- 从模块内部访问Express装载路径
- 难以访问的JS环境中的语法错误
- 为什么nodejs's require在此闭包中无法使用调试器控制台访问?可能的v8优化
- 访问V8 JavaScript中的行号(Chrome&Node.js)
- 访问V8引擎的抽象语法树
- 如何使用V8从C++访问和调用Javascript对象属性和方法
- 访问持久函数时V8崩溃
- 调用V8函数会导致访问冲突
- 当内联缓存丢失时V8如何访问属性
- 访问& # 39;参数# 39;在JavaScript V8回调
- 直接从android应用程序访问JavaScript引擎:V8