V8 C ++ проблемы встраивания

Я новичок в встраивании V8 и только начал заменять мой текущий язык сценариев библиотекой V8. Однако я сталкиваюсь с некоторыми действительно странными (по крайней мере для меня) проблемами. Такое ощущение, что я единственный, кто делает то, что я делаю, и я чувствую, что делаю что-то глупое.

Я создал класс-обертку, чтобы обернуть функции движка V8 и создать движок при создании моей обертки (попробуйте игнорировать дерьмовые имена переменных или глупые стили):

engine.h:

namespace JSEngine {

class Engine
{
public:
Engine();
virtual ~Engine();
v8::Isolate* isolate;
v8::Handle<v8::Context> context;
};
}

engine.cpp (который включает engine.h):

JSEngine::Engine::Engine()
{
v8::Locker locker();
V8::Initialize();

this->isolate = Isolate::GetCurrent();
HandleScope scope(this->isolate);

this->context = Context::New(this->isolate);
}

Этот код в порядке, но как только я попробую это:

Server::jsEngine = new JSEngine::Engine();
HandleScope scope(Server::jsEngine->isolate);
Context::Scope context_scope(Server::jsEngine->context);

Handle<String> source = String::NewFromUtf8(Server::jsEngine->isolate, "'Hello' + ', World!'");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();

String::Utf8Value utf8(result);
printf("%s\n", *utf8);

Я получаю ОТСУТСТВИЕ СЕГМЕНТАЦИИ в этой строке: Context::Scope context_scope(Server::jsEngine->context);

Я понятия не имею, что я делаю неправильно, и является ли этот подход даже лучшей практикой. Не могли бы вы помочь мне устранить ошибку SEGMENTATION FAULT, пожалуйста?

1

Решение

Ваша переменная-член контекста — это локальный дескриптор, созданный в локальной области и недействительный, как только ваш конструктор Engine завершит работу, поскольку область будет удалена. Вам нужен постоянный дескриптор для вашего контекста. Измените свою декларацию Engine для использования

v8::Persistent<v8::Context> context;

и когда вы на самом деле создаете контекст, используйте

this->context.Reset(this->isolate, Context::New(this->isolate));

и в вашем деструкторе используйте

this->context.Reset();
1

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

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

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