Область действия C ++ и контекст скрипта Google V8

У меня есть следующий, почти рабочий кусок кода, написанный на c ++:

[..]

Handle<Object> jsGlobal;
Handle<Function> jsUpdateFunc;

void setupJs () {
V8::Initialize();
Isolate* isolate = v8::Isolate::New();
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
Local<String> source = String::NewFromUtf8(isolate, "var a = 0; function test() { a++; return a.toString(); }");
Local<Script> script = Script::Compile(source);
script->Run();

jsGlobal = context->Global();
Handle<Value> value = jsGlobal->Get(String::NewFromUtf8(isolate, "test"));
jsUpdateFunc = Handle<Function>::Cast(value);
}

void callJs() {
Handle<Value> args[0];
Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
js_result->ToString();

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

[..]

У меня есть функция setupJs (), настраивающая среду v8, и callJs должен вызываться несколько раз (при работе скрипт javascript увеличивает переменную на a каждый раз)

Если я положу

Handle<Value> args[0];
Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
js_result->ToString();

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

в setupJs я вижу, как вызывается функция s и печатается «1». Но если я оставлю вызов функции с другой функцией, которая будет вызвана позже, у меня будет Segfault на линии Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);

Я проверил, и оба jsUpdateFunc и jsGlobal не являются нулевыми указателями

3

Решение

Вам нужно использовать постоянные ручки для jsGlobal а также jsUpdateFunc, Нормальный (локальный) дескриптор становится недействительным при его включении v8::HandleScope уничтожен

Вам также понадобится глобальная переменная для v8::Isolate указатель и еще один для постоянного дескриптора к v8::Context,

Чтобы вызвать функцию script позже, вам необходимо:

  1. Блокировка изолята (что вы действительно должны сделать в setupJs также; увидеть v8::Locker)
  2. Введите изолят (см. v8::Isolate::Scope).
  3. Установите область действия ручки (см. v8::HandleScope).
  4. Создайте локальный дескриптор для контекста.
  5. Введите контекст (см. v8::Context::Scope).
  6. Создать локальные дескрипторы для jsGlobal а также jsUpdateFunc,
  7. Вызовите функцию скрипта, как указано выше.

Ищу v8::Persistent и связанные шаблоны в заголовочном файле V8.

4

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

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

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