From 7cd09874c666f0ce64b1d7776de74f55ff3e53ab Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 28 Jun 2009 12:40:20 +0200 Subject: [PATCH] Add Promise class --- src/events.cc | 31 +++++++++++++++++++++++++++++++ src/events.h | 28 ++++++++++++++++++++++++++-- src/events.js | 13 ++++++++++++- src/node.cc | 1 + 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/events.cc b/src/events.cc index 312423d..9549b29 100644 --- a/src/events.cc +++ b/src/events.cc @@ -55,3 +55,34 @@ EventEmitter::Emit (const char *type, int argc, Handle argv[]) return true; } + +Persistent Promise::constructor_template; + +void +Promise::Initialize (v8::Handle target) +{ + HandleScope scope; + + Local t = FunctionTemplate::New(); + constructor_template = Persistent::New(t); + constructor_template->Inherit(EventEmitter::constructor_template); + + // All prototype methods are defined in events.js + + target->Set(String::NewSymbol("Promise"), + constructor_template->GetFunction()); +} + +Promise* +Promise::Create (void) +{ + HandleScope scope; + + Local handle = + Promise::constructor_template->GetFunction()->NewInstance(); + Promise *promise = new Promise(handle); + ObjectWrap::InformV8ofAllocation(promise); + + return promise; +} + diff --git a/src/events.h b/src/events.h index 1fe47cb..38e0cb6 100644 --- a/src/events.h +++ b/src/events.h @@ -7,14 +7,38 @@ namespace node { class EventEmitter : public ObjectWrap { -public: + public: static void Initialize (v8::Handle target); static v8::Persistent constructor_template; + virtual size_t size (void) { return sizeof(EventEmitter); }; bool Emit (const char *type, int argc, v8::Handle argv[]); EventEmitter (v8::Handle handle) - : ObjectWrap(handle) { }; + : ObjectWrap(handle) { } +}; + +class Promise : public EventEmitter { + public: + static void Initialize (v8::Handle target); + static v8::Persistent constructor_template; + virtual size_t size (void) { return sizeof(Promise); }; + + bool EmitSuccess (int argc, v8::Handle argv[]) + { + return Emit("Success", argc, argv); + } + + bool EmitError (int argc, v8::Handle argv[]) + { + return Emit("Error", argc, argv); + } + + static Promise* Create (void); + + protected: + + Promise (v8::Handle handle) : EventEmitter(handle) { } }; } // namespace node diff --git a/src/events.js b/src/events.js index 3489d59..3310b06 100644 --- a/src/events.js +++ b/src/events.js @@ -30,4 +30,15 @@ emitter.emit = function (type, args) { } }; -})(); // end annonymous namespace +// node.Promise is defined in src/events.cc +var promise = node.Promise.prototype; + +promise.addCallback = function (listener) { + this.addListener("Success", listener); +}; + +promise.addErrback = function (listener) { + this.addListener("Error", listener); +}; + +})(); // end anonymous namespace diff --git a/src/node.cc b/src/node.cc index 405a80e..acfab87 100644 --- a/src/node.cc +++ b/src/node.cc @@ -313,6 +313,7 @@ Load (int argc, char *argv[]) NODE_SET_METHOD(node_obj, "reallyExit", node_exit); EventEmitter::Initialize(node_obj); + Promise::Initialize(node_obj); Timer::Initialize(node_obj); Process::Initialize(node_obj); -- 2.7.4