Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Unified Diff: fpdfsdk/src/jsapi/fxjs_v8.cpp

Issue 1424933013: Keep "static" objects per-context rather than per isolate. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: fpdfsdk/src/jsapi/fxjs_v8.cpp
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 6727569ec4a19d85740d3edec1579884bd8d16ae..a708f9fd6692e10c2ae92a3f91f594387b49875e 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;
@@ -289,14 +290,9 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, 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()
@@ -310,23 +306,27 @@ 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::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);
@@ -340,8 +340,9 @@ 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);
jochen (gone - plz use gerrit) 2015/11/07 16:36:27 set pStaticObjects->at(i) to nullptr?
Tom Sepez 2015/11/09 22:00:42 Done.
}
if (!pObj.IsEmpty()) {
@@ -352,6 +353,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;
}

Powered by Google App Engine
This is Rietveld 408576698