0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00

n-api: add napi_fatal_error API

PR-URL: https://github.com/nodejs/node/pull/13971
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jason Ginchereau <jasongin@microsoft.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
This commit is contained in:
Kyle Farnung 2017-06-27 17:54:44 -07:00 committed by Michael Dawson
parent a74ddff1d9
commit 73078d6072
6 changed files with 75 additions and 0 deletions

View File

@ -533,6 +533,23 @@ Returns `napi_ok` if the API succeeded.
This API returns true if an exception is pending.
### Fatal Errors
In the event of an unrecoverable error in a native module, a fatal error can be
thrown to immediately terminate the process.
#### napi_fatal_error
<!-- YAML
added: REPLACEME
-->
```C
NAPI_EXTERN NAPI_NO_RETURN void napi_fatal_error(const char* location, const char* message);
```
- `[in] location`: Optional location at which the error occurred.
- `[in] message`: The message associated with the error.
The function call does not return, the process will be terminated.
## Object Lifetime management

View File

@ -823,6 +823,11 @@ napi_status napi_get_last_error_info(napi_env env,
return napi_ok;
}
NAPI_NO_RETURN void napi_fatal_error(const char* location,
const char* message) {
node::FatalError(location, message);
}
napi_status napi_create_function(napi_env env,
const char* utf8name,
napi_callback cb,

View File

@ -37,6 +37,12 @@
# define NAPI_MODULE_EXPORT __attribute__((visibility("default")))
#endif
#ifdef __GNUC__
#define NAPI_NO_RETURN __attribute__((noreturn))
#else
#define NAPI_NO_RETURN
#endif
typedef void (*napi_addon_register_func)(napi_env env,
napi_value exports,
@ -104,6 +110,9 @@ NAPI_EXTERN napi_status
napi_get_last_error_info(napi_env env,
const napi_extended_error_info** result);
NAPI_EXTERN NAPI_NO_RETURN void napi_fatal_error(const char* location,
const char* message);
// Getters for defined singletons
NAPI_EXTERN napi_status napi_get_undefined(napi_env env, napi_value* result);
NAPI_EXTERN napi_status napi_get_null(napi_env env, napi_value* result);

View File

@ -0,0 +1,8 @@
{
"targets": [
{
"target_name": "test_fatal",
"sources": [ "test_fatal.c" ]
}
]
}

View File

@ -0,0 +1,18 @@
'use strict';
const common = require('../../common');
const assert = require('assert');
const child_process = require('child_process');
const test_fatal = require(`./build/${common.buildType}/test_fatal`);
// Test in a child process because the test code will trigger a fatal error
// that crashes the process.
if (process.argv[2] === 'child') {
test_fatal.Test();
return;
}
const p = child_process.spawnSync(
process.execPath, [ '--napi-modules', __filename, 'child' ]);
assert.ifError(p.error);
assert.ok(p.stderr.toString().includes(
'FATAL ERROR: test_fatal::Test fatal message'));

View File

@ -0,0 +1,18 @@
#include <node_api.h>
#include "../common.h"
napi_value Test(napi_env env, napi_callback_info info) {
napi_fatal_error("test_fatal::Test", "fatal message");
return NULL;
}
void Init(napi_env env, napi_value exports, napi_value module, void* priv) {
napi_property_descriptor properties[] = {
DECLARE_NAPI_PROPERTY("Test", Test),
};
NAPI_CALL_RETURN_VOID(env, napi_define_properties(
env, exports, sizeof(properties) / sizeof(*properties), properties));
}
NAPI_MODULE(addon, Init)