@@ -87,16 +87,43 @@ class JSTrigger {
87
87
return esa;
88
88
}
89
89
90
- inline int32_t putFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func )
90
+ inline result_t emitNewOrRemoveEvent (v8::Local<v8::Function> func, exlib::string ev, exlib::string type )
91
91
{
92
- int32_t len = esa->Length ();
92
+ std::vector<v8::Local<v8::Value>> _args;
93
+ _args.resize (2 );
94
+ bool b;
95
+
96
+ _args[0 ] = NewFromUtf8 (ev);
97
+
98
+ v8::Local<v8::Value> _func = func->Get (NewFromUtf8 (" _func" ));
99
+
100
+ if (_func->IsUndefined () || _func->IsNull ())
101
+ _args[1 ] = func;
102
+ else
103
+ _args[1 ] = _func;
104
+
105
+ return _emit (type, _args.data (), (int32_t )_args.size (), b);
106
+ }
107
+
108
+ inline int32_t putFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func, exlib::string ev)
109
+ {
110
+ result_t hr;
111
+ hr = emitNewOrRemoveEvent (func, ev, " newListener" );
112
+ if (hr < 0 )
113
+ return hr;
93
114
115
+ int32_t len = esa->Length ();
94
116
esa->Set (len, func);
95
- return 1 ;
117
+ return 0 ;
96
118
}
97
119
98
- inline int32_t prependPutFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func)
120
+ inline int32_t prependPutFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func, exlib::string ev )
99
121
{
122
+ result_t hr;
123
+ hr = emitNewOrRemoveEvent (func, ev, " newListener" );
124
+ if (hr < 0 )
125
+ return hr;
126
+
100
127
int32_t len = esa->Length ();
101
128
int32_t i;
102
129
@@ -105,7 +132,7 @@ class JSTrigger {
105
132
esa->Set (i, v);
106
133
}
107
134
esa->Set (0 , func);
108
- return 1 ;
135
+ return 0 ;
109
136
}
110
137
111
138
inline void spliceOne (v8::Local<v8::Array> esa, int32_t index)
@@ -119,7 +146,7 @@ class JSTrigger {
119
146
v8::Integer::New (isolate, len - 1 ));
120
147
}
121
148
122
- inline int32_t removeFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func)
149
+ inline int32_t removeFunction (v8::Local<v8::Array> esa, v8::Local<v8::Function> func, exlib::string ev )
123
150
{
124
151
if (esa.IsEmpty ())
125
152
return 0 ;
@@ -131,7 +158,11 @@ class JSTrigger {
131
158
v8::Local<v8::Value> v = esa->Get (i);
132
159
if (v->Equals (func)) {
133
160
spliceOne (esa, i);
134
- return 1 ;
161
+ result_t hr;
162
+ hr = emitNewOrRemoveEvent (func, ev, " removeListener" );
163
+ if (hr < 0 )
164
+ return hr;
165
+ return 0 ;
135
166
}
136
167
}
137
168
@@ -166,7 +197,7 @@ class JSTrigger {
166
197
167
198
result_t on (exlib::string ev, v8::Local<v8::Function> func, v8::Local<v8::Object>& retVal)
168
199
{
169
- putFunction (GetHiddenList (ev, true ), func);
200
+ putFunction (GetHiddenList (ev, true ), func, ev );
170
201
retVal = o;
171
202
return 0 ;
172
203
}
@@ -178,7 +209,7 @@ class JSTrigger {
178
209
179
210
result_t prependListener (exlib::string ev, v8::Local<v8::Function> func, v8::Local<v8::Object>& retVal)
180
211
{
181
- prependPutFunction (GetHiddenList (ev, true ), func);
212
+ prependPutFunction (GetHiddenList (ev, true ), func, ev );
182
213
retVal = o;
183
214
return 0 ;
184
215
}
@@ -215,13 +246,14 @@ class JSTrigger {
215
246
216
247
result_t once (exlib::string ev, v8::Local<v8::Function> func, v8::Local<v8::Object>& retVal)
217
248
{
218
- Isolate* isolate = Isolate::current ();
219
- v8::Local<v8::Object> _data = v8::Object::New (isolate-> m_isolate );
220
- _data->Set (isolate-> NewFromUtf8 (" _func" ), func);
221
- _data->Set (isolate-> NewFromUtf8 (" _ev" ), isolate-> NewFromUtf8 (ev));
249
+ Isolate* _isolate = Isolate::current ();
250
+ v8::Local<v8::Object> _data = v8::Object::New (isolate);
251
+ _data->Set (NewFromUtf8 (" _func" ), func);
252
+ _data->Set (NewFromUtf8 (" _ev" ), NewFromUtf8 (ev));
222
253
223
- v8::Local<v8::Function> wrap = isolate->NewFunction (" _onceWrap" , _onceWrap, _data);
224
- putFunction (GetHiddenList (ev, true ), wrap);
254
+ v8::Local<v8::Function> wrap = _isolate->NewFunction (" _onceWrap" , _onceWrap, _data);
255
+ wrap->Set (NewFromUtf8 (" _func" ), func);
256
+ putFunction (GetHiddenList (ev, true ), wrap, ev);
225
257
226
258
retVal = o;
227
259
return 0 ;
@@ -234,16 +266,16 @@ class JSTrigger {
234
266
235
267
result_t prependOnceListener (exlib::string ev, v8::Local<v8::Function> func, v8::Local<v8::Object>& retVal)
236
268
{
237
- Isolate* isolate = Isolate::current ();
238
- v8::Local<v8::Object> _data = v8::Object::New (isolate-> m_isolate );
239
- _data->Set (isolate-> NewFromUtf8 (" _func" ), func);
240
- _data->Set (isolate-> NewFromUtf8 (" _ev" ), isolate-> NewFromUtf8 (ev));
269
+ Isolate* _isolate = Isolate::current ();
270
+ v8::Local<v8::Object> _data = v8::Object::New (isolate);
271
+ _data->Set (NewFromUtf8 (" _func" ), func);
272
+ _data->Set (NewFromUtf8 (" _ev" ), NewFromUtf8 (ev));
241
273
242
- v8::Local<v8::Function> wrap = isolate ->NewFunction (" _onceWrap" , _onceWrap, _data);
274
+ v8::Local<v8::Function> wrap = _isolate ->NewFunction (" _onceWrap" , _onceWrap, _data);
243
275
244
- _data->Set (isolate-> NewFromUtf8 (" _wrap" ), wrap);
276
+ _data->Set (NewFromUtf8 (" _wrap" ), wrap);
245
277
246
- prependPutFunction (GetHiddenList (ev, true ), wrap);
278
+ prependPutFunction (GetHiddenList (ev, true ), wrap, ev );
247
279
248
280
retVal = o;
249
281
return 0 ;
@@ -258,7 +290,7 @@ class JSTrigger {
258
290
{
259
291
v8::Local<v8::Array> esa = GetHiddenList (ev);
260
292
261
- removeFunction (esa, func);
293
+ removeFunction (esa, func, ev );
262
294
263
295
int32_t len = esa->Length ();
264
296
@@ -305,6 +337,47 @@ class JSTrigger {
305
337
return 0 ;
306
338
}
307
339
340
+ result_t setMaxListeners (int32_t n)
341
+ {
342
+ if (n < 0 )
343
+ return Runtime::setError (" \" defaultMaxListeners\" must be a positive number" );
344
+
345
+ o->SetPrivate (o->CreationContext (),
346
+ v8::Private::ForApi (isolate, NewFromUtf8 (" _maxListeners" )), v8::Integer::New (isolate, n));
347
+ return 0 ;
348
+ }
349
+
350
+ result_t getMaxListeners (int32_t & retVal)
351
+ {
352
+ Isolate* _isolate = Isolate::current ();
353
+ v8::Local<v8::Value> maxListeners = o->GetPrivate (o->CreationContext (),
354
+ v8::Private::ForApi (isolate, NewFromUtf8 (" _maxListeners" )))
355
+ .ToLocalChecked ();
356
+ if (maxListeners->IsUndefined () || maxListeners->IsNull ()) {
357
+ retVal = _isolate->m_defaultMaxListeners ;
358
+ } else {
359
+ GetArgumentValue (maxListeners, retVal, true );
360
+ }
361
+ return 0 ;
362
+ }
363
+
364
+ static result_t set_defaultMaxListeners (int32_t newVal)
365
+ {
366
+ if (newVal < 0 )
367
+ return Runtime::setError (" \" defaultMaxListeners\" must be a positive number" );
368
+
369
+ Isolate* isolate = Isolate::current ();
370
+ isolate->m_defaultMaxListeners = newVal;
371
+ return 0 ;
372
+ }
373
+
374
+ static result_t get_defaultMaxListeners (int32_t & retVal)
375
+ {
376
+ Isolate* isolate = Isolate::current ();
377
+ retVal = isolate->m_defaultMaxListeners ;
378
+ return 0 ;
379
+ }
380
+
308
381
result_t listeners (exlib::string ev, v8::Local<v8::Array>& retVal)
309
382
{
310
383
int32_t n = 0 ;
@@ -570,6 +643,52 @@ class JSTrigger {
570
643
571
644
static void s_setMaxListeners (const v8::FunctionCallbackInfo<v8::Value>& args)
572
645
{
646
+ JSTrigger t (args);
647
+
648
+ METHOD_ENTER ();
649
+
650
+ METHOD_OVER (1 , 1 );
651
+
652
+ ARG (int32_t , 0 );
653
+
654
+ t.setMaxListeners (v0);
655
+
656
+ METHOD_VOID ();
657
+ }
658
+
659
+ static void s_getMaxListeners (const v8::FunctionCallbackInfo<v8::Value>& args)
660
+ {
661
+ int32_t vr;
662
+ JSTrigger t (args);
663
+
664
+ METHOD_ENTER ();
665
+
666
+ METHOD_OVER (0 , 0 );
667
+
668
+ hr = t.getMaxListeners (vr);
669
+
670
+ METHOD_RETURN ();
671
+ }
672
+
673
+ static void s_get_defaultMaxListeners (v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& args)
674
+ {
675
+ int32_t vr;
676
+
677
+ PROPERTY_ENTER ();
678
+
679
+ hr = get_defaultMaxListeners (vr);
680
+
681
+ METHOD_RETURN ();
682
+ }
683
+
684
+ static void s_set_defaultMaxListeners (v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void >& args)
685
+ {
686
+ PROPERTY_ENTER ();
687
+ PROPERTY_VAL (int32_t );
688
+
689
+ hr = set_defaultMaxListeners (v0);
690
+
691
+ PROPERTY_SET_LEAVE ();
573
692
}
574
693
575
694
static void s_listeners (const v8::FunctionCallbackInfo<v8::Value>& args)
0 commit comments