11
11
#include < arpa/inet.h> /* inet_ntop */
12
12
#include < netinet/in.h> /* sockaddr_in, sockaddr_in6 */
13
13
14
+ #ifndef RAMP
15
+ # define RAMP (x ) ((x) > 0 ? (x) : 0 )
16
+ #endif
17
+
14
18
using namespace v8 ;
15
19
using namespace node ;
16
20
@@ -22,39 +26,41 @@ EventEmitter::Initialize (v8::Handle<v8::Object> target)
22
26
HandleScope scope;
23
27
24
28
Local<FunctionTemplate> t = FunctionTemplate::New ();
29
+
25
30
constructor_template = Persistent<FunctionTemplate>::New (t);
26
31
27
- // All prototype methods are defined in events.js
32
+ Local<FunctionTemplate> __emit = FunctionTemplate::New (Emit);
33
+ constructor_template->PrototypeTemplate ()->Set (String::NewSymbol (" emit" ), __emit);
34
+
35
+ // All other prototype methods are defined in events.js
28
36
29
37
target->Set (String::NewSymbol (" EventEmitter" ),
30
38
constructor_template->GetFunction ());
31
39
}
32
40
33
- bool
34
- EventEmitter::Emit ( const char *type , int argc, Handle <Value> argv[])
41
+ static bool
42
+ ReallyEmit ( Handle <Object> self, Handle <String> event , int argc, Handle <Value> argv[])
35
43
{
36
44
HandleScope scope;
37
45
38
- Local<Value> emit_v = handle_->Get (String::NewSymbol (" emit" ));
39
- assert (emit_v->IsFunction ());
40
- Local<Function> emit = Local<Function>::Cast (emit_v);
41
-
42
- Local<Value> events_v = handle_->Get (String::NewSymbol (" _events" ));
46
+ Local<Value> events_v = self->Get (String::NewSymbol (" _events" ));
43
47
if (!events_v->IsObject ()) return false ;
44
48
Local<Object> events = events_v->ToObject ();
45
49
46
- Local<Value> listeners_v = events->Get (String::NewSymbol (type) );
50
+ Local<Value> listeners_v = events->Get (event );
47
51
if (!listeners_v->IsArray ()) return false ;
48
52
Local<Array> listeners = Local<Array>::Cast (listeners_v);
49
53
50
- TryCatch try_catch;
54
+ for (unsigned int i = 0 ; i < listeners->Length (); i++) {
55
+ HandleScope scope;
51
56
52
- for (int i = 0 ; i < listeners->Length (); i++) {
53
57
Local<Value> listener_v = listeners->Get (Integer::New (i));
54
58
if (!listener_v->IsFunction ()) continue ;
55
59
Local<Function> listener = Local<Function>::Cast (listener_v);
56
60
57
- listener->Call (handle_, argc, argv);
61
+ TryCatch try_catch;
62
+
63
+ listener->Call (self, argc, argv);
58
64
59
65
if (try_catch.HasCaught ()) {
60
66
FatalException (try_catch);
@@ -65,6 +71,36 @@ EventEmitter::Emit (const char *type, int argc, Handle<Value> argv[])
65
71
return true ;
66
72
}
67
73
74
+ Handle <Value>
75
+ EventEmitter::Emit (const Arguments& args)
76
+ {
77
+ HandleScope scope;
78
+ Local<String> event = args[0 ]->ToString ();
79
+ int argc = 0 ;
80
+ Local<Array> emit_args;
81
+ if (args[1 ]->IsArray ()) {
82
+ emit_args = Local<Array>::Cast (args[1 ]);
83
+ argc = emit_args->Length ();
84
+ }
85
+ Local<Value> argv[argc];
86
+
87
+ for (int i = 0 ; i < argc; i++) {
88
+ argv[i] = emit_args->Get (Integer::New (i));
89
+ }
90
+
91
+ bool r = ReallyEmit (args.Holder (), event, argc, argv);
92
+
93
+ return scope.Close (r ? True () : False ());
94
+ }
95
+
96
+ bool
97
+ EventEmitter::Emit (const char *event_s, int argc, Handle <Value> argv[])
98
+ {
99
+ HandleScope scope;
100
+ Local<String> event = String::NewSymbol (event_s);
101
+ return ReallyEmit (handle_, event, argc, argv);
102
+ }
103
+
68
104
Persistent<FunctionTemplate> Promise::constructor_template;
69
105
70
106
void
0 commit comments