[英]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.