|
@ -3499,7 +3499,7 @@ void Init(int* argc, |
|
|
uv_disable_stdio_inheritance(); |
|
|
uv_disable_stdio_inheritance(); |
|
|
|
|
|
|
|
|
// init async debug messages dispatching
|
|
|
// init async debug messages dispatching
|
|
|
// FIXME(bnoordhuis) Should be per-isolate or per-context, not global.
|
|
|
// Main thread uses uv_default_loop
|
|
|
uv_async_init(uv_default_loop(), |
|
|
uv_async_init(uv_default_loop(), |
|
|
&dispatch_debug_messages_async, |
|
|
&dispatch_debug_messages_async, |
|
|
DispatchDebugMessagesAsyncCallback); |
|
|
DispatchDebugMessagesAsyncCallback); |
|
@ -3663,6 +3663,18 @@ Environment* CreateEnvironment(Isolate* isolate, |
|
|
return env; |
|
|
return env; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static Environment* CreateEnvironment(Isolate* isolate, |
|
|
|
|
|
Handle<Context> context, |
|
|
|
|
|
NodeInstanceData* instance_data) { |
|
|
|
|
|
return CreateEnvironment(isolate, |
|
|
|
|
|
instance_data->event_loop(), |
|
|
|
|
|
context, |
|
|
|
|
|
instance_data->argc(), |
|
|
|
|
|
instance_data->argv(), |
|
|
|
|
|
instance_data->exec_argc(), |
|
|
|
|
|
instance_data->exec_argv()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void HandleCloseCb(uv_handle_t* handle) { |
|
|
static void HandleCloseCb(uv_handle_t* handle) { |
|
|
Environment* env = reinterpret_cast<Environment*>(handle->data); |
|
|
Environment* env = reinterpret_cast<Environment*>(handle->data); |
|
@ -3746,62 +3758,32 @@ Environment* CreateEnvironment(Isolate* isolate, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Start(int argc, char** argv) { |
|
|
// Entry point for new node instances, also called directly for the main
|
|
|
PlatformInit(); |
|
|
// node instance.
|
|
|
|
|
|
static void StartNodeInstance(void* arg) { |
|
|
const char* replaceInvalid = secure_getenv("NODE_INVALID_UTF8"); |
|
|
NodeInstanceData* instance_data = static_cast<NodeInstanceData*>(arg); |
|
|
|
|
|
Isolate* isolate = Isolate::New(); |
|
|
if (replaceInvalid == nullptr) |
|
|
// Fetch a reference to the main isolate, so we have a reference to it
|
|
|
WRITE_UTF8_FLAGS |= String::REPLACE_INVALID_UTF8; |
|
|
|
|
|
|
|
|
|
|
|
CHECK_GT(argc, 0); |
|
|
|
|
|
|
|
|
|
|
|
// Hack around with the argv pointer. Used for process.title = "blah".
|
|
|
|
|
|
argv = uv_setup_args(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
// This needs to run *before* V8::Initialize(). The const_cast is not
|
|
|
|
|
|
// optional, in case you're wondering.
|
|
|
|
|
|
int exec_argc; |
|
|
|
|
|
const char** exec_argv; |
|
|
|
|
|
Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv); |
|
|
|
|
|
|
|
|
|
|
|
#if HAVE_OPENSSL |
|
|
|
|
|
// V8 on Windows doesn't have a good source of entropy. Seed it from
|
|
|
|
|
|
// OpenSSL's pool.
|
|
|
|
|
|
V8::SetEntropySource(crypto::EntropySource); |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
V8::InitializePlatform(new Platform(4)); |
|
|
|
|
|
|
|
|
|
|
|
int code; |
|
|
|
|
|
V8::Initialize(); |
|
|
|
|
|
|
|
|
|
|
|
// Fetch a reference to the main isolate, so we have a reference to it
|
|
|
|
|
|
// even when we need it to access it from another (debugger) thread.
|
|
|
// even when we need it to access it from another (debugger) thread.
|
|
|
node_isolate = Isolate::New(); |
|
|
if (instance_data->is_main()) |
|
|
|
|
|
node_isolate = isolate; |
|
|
{ |
|
|
{ |
|
|
Locker locker(node_isolate); |
|
|
Locker locker(isolate); |
|
|
Isolate::Scope isolate_scope(node_isolate); |
|
|
Isolate::Scope isolate_scope(isolate); |
|
|
HandleScope handle_scope(node_isolate); |
|
|
HandleScope handle_scope(isolate); |
|
|
Local<Context> context = Context::New(node_isolate); |
|
|
Local<Context> context = Context::New(isolate); |
|
|
Environment* env = CreateEnvironment( |
|
|
Environment* env = CreateEnvironment(isolate, context, instance_data); |
|
|
node_isolate, |
|
|
|
|
|
uv_default_loop(), |
|
|
|
|
|
context, |
|
|
|
|
|
argc, |
|
|
|
|
|
argv, |
|
|
|
|
|
exec_argc, |
|
|
|
|
|
exec_argv); |
|
|
|
|
|
Context::Scope context_scope(context); |
|
|
Context::Scope context_scope(context); |
|
|
env->set_using_abort_on_uncaught_exc(abort_on_uncaught_exception); |
|
|
if (instance_data->is_main()) |
|
|
|
|
|
env->set_using_abort_on_uncaught_exc(abort_on_uncaught_exception); |
|
|
// Start debug agent when argv has --debug
|
|
|
// Start debug agent when argv has --debug
|
|
|
if (use_debug_agent) |
|
|
if (instance_data->use_debug_agent()) |
|
|
StartDebug(env, debug_wait_connect); |
|
|
StartDebug(env, debug_wait_connect); |
|
|
|
|
|
|
|
|
LoadEnvironment(env); |
|
|
LoadEnvironment(env); |
|
|
|
|
|
|
|
|
// Enable debugger
|
|
|
// Enable debugger
|
|
|
if (use_debug_agent) |
|
|
if (instance_data->use_debug_agent()) |
|
|
EnableDebug(env); |
|
|
EnableDebug(env); |
|
|
|
|
|
|
|
|
bool more; |
|
|
bool more; |
|
@ -3817,22 +3799,69 @@ int Start(int argc, char** argv) { |
|
|
more = true; |
|
|
more = true; |
|
|
} |
|
|
} |
|
|
} while (more == true); |
|
|
} while (more == true); |
|
|
code = EmitExit(env); |
|
|
|
|
|
|
|
|
int exit_code = EmitExit(env); |
|
|
|
|
|
if (instance_data->is_main()) |
|
|
|
|
|
instance_data->set_exit_code(exit_code); |
|
|
RunAtExit(env); |
|
|
RunAtExit(env); |
|
|
|
|
|
|
|
|
env->Dispose(); |
|
|
env->Dispose(); |
|
|
env = nullptr; |
|
|
env = nullptr; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
CHECK_NE(node_isolate, nullptr); |
|
|
CHECK_NE(isolate, nullptr); |
|
|
node_isolate->Dispose(); |
|
|
isolate->Dispose(); |
|
|
node_isolate = nullptr; |
|
|
isolate = nullptr; |
|
|
|
|
|
if (instance_data->is_main()) |
|
|
|
|
|
node_isolate = nullptr; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int Start(int argc, char** argv) { |
|
|
|
|
|
PlatformInit(); |
|
|
|
|
|
|
|
|
|
|
|
const char* replace_invalid = secure_getenv("NODE_INVALID_UTF8"); |
|
|
|
|
|
|
|
|
|
|
|
if (replace_invalid == nullptr) |
|
|
|
|
|
WRITE_UTF8_FLAGS |= String::REPLACE_INVALID_UTF8; |
|
|
|
|
|
|
|
|
|
|
|
CHECK_GT(argc, 0); |
|
|
|
|
|
|
|
|
|
|
|
// Hack around with the argv pointer. Used for process.title = "blah".
|
|
|
|
|
|
argv = uv_setup_args(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
// This needs to run *before* V8::Initialize(). The const_cast is not
|
|
|
|
|
|
// optional, in case you're wondering.
|
|
|
|
|
|
int exec_argc; |
|
|
|
|
|
const char** exec_argv; |
|
|
|
|
|
Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv); |
|
|
|
|
|
|
|
|
|
|
|
#if HAVE_OPENSSL |
|
|
|
|
|
// V8 on Windows doesn't have a good source of entropy. Seed it from
|
|
|
|
|
|
// OpenSSL's pool.
|
|
|
|
|
|
V8::SetEntropySource(crypto::EntropySource); |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
V8::InitializePlatform(new Platform(4)); |
|
|
|
|
|
V8::Initialize(); |
|
|
|
|
|
|
|
|
|
|
|
int exit_code = 1; |
|
|
|
|
|
{ |
|
|
|
|
|
NodeInstanceData instance_data(NodeInstanceType::MAIN, |
|
|
|
|
|
uv_default_loop(), |
|
|
|
|
|
argc, |
|
|
|
|
|
const_cast<const char**>(argv), |
|
|
|
|
|
exec_argc, |
|
|
|
|
|
exec_argv, |
|
|
|
|
|
use_debug_agent); |
|
|
|
|
|
StartNodeInstance(&instance_data); |
|
|
|
|
|
exit_code = instance_data.exit_code(); |
|
|
|
|
|
} |
|
|
V8::Dispose(); |
|
|
V8::Dispose(); |
|
|
|
|
|
|
|
|
delete[] exec_argv; |
|
|
delete[] exec_argv; |
|
|
exec_argv = nullptr; |
|
|
exec_argv = nullptr; |
|
|
|
|
|
|
|
|
return code; |
|
|
return exit_code; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|