如何在V8中存储持久句柄

How to store persistent handles in V8?

本文关键字:句柄 存储 V8      更新时间:2023-10-16

我想让我的类持有一个v8::Context和一个v8::External作为成员。因此,我认为我必须使用持久句柄。

class ScriptHelper {
public:
    ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
        // ...
    }
    // ...
private:
    v8::Persistent<v8::Context> context;
    v8::Persistent<v8::External> external;
};

然而,持久句柄在V8中是不可复制的,因此代码无法编译。错误发生在初始化两个成员的行中。对于context, this在构造函数的初始化列表中,对于external, this在构造函数体中。

1>错误C2440: '=':无法从'v8::Primitive *'转换为'v8::Object *volatile '
1>所指向的类型不相关;转换需要reinterpret_cast、c风格强制转换或函数风格强制转换
1> includev8v8.h(603):参见参考函数模板实例化'void v8::NonCopyablePersistentTraits::Uncompilable(void)'正在编译

我想过使用指针指向持久句柄,但这似乎有违直觉,因为句柄的概念已经暗示了某种引用。此外,我认为句柄会被销毁,以便V8的内部垃圾收集器可以清理对象。

如何将V8对象持久地存储为类成员?

更新:即使我使用指向持久句柄的指针,对于返回持久句柄的方法,我也会得到相同的编译器错误。

默认情况下,持久句柄使用不可复制的trait。显式地将copyable trait作为模板参数传递,使它们像以前的版本一样工作。

Persistent<Value, CopyablePersistentTraits<Value>> persistent(isolate, value);