Simplify memory management for per isolate data
Use smart pointers for FXJS_PerIsolateData owned member variables. Also
move creation and deletion of dynamic object map into
FXJS_PerIsolateData's constructor and destructor. Overall, the
interfaces and memory management should be simpler.
BUG=pdfium:518
Review-Url: https://codereview.chromium.org/2358343002
diff --git a/fxjs/fxjs_v8.cpp b/fxjs/fxjs_v8.cpp
index ebe38fd..19197b9 100644
--- a/fxjs/fxjs_v8.cpp
+++ b/fxjs/fxjs_v8.cpp
@@ -38,7 +38,7 @@
static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) {
// Note: GetAt() halts if out-of-range even in release builds.
- return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id];
+ return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id].get();
}
CFXJS_ObjDefinition(v8::Isolate* isolate,
@@ -70,7 +70,7 @@
int AssignID() {
FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate);
- pData->m_ObjectDefnArray.push_back(this);
+ pData->m_ObjectDefnArray.emplace_back(this);
return pData->m_ObjectDefnArray.size() - 1;
}
@@ -150,7 +150,7 @@
V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo(
const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {
V8TemplateMap* pMap =
- (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap;
+ (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap.get();
return pMap ? &pMap->m_map : nullptr;
}
@@ -206,7 +206,7 @@
// static
void FXJS_PerIsolateData::SetUp(v8::Isolate* pIsolate) {
if (!pIsolate->GetData(g_embedderDataSlot))
- pIsolate->SetData(g_embedderDataSlot, new FXJS_PerIsolateData());
+ pIsolate->SetData(g_embedderDataSlot, new FXJS_PerIsolateData(pIsolate));
}
// static
@@ -215,7 +215,8 @@
pIsolate->GetData(g_embedderDataSlot));
}
-FXJS_PerIsolateData::FXJS_PerIsolateData() : m_pDynamicObjsMap(nullptr) {}
+FXJS_PerIsolateData::FXJS_PerIsolateData(v8::Isolate* pIsolate)
+ : m_pDynamicObjsMap(new V8TemplateMap(pIsolate)) {}
CFXJS_Engine::CFXJS_Engine() : m_isolate(nullptr) {}
@@ -380,10 +381,6 @@
v8::Context::New(m_isolate, nullptr, GetGlobalObjectTemplate(m_isolate));
v8::Context::Scope context_scope(v8Context);
- FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate);
- if (!pData)
- return;
- pData->CreateDynamicObjsMap(m_isolate);
v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, this);
int maxID = CFXJS_ObjDefinition::MaxID(m_isolate);
@@ -455,12 +452,8 @@
if (m_isolate == g_isolate && --g_isolate_ref_count > 0)
return;
- pData->ReleaseDynamicObjsMap();
- for (int i = 0; i < maxID; ++i)
- delete CFXJS_ObjDefinition::ForID(m_isolate, i);
-
- m_isolate->SetData(g_embedderDataSlot, nullptr);
delete pData;
+ m_isolate->SetData(g_embedderDataSlot, nullptr);
}
int CFXJS_Engine::Execute(const CFX_WideString& script, FXJSErr* pError) {
diff --git a/fxjs/include/fxjs_v8.h b/fxjs/include/fxjs_v8.h
index 8b5fc83..c87d8a5 100644
--- a/fxjs/include/fxjs_v8.h
+++ b/fxjs/include/fxjs_v8.h
@@ -100,23 +100,14 @@
static void SetUp(v8::Isolate* pIsolate);
static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate);
- void CreateDynamicObjsMap(v8::Isolate* pIsolate) {
- if (!m_pDynamicObjsMap)
- m_pDynamicObjsMap = new V8TemplateMap(pIsolate);
- }
- void ReleaseDynamicObjsMap() {
- delete m_pDynamicObjsMap;
- m_pDynamicObjsMap = nullptr;
- }
-
- std::vector<CFXJS_ObjDefinition*> m_ObjectDefnArray;
+ std::vector<std::unique_ptr<CFXJS_ObjDefinition>> m_ObjectDefnArray;
#ifdef PDF_ENABLE_XFA
std::unique_ptr<CFXJSE_RuntimeData> m_pFXJSERuntimeData;
#endif // PDF_ENABLE_XFA
- V8TemplateMap* m_pDynamicObjsMap;
+ std::unique_ptr<V8TemplateMap> m_pDynamicObjsMap;
protected:
- FXJS_PerIsolateData();
+ explicit FXJS_PerIsolateData(v8::Isolate* pIsolate);
};
class FXJS_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {