Index: fpdfsdk/src/jsapi/fxjs_v8.cpp |
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp |
index 3413d72bb3d0218a98976465ccbe3596f6749d23..f0992896663ae7a4275acf459ddb76d65ed5239b 100644 |
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp |
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp |
@@ -95,7 +95,6 @@ class CFXJS_ObjDefinition { |
v8::Isolate* m_pIsolate; |
v8::Global<v8::FunctionTemplate> m_FunctionTemplate; |
v8::Global<v8::Signature> m_Signature; |
- v8::Global<v8::Object> m_StaticObj; |
}; |
static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate( |
@@ -273,9 +272,11 @@ void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, |
pDefault, v8::ReadOnly); |
} |
-void FXJS_InitializeRuntime(v8::Isolate* pIsolate, |
- IJS_Runtime* pIRuntime, |
- v8::Global<v8::Context>& v8PersistentContext) { |
+void FXJS_InitializeRuntime( |
+ v8::Isolate* pIsolate, |
+ IJS_Runtime* pIRuntime, |
+ v8::Global<v8::Context>* pV8PersistentContext, |
+ std::vector<v8::Global<v8::Object>*>* pStaticObjects) { |
if (pIsolate == g_isolate) |
++g_isolate_ref_count; |
@@ -290,14 +291,9 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate, |
FXJS_SetRuntimeForV8Context(v8Context, pIRuntime); |
int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); |
+ pStaticObjects->resize(maxID + 1); |
for (int i = 0; i < maxID; ++i) { |
CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); |
- CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); |
- v8::Local<v8::String> m_ObjName = |
- v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
- v8::NewStringType::kNormal, |
- bs.GetLength()).ToLocalChecked(); |
- |
if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { |
v8Context->Global() |
->GetPrototype() |
@@ -311,24 +307,28 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate, |
->ToObject(v8Context) |
.ToLocalChecked()); |
} else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { |
+ CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); |
+ v8::Local<v8::String> m_ObjName = |
+ v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
+ v8::NewStringType::kNormal, |
+ bs.GetLength()).ToLocalChecked(); |
+ |
v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i); |
v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); |
- pObjDef->m_StaticObj.Reset(pIsolate, obj); |
+ pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); |
} |
} |
- v8PersistentContext.Reset(pIsolate, v8Context); |
+ pV8PersistentContext->Reset(pIsolate, v8Context); |
} |
void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
- v8::Global<v8::Context>& v8PersistentContext) { |
- if (pIsolate == g_isolate && --g_isolate_ref_count > 0) |
- return; |
- |
+ v8::Global<v8::Context>* pV8PersistentContext, |
+ std::vector<v8::Global<v8::Object>*>* pStaticObjects) { |
v8::Isolate::Scope isolate_scope(pIsolate); |
v8::Locker locker(pIsolate); |
v8::HandleScope handle_scope(pIsolate); |
v8::Local<v8::Context> context = |
- v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); |
+ v8::Local<v8::Context>::New(pIsolate, *pV8PersistentContext); |
v8::Context::Scope context_scope(context); |
FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); |
@@ -345,8 +345,10 @@ void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { |
pObj = |
context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); |
- } else if (!pObjDef->m_StaticObj.IsEmpty()) { |
- pObj = v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); |
+ } else if (pStaticObjects->at(i) && !pStaticObjects->at(i)->IsEmpty()) { |
+ pObj = v8::Local<v8::Object>::New(pIsolate, *pStaticObjects->at(i)); |
+ delete pStaticObjects->at(i); |
+ pStaticObjects->at(i) = nullptr; |
} |
if (!pObj.IsEmpty()) { |
@@ -357,6 +359,9 @@ void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
delete pObjDef; |
} |
+ if (pIsolate == g_isolate && --g_isolate_ref_count > 0) |
+ return; |
+ |
pIsolate->SetData(g_embedderDataSlot, nullptr); |
delete pData; |
} |