diff options
author | Tom Sepez <tsepez@chromium.org> | 2015-11-10 15:19:17 -0800 |
---|---|---|
committer | Tom Sepez <tsepez@chromium.org> | 2015-11-10 15:19:17 -0800 |
commit | 4237aedc2efb0e7a8479148592af349addf86a89 (patch) | |
tree | 93bc2c19bfa39d9658836f364d8a22a4305bb736 /fpdfsdk/src/jsapi/fxjs_v8.cpp | |
parent | 4f4603cc1b498bca3b1619006137e50ce80088c1 (diff) | |
download | pdfium-4237aedc2efb0e7a8479148592af349addf86a89.tar.xz |
Merge to XFA: Keep "static" objects per-context rather than per isolate.
Original Review URL: https://codereview.chromium.org/1424933013 .
(cherry picked from commit 7d4c74d1b96d82681d49519c129262a1568e87d4)
TBR=jochen@chromium.org
Review URL: https://codereview.chromium.org/1407063012 .
Diffstat (limited to 'fpdfsdk/src/jsapi/fxjs_v8.cpp')
-rw-r--r-- | fpdfsdk/src/jsapi/fxjs_v8.cpp | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp index 3413d72bb3..f099289666 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; } |