Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/api/callback.cc17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/api/callback.cc b/src/api/callback.cc
index 84664c08959..3d4f91a866e 100644
--- a/src/api/callback.cc
+++ b/src/api/callback.cc
@@ -223,10 +223,19 @@ MaybeLocal<Value> MakeCallback(Isolate* isolate,
int argc,
Local<Value> argv[],
async_context asyncContext) {
- Local<Value> callback_v =
- recv->Get(isolate->GetCurrentContext(), symbol).ToLocalChecked();
- if (callback_v.IsEmpty()) return Local<Value>();
- if (!callback_v->IsFunction()) return Local<Value>();
+ // 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<Value>();
+
+ Local<Value> callback_v;
+ if (!recv->Get(isolate->GetCurrentContext(), symbol).ToLocal(&callback_v))
+ return Local<Value>();
+ 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<Function> callback = callback_v.As<Function>();
return MakeCallback(isolate, recv, callback, argc, argv, asyncContext);
}