Skip to content

Commit 747b7b1

Browse files
Update headers from nodejs/node tag v21.6.0 (#36)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent f62bc5c commit 747b7b1

File tree

3 files changed

+76
-33
lines changed

3 files changed

+76
-33
lines changed

include/js_native_api.h

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545

4646
EXTERN_C_START
4747

48-
NAPI_EXTERN napi_status NAPI_CDECL
49-
napi_get_last_error_info(napi_env env, const napi_extended_error_info** result);
48+
NAPI_EXTERN napi_status NAPI_CDECL napi_get_last_error_info(
49+
node_api_nogc_env env, const napi_extended_error_info** result);
5050

5151
// Getters for defined singletons
5252
NAPI_EXTERN napi_status NAPI_CDECL napi_get_undefined(napi_env env,
@@ -267,7 +267,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_instanceof(napi_env env,
267267

268268
// Gets all callback info in a single call. (Ugly, but faster.)
269269
NAPI_EXTERN napi_status NAPI_CDECL napi_get_cb_info(
270-
napi_env env, // [in] NAPI environment handle
270+
napi_env env, // [in] Node-API environment handle
271271
napi_callback_info cbinfo, // [in] Opaque callback-info handle
272272
size_t* argc, // [in-out] Specifies the size of the provided argv array
273273
// and receives the actual count of args.
@@ -291,7 +291,7 @@ napi_define_class(napi_env env,
291291
NAPI_EXTERN napi_status NAPI_CDECL napi_wrap(napi_env env,
292292
napi_value js_object,
293293
void* native_object,
294-
napi_finalize finalize_cb,
294+
node_api_nogc_finalize finalize_cb,
295295
void* finalize_hint,
296296
napi_ref* result);
297297
NAPI_EXTERN napi_status NAPI_CDECL napi_unwrap(napi_env env,
@@ -303,7 +303,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_remove_wrap(napi_env env,
303303
NAPI_EXTERN napi_status NAPI_CDECL
304304
napi_create_external(napi_env env,
305305
void* data,
306-
napi_finalize finalize_cb,
306+
node_api_nogc_finalize finalize_cb,
307307
void* finalize_hint,
308308
napi_value* result);
309309
NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_external(napi_env env,
@@ -402,7 +402,7 @@ NAPI_EXTERN napi_status NAPI_CDECL
402402
napi_create_external_arraybuffer(napi_env env,
403403
void* external_data,
404404
size_t byte_length,
405-
napi_finalize finalize_cb,
405+
node_api_nogc_finalize finalize_cb,
406406
void* finalize_hint,
407407
napi_value* result);
408408
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
@@ -444,7 +444,7 @@ napi_get_dataview_info(napi_env env,
444444
size_t* byte_offset);
445445

446446
// version management
447-
NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(napi_env env,
447+
NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_nogc_env env,
448448
uint32_t* result);
449449

450450
// Promises
@@ -468,7 +468,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_run_script(napi_env env,
468468

469469
// Memory management
470470
NAPI_EXTERN napi_status NAPI_CDECL napi_adjust_external_memory(
471-
napi_env env, int64_t change_in_bytes, int64_t* adjusted_value);
471+
node_api_nogc_env env, int64_t change_in_bytes, int64_t* adjusted_value);
472472

473473
#if NAPI_VERSION >= 5
474474

@@ -486,12 +486,13 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_get_date_value(napi_env env,
486486
double* result);
487487

488488
// Add finalizer for pointer
489-
NAPI_EXTERN napi_status NAPI_CDECL napi_add_finalizer(napi_env env,
490-
napi_value js_object,
491-
void* finalize_data,
492-
napi_finalize finalize_cb,
493-
void* finalize_hint,
494-
napi_ref* result);
489+
NAPI_EXTERN napi_status NAPI_CDECL
490+
napi_add_finalizer(napi_env env,
491+
napi_value js_object,
492+
void* finalize_data,
493+
node_api_nogc_finalize finalize_cb,
494+
void* finalize_hint,
495+
napi_ref* result);
495496

496497
#endif // NAPI_VERSION >= 5
497498

@@ -533,10 +534,13 @@ napi_get_all_property_names(napi_env env,
533534
napi_value* result);
534535

535536
// Instance data
536-
NAPI_EXTERN napi_status NAPI_CDECL napi_set_instance_data(
537-
napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint);
537+
NAPI_EXTERN napi_status NAPI_CDECL
538+
napi_set_instance_data(node_api_nogc_env env,
539+
void* data,
540+
napi_finalize finalize_cb,
541+
void* finalize_hint);
538542

539-
NAPI_EXTERN napi_status NAPI_CDECL napi_get_instance_data(napi_env env,
543+
NAPI_EXTERN napi_status NAPI_CDECL napi_get_instance_data(node_api_nogc_env env,
540544
void** data);
541545
#endif // NAPI_VERSION >= 6
542546

include/js_native_api_types.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,35 @@ typedef uint16_t char16_t;
2222
// JSVM API types are all opaque pointers for ABI stability
2323
// typedef undefined structs instead of void* for compile time type safety
2424
typedef struct napi_env__* napi_env;
25+
26+
// We need to mark APIs which can be called during garbage collection (GC),
27+
// meaning that they do not affect the state of the JS engine, and can
28+
// therefore be called synchronously from a finalizer that itself runs
29+
// synchronously during GC. Such APIs can receive either a `napi_env` or a
30+
// `node_api_nogc_env` as their first parameter, because we should be able to
31+
// also call them during normal, non-garbage-collecting operations, whereas
32+
// APIs that affect the state of the JS engine can only receive a `napi_env` as
33+
// their first parameter, because we must not call them during GC. In lieu of
34+
// inheritance, we use the properties of the const qualifier to accomplish
35+
// this, because both a const and a non-const value can be passed to an API
36+
// expecting a const value, but only a non-const value can be passed to an API
37+
// expecting a non-const value.
38+
//
39+
// In conjunction with appropriate CFLAGS to warn us if we're passing a const
40+
// (nogc) environment into an API that expects a non-const environment, and the
41+
// definition of nogc finalizer function pointer types below, which receive a
42+
// nogc environment as their first parameter, and can thus only call nogc APIs
43+
// (unless the user explicitly casts the environment), we achieve the ability
44+
// to ensure at compile time that we do not call APIs that affect the state of
45+
// the JS engine from a synchronous (nogc) finalizer.
46+
#if !defined(NAPI_EXPERIMENTAL) || \
47+
(defined(NAPI_EXPERIMENTAL) && \
48+
defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT))
49+
typedef struct napi_env__* node_api_nogc_env;
50+
#else
51+
typedef const struct napi_env__* node_api_nogc_env;
52+
#endif
53+
2554
typedef struct napi_value__* napi_value;
2655
typedef struct napi_ref__* napi_ref;
2756
typedef struct napi_handle_scope__* napi_handle_scope;
@@ -116,6 +145,16 @@ typedef void(NAPI_CDECL* napi_finalize)(napi_env env,
116145
void* finalize_data,
117146
void* finalize_hint);
118147

148+
#if !defined(NAPI_EXPERIMENTAL) || \
149+
(defined(NAPI_EXPERIMENTAL) && \
150+
defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT))
151+
typedef napi_finalize node_api_nogc_finalize;
152+
#else
153+
typedef void(NAPI_CDECL* node_api_nogc_finalize)(node_api_nogc_env env,
154+
void* finalize_data,
155+
void* finalize_hint);
156+
#endif
157+
119158
typedef struct {
120159
// One of utf8name or name should be NULL.
121160
const char* utf8name;

include/node_api.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ NAPI_EXTERN napi_status NAPI_CDECL
131131
napi_create_external_buffer(napi_env env,
132132
size_t length,
133133
void* data,
134-
napi_finalize finalize_cb,
134+
node_api_nogc_finalize finalize_cb,
135135
void* finalize_hint,
136136
napi_value* result);
137137
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
@@ -159,20 +159,20 @@ napi_create_async_work(napi_env env,
159159
napi_async_work* result);
160160
NAPI_EXTERN napi_status NAPI_CDECL napi_delete_async_work(napi_env env,
161161
napi_async_work work);
162-
NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(napi_env env,
162+
NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(node_api_nogc_env env,
163163
napi_async_work work);
164-
NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(napi_env env,
164+
NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(node_api_nogc_env env,
165165
napi_async_work work);
166166

167167
// version management
168168
NAPI_EXTERN napi_status NAPI_CDECL
169-
napi_get_node_version(napi_env env, const napi_node_version** version);
169+
napi_get_node_version(node_api_nogc_env env, const napi_node_version** version);
170170

171171
#if NAPI_VERSION >= 2
172172

173173
// Return the current libuv event loop for a given environment
174174
NAPI_EXTERN napi_status NAPI_CDECL
175-
napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop);
175+
napi_get_uv_event_loop(node_api_nogc_env env, struct uv_loop_s** loop);
176176

177177
#endif // NAPI_VERSION >= 2
178178

@@ -181,11 +181,11 @@ napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop);
181181
NAPI_EXTERN napi_status NAPI_CDECL napi_fatal_exception(napi_env env,
182182
napi_value err);
183183

184-
NAPI_EXTERN napi_status NAPI_CDECL
185-
napi_add_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg);
184+
NAPI_EXTERN napi_status NAPI_CDECL napi_add_env_cleanup_hook(
185+
node_api_nogc_env env, napi_cleanup_hook fun, void* arg);
186186

187-
NAPI_EXTERN napi_status NAPI_CDECL
188-
napi_remove_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg);
187+
NAPI_EXTERN napi_status NAPI_CDECL napi_remove_env_cleanup_hook(
188+
node_api_nogc_env env, napi_cleanup_hook fun, void* arg);
189189

190190
NAPI_EXTERN napi_status NAPI_CDECL
191191
napi_open_callback_scope(napi_env env,
@@ -209,7 +209,7 @@ napi_create_threadsafe_function(napi_env env,
209209
size_t max_queue_size,
210210
size_t initial_thread_count,
211211
void* thread_finalize_data,
212-
napi_finalize thread_finalize_cb,
212+
node_api_nogc_finalize thread_finalize_cb,
213213
void* context,
214214
napi_threadsafe_function_call_js call_js_cb,
215215
napi_threadsafe_function* result);
@@ -228,18 +228,18 @@ napi_acquire_threadsafe_function(napi_threadsafe_function func);
228228
NAPI_EXTERN napi_status NAPI_CDECL napi_release_threadsafe_function(
229229
napi_threadsafe_function func, napi_threadsafe_function_release_mode mode);
230230

231-
NAPI_EXTERN napi_status NAPI_CDECL
232-
napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func);
231+
NAPI_EXTERN napi_status NAPI_CDECL napi_unref_threadsafe_function(
232+
node_api_nogc_env env, napi_threadsafe_function func);
233233

234-
NAPI_EXTERN napi_status NAPI_CDECL
235-
napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func);
234+
NAPI_EXTERN napi_status NAPI_CDECL napi_ref_threadsafe_function(
235+
node_api_nogc_env env, napi_threadsafe_function func);
236236

237237
#endif // NAPI_VERSION >= 4
238238

239239
#if NAPI_VERSION >= 8
240240

241241
NAPI_EXTERN napi_status NAPI_CDECL
242-
napi_add_async_cleanup_hook(napi_env env,
242+
napi_add_async_cleanup_hook(node_api_nogc_env env,
243243
napi_async_cleanup_hook hook,
244244
void* arg,
245245
napi_async_cleanup_hook_handle* remove_handle);
@@ -252,7 +252,7 @@ napi_remove_async_cleanup_hook(napi_async_cleanup_hook_handle remove_handle);
252252
#if NAPI_VERSION >= 9
253253

254254
NAPI_EXTERN napi_status NAPI_CDECL
255-
node_api_get_module_file_name(napi_env env, const char** result);
255+
node_api_get_module_file_name(node_api_nogc_env env, const char** result);
256256

257257
#endif // NAPI_VERSION >= 9
258258

0 commit comments

Comments
 (0)