src: create env->inspector_console_api_object earlier
Previously we create env->inspector_console_api_object() when `process.binding('inspector')` is called, which may be too late if the inspector console is used before the first call to `process.binding('inspector')` - that is possible when using `--inspect-brk-node`. Setting a breakpoint and using the inspector console before that would crash the process. This patch moves the initialization of the console API object to the point when Environment is initialized so that `installAdditionalCommandLineAPI()` can be essentially a noop if we use the inspector console before the inspector binding is initialized instead of crashing on an empty object. PR-URL: https://github.com/nodejs/node/pull/24906 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
This commit is contained in:
parent
9a2654601e
commit
a1b283c2ca
@ -341,6 +341,13 @@ void Environment::Start(const std::vector<std::string>& args,
|
||||
static uv_once_t init_once = UV_ONCE_INIT;
|
||||
uv_once(&init_once, InitThreadLocalOnce);
|
||||
uv_key_set(&thread_local_env, this);
|
||||
|
||||
#if HAVE_INSPECTOR
|
||||
// This needs to be set before we start the inspector
|
||||
Local<Object> obj = Object::New(isolate());
|
||||
CHECK(obj->SetPrototype(context(), Null(isolate())).FromJust());
|
||||
set_inspector_console_api_object(obj);
|
||||
#endif // HAVE_INSPECTOR
|
||||
}
|
||||
|
||||
void Environment::RegisterHandleCleanups() {
|
||||
|
@ -506,6 +506,7 @@ class NodeInspectorClient : public V8InspectorClient {
|
||||
void installAdditionalCommandLineAPI(Local<Context> context,
|
||||
Local<Object> target) override {
|
||||
Local<Object> console_api = env_->inspector_console_api_object();
|
||||
CHECK(!console_api.IsEmpty());
|
||||
|
||||
Local<Array> properties =
|
||||
console_api->GetOwnPropertyNames(context).ToLocalChecked();
|
||||
|
@ -277,12 +277,6 @@ void Url(const FunctionCallbackInfo<Value>& args) {
|
||||
void Initialize(Local<Object> target, Local<Value> unused,
|
||||
Local<Context> context, void* priv) {
|
||||
Environment* env = Environment::GetCurrent(context);
|
||||
{
|
||||
auto obj = Object::New(env->isolate());
|
||||
auto null = Null(env->isolate());
|
||||
CHECK(obj->SetPrototype(context, null).FromJust());
|
||||
env->set_inspector_console_api_object(obj);
|
||||
}
|
||||
|
||||
Agent* agent = env->inspector_agent();
|
||||
env->SetMethod(target, "consoleCall", InspectorConsoleCall);
|
||||
|
Loading…
x
Reference in New Issue
Block a user