Skip to content

Commit

Permalink
src: create env->inspector_console_api_object earlier
Browse files Browse the repository at this point in the history
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: #24906
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Franziska Hinkelmann <[email protected]>
  • Loading branch information
joyeecheung authored and BethGriggs committed Dec 17, 2018
1 parent e61bbda commit 5a1289d
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 6 deletions.
7 changes: 7 additions & 0 deletions src/env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
1 change: 1 addition & 0 deletions src/inspector_agent.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
6 changes: 0 additions & 6 deletions src/inspector_js_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 5a1289d

Please sign in to comment.