From c2259c974b84d6e21077100b9be486a01285a618 Mon Sep 17 00:00:00 2001 From: JckXia Date: Thu, 21 Oct 2021 14:10:38 -0400 Subject: [PATCH] src: reset error struct if error code is napi_ok MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/40552 Refs: https://github.com/nodejs/node-addon-api/issues/1089 Reviewed-By: Darshan Sen Reviewed-By: James M Snell Reviewed-By: Michael Dawson Reviewed-By: Gabriel Schulhof Reviewed-By: Juan José Arboleda --- src/js_native_api_v8.cc | 4 +++- src/js_native_api_v8.h | 1 + test/js-native-api/common.h | 7 ++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 9dfc8d1ae2ae92..72f911cab6c203 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -761,12 +761,14 @@ napi_status napi_get_last_error_info(napi_env env, NAPI_ARRAYSIZE(error_messages) == last_status + 1, "Count of error messages must match count of error values"); CHECK_LE(env->last_error.error_code, last_status); - // Wait until someone requests the last error information to fetch the error // message string env->last_error.error_message = error_messages[env->last_error.error_code]; + if (env->last_error.error_code == napi_ok) { + napi_clear_last_error(env); + } *result = &(env->last_error); return napi_ok; } diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index 91c2eeb98989ca..673e697dd6ba1b 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -159,6 +159,7 @@ static inline napi_status napi_clear_last_error(napi_env env) { // TODO(boingoing): Should this be a callback? env->last_error.engine_error_code = 0; env->last_error.engine_reserved = nullptr; + env->last_error.error_message = nullptr; return napi_ok; } diff --git a/test/js-native-api/common.h b/test/js-native-api/common.h index ab6785fb199b01..73f60906630140 100644 --- a/test/js-native-api/common.h +++ b/test/js-native-api/common.h @@ -8,12 +8,13 @@ const napi_extended_error_info *error_info; \ napi_get_last_error_info((env), &error_info); \ bool is_pending; \ + const char* err_message = error_info->error_message; \ napi_is_exception_pending((env), &is_pending); \ /* If an exception is already pending, don't rethrow it */ \ if (!is_pending) { \ - const char* error_message = error_info->error_message != NULL ? \ - error_info->error_message : \ - "empty error message"; \ + const char* error_message = err_message != NULL ? \ + err_message : \ + "empty error message"; \ napi_throw_error((env), NULL, error_message); \ } \ } while (0)