From ac4df34ecd8a306e5cf71fd6696fae4362f3e515 Mon Sep 17 00:00:00 2001 From: Robo Date: Thu, 29 Oct 2015 16:27:30 +0530 Subject: [PATCH] create binding to idweakmap --- atom/browser/lib/rpc-server.coffee | 11 ++-- atom/common/api/atom_api_v8_util.cc | 7 --- atom/common/api/atom_api_weak_map.cc | 79 ++++++++++++++++++++++++++++ atom/common/api/atom_api_weak_map.h | 46 ++++++++++++++++ atom/common/id_weak_map.cc | 21 -------- atom/common/id_weak_map.h | 8 +-- atom/common/node_bindings.cc | 1 + filenames.gypi | 2 + 8 files changed, 135 insertions(+), 40 deletions(-) create mode 100644 atom/common/api/atom_api_weak_map.cc create mode 100644 atom/common/api/atom_api_weak_map.h diff --git a/atom/browser/lib/rpc-server.coffee b/atom/browser/lib/rpc-server.coffee index 13c8ceb16e03..3a4f896da5ec 100644 --- a/atom/browser/lib/rpc-server.coffee +++ b/atom/browser/lib/rpc-server.coffee @@ -2,9 +2,10 @@ ipc = require 'ipc' path = require 'path' objectsRegistry = require './objects-registry.js' v8Util = process.atomBinding 'v8_util' +WeakMap = process.atomBinding('weak_map').WeakMap -# weak refereence to callback with their registry ID. -rendererCallbacks = v8Util.createWeakMap() +# Weak reference to callback with their registry ID. +rendererCallbacks = new WeakMap() # Convert a real value into meta data. valueToMeta = (sender, value, optimizeSimpleObject=false) -> @@ -73,13 +74,13 @@ unwrapArgs = (sender, args) -> returnValue = metaToValue meta.value -> returnValue when 'function' + if rendererCallbacks.has(meta.id) + return rendererCallbacks.get(meta.id) + rendererReleased = false objectsRegistry.once "clear-#{sender.getId()}", -> rendererReleased = true - if rendererCallbacks.has(meta.id) - return rendererCallbacks.get(meta.id) - ret = -> if rendererReleased throw new Error("Attempting to call a function in a renderer window diff --git a/atom/common/api/atom_api_v8_util.cc b/atom/common/api/atom_api_v8_util.cc index 4a321f84d80e..1c8c8c9f7e09 100644 --- a/atom/common/api/atom_api_v8_util.cc +++ b/atom/common/api/atom_api_v8_util.cc @@ -5,7 +5,6 @@ #include "atom/common/api/object_life_monitor.h" #include "atom/common/id_weak_map.h" #include "atom/common/node_includes.h" -#include "native_mate/handle.h" #include "native_mate/dictionary.h" #include "v8/include/v8-profiler.h" @@ -48,11 +47,6 @@ void TakeHeapSnapshot(v8::Isolate* isolate) { isolate->GetHeapProfiler()->TakeHeapSnapshot(); } -mate::Handle CreateWeakMap(v8::Isolate* isolate) { - auto handle = mate::CreateHandle(isolate, new atom::IDWeakMap); - return handle; -} - void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { mate::Dictionary dict(context->GetIsolate(), exports); @@ -63,7 +57,6 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("getObjectHash", &GetObjectHash); dict.SetMethod("setDestructor", &SetDestructor); dict.SetMethod("takeHeapSnapshot", &TakeHeapSnapshot); - dict.SetMethod("createWeakMap", &CreateWeakMap); } } // namespace diff --git a/atom/common/api/atom_api_weak_map.cc b/atom/common/api/atom_api_weak_map.cc new file mode 100644 index 000000000000..6cc75c43c927 --- /dev/null +++ b/atom/common/api/atom_api_weak_map.cc @@ -0,0 +1,79 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/common/api/atom_api_weak_map.h" + +#include "atom/common/node_includes.h" +#include "native_mate/constructor.h" +#include "native_mate/dictionary.h" + +namespace atom { + +namespace api { + +WeakMap::WeakMap() { + id_weak_map_.reset(new atom::IDWeakMap); +} + +WeakMap::~WeakMap() { +} + +void WeakMap::Set(v8::Isolate* isolate, + int32_t id, + v8::Local object) { + id_weak_map_->Set(isolate, id, object); +} + +v8::Local WeakMap::Get(v8::Isolate* isolate, int32_t id) { + return id_weak_map_->Get(isolate, id).ToLocalChecked(); +} + +bool WeakMap::Has(int32_t id) { + return id_weak_map_->Has(id); +} + +void WeakMap::Remove(int32_t id) { + id_weak_map_->Remove(id); +} + +bool WeakMap::IsDestroyed() const { + return !id_weak_map_; +} + +// static +void WeakMap::BuildPrototype(v8::Isolate* isolate, + v8::Local prototype) { + mate::ObjectTemplateBuilder(isolate, prototype) + .SetMethod("set", &WeakMap::Set) + .SetMethod("get", &WeakMap::Get) + .SetMethod("has", &WeakMap::Has) + .SetMethod("remove", &WeakMap::Remove); +} + +// static +mate::Wrappable* WeakMap::Create(v8::Isolate* isolate) { + return new WeakMap; +} + +} // namespace api + +} // namespace atom + +namespace { + +using atom::api::WeakMap; + +void Initialize(v8::Local exports, v8::Local unused, + v8::Local context, void* priv) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local constructor = mate::CreateConstructor( + isolate, "WeakMap", base::Bind(&WeakMap::Create)); + mate::Dictionary weak_map(isolate, constructor); + mate::Dictionary dict(isolate, exports); + dict.Set("WeakMap", weak_map); +} + +} // namespace + +NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_common_weak_map, Initialize) diff --git a/atom/common/api/atom_api_weak_map.h b/atom/common/api/atom_api_weak_map.h new file mode 100644 index 000000000000..7c747e1a384e --- /dev/null +++ b/atom/common/api/atom_api_weak_map.h @@ -0,0 +1,46 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_COMMON_API_ATOM_API_WEAK_MAP_H_ +#define ATOM_COMMON_API_ATOM_API_WEAK_MAP_H_ + +#include "atom/common/id_weak_map.h" +#include "native_mate/object_template_builder.h" +#include "native_mate/handle.h" + +namespace atom { + +namespace api { + +class WeakMap : public mate::Wrappable { + public: + static mate::Wrappable* Create(v8::Isolate* isolate); + + static void BuildPrototype(v8::Isolate* isolate, + v8::Local prototype); + + protected: + WeakMap(); + virtual ~WeakMap(); + + // mate::Wrappable: + bool IsDestroyed() const override; + + private: + // Api for IDWeakMap. + void Set(v8::Isolate* isolate, int32_t id, v8::Local object); + v8::Local Get(v8::Isolate* isolate, int32_t id); + bool Has(int32_t id); + void Remove(int32_t id); + + scoped_ptr id_weak_map_; + + DISALLOW_COPY_AND_ASSIGN(WeakMap); +}; + +} // namespace api + +} // namespace atom + +#endif // ATOM_COMMON_API_ATOM_API_WEAK_MAP_H_ diff --git a/atom/common/id_weak_map.cc b/atom/common/id_weak_map.cc index 3d7e1513597c..7fda009e0ee1 100644 --- a/atom/common/id_weak_map.cc +++ b/atom/common/id_weak_map.cc @@ -8,18 +8,6 @@ #include "native_mate/converter.h" -namespace mate { - -template -struct Converter> { - static v8::Local ToV8(v8::Isolate* isolate, - v8::MaybeLocal val) { - return ConvertToV8(isolate, val.ToLocalChecked()); - } -}; - -} // namespace mate - namespace atom { namespace { @@ -106,13 +94,4 @@ int32_t IDWeakMap::GetNextID() { return ++next_id_; } -mate::ObjectTemplateBuilder IDWeakMap::GetObjectTemplateBuilder( - v8::Isolate* isolate) { - return mate::ObjectTemplateBuilder(isolate) - .SetMethod("set", &IDWeakMap::Set) - .SetMethod("get", &IDWeakMap::Get) - .SetMethod("has", &IDWeakMap::Has) - .SetMethod("remove", &IDWeakMap::Remove); -} - } // namespace atom diff --git a/atom/common/id_weak_map.h b/atom/common/id_weak_map.h index c291f76a430e..688e85cd0cce 100644 --- a/atom/common/id_weak_map.h +++ b/atom/common/id_weak_map.h @@ -9,14 +9,12 @@ #include #include "base/memory/linked_ptr.h" -#include "native_mate/object_template_builder.h" -#include "native_mate/wrappable.h" #include "v8/include/v8.h" namespace atom { // Like ES6's WeakMap, but the key is Integer and the value is Weak Pointer. -class IDWeakMap : public mate::Wrappable { +class IDWeakMap { public: IDWeakMap(); ~IDWeakMap(); @@ -45,10 +43,6 @@ class IDWeakMap : public mate::Wrappable { // Clears the weak map. void Clear(); - protected: - mate::ObjectTemplateBuilder GetObjectTemplateBuilder( - v8::Isolate* isolate) override; - private: // Returns next available ID. int32_t GetNextID(); diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index 2da68854ad14..b6fcdb82f819 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -52,6 +52,7 @@ REFERENCE_MODULE(atom_common_native_image); REFERENCE_MODULE(atom_common_screen); REFERENCE_MODULE(atom_common_shell); REFERENCE_MODULE(atom_common_v8_util); +REFERENCE_MODULE(atom_common_weak_map); REFERENCE_MODULE(atom_renderer_ipc); REFERENCE_MODULE(atom_renderer_web_frame); #undef REFERENCE_MODULE diff --git a/filenames.gypi b/filenames.gypi index f66485edd19d..0f5b794a0361 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -260,6 +260,8 @@ 'atom/common/api/atom_api_native_image_mac.mm', 'atom/common/api/atom_api_shell.cc', 'atom/common/api/atom_api_v8_util.cc', + 'atom/common/api/atom_api_weak_map.cc', + 'atom/common/api/atom_api_weak_map.h', 'atom/common/api/atom_bindings.cc', 'atom/common/api/atom_bindings.h', 'atom/common/api/event_emitter_caller.cc',