From bdf8809b5d0ed463e263908d45829386627a5d48 Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Sat, 6 Nov 2021 10:36:38 +0200 Subject: [PATCH 01/16] src,doc: add SyntaxError napi support Add `napi_create_syntax_error` and `napi_throw_syntax_error`. Fixes: https://github.com/nodejs/node-addon-api/issues/1099 --- doc/api/n-api.md | 51 ++++++++++++++++++++-- src/js_native_api.h | 7 +++ src/js_native_api_v8.cc | 38 ++++++++++++++++ test/js-native-api/test_error/test.js | 23 ++++++++++ test/js-native-api/test_error/test_error.c | 32 ++++++++++++++ 5 files changed, 148 insertions(+), 3 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 335394e9b45ba3..e00ab138ed1fdd 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1065,12 +1065,11 @@ JavaScript value to be thrown. The following utility functions are also available in case native code needs to throw an exception or determine if a `napi_value` is an instance of a JavaScript `Error` object: [`napi_throw_error`][], -[`napi_throw_type_error`][], [`napi_throw_range_error`][] and -[`napi_is_error`][]. +[`napi_throw_type_error`][], [`napi_throw_range_error`][], [`napi_throw_syntax_error`][] and [`napi_is_error`][]. The following utility functions are also available in case native code needs to create an `Error` object: [`napi_create_error`][], -[`napi_create_type_error`][], and [`napi_create_range_error`][], +[`napi_create_type_error`][], [`napi_create_range_error`][] and [`napi_create_syntax_error`][], where result is the `napi_value` that refers to the newly created JavaScript `Error` object. @@ -1180,6 +1179,26 @@ Returns `napi_ok` if the API succeeded. This API throws a JavaScript `RangeError` with the text provided. +#### `napi_throw_syntax_error` + + + +```c +NAPI_EXTERN napi_status napi_throw_syntax_error(napi_env env, + const char* code, + const char* msg); +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] code`: Optional error code to be set on the error. +* `[in] msg`: C string representing the text to be associated with the error. + +Returns `napi_ok` if the API succeeded. + +This API throws a JavaScript `SyntaxError` with the text provided. + #### `napi_is_error` + +```c +NAPI_EXTERN napi_status napi_create_syntax_error(napi_env env, + napi_value code, + napi_value msg, + napi_value* result); +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] code`: Optional `napi_value` with the string for the error code to be + associated with the error. +* `[in] msg`: `napi_value` that references a JavaScript `string` to be used as + the message for the `Error`. +* `[out] result`: `napi_value` representing the error created. + +Returns `napi_ok` if the API succeeded. + +This API returns a JavaScript `SyntaxError` with the text provided. + #### `napi_get_and_clear_last_exception` ```c -NAPI_EXTERN napi_status napi_throw_syntax_error(napi_env env, +NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, const char* code, const char* msg); ``` @@ -1296,14 +1296,14 @@ Returns `napi_ok` if the API succeeded. This API returns a JavaScript `RangeError` with the text provided. -#### `napi_create_syntax_error` +#### `node_api_create_syntax_error` ```c -NAPI_EXTERN napi_status napi_create_syntax_error(napi_env env, +NAPI_EXTERN napi_status node_api_create_syntax_error(napi_env env, napi_value code, napi_value msg, napi_value* result); @@ -6300,7 +6300,7 @@ the add-on's file name during loading. [`napi_create_external_arraybuffer`]: #napi_create_external_arraybuffer [`napi_create_range_error`]: #napi_create_range_error [`napi_create_reference`]: #napi_create_reference -[`napi_create_syntax_error`]: #napi_create_syntax_error +[`node_api_create_syntax_error`]: #node_api_create_syntax_error [`napi_create_type_error`]: #napi_create_type_error [`napi_define_class`]: #napi_define_class [`napi_delete_async_work`]: #napi_delete_async_work @@ -6334,7 +6334,7 @@ the add-on's file name during loading. [`napi_threadsafe_function_call_js`]: #napi_threadsafe_function_call_js [`napi_throw_error`]: #napi_throw_error [`napi_throw_range_error`]: #napi_throw_range_error -[`napi_throw_syntax_error`]: #napi_throw_syntax_error +[`node_api_throw_syntax_error`]: #node_api_throw_syntax_error [`napi_throw_type_error`]: #napi_throw_type_error [`napi_throw`]: #napi_throw [`napi_unwrap`]: #napi_unwrap diff --git a/src/js_native_api.h b/src/js_native_api.h index 005a2c234fb578..dc3e0714f0cc8a 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -112,7 +112,7 @@ NAPI_EXTERN napi_status napi_create_range_error(napi_env env, napi_value msg, napi_value* result); #ifdef NAPI_EXPERIMENTAL -NAPI_EXTERN napi_status napi_create_syntax_error(napi_env env, +NAPI_EXTERN napi_status node_api_create_syntax_error(napi_env env, napi_value code, napi_value msg, napi_value* result); @@ -377,7 +377,7 @@ NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, const char* code, const char* msg); #ifdef NAPI_EXPERIMENTAL -NAPI_EXTERN napi_status napi_throw_syntax_error(napi_env env, +NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, const char* code, const char* msg); #endif // NAPI_EXPERIMENTAL diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 93d19deee24e47..8317988b128394 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1747,7 +1747,7 @@ napi_status napi_create_range_error(napi_env env, return napi_clear_last_error(env); } -napi_status napi_create_syntax_error(napi_env env, +napi_status node_api_create_syntax_error(napi_env env, napi_value code, napi_value msg, napi_value* result) { @@ -1984,7 +1984,7 @@ napi_status napi_throw_range_error(napi_env env, return napi_clear_last_error(env); } -napi_status napi_throw_syntax_error(napi_env env, +napi_status node_api_throw_syntax_error(napi_env env, const char* code, const char* msg) { NAPI_PREAMBLE(env); diff --git a/test/js-native-api/test_error/test_error.c b/test/js-native-api/test_error/test_error.c index 041e0d1bc9d399..0dea66a51cc3a6 100644 --- a/test/js-native-api/test_error/test_error.c +++ b/test/js-native-api/test_error/test_error.c @@ -42,7 +42,7 @@ static napi_value throwTypeError(napi_env env, napi_callback_info info) { } static napi_value throwSyntaxError(napi_env env, napi_callback_info info) { - NODE_API_CALL(env, napi_throw_syntax_error(env, NULL, "syntax error")); + NODE_API_CALL(env, node_api_throw_syntax_error(env, NULL, "syntax error")); return NULL; } @@ -65,7 +65,7 @@ static napi_value throwTypeErrorCode(napi_env env, napi_callback_info info) { static napi_value throwSyntaxErrorCode(napi_env env, napi_callback_info info) { NODE_API_CALL(env, - napi_throw_syntax_error(env, "ERR_TEST_CODE", "SyntaxError [syntax error]")); + node_api_throw_syntax_error(env, "ERR_TEST_CODE", "SyntaxError [syntax error]")); return NULL; } @@ -101,7 +101,7 @@ static napi_value createSyntaxError(napi_env env, napi_callback_info info) { napi_value message; NODE_API_CALL(env, napi_create_string_utf8( env, "syntax error", NAPI_AUTO_LENGTH, &message)); - NODE_API_CALL(env, napi_create_syntax_error(env, NULL, message, &result)); + NODE_API_CALL(env, node_api_create_syntax_error(env, NULL, message, &result)); return result; } @@ -152,7 +152,7 @@ static napi_value createSyntaxErrorCode(napi_env env, napi_callback_info info) { env, "SyntaxError [syntax error]", NAPI_AUTO_LENGTH, &message)); NODE_API_CALL(env, napi_create_string_utf8( env, "ERR_TEST_CODE", NAPI_AUTO_LENGTH, &code)); - NODE_API_CALL(env, napi_create_syntax_error(env, code, message, &result)); + NODE_API_CALL(env, node_api_create_syntax_error(env, code, message, &result)); return result; } From c22c337f9fee2092f851b849f53ecac53caf488c Mon Sep 17 00:00:00 2001 From: Idan Attias Date: Tue, 9 Nov 2021 15:00:15 +0200 Subject: [PATCH 06/16] fix: lint --- doc/api/n-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index b06c045ef18b65..cd70aabe7b0acb 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -6300,7 +6300,6 @@ the add-on's file name during loading. [`napi_create_external_arraybuffer`]: #napi_create_external_arraybuffer [`napi_create_range_error`]: #napi_create_range_error [`napi_create_reference`]: #napi_create_reference -[`node_api_create_syntax_error`]: #node_api_create_syntax_error [`napi_create_type_error`]: #napi_create_type_error [`napi_define_class`]: #napi_define_class [`napi_delete_async_work`]: #napi_delete_async_work @@ -6334,13 +6333,14 @@ the add-on's file name during loading. [`napi_threadsafe_function_call_js`]: #napi_threadsafe_function_call_js [`napi_throw_error`]: #napi_throw_error [`napi_throw_range_error`]: #napi_throw_range_error -[`node_api_throw_syntax_error`]: #node_api_throw_syntax_error [`napi_throw_type_error`]: #napi_throw_type_error [`napi_throw`]: #napi_throw [`napi_unwrap`]: #napi_unwrap [`napi_wrap`]: #napi_wrap [`node-addon-api`]: https://github.com/nodejs/node-addon-api [`node_api.h`]: https://github.com/nodejs/node/blob/HEAD/src/node_api.h +[`node_api_create_syntax_error`]: #node_api_create_syntax_error +[`node_api_throw_syntax_error`]: #node_api_throw_syntax_error [`process.release`]: process.md#processrelease [`uv_ref`]: https://docs.libuv.org/en/v1.x/handle.html#c.uv_ref [`uv_unref`]: https://docs.libuv.org/en/v1.x/handle.html#c.uv_unref From 5c52bec68888a88f4460fc2a7a787b495a9989b5 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:33:59 -0500 Subject: [PATCH 07/16] Update doc/api/n-api.md --- doc/api/n-api.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index cd70aabe7b0acb..42888f35b57834 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1189,7 +1189,8 @@ added: REPLACEME NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, const char* code, const char* msg); -``` + const char* code, + const char* msg); * `[in] env`: The environment that the API is invoked under. * `[in] code`: Optional error code to be set on the error. From f733054c8b8db3e71d160de4e2c945fd17b960c8 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:34:30 -0500 Subject: [PATCH 08/16] Update doc/api/n-api.md --- doc/api/n-api.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 42888f35b57834..86de9973f96381 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1187,8 +1187,6 @@ added: REPLACEME ```c NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, - const char* code, - const char* msg); const char* code, const char* msg); From c6adcb4bcc4b655a682b1933f22f65772e72f784 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:35:37 -0500 Subject: [PATCH 09/16] Update doc/api/n-api.md --- doc/api/n-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 86de9973f96381..d3b7547560b5ed 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1303,9 +1303,9 @@ added: REPLACEME ```c NAPI_EXTERN napi_status node_api_create_syntax_error(napi_env env, - napi_value code, - napi_value msg, - napi_value* result); + napi_value code, + napi_value msg, + napi_value* result); ``` * `[in] env`: The environment that the API is invoked under. From e0398c638a1479ad4a6fe41e42d7c9a8efbb0615 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:37:05 -0500 Subject: [PATCH 10/16] Update src/js_native_api.h --- src/js_native_api.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index dc3e0714f0cc8a..78fbc48d38ca52 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -113,9 +113,9 @@ NAPI_EXTERN napi_status napi_create_range_error(napi_env env, napi_value* result); #ifdef NAPI_EXPERIMENTAL NAPI_EXTERN napi_status node_api_create_syntax_error(napi_env env, - napi_value code, - napi_value msg, - napi_value* result); + napi_value code, + napi_value msg, + napi_value* result); #endif // NAPI_EXPERIMENTAL // Methods to get the native napi_value from Primitive type From e4165ccf5f939a588b0de5ded025e515718632b9 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:37:47 -0500 Subject: [PATCH 11/16] Update src/js_native_api.h --- src/js_native_api.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 78fbc48d38ca52..7e0c342d68a1b4 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -378,8 +378,8 @@ NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, const char* msg); #ifdef NAPI_EXPERIMENTAL NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, - const char* code, - const char* msg); + const char* code, + const char* msg); #endif // NAPI_EXPERIMENTAL NAPI_EXTERN napi_status napi_is_error(napi_env env, napi_value value, From 99216f45690d54b0a18e3ed7d3ba8fa7ee889386 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:46:21 -0500 Subject: [PATCH 12/16] Update src/js_native_api.h --- src/js_native_api.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 7e0c342d68a1b4..3610d989f113a9 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -378,8 +378,8 @@ NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, const char* msg); #ifdef NAPI_EXPERIMENTAL NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, - const char* code, - const char* msg); + const char* code, + const char* msg); #endif // NAPI_EXPERIMENTAL NAPI_EXTERN napi_status napi_is_error(napi_env env, napi_value value, From 606cc0b34cfa55e4b6069867f13636bd43e6a05c Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:47:47 -0500 Subject: [PATCH 13/16] Update src/js_native_api.h --- src/js_native_api.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 3610d989f113a9..d72e7f4e997270 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -378,8 +378,8 @@ NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, const char* msg); #ifdef NAPI_EXPERIMENTAL NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, - const char* code, - const char* msg); + const char* code, + const char* msg); #endif // NAPI_EXPERIMENTAL NAPI_EXTERN napi_status napi_is_error(napi_env env, napi_value value, From f2c8ad6423b0df6e9d17134dc1fb5baa6e92df57 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:49:37 -0500 Subject: [PATCH 14/16] Update src/js_native_api_v8.cc --- src/js_native_api_v8.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 8317988b128394..e65c6a1a7425d9 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1748,9 +1748,9 @@ napi_status napi_create_range_error(napi_env env, } napi_status node_api_create_syntax_error(napi_env env, - napi_value code, - napi_value msg, - napi_value* result) { + napi_value code, + napi_value msg, + napi_value* result) { CHECK_ENV(env); CHECK_ARG(env, msg); CHECK_ARG(env, result); From a8906c49f21fdcf04d602ce572a15043874bd12b Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 09:50:58 -0500 Subject: [PATCH 15/16] Update src/js_native_api_v8.cc --- src/js_native_api_v8.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index e65c6a1a7425d9..9dfc8d1ae2ae92 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1985,8 +1985,8 @@ napi_status napi_throw_range_error(napi_env env, } napi_status node_api_throw_syntax_error(napi_env env, - const char* code, - const char* msg) { + const char* code, + const char* msg) { NAPI_PREAMBLE(env); v8::Isolate* isolate = env->isolate; From 8c2a1b312f317de35b196ef3fc3f84d39c8f8709 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 15 Nov 2021 11:30:56 -0500 Subject: [PATCH 16/16] squash: run make format -md Signed-off-by: Michael Dawson --- doc/api/n-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/n-api.md b/doc/api/n-api.md index d3b7547560b5ed..8356c00cd2e6aa 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1185,7 +1185,7 @@ This API throws a JavaScript `RangeError` with the text provided. added: REPLACEME --> -```c +````c NAPI_EXTERN napi_status node_api_throw_syntax_error(napi_env env, const char* code, const char* msg); @@ -1209,7 +1209,7 @@ napiVersion: 1 NAPI_EXTERN napi_status napi_is_error(napi_env env, napi_value value, bool* result); -``` +```` * `[in] env`: The environment that the API is invoked under. * `[in] value`: The `napi_value` to be checked.