emitter wip

This commit is contained in:
raub 2018-03-04 19:32:25 +03:00
parent fa989dda66
commit 268b188c59
4 changed files with 43 additions and 29 deletions

View File

@ -4,5 +4,7 @@
#include <addon-tools.hpp> #include <addon-tools.hpp>
#define DES_CHECK \
if (_isDestroyed) return;
#endif /* _COMMON_HPP_ */ #endif /* _COMMON_HPP_ */

View File

@ -7,11 +7,11 @@ using namespace v8;
using namespace node; using namespace node;
using namespace std; using namespace std;
#define THIS_EXAMPLE \ #define THIS_EXAMPLE \
Example *example = ObjectWrap::Unwrap<Example>(info.This()); Example *example = ObjectWrap::Unwrap<Example>(info.This());
#define THIS_CHECK \ #define THIS_CHECK \
if (body->_isDestroyed) return; if (example->_isDestroyed) return;
Nan::Persistent<v8::Function> Example::_constructor; Nan::Persistent<v8::Function> Example::_constructor;
@ -60,14 +60,14 @@ Example::Example() {
} }
Body::~Body() { Example::~Example() {
_destroy(); _destroy();
} }
void Body::_destroy() { DES_CHECK; void Example::_destroy() { DES_CHECK;
_isDestroyed = true; _isDestroyed = true;
@ -76,7 +76,7 @@ void Body::_destroy() { DES_CHECK;
} }
NAN_METHOD(Body::destroy) { THIS_BODY; THIS_CHECK; NAN_METHOD(Example::destroy) { THIS_EXAMPLE; THIS_CHECK;
example->_destroy(); example->_destroy();

View File

@ -25,6 +25,11 @@ protected:
static NAN_METHOD(destroy); static NAN_METHOD(destroy);
private:
void _destroy();
private: private:
static Nan::Persistent<v8::Function> _constructor; static Nan::Persistent<v8::Function> _constructor;

View File

@ -17,7 +17,7 @@ class EventEmitter : public Nan::ObjectWrap {
typedef Nan::CopyablePersistentTraits<v8::Function>::CopyablePersistent FN_TYPE; typedef Nan::CopyablePersistentTraits<v8::Function>::CopyablePersistent FN_TYPE;
typedef std::deque<FN_TYPE> VEC_TYPE; typedef std::deque<FN_TYPE> VEC_TYPE;
typedef std::map<std::string, VEC_TYPE> MAP_TYPE; typedef std::map<std::string, VEC_TYPE> MAP_TYPE;
typedef std::map<FN_TYPE, FN_TYPE> FNMAP_TYPE; typedef std::map<int, FN_TYPE> FNMAP_TYPE;
typedef VEC_TYPE::iterator IT_TYPE; typedef VEC_TYPE::iterator IT_TYPE;
typedef MAP_TYPE::iterator MAP_IT_TYPE; typedef MAP_TYPE::iterator MAP_IT_TYPE;
@ -25,6 +25,7 @@ public:
EventEmitter () { EventEmitter () {
_maxListeners = _defaultMaxListeners; _maxListeners = _defaultMaxListeners;
_freeId = 0;
} }
~EventEmitter () {} ~EventEmitter () {}
@ -87,12 +88,12 @@ public:
// Deprecated method // Deprecated method
static NAN_METHOD(jsStaticListenerCount) { static NAN_METHOD(jsStaticListenerCount) {
EventEmitter *emitter = ObjectWrap::Unwrap<EventEmitter>(info[0]); // EventEmitter *emitter = ObjectWrap::Unwrap<EventEmitter>(info[0]);
REQ_UTF8_ARG(1, name); // REQ_UTF8_ARG(1, name);
const VEC_TYPE &list = emitter->_listeners[*name]; // const VEC_TYPE &list = emitter->_listeners[*name];
RET_VALUE(JS_INT(list.size())); // RET_VALUE(JS_NUM(list.size()));
} }
@ -166,7 +167,7 @@ public:
const VEC_TYPE &list = emitter->_listeners[*name]; const VEC_TYPE &list = emitter->_listeners[*name];
RET_VALUE(JS_INT(list.size())); RET_VALUE(JS_INT(static_cast<int>(list.size())));
} }
@ -245,7 +246,10 @@ public:
emitter->_listeners[name].push_back(cb); emitter->_listeners[name].push_back(cb);
emitter->_raw[name].push_back(raw); emitter->_raw[name].push_back(raw);
} }
emitter->_wrapped[raw] = cb;
int nextId = _freeId++;
emitter->_wrappedIds[nextId] = cb;
emitter->_rawIds[nextId] = raw;
} }
@ -292,11 +296,11 @@ public:
static NAN_METHOD(jsRemoveAllListeners) { THIS_EMITTER; static NAN_METHOD(jsRemoveAllListeners) { THIS_EMITTER;
if (info->Length > 0 && info[0]->IsString()) { if (info.Length() > 0 && info[0]->IsString()) {
_listeners->clear(); emitter->_listeners.clear();
_raw->clear(); emitter->_raw.clear();
_wrapped->clear(); emitter->_wrapped.clear();
return; return;
@ -313,12 +317,12 @@ public:
for (IT_TYPE it = list.begin(); it != list.end(); ++it) { for (IT_TYPE it = list.begin(); it != list.end(); ++it) {
emitter->_wrapped.erase(*it) emitter->_wrapped.erase(*it);
} }
emitter->_listeners[*name].clear(); emitter->_listeners[name].clear();
emitter->_raw[*name].clear(); emitter->_raw[name].clear();
} }
@ -328,8 +332,8 @@ public:
REQ_UTF8_ARG(0, n); REQ_UTF8_ARG(0, n);
REQ_FUN_ARG(1, raw); REQ_FUN_ARG(1, raw);
Nan::Persistent<v8::Function> persistentCb; Nan::Persistent<v8::Function> persistentRaw;
persistentCb.Reset(raw); persistentRaw.Reset(raw);
std::string name = std::string(*n); std::string name = std::string(*n);
@ -342,7 +346,7 @@ public:
for (IT_TYPE it = rawList.begin(); it != rawList.end(); ++it) { for (IT_TYPE it = rawList.begin(); it != rawList.end(); ++it) {
if (*it === persistentCb) { if (*it == persistentRaw) {
rawList.erase(it); rawList.erase(it);
break; break;
} }
@ -352,11 +356,11 @@ public:
VEC_TYPE &wrapList = emitter->_listeners[name]; VEC_TYPE &wrapList = emitter->_listeners[name];
if (emitter->_wrapped.count(persistentCb) == 0) { if (emitter->_wrapped.count(persistentRaw) == 0) {
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) { for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
if (*it === persistentCb) { if (*it == persistentRaw) {
wrapList.erase(it); wrapList.erase(it);
break; break;
} }
@ -368,18 +372,18 @@ public:
} }
const FN_TYPE &wrapped = _wrapped[persistentCb]; const FN_TYPE &wrapped = emitter->_wrapped[persistentRaw];
for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) { for (IT_TYPE it = wrapList.begin(); it != wrapList.end(); ++it) {
if (*it === wrapped) { if (*it == wrapped) {
wrapList.erase(it); wrapList.erase(it);
break; break;
} }
} }
emitter->_wrapped.erase(persistentCb); emitter->_wrapped.erase(persistentRaw);
} }
@ -399,7 +403,7 @@ public:
VEC_TYPE &list = emitter->_raw[*name]; VEC_TYPE &list = emitter->_raw[*name];
Local<Array> jsListeners = Nan::New<Array>(list.size()); v8::Local<v8::Array> jsListeners = Nan::New<v8::Array>(list.size());
if (list.empty()) { if (list.empty()) {
RET_VALUE(jsListeners); RET_VALUE(jsListeners);
@ -429,7 +433,10 @@ private:
MAP_TYPE _listeners; MAP_TYPE _listeners;
MAP_TYPE _raw; MAP_TYPE _raw;
FNMAP_TYPE _wrapped;
int _freeId;
FNMAP_TYPE _wrappedIds;
FNMAP_TYPE _rawIds;
}; };