|
6 | 6 | static void Finalize(napi_env env, void* data, void* hint) {
|
7 | 7 | napi_value global, set_timeout;
|
8 | 8 | napi_ref* ref = data;
|
| 9 | + |
| 10 | + NODE_API_NOGC_ASSERT_RETURN_VOID( |
| 11 | + napi_delete_reference(env, *ref) == napi_ok, |
| 12 | + "deleting reference in finalizer should succeed"); |
| 13 | + NODE_API_NOGC_ASSERT_RETURN_VOID( |
| 14 | + napi_get_global(env, &global) == napi_ok, |
| 15 | + "getting global reference in finalizer should succeed"); |
| 16 | + napi_status result = |
| 17 | + napi_get_named_property(env, global, "setTimeout", &set_timeout); |
| 18 | + |
| 19 | + // The finalizer could be invoked either from check callbacks (as native |
| 20 | + // immediates) if the event loop is still running (where napi_ok is returned) |
| 21 | + // or during environment shutdown (where napi_cannot_run_js or |
| 22 | + // napi_pending_exception is returned). This is not deterministic from |
| 23 | + // the point of view of the addon. |
| 24 | + |
9 | 25 | #ifdef NAPI_EXPERIMENTAL
|
10 |
| - napi_status expected_status = napi_cannot_run_js; |
| 26 | + NODE_API_NOGC_ASSERT_RETURN_VOID( |
| 27 | + result == napi_cannot_run_js || result == napi_ok, |
| 28 | + "getting named property from global in finalizer should succeed " |
| 29 | + "or return napi_cannot_run_js"); |
11 | 30 | #else
|
12 |
| - napi_status expected_status = napi_pending_exception; |
| 31 | + NODE_API_NOGC_ASSERT_RETURN_VOID( |
| 32 | + result == napi_pending_exception || result == napi_ok, |
| 33 | + "getting named property from global in finalizer should succeed " |
| 34 | + "or return napi_pending_exception"); |
13 | 35 | #endif // NAPI_EXPERIMENTAL
|
14 |
| - |
15 |
| - if (napi_delete_reference(env, *ref) != napi_ok) abort(); |
16 |
| - if (napi_get_global(env, &global) != napi_ok) abort(); |
17 |
| - if (napi_get_named_property(env, global, "setTimeout", &set_timeout) != |
18 |
| - expected_status) |
19 |
| - abort(); |
20 | 36 | free(ref);
|
21 | 37 | }
|
22 | 38 |
|
|
0 commit comments