mirror of https://github.com/lukechilds/node.git
Browse Source
Replace node-weak with a small hand-rolled add-on. We can now drop node-weak and nan, reducing the size of the source tree by about 750 kB and the size of the tarball by about 150-300 kB. PR-URL: https://github.com/nodejs/node/pull/11239 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com>v6
Ben Noordhuis
8 years ago
12 changed files with 115 additions and 43 deletions
@ -0,0 +1 @@ |
|||
build/ |
@ -0,0 +1,80 @@ |
|||
#include "node.h" |
|||
#include "uv.h" |
|||
|
|||
#include <assert.h> |
|||
#include <stdlib.h> |
|||
|
|||
#include <vector> |
|||
|
|||
#ifdef NDEBUG |
|||
#define CHECK(x) do { if (!(x)) abort(); } while (false) |
|||
#else |
|||
#define CHECK assert |
|||
#endif |
|||
|
|||
#define CHECK_EQ(a, b) CHECK((a) == (b)) |
|||
|
|||
namespace { |
|||
|
|||
struct Callback { |
|||
inline Callback(v8::Isolate* isolate, |
|||
v8::Local<v8::Object> object, |
|||
v8::Local<v8::Function> function) |
|||
: object(isolate, object), function(isolate, function) {} |
|||
|
|||
v8::Persistent<v8::Object> object; |
|||
v8::Persistent<v8::Function> function; |
|||
}; |
|||
|
|||
static uv_async_t async_handle; |
|||
static std::vector<Callback*> callbacks; |
|||
|
|||
inline void Prime() { |
|||
uv_ref(reinterpret_cast<uv_handle_t*>(&async_handle)); |
|||
CHECK_EQ(0, uv_async_send(&async_handle)); |
|||
} |
|||
|
|||
inline void AsyncCallback(uv_async_t*) { |
|||
auto isolate = v8::Isolate::GetCurrent(); |
|||
v8::HandleScope handle_scope(isolate); |
|||
auto context = isolate->GetCurrentContext(); |
|||
auto global = context->Global(); |
|||
while (!callbacks.empty()) { |
|||
v8::HandleScope handle_scope(isolate); |
|||
auto callback = callbacks.back(); |
|||
callbacks.pop_back(); |
|||
auto function = v8::Local<v8::Function>::New(isolate, callback->function); |
|||
delete callback; |
|||
if (node::MakeCallback(isolate, global, function, 0, nullptr).IsEmpty()) |
|||
return Prime(); // Have exception, flush remainder on next loop tick.
|
|||
} |
|||
uv_unref(reinterpret_cast<uv_handle_t*>(&async_handle)); |
|||
} |
|||
|
|||
inline void OnGC(const v8::FunctionCallbackInfo<v8::Value>& info) { |
|||
CHECK(info[0]->IsObject()); |
|||
CHECK(info[1]->IsFunction()); |
|||
auto object = info[0].As<v8::Object>(); |
|||
auto function = info[1].As<v8::Function>(); |
|||
auto callback = new Callback(info.GetIsolate(), object, function); |
|||
auto on_callback = [] (const v8::WeakCallbackInfo<Callback>& data) { |
|||
auto callback = data.GetParameter(); |
|||
callbacks.push_back(callback); |
|||
callback->object.Reset(); |
|||
Prime(); |
|||
}; |
|||
callback->object.SetWeak(callback, on_callback, |
|||
v8::WeakCallbackType::kParameter); |
|||
} |
|||
|
|||
inline void Initialize(v8::Local<v8::Object> exports, |
|||
v8::Local<v8::Value> module, |
|||
v8::Local<v8::Context> context) { |
|||
NODE_SET_METHOD(module->ToObject(context).ToLocalChecked(), "exports", OnGC); |
|||
CHECK_EQ(0, uv_async_init(uv_default_loop(), &async_handle, AsyncCallback)); |
|||
uv_unref(reinterpret_cast<uv_handle_t*>(&async_handle)); |
|||
} |
|||
|
|||
} // anonymous namespace
|
|||
|
|||
NODE_MODULE_CONTEXT_AWARE(binding, Initialize) |
@ -0,0 +1,9 @@ |
|||
{ |
|||
'targets': [ |
|||
{ |
|||
'target_name': 'binding', |
|||
'defines': [ 'V8_DEPRECATION_WARNINGS=1' ], |
|||
'sources': [ 'binding.cc' ], |
|||
}, |
|||
], |
|||
} |
Loading…
Reference in new issue