Постоянная область видимости C v8

#c #v8 #persistent

#c #v8 #постоянная

Вопрос:

Могу ли я каким-то образом сохранять v8::Isolate::Scope v8::HandleScope и v8::Context::Scope ?

Я знаю, что могу создать постоянную контекстную v8::Persistent<v8::Context, v8::CopyablePersistentTraits<v8::Context>> pContext(isolate, v8::Context::New(isolate, nullptr, global)); и постоянную функцию, но могу ли я на самом деле сохранить все области, перечисленные выше?

Чтобы я мог исключить переменные стека областей, подобные этому:

 v8::Isolate::Scope isolate_scope(isolate); // can I persist isolate_scope ?
v8::HandleScope scope(isolate); // can I persist handlescope ?

v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
    global->Set(v8::String::NewFromUtf8(isolate, "print"), v8::FunctionTemplate::New(isolate, Print));
    global->Set(v8::String::NewFromUtf8(isolate, "require"), v8::FunctionTemplate::New(isolate, Require));

v8::Persistent<v8::Context, v8::CopyablePersistentTraits<v8::Context>> pContext(isolate, v8::Context::New(isolate, nullptr, global));
v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, pContext);

v8::Context::Scope context_scope(context); // can I persist this ?
  

Большое спасибо.

Комментарии:

1. Я не понимаю вашего вопроса, но вот некоторая общая информация: A v8::Local — это ссылка, которая исчезает, когда исчезает ее handlescope. A v8::Global (предположительно, что вы имеете в виду постоянный) остается до тех пор, пока глобальная переменная не вызовет свой деструктор или ::Reset(...) . Обычно создается Global<Context> , поскольку это единственный способ поместить его в структуру данных, чтобы сохранить контекст, чтобы потом с ним что-то делать.

2. Кроме того, v8::Local<v8::ObjectTemplate> global это ужасное имя.

3. Хорошо. Я попытаюсь немного прояснить. Внутри моей оболочки c у меня есть две функции: компиляция и запуск. Сначала создайте изолированную, создайте области видимости, скомпилируйте, запустите и сохраните постоянную функцию. И второе включение, run function , пытается получить ту же изоляцию, создать области видимости и просто запустить эту уже скомпилированную функцию. bitbucket.org/bondarenkoedik/v8final/src v8wrap.cpp функции file, _run и _compile. Итак, вопрос в том, почему версия nodejs работает быстрее. Проблема в GC? Потому что в моей версии, если я вызываю _run в цикле, я постоянно выделяю и удаляю память, и это может быть так.

4. Я ничего не знаю о вашей узловой программе, чтобы рассказать вам, в чем может быть разница.

5. Я не использую cnode.cpp для проведения тестов. Я просто вызываю run из нескольких потоков внутри моей тестовой простой программы.