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:
parent
f0018a5152
commit
bda7da34c6
@ -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;
|
||||||
}
|
}
|
||||||
|
51
src/env.cc
51
src/env.cc
@ -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) {
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
@ -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 {
|
||||||
|
@ -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();
|
||||||
|
@ -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_);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user