diff --git a/src/api/callback.cc b/src/api/callback.cc index 2bb34b088f74e1..67b533d2f4ddf2 100644 --- a/src/api/callback.cc +++ b/src/api/callback.cc @@ -225,10 +225,19 @@ MaybeLocal MakeCallback(Isolate* isolate, int argc, Local argv[], async_context asyncContext) { - Local callback_v = - recv->Get(isolate->GetCurrentContext(), symbol).ToLocalChecked(); - if (callback_v.IsEmpty()) return Local(); - if (!callback_v->IsFunction()) return Local(); + // Check can_call_into_js() first because calling Get() might do so. + Environment* env = Environment::GetCurrent(recv->CreationContext()); + CHECK_NOT_NULL(env); + if (!env->can_call_into_js()) return Local(); + + Local callback_v; + if (!recv->Get(isolate->GetCurrentContext(), symbol).ToLocal(&callback_v)) + return Local(); + if (!callback_v->IsFunction()) { + // This used to return an empty value, but Undefined() makes more sense + // since no exception is pending here. + return Undefined(isolate); + } Local callback = callback_v.As(); return MakeCallback(isolate, recv, callback, argc, argv, asyncContext); }