2014-01-20 22 views
3

我想在使用V8引擎的嵌入式JavaScript应用程序中实现此功能。在HashMap中存储对象的句柄或在Google的V8引擎中设置

function myFunction1() { 
    //do stuff 
} 

function myFunction2() { 
    //do other stuff 
} 

myAddon.addCallback(myFunction1); 
myAddon.addCallback(myFunction2); 
myAddon.removeCallback(myFunction1); 

为了做到这一点,我需要存储在std::set像这样

void addCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 
    v8::HandleScope scope(args.GetIsolate()); 
    v8::Local<v8::Function> cb = v8::Local<v8::Function>::Cast(args[0]); 
    std::set mySet = this->mySet; 
    //now how do I insert a reference to this function into mySet so I can retrieve 
    //it later 
} 

void removeCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 
    v8::HandleScope scope(args.GetIsolate()); 
    v8::Local<v8::Function> cb = v8::Local<v8::Function>::Cast(args[0]); 
    std::set mySet = this->mySet; 
    //now how do I remove the element in this set that refers to this function? 
} 

一个人如何去这样做这些功能呢?我不想使用v8::Object::GetIdentityHash(),因为结果不能保证是唯一的。

我也不能只存储在std::set本地,因为复制构造函数是私人的,它也会得到一次removeCallback或addCallback返回。

感谢您提前提供任何帮助。

编辑:我意识到我可以写一些JavaScript来为我做函数散列,然后调用一个C++绑定函数遍历所有回调函数,但我宁愿不要每次需要存储集合时都这样做或JavaScript对象的哈希值。

+0

更好地编辑您的问题与@robot_guy作为其更难以错过的评论。 – Amicable

回答

4

这是正确的,您不能安全地存储Local<T>句柄,因为当它超出作用域时,函数对象可能变为可用于垃圾回收。你需要的是一个持久的句柄。你可以把它构造成如下形式:

v8::Local<v8::Function> cb = v8::Local<v8::Function>::Cast(args[0]); 
v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function>> value(isolate, cb); 

注意CopyablePersistentTraits它允许处理复制。如果您想阻止这种情况,还有NonCopyablePersistentTraits

现在你可以把它放在一个向量:

std::vector<v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function>>> v; 
v.push_back(value); 

转换回本地:

v8::Local<v8::Function> local = v8::Local<v8::Function>::New(isolate, value); 

对于std::set您还需要为元件提供比较函数。把v8::Persistent<T>换成你自己的班级,比如PersistentWrapper<T>(这是我在我的项目中做的)来获得所需的行为也是一个好主意。

+0

是的,对不起,你是正确的,那些将不得不是持久对象,所以他们不会失去范围。你能提供一个如何包装持久性的例子吗?谢谢 –

+0

例如https://gist.github.com/anonymous/8565705(C++ 11)。我不需要对象散列。散列的唯一原因是您可以稍后移除回调吗? – iefserge

相关问题