Browse Source

create binding to idweakmap

Robo 9 years ago
parent
commit
ac4df34ecd

+ 6 - 5
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

+ 0 - 7
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<atom::IDWeakMap> CreateWeakMap(v8::Isolate* isolate) {
-  auto handle = mate::CreateHandle(isolate, new atom::IDWeakMap);
-  return handle;
-}
-
 void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
                 v8::Local<v8::Context> context, void* priv) {
   mate::Dictionary dict(context->GetIsolate(), exports);
@@ -63,7 +57,6 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
   dict.SetMethod("getObjectHash", &GetObjectHash);
   dict.SetMethod("setDestructor", &SetDestructor);
   dict.SetMethod("takeHeapSnapshot", &TakeHeapSnapshot);
-  dict.SetMethod("createWeakMap", &CreateWeakMap);
 }
 
 }  // namespace

+ 79 - 0
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<v8::Object> object) {
+  id_weak_map_->Set(isolate, id, object);
+}
+
+v8::Local<v8::Object> 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<v8::ObjectTemplate> 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<v8::Object> exports, v8::Local<v8::Value> unused,
+                v8::Local<v8::Context> context, void* priv) {
+  v8::Isolate* isolate = context->GetIsolate();
+  v8::Local<v8::Function> constructor = mate::CreateConstructor<WeakMap>(
+      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)

+ 46 - 0
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<v8::ObjectTemplate> 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<v8::Object> object);
+  v8::Local<v8::Object> Get(v8::Isolate* isolate, int32_t id);
+  bool Has(int32_t id);
+  void Remove(int32_t id);
+
+  scoped_ptr<IDWeakMap> id_weak_map_;
+
+  DISALLOW_COPY_AND_ASSIGN(WeakMap);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_COMMON_API_ATOM_API_WEAK_MAP_H_

+ 0 - 21
atom/common/id_weak_map.cc

@@ -8,18 +8,6 @@
 
 #include "native_mate/converter.h"
 
-namespace mate {
-
-template<typename T>
-struct Converter<v8::MaybeLocal<T>> {
-  static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
-                                   v8::MaybeLocal<T> 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

+ 1 - 7
atom/common/id_weak_map.h

@@ -9,14 +9,12 @@
 #include <vector>
 
 #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();

+ 1 - 0
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

+ 2 - 0
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',