Skip to content

Commit 8b4551b

Browse files
authored
enable uncaught exceptions policy by default (#81)
1 parent f04d9ed commit 8b4551b

8 files changed

Lines changed: 164 additions & 97 deletions

File tree

packages/runtime/src/env.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ export class NodeEnv extends Env {
250250
}
251251
const hasProcess = typeof process === 'object' && process !== null
252252
const hasForceFlag = hasProcess ? Boolean(process.execArgv && (process.execArgv.indexOf('--force-node-api-uncaught-exceptions-policy') !== -1)) : false
253-
if (!hasForceFlag && !enforceUncaughtExceptionPolicy) {
253+
if (envObject.moduleApiVersion < NAPI_VERSION_EXPERIMENTAL && !hasForceFlag && !enforceUncaughtExceptionPolicy) {
254254
const warn = hasProcess && typeof process.emitWarning === 'function'
255255
? process.emitWarning
256256
: function (warning: string | Error, type?: string, code?: string) {

packages/test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ add_test("dataview" "./dataview/binding.c" OFF)
278278
add_test("date" "./date/binding.c" OFF)
279279
add_test("error" "./error/binding.c" OFF)
280280
add_test("exception" "./exception/binding.c" OFF)
281+
add_test("ref_finalizer" "./ref_finalizer/binding.c" OFF)
281282
add_test("ref" "./ref/binding.c" OFF)
282283
add_test("ref_double_free" "./ref_double_free/binding.c" OFF)
283284
add_test("function" "./function/binding.c" OFF)
@@ -287,6 +288,7 @@ add_test("number" "./number/binding.c;./number/test_null.c" OFF)
287288
add_test("symbol" "./symbol/binding.c" OFF)
288289
add_test("typedarray" "./typedarray/binding.c" OFF)
289290
add_test("buffer" "./buffer/binding.c" OFF)
291+
add_test("buffer_finalizer" "./buffer_finalizer/binding.c" OFF)
290292
add_test("fatal_exception" "./fatal_exception/binding.c" OFF)
291293
add_test("cleanup_hook" "./cleanup_hook/binding.c" OFF)
292294

packages/test/buffer/binding.c

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,6 @@ static void noopDeleter(napi_env env, void* data, void* finalize_hint) {
5252
deleterCallCount++;
5353
}
5454

55-
static void malignDeleter(napi_env env, void* data, void* finalize_hint) {
56-
NODE_API_ASSERT_RETURN_VOID(env, data != NULL && strcmp(data, theText) == 0, "invalid data");
57-
napi_ref finalizer_ref = (napi_ref)finalize_hint;
58-
napi_value js_finalizer;
59-
napi_value recv;
60-
NODE_API_CALL_RETURN_VOID(env, napi_get_reference_value(env, finalizer_ref, &js_finalizer));
61-
NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv));
62-
NODE_API_CALL_RETURN_VOID(env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL));
63-
NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref));
64-
}
65-
6655
static napi_value newBuffer(napi_env env, napi_callback_info info) {
6756
napi_value theBuffer;
6857
char* theCopy;
@@ -150,30 +139,6 @@ static napi_value staticBuffer(napi_env env, napi_callback_info info) {
150139
return theBuffer;
151140
}
152141

153-
static napi_value malignFinalizerBuffer(napi_env env, napi_callback_info info) {
154-
size_t argc = 1;
155-
napi_value args[1];
156-
NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
157-
NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
158-
napi_value finalizer = args[0];
159-
napi_valuetype finalizer_valuetype;
160-
NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype));
161-
NODE_API_ASSERT(env, finalizer_valuetype == napi_function, "Wrong type of first argument");
162-
napi_ref finalizer_ref;
163-
NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref));
164-
165-
napi_value theBuffer;
166-
NODE_API_CALL(
167-
env,
168-
napi_create_external_buffer(env,
169-
sizeof(theText),
170-
(void*)theText,
171-
malignDeleter,
172-
finalizer_ref, // finalize_hint
173-
&theBuffer));
174-
return theBuffer;
175-
}
176-
177142
static napi_value getMemoryDataAsArray(napi_env env, napi_callback_info info) {
178143
size_t argc = 1;
179144
napi_value args[1];
@@ -224,7 +189,6 @@ static napi_value Init(napi_env env, napi_value exports) {
224189
DECLARE_NODE_API_PROPERTY("bufferHasInstance", bufferHasInstance),
225190
DECLARE_NODE_API_PROPERTY("bufferInfo", bufferInfo),
226191
DECLARE_NODE_API_PROPERTY("staticBuffer", staticBuffer),
227-
DECLARE_NODE_API_PROPERTY("malignFinalizerBuffer", malignFinalizerBuffer),
228192
DECLARE_NODE_API_PROPERTY("getMemoryDataAsArray", getMemoryDataAsArray),
229193
};
230194

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <node_api.h>
2+
// #include <stdlib.h>
3+
#include "../common.h"
4+
5+
#if !defined(__wasm__) || (defined(__EMSCRIPTEN__) || defined(__wasi__))
6+
#include <string.h>
7+
#else
8+
int strcmp(const char *l, const char *r) {
9+
for (; *l==*r && *l; l++, r++);
10+
return *(unsigned char *)l - *(unsigned char *)r;
11+
}
12+
#endif
13+
14+
static const char theText[] =
15+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
16+
17+
static void malignDeleter(napi_env env, void* data, void* finalize_hint) {
18+
NODE_API_ASSERT_RETURN_VOID(
19+
env, data != NULL && strcmp(data, theText) == 0, "invalid data");
20+
napi_ref finalizer_ref = (napi_ref)finalize_hint;
21+
napi_value js_finalizer;
22+
napi_value recv;
23+
NODE_API_CALL_RETURN_VOID(
24+
env, napi_get_reference_value(env, finalizer_ref, &js_finalizer));
25+
NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv));
26+
NODE_API_CALL_RETURN_VOID(
27+
env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL));
28+
NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref));
29+
}
30+
31+
static napi_value malignFinalizerBuffer(napi_env env, napi_callback_info info) {
32+
size_t argc = 1;
33+
napi_value args[1];
34+
NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
35+
NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
36+
napi_value finalizer = args[0];
37+
napi_valuetype finalizer_valuetype;
38+
NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype));
39+
NODE_API_ASSERT(env,
40+
finalizer_valuetype == napi_function,
41+
"Wrong type of first argument");
42+
napi_ref finalizer_ref;
43+
NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref));
44+
45+
napi_value theBuffer;
46+
NODE_API_CALL(env,
47+
napi_create_external_buffer(env,
48+
sizeof(theText),
49+
(void*)theText,
50+
malignDeleter,
51+
finalizer_ref, // finalize_hint
52+
&theBuffer));
53+
return theBuffer;
54+
}
55+
56+
static napi_value Init(napi_env env, napi_value exports) {
57+
napi_property_descriptor methods[] = {
58+
DECLARE_NODE_API_PROPERTY("malignFinalizerBuffer", malignFinalizerBuffer),
59+
};
60+
61+
NODE_API_CALL(
62+
env,
63+
napi_define_properties(
64+
env, exports, sizeof(methods) / sizeof(methods[0]), methods));
65+
66+
return exports;
67+
}
68+
69+
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

packages/test/buffer/buffer.finalizer.test.js renamed to packages/test/buffer_finalizer/buffer_finalizer.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ process.on('uncaughtException', common.mustCall((err) => {
1010
}))
1111

1212
async function main () {
13-
const binding = await load('buffer')
13+
const binding = await load('buffer_finalizer')
1414

1515
await (async function () {
1616
// eslint-disable-next-line no-lone-blocks

packages/test/ref/binding.c

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,6 @@ static void FinalizeExternal(napi_env env, void* data, void* hint) {
2525
finalize_count++;
2626
}
2727

28-
static void FinalizeExternalCallJs(napi_env env, void* data, void* hint) {
29-
int *actual_value = data;
30-
NODE_API_ASSERT_RETURN_VOID(env, actual_value == &test_value,
31-
"The correct pointer was passed to the finalizer");
32-
33-
napi_ref finalizer_ref = (napi_ref)hint;
34-
napi_value js_finalizer;
35-
napi_value recv;
36-
NODE_API_CALL_RETURN_VOID(env, napi_get_reference_value(env, finalizer_ref, &js_finalizer));
37-
NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv));
38-
NODE_API_CALL_RETURN_VOID(env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL));
39-
NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref));
40-
}
41-
4228
static napi_value CreateExternal(napi_env env, napi_callback_info info) {
4329
int* data = &test_value;
4430

@@ -117,31 +103,6 @@ CreateExternalWithFinalize(napi_env env, napi_callback_info info) {
117103
return result;
118104
}
119105

120-
static napi_value
121-
CreateExternalWithJsFinalize(napi_env env, napi_callback_info info) {
122-
size_t argc = 1;
123-
napi_value args[1];
124-
NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
125-
NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
126-
napi_value finalizer = args[0];
127-
napi_valuetype finalizer_valuetype;
128-
NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype));
129-
NODE_API_ASSERT(env, finalizer_valuetype == napi_function, "Wrong type of first argument");
130-
napi_ref finalizer_ref;
131-
NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref));
132-
133-
napi_value result;
134-
NODE_API_CALL(env,
135-
napi_create_external(env,
136-
&test_value,
137-
FinalizeExternalCallJs,
138-
finalizer_ref, /* finalize_hint */
139-
&result));
140-
141-
finalize_count = 0;
142-
return result;
143-
}
144-
145106
static napi_value CheckExternal(napi_env env, napi_callback_info info) {
146107
size_t argc = 1;
147108
napi_value arg;
@@ -262,24 +223,24 @@ static napi_value ValidateDeleteBeforeFinalize(napi_env env, napi_callback_info
262223
EXTERN_C_START
263224
napi_value Init(napi_env env, napi_value exports) {
264225
napi_property_descriptor descriptors[] = {
265-
DECLARE_NODE_API_GETTER("finalizeCount", GetFinalizeCount),
266-
DECLARE_NODE_API_PROPERTY("createExternal", CreateExternal),
267-
DECLARE_NODE_API_PROPERTY("createExternalWithFinalize",
268-
CreateExternalWithFinalize),
269-
DECLARE_NODE_API_PROPERTY("createExternalWithJsFinalize",
270-
CreateExternalWithJsFinalize),
271-
DECLARE_NODE_API_PROPERTY("checkExternal", CheckExternal),
272-
DECLARE_NODE_API_PROPERTY("createReference", CreateReference),
273-
DECLARE_NODE_API_PROPERTY("createSymbol", CreateSymbol),
274-
DECLARE_NODE_API_PROPERTY("createSymbolFor", CreateSymbolFor),
275-
DECLARE_NODE_API_PROPERTY("createSymbolForEmptyString", CreateSymbolForEmptyString),
276-
DECLARE_NODE_API_PROPERTY("createSymbolForIncorrectLength", CreateSymbolForIncorrectLength),
277-
DECLARE_NODE_API_PROPERTY("deleteReference", DeleteReference),
278-
DECLARE_NODE_API_PROPERTY("incrementRefcount", IncrementRefcount),
279-
DECLARE_NODE_API_PROPERTY("decrementRefcount", DecrementRefcount),
280-
DECLARE_NODE_API_GETTER("referenceValue", GetReferenceValue),
281-
DECLARE_NODE_API_PROPERTY("validateDeleteBeforeFinalize",
282-
ValidateDeleteBeforeFinalize),
226+
DECLARE_NODE_API_GETTER("finalizeCount", GetFinalizeCount),
227+
DECLARE_NODE_API_PROPERTY("createExternal", CreateExternal),
228+
DECLARE_NODE_API_PROPERTY("createExternalWithFinalize",
229+
CreateExternalWithFinalize),
230+
DECLARE_NODE_API_PROPERTY("checkExternal", CheckExternal),
231+
DECLARE_NODE_API_PROPERTY("createReference", CreateReference),
232+
DECLARE_NODE_API_PROPERTY("createSymbol", CreateSymbol),
233+
DECLARE_NODE_API_PROPERTY("createSymbolFor", CreateSymbolFor),
234+
DECLARE_NODE_API_PROPERTY("createSymbolForEmptyString",
235+
CreateSymbolForEmptyString),
236+
DECLARE_NODE_API_PROPERTY("createSymbolForIncorrectLength",
237+
CreateSymbolForIncorrectLength),
238+
DECLARE_NODE_API_PROPERTY("deleteReference", DeleteReference),
239+
DECLARE_NODE_API_PROPERTY("incrementRefcount", IncrementRefcount),
240+
DECLARE_NODE_API_PROPERTY("decrementRefcount", DecrementRefcount),
241+
DECLARE_NODE_API_GETTER("referenceValue", GetReferenceValue),
242+
DECLARE_NODE_API_PROPERTY("validateDeleteBeforeFinalize",
243+
ValidateDeleteBeforeFinalize),
283244
};
284245

285246
NODE_API_CALL(env, napi_define_properties(
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// #include <assert.h>
2+
#include <js_native_api.h>
3+
// #include <stdlib.h>
4+
#include "../common.h"
5+
#include "../entry_point.h"
6+
7+
static int test_value = 1;
8+
static int finalize_count = 0;
9+
10+
static void FinalizeExternalCallJs(napi_env env, void* data, void* hint) {
11+
int* actual_value = data;
12+
NODE_API_ASSERT_RETURN_VOID(
13+
env,
14+
actual_value == &test_value,
15+
"The correct pointer was passed to the finalizer");
16+
17+
napi_ref finalizer_ref = (napi_ref)hint;
18+
napi_value js_finalizer;
19+
napi_value recv;
20+
NODE_API_CALL_RETURN_VOID(
21+
env, napi_get_reference_value(env, finalizer_ref, &js_finalizer));
22+
NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv));
23+
NODE_API_CALL_RETURN_VOID(
24+
env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL));
25+
NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref));
26+
}
27+
28+
static napi_value CreateExternalWithJsFinalize(napi_env env,
29+
napi_callback_info info) {
30+
size_t argc = 1;
31+
napi_value args[1];
32+
NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
33+
NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
34+
napi_value finalizer = args[0];
35+
napi_valuetype finalizer_valuetype;
36+
NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype));
37+
NODE_API_ASSERT(env,
38+
finalizer_valuetype == napi_function,
39+
"Wrong type of first argument");
40+
napi_ref finalizer_ref;
41+
NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref));
42+
43+
napi_value result;
44+
NODE_API_CALL(env,
45+
napi_create_external(env,
46+
&test_value,
47+
FinalizeExternalCallJs,
48+
finalizer_ref, /* finalize_hint */
49+
&result));
50+
51+
finalize_count = 0;
52+
return result;
53+
}
54+
55+
EXTERN_C_START
56+
napi_value Init(napi_env env, napi_value exports) {
57+
napi_property_descriptor descriptors[] = {
58+
DECLARE_NODE_API_PROPERTY("createExternalWithJsFinalize",
59+
CreateExternalWithJsFinalize),
60+
};
61+
62+
NODE_API_CALL(
63+
env,
64+
napi_define_properties(env,
65+
exports,
66+
sizeof(descriptors) / sizeof(*descriptors),
67+
descriptors));
68+
69+
return exports;
70+
}
71+
EXTERN_C_END

packages/test/ref/ref_finalizer.test.js renamed to packages/test/ref_finalizer/ref_finalizer.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ module.exports = new Promise((resolve) => {
2121
})
2222

2323
const p2 = new Promise((resolve, reject) => {
24-
load('ref').then((test_reference) => {
24+
load('ref_finalizer').then((binding) => {
2525
{
26-
test_reference.createExternalWithJsFinalize(
26+
binding.createExternalWithJsFinalize(
2727
common.mustCall(() => {
2828
throw new Error('finalizer error')
2929
}))

0 commit comments

Comments
 (0)