From a0395e526d75fbb642e47c3cd8858647627794e0 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Fri, 9 Feb 2018 19:28:39 +0000 Subject: Tidy V8TemplateMap. Change-Id: Idcba60bb36c0d47c0d2acb21ddfa3b3b46cdfe49 Reviewed-on: https://pdfium-review.googlesource.com/26170 Commit-Queue: Tom Sepez Reviewed-by: dsinclair --- fxjs/cfxjs_engine.cpp | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/fxjs/cfxjs_engine.cpp b/fxjs/cfxjs_engine.cpp index c773a16324..dd1f21d84f 100644 --- a/fxjs/cfxjs_engine.cpp +++ b/fxjs/cfxjs_engine.cpp @@ -28,8 +28,11 @@ static wchar_t kPerObjectDataTag[] = L"CFXJS_PerObjectData"; // Global weak map to save dynamic objects. class V8TemplateMapTraits : public v8::StdMapTraits { public: - typedef v8::GlobalValueMap MapType; - typedef void WeakCallbackDataType; + using MapType = v8::GlobalValueMap; + using WeakCallbackDataType = void; + + static const v8::PersistentContainerCallbackType kCallbackType = + v8::kWeakWithInternalFields; static WeakCallbackDataType* WeakCallbackParameter(MapType* map, void* key, v8::Local value) { @@ -37,17 +40,16 @@ class V8TemplateMapTraits : public v8::StdMapTraits { } static MapType* MapFromWeakCallbackInfo( const v8::WeakCallbackInfo&); - static void* KeyFromWeakCallbackInfo( const v8::WeakCallbackInfo& data) { return data.GetParameter(); } - static const v8::PersistentContainerCallbackType kCallbackType = - v8::kWeakWithInternalFields; - static void DisposeWeak( - const v8::WeakCallbackInfo& data) {} static void OnWeakCallback( const v8::WeakCallbackInfo& data) {} + static void DisposeWeak( + const v8::WeakCallbackInfo& data) { + // TODO(tsepez): this is expected be called during GC. + } static void Dispose(v8::Isolate* isolate, v8::Global value, void* key); @@ -56,12 +58,19 @@ class V8TemplateMapTraits : public v8::StdMapTraits { class V8TemplateMap { public: - typedef v8::GlobalValueMap MapType; + using MapType = v8::GlobalValueMap; + + explicit V8TemplateMap(v8::Isolate* isolate) : m_map(isolate) {} + ~V8TemplateMap() = default; - explicit V8TemplateMap(v8::Isolate* isolate); - ~V8TemplateMap(); + void SetAndMakeWeak(void* key, v8::Local handle) { + ASSERT(!m_map.Contains(key)); - void set(void* key, v8::Local handle); + // Inserting an object into a GlobalValueMap with the appropriate traits + // has the side-effect of making the object weak deep in the guts of V8, + // and arranges for it to be cleaned up by the methods in the traits. + m_map.Set(key, handle); + } friend class V8TemplateMapTraits; @@ -253,15 +262,6 @@ size_t FXJS_GlobalIsolateRefCount() { return g_isolate_ref_count; } -V8TemplateMap::V8TemplateMap(v8::Isolate* isolate) : m_map(isolate) {} - -V8TemplateMap::~V8TemplateMap() {} - -void V8TemplateMap::set(void* key, v8::Local handle) { - ASSERT(!m_map.Contains(key)); - m_map.Set(key, handle); -} - FXJS_PerIsolateData::~FXJS_PerIsolateData() {} // static @@ -536,10 +536,11 @@ v8::Local CFXJS_Engine::NewFXJSBoundObject(int nObjDefnID, if (pObjDef->m_pConstructor) pObjDef->m_pConstructor(this, obj); - if (!bStatic && FXJS_PerIsolateData::Get(GetIsolate())->m_pDynamicObjsMap) - FXJS_PerIsolateData::Get(GetIsolate()) - ->m_pDynamicObjsMap->set(pObjData, obj); - + if (!bStatic) { + auto* pIsolateData = FXJS_PerIsolateData::Get(GetIsolate()); + if (pIsolateData->m_pDynamicObjsMap) + pIsolateData->m_pDynamicObjsMap->SetAndMakeWeak(pObjData, obj); + } return obj; } -- cgit v1.2.3