Как сбросить глобальный объект во встроенном V8? - PullRequest
0 голосов
/ 19 января 2019

Я хотел бы иметь возможность сбросить глобальный объект моего V8 JS-контекста. Допустим, все работает нормально, код выполняется и т. Д. Но теперь я хотел бы вернуться в исходное состояние (удалить все объекты, функции и т. Д.)

Я пробовал так:

Сначала я покидаю свой текущий контекст:

v8::Local<v8::Context> context(m_isolate->GetCurrentContext());
context->Exit();

m_context.Reset(); //v8::Global<v8::Context>

И я создаю новый контекст с новым глобальным объектом:

v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(m_isolate);
global->SetInternalFieldCount(1);
install_global_functions(global);

v8::Local<v8::Context> context = v8::Context::New(m_isolate, nullptr, global);
m_context.Reset(m_isolate, context); //making context persistent

context->Enter();

v8::Local<v8::Object> g_obj = context->Global();
g_obj->SetAlignedPointerInInternalField(0, this);

И ... У меня все еще есть доступ к переменным, функциям, классам, которые я определил в предыдущем контексте. ЗАЧЕМ? Как это возможно. Когда я создаю новый контекст с новым шаблоном глобального объекта, разве это не должен быть просто «чистый» экземпляр? Что не так?

Что я хочу сделать, это просто очистить все (что было создано в JS и что было добавлено в глобальный объект из C ++, оба)? Есть ли способ сделать это (кроме уничтожения изолята и повторной инициализации всего)?

EDIT:

Похоже, isolate->GetCurrentContext() не возвращает правильный контекст. Я часто использую этот метод, чтобы найти «текущий» контекст. Пробовал два разных метода isolate->GetEnteredContext() и m_context.Get(m_isolate) и эти два кажутся для правильной работы. Я до сих пор не понимаю, ПОЧЕМУ? Почему isolate->GetCurrentContext() возвращает старый контекст, а его название говорит об обратном ??? Что на самом деле возвращает isolate->GetCurrentContext()? Я потерян ...

...