繁体   English   中英

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

[英]How to reset global object in 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()实际返回什么? 我迷路了...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM