Skip to content

Commit cf6c93e

Browse files
committed
don't try to escape null
If an exception is pending from Call Or MakeCallback on FunctionReference the return value may be nullptr. Check for a pending exception and don't try to escape in these cases. PR-URL: #245 Refs: #233 Reviewed-By: Hitesh Kanwathirtha <[email protected]>
1 parent 15e4b35 commit cf6c93e

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

napi-inl.h

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,36 +2285,60 @@ inline Napi::Value FunctionReference::operator ()(
22852285

22862286
inline Napi::Value FunctionReference::Call(const std::initializer_list<napi_value>& args) const {
22872287
EscapableHandleScope scope(_env);
2288-
return scope.Escape(Value().Call(args));
2288+
Napi::Value result = Value().Call(args);
2289+
if (scope.Env().IsExceptionPending()) {
2290+
return Value();
2291+
}
2292+
return scope.Escape(result);
22892293
}
22902294

22912295
inline Napi::Value FunctionReference::Call(const std::vector<napi_value>& args) const {
22922296
EscapableHandleScope scope(_env);
2293-
return scope.Escape(Value().Call(args));
2297+
Napi::Value result = Value().Call(args);
2298+
if (scope.Env().IsExceptionPending()) {
2299+
return Value();
2300+
}
2301+
return scope.Escape(result);
22942302
}
22952303

22962304
inline Napi::Value FunctionReference::Call(
22972305
napi_value recv, const std::initializer_list<napi_value>& args) const {
22982306
EscapableHandleScope scope(_env);
2299-
return scope.Escape(Value().Call(recv, args));
2307+
Napi::Value result = Value().Call(recv, args);
2308+
if (scope.Env().IsExceptionPending()) {
2309+
return Value();
2310+
}
2311+
return scope.Escape(result);
23002312
}
23012313

23022314
inline Napi::Value FunctionReference::Call(
23032315
napi_value recv, const std::vector<napi_value>& args) const {
23042316
EscapableHandleScope scope(_env);
2305-
return scope.Escape(Value().Call(recv, args));
2317+
Napi::Value result = Value().Call(recv, args);
2318+
if (scope.Env().IsExceptionPending()) {
2319+
return Value();
2320+
}
2321+
return scope.Escape(result);
23062322
}
23072323

23082324
inline Napi::Value FunctionReference::MakeCallback(
23092325
napi_value recv, const std::initializer_list<napi_value>& args) const {
23102326
EscapableHandleScope scope(_env);
2311-
return scope.Escape(Value().MakeCallback(recv, args));
2327+
Napi::Value result = Value().MakeCallback(recv, args);
2328+
if (scope.Env().IsExceptionPending()) {
2329+
return Value();
2330+
}
2331+
return scope.Escape(result);
23122332
}
23132333

23142334
inline Napi::Value FunctionReference::MakeCallback(
23152335
napi_value recv, const std::vector<napi_value>& args) const {
23162336
EscapableHandleScope scope(_env);
2317-
return scope.Escape(Value().MakeCallback(recv, args));
2337+
Napi::Value result = Value().MakeCallback(recv, args);
2338+
if (scope.Env().IsExceptionPending()) {
2339+
return Value();
2340+
}
2341+
return scope.Escape(result);
23182342
}
23192343

23202344
inline Object FunctionReference::New(const std::initializer_list<napi_value>& args) const {

0 commit comments

Comments
 (0)