Как хранить постоянные дескрипторы в V8?

Я хочу, чтобы мой класс провел 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, поэтому код не компилируется. Ошибка возникает в линиях, где две мембраны инициализируются. Для контекста это находится в списке инициализатора конструктора, для внешнего это внутри тела конструктора.

1> ошибка C2440: ‘=’: невозможно преобразовать из ‘v8 :: Primitive *’ в ‘v8 :: Object * volatile’
1> Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, приведения в стиле C или в стиле функции
1> include \ v8 \ v8.h (603): см. Ссылку на компилируемую реализацию шаблона функции ‘void v8 :: NonCopyablePersistentTraits :: Uncompilable (void)’

Я думал об использовании указателей на постоянные дескрипторы, но это кажется нелогичным, поскольку концепция дескрипторов уже подразумевает какую-то ссылку. Более того, я думаю, что ручки будут разрушены, так что внутренний сборщик мусора в V8 сможет очистить объекты.

Как я могу хранить объекты V8 как постоянные члены класса?

Обновление: даже если я использую указатель на постоянные дескрипторы, я получаю те же ошибки компилятора для методов, которые возвращают постоянные дескрипторы.

7

Решение

По умолчанию постоянные дескрипторы используют не копируемую черту. Явная передача копируемой черты в качестве аргумента шаблона заставляет их работать как в предыдущих версиях.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]