src: inline ProcessCliArgs in the Environment constructor

Inline `ProcessCliArgs()` in the `Environment` constructor, and
emit the `Environment` creation trace events with the arguments
earlier. Remove the unused arguments passed to `CreateProcessObject()`
since these are now attached to process in `PatchProcessObject()`
during pre-execution instead.

PR-URL: https://github.com/nodejs/node/pull/27539
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
Joyee Cheung 2019-05-20 13:06:55 +02:00
parent f0018a5152
commit bda7da34c6
No known key found for this signature in database
GPG Key ID: 92B78A53C8303B8D
7 changed files with 32 additions and 43 deletions

View File

@ -281,11 +281,12 @@ Environment* CreateEnvironment(IsolateData* isolate_data,
Environment* env = new Environment( Environment* env = new Environment(
isolate_data, isolate_data,
context, context,
args,
exec_args,
static_cast<Environment::Flags>(Environment::kIsMainThread | static_cast<Environment::Flags>(Environment::kIsMainThread |
Environment::kOwnsProcessState | Environment::kOwnsProcessState |
Environment::kOwnsInspector)); Environment::kOwnsInspector));
env->InitializeLibuv(per_process::v8_is_profiling); env->InitializeLibuv(per_process::v8_is_profiling);
env->ProcessCliArgs(args, exec_args);
if (RunBootstrapping(env).IsEmpty()) { if (RunBootstrapping(env).IsEmpty()) {
return nullptr; return nullptr;
} }

View File

@ -237,6 +237,8 @@ uint64_t Environment::AllocateThreadId() {
Environment::Environment(IsolateData* isolate_data, Environment::Environment(IsolateData* isolate_data,
Local<Context> context, Local<Context> context,
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args,
Flags flags, Flags flags,
uint64_t thread_id) uint64_t thread_id)
: isolate_(context->GetIsolate()), : isolate_(context->GetIsolate()),
@ -244,6 +246,8 @@ Environment::Environment(IsolateData* isolate_data,
immediate_info_(context->GetIsolate()), immediate_info_(context->GetIsolate()),
tick_info_(context->GetIsolate()), tick_info_(context->GetIsolate()),
timer_base_(uv_now(isolate_data->event_loop())), timer_base_(uv_now(isolate_data->event_loop())),
exec_argv_(exec_args),
argv_(args),
should_abort_on_uncaught_toggle_(isolate_, 1), should_abort_on_uncaught_toggle_(isolate_, 1),
stream_base_state_(isolate_, StreamBase::kNumStreamBaseStateFields), stream_base_state_(isolate_, StreamBase::kNumStreamBaseStateFields),
flags_(flags), flags_(flags),
@ -306,6 +310,22 @@ Environment::Environment(IsolateData* isolate_data,
performance::NODE_PERFORMANCE_MILESTONE_V8_START, performance::NODE_PERFORMANCE_MILESTONE_V8_START,
performance::performance_v8_start); performance::performance_v8_start);
if (*TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
TRACING_CATEGORY_NODE1(environment)) != 0) {
auto traced_value = tracing::TracedValue::Create();
traced_value->BeginArray("args");
for (const std::string& arg : args) traced_value->AppendString(arg);
traced_value->EndArray();
traced_value->BeginArray("exec_args");
for (const std::string& arg : exec_args) traced_value->AppendString(arg);
traced_value->EndArray();
TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(TRACING_CATEGORY_NODE1(environment),
"Environment",
this,
"args",
std::move(traced_value));
}
// By default, always abort when --abort-on-uncaught-exception was passed. // By default, always abort when --abort-on-uncaught-exception was passed.
should_abort_on_uncaught_toggle_[0] = 1; should_abort_on_uncaught_toggle_[0] = 1;
@ -318,6 +338,8 @@ Environment::Environment(IsolateData* isolate_data,
if (options_->no_force_async_hooks_checks) { if (options_->no_force_async_hooks_checks) {
async_hooks_.no_force_checks(); async_hooks_.no_force_checks();
} }
set_process_object(node::CreateProcessObject(this).ToLocalChecked());
} }
CompileFnEntry::CompileFnEntry(Environment* env, uint32_t id) CompileFnEntry::CompileFnEntry(Environment* env, uint32_t id)
@ -434,35 +456,6 @@ void Environment::ExitEnv() {
isolate_->TerminateExecution(); isolate_->TerminateExecution();
} }
MaybeLocal<Object> Environment::ProcessCliArgs(
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args) {
argv_ = args;
exec_argv_ = exec_args;
if (*TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
TRACING_CATEGORY_NODE1(environment)) != 0) {
auto traced_value = tracing::TracedValue::Create();
traced_value->BeginArray("args");
for (const std::string& arg : args) traced_value->AppendString(arg);
traced_value->EndArray();
traced_value->BeginArray("exec_args");
for (const std::string& arg : exec_args) traced_value->AppendString(arg);
traced_value->EndArray();
TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(TRACING_CATEGORY_NODE1(environment),
"Environment",
this,
"args",
std::move(traced_value));
}
Local<Object> process_object =
node::CreateProcessObject(this, args, exec_args)
.FromMaybe(Local<Object>());
set_process_object(process_object);
return process_object;
}
void Environment::RegisterHandleCleanups() { void Environment::RegisterHandleCleanups() {
HandleCleanupCb close_and_finish = [](Environment* env, uv_handle_t* handle, HandleCleanupCb close_and_finish = [](Environment* env, uv_handle_t* handle,
void* arg) { void* arg) {

View File

@ -823,14 +823,13 @@ class Environment : public MemoryRetainer {
Environment(IsolateData* isolate_data, Environment(IsolateData* isolate_data,
v8::Local<v8::Context> context, v8::Local<v8::Context> context,
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args,
Flags flags = Flags(), Flags flags = Flags(),
uint64_t thread_id = kNoThreadId); uint64_t thread_id = kNoThreadId);
~Environment(); ~Environment();
void InitializeLibuv(bool start_profiler_idle_notifier); void InitializeLibuv(bool start_profiler_idle_notifier);
v8::MaybeLocal<v8::Object> ProcessCliArgs(
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args);
inline const std::vector<std::string>& exec_argv(); inline const std::vector<std::string>& exec_argv();
inline const std::vector<std::string>& argv(); inline const std::vector<std::string>& argv();

View File

@ -188,11 +188,12 @@ std::unique_ptr<Environment> NodeMainInstance::CreateMainEnvironment(
std::unique_ptr<Environment> env = std::make_unique<Environment>( std::unique_ptr<Environment> env = std::make_unique<Environment>(
isolate_data_.get(), isolate_data_.get(),
context, context,
args_,
exec_args_,
static_cast<Environment::Flags>(Environment::kIsMainThread | static_cast<Environment::Flags>(Environment::kIsMainThread |
Environment::kOwnsProcessState | Environment::kOwnsProcessState |
Environment::kOwnsInspector)); Environment::kOwnsInspector));
env->InitializeLibuv(per_process::v8_is_profiling); env->InitializeLibuv(per_process::v8_is_profiling);
env->ProcessCliArgs(args_, exec_args_);
#if HAVE_INSPECTOR && NODE_USE_V8_PLATFORM #if HAVE_INSPECTOR && NODE_USE_V8_PLATFORM
CHECK(!env->inspector_agent()->IsListening()); CHECK(!env->inspector_agent()->IsListening());

View File

@ -31,10 +31,7 @@ v8::Maybe<bool> ProcessEmitDeprecationWarning(Environment* env,
const char* warning, const char* warning,
const char* deprecation_code); const char* deprecation_code);
v8::MaybeLocal<v8::Object> CreateProcessObject( v8::MaybeLocal<v8::Object> CreateProcessObject(Environment* env);
Environment* env,
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args);
void PatchProcessObject(const v8::FunctionCallbackInfo<v8::Value>& args); void PatchProcessObject(const v8::FunctionCallbackInfo<v8::Value>& args);
namespace task_queue { namespace task_queue {

View File

@ -68,10 +68,7 @@ static void GetParentProcessId(Local<Name> property,
info.GetReturnValue().Set(uv_os_getppid()); info.GetReturnValue().Set(uv_os_getppid());
} }
MaybeLocal<Object> CreateProcessObject( MaybeLocal<Object> CreateProcessObject(Environment* env) {
Environment* env,
const std::vector<std::string>& args,
const std::vector<std::string>& exec_args) {
Isolate* isolate = env->isolate(); Isolate* isolate = env->isolate();
EscapableHandleScope scope(isolate); EscapableHandleScope scope(isolate);
Local<Context> context = env->context(); Local<Context> context = env->context();

View File

@ -256,6 +256,8 @@ void Worker::Run() {
// public API. // public API.
env_.reset(new Environment(data.isolate_data_.get(), env_.reset(new Environment(data.isolate_data_.get(),
context, context,
std::move(argv_),
std::move(exec_argv_),
Environment::kNoFlags, Environment::kNoFlags,
thread_id_)); thread_id_));
CHECK_NOT_NULL(env_); CHECK_NOT_NULL(env_);
@ -264,7 +266,6 @@ void Worker::Run() {
env_->set_worker_context(this); env_->set_worker_context(this);
env_->InitializeLibuv(profiler_idle_notifier_started_); env_->InitializeLibuv(profiler_idle_notifier_started_);
env_->ProcessCliArgs(std::move(argv_), std::move(exec_argv_));
} }
{ {
Mutex::ScopedLock lock(mutex_); Mutex::ScopedLock lock(mutex_);