如何在嵌入式V8中重置全局对象?

时间:2019-01-19 10:29:05

标签: c++ v8 embedded-v8

我希望能够重置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 ++添加到全局对象的东西)?有什么方法可以做到这一点(然后破坏隔离并重新初始化所有内容)?

编辑:

似乎isolate->GetCurrentContext()没有返回正确的上下文。我经常使用这种方法来查找“当前”上下文。尝试了两种不同的方法isolate->GetEnteredContext()m_context.Get(m_isolate),并且这两个似乎可以正常工作。我还是不明白为什么?为什么isolate->GetCurrentContext()返回旧的上下文,而其名称却暗示了其他情况?? isolate->GetCurrentContext()实际返回什么?我迷路了...

1 个答案:

答案 0 :(得分:0)

isolate->GetCurrentContext() 返回最后一个 Enter()-ed 上下文...