}
}
-int
-main (int argc, char *argv[])
+static Local<Object>
+Load (int argc, char *argv[])
{
- ev_default_loop(EVFLAG_AUTO); // initialize the default ev loop.
-
- // start eio thread pool
- ev_async_init(&eio_watcher, node_eio_cb);
- eio_init(eio_want_poll, NULL);
-
- V8::SetFlagsFromCommandLine(&argc, argv, true);
- V8::Initialize();
-
- if(argc < 2) {
- fprintf(stderr, "No script was specified.\n");
- return 1;
- }
-
- string filename(argv[1]);
-
- HandleScope handle_scope;
-
- Persistent<Context> context = Context::New(NULL, ObjectTemplate::New());
- Context::Scope context_scope(context);
- V8::SetFatalErrorHandler(OnFatalError);
-
- Local<Object> g = Context::GetCurrent()->Global();
-
- V8::PauseProfiler(); // to be resumed in Connection::on_read
+ HandleScope scope;
- Local<Object> node = Object::New();
- g->Set(String::New("node"), node);
+ Local<Object> global_obj = Context::GetCurrent()->Global();
+ Local<Object> node_obj = Object::New();
- NODE_SET_METHOD(node, "compile", compile); // internal
- NODE_SET_METHOD(node, "debug", debug);
- NODE_SET_METHOD(node, "reallyExit", node_exit);
+ global_obj->Set(String::NewSymbol("node"), node_obj);
Local<Array> arguments = Array::New(argc);
for (int i = 0; i < argc; i++) {
Local<String> arg = String::New(argv[i]);
arguments->Set(Integer::New(i), arg);
}
- g->Set(String::New("ARGV"), arguments);
+ global_obj->Set(String::NewSymbol("ARGV"), arguments);
- // BUILT-IN MODULES
- Timer::Initialize(node);
+ NODE_SET_METHOD(node_obj, "compile", compile);
+ NODE_SET_METHOD(node_obj, "debug", debug);
+ NODE_SET_METHOD(node_obj, "reallyExit", node_exit);
+
+ Timer::Initialize(node_obj);
Local<Object> constants = Object::New();
- node->Set(String::New("constants"), constants);
+ node_obj->Set(String::NewSymbol("constants"), constants);
DefineConstants(constants);
Local<Object> fs = Object::New();
- node->Set(String::New("fs"), fs);
+ node_obj->Set(String::NewSymbol("fs"), fs);
File::Initialize(fs);
Local<Object> tcp = Object::New();
- node->Set(String::New("tcp"), tcp);
+ node_obj->Set(String::New("tcp"), tcp);
Acceptor::Initialize(tcp);
Connection::Initialize(tcp);
Local<Object> http = Object::New();
- node->Set(String::New("http"), http);
+ node_obj->Set(String::New("http"), http);
HTTPServer::Initialize(http);
HTTPConnection::Initialize(http);
ExecuteNativeJS("file.js", native_file);
ExecuteNativeJS("node.js", native_node);
- ev_loop(EV_DEFAULT_UC_ 0);
+ return scope.Close(node_obj);
+}
- // call node.exit()
- Local<Value> exit_v = node->Get(String::New("exit"));
+static void
+CallExitHandler (Handle<Object> node_obj)
+{
+ HandleScope scope;
+ Local<Value> exit_v = node_obj->Get(String::New("exit"));
assert(exit_v->IsFunction());
Handle<Function> exit_f = Handle<Function>::Cast(exit_v);
TryCatch try_catch;
- exit_f->Call(g, 0, NULL);
+ exit_f->Call(Context::GetCurrent()->Global(), 0, NULL);
if (try_catch.HasCaught())
node::FatalException(try_catch);
+}
+
+int
+main (int argc, char *argv[])
+{
+ ev_default_loop(EVFLAG_AUTO); // initialize the default ev loop.
+
+ // start eio thread pool
+ ev_async_init(&eio_watcher, node_eio_cb);
+ eio_init(eio_want_poll, NULL);
+
+ V8::SetFlagsFromCommandLine(&argc, argv, true);
+ V8::Initialize();
+ V8::SetFatalErrorHandler(OnFatalError);
+
+ if(argc < 2) {
+ fprintf(stderr, "No script was specified.\n");
+ return 1;
+ }
+
+ HandleScope handle_scope;
+ Persistent<Context> context = Context::New(NULL, ObjectTemplate::New());
+ Context::Scope context_scope(context);
+
+ Local<Object> node_obj = Load(argc, argv);
+
+ ev_loop(EV_DEFAULT_UC_ 0); // main event loop
+
+ CallExitHandler(node_obj);
context.Dispose();
- // The following line when uncommented causes an error.
- // To reproduce do this:
- // > node --prof test-http_simple.js
- //
- // > curl http://localhost:8000/quit/
- //
- //V8::Dispose();
+ V8::Dispose();
return 0;
}