簡體   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