From 4dbd8938298bd7a60dd9a05beb80a7ee3a67f60e Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Sun, 6 Aug 2023 01:51:19 +0800 Subject: [PATCH 1/5] node-api: update headers for better wasm support --- src/js_native_api.h | 8 +++++++- src/node_api.h | 30 ++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 3aa0ee5c1c5c5c..2950f0c0565a3d 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -28,10 +28,16 @@ #ifndef NAPI_EXTERN #ifdef _WIN32 #define NAPI_EXTERN __declspec(dllexport) -#elif defined(__wasm32__) +#elif defined(__wasm__) +#ifdef __EMSCRIPTEN__ +#define NAPI_EXTERN \ + __attribute__((visibility("default"))) \ + __attribute__((__import_module__("env"))) +#else #define NAPI_EXTERN \ __attribute__((visibility("default"))) \ __attribute__((__import_module__("napi"))) +#endif #else #define NAPI_EXTERN __attribute__((visibility("default"))) #endif diff --git a/src/node_api.h b/src/node_api.h index 27acc6a0df43be..dd83bafd79fe95 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -5,20 +5,38 @@ #ifdef _WIN32 // Building native addon against node #define NAPI_EXTERN __declspec(dllimport) -#elif defined(__wasm32__) +#elif defined(__wasm__) +#ifdef __EMSCRIPTEN__ +#define NAPI_EXTERN __attribute__((__import_module__("env"))) +#else #define NAPI_EXTERN __attribute__((__import_module__("napi"))) #endif #endif +#endif #include "js_native_api.h" #include "node_api_types.h" +// See https://github.com/nodejs/node-addon-api/pull/1283 +#ifndef NAPI_HAS_THREADS +#if !defined(__wasm__) || (defined(__EMSCRIPTEN_PTHREADS__) || \ + (defined(__wasi__) && defined(_REENTRANT))) +#define NAPI_HAS_THREADS 1 +#else +#define NAPI_HAS_THREADS 0 +#endif +#endif + struct uv_loop_s; // Forward declaration. #ifdef _WIN32 #define NAPI_MODULE_EXPORT __declspec(dllexport) #else +#ifdef __EMSCRIPTEN__ +#define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) __attribute__((used)) +#else #define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) #endif +#endif #if defined(__GNUC__) #define NAPI_NO_RETURN __attribute__((noreturn)) @@ -49,7 +67,7 @@ typedef struct napi_module { NAPI_MODULE_INITIALIZER_X_HELPER(base, version) #define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version -#ifdef __wasm32__ +#ifdef __wasm__ #define NAPI_MODULE_INITIALIZER_BASE napi_register_wasm_v #else #define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v @@ -143,7 +161,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_get_buffer_info(napi_env env, void** data, size_t* length); -#ifndef __wasm32__ +#if NAPI_HAS_THREADS // Methods to manage simple async operations NAPI_EXTERN napi_status NAPI_CDECL napi_create_async_work(napi_env env, @@ -159,7 +177,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(napi_env env, napi_async_work work); NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(napi_env env, napi_async_work work); -#endif // __wasm32__ +#endif // NAPI_HAS_THREADS // version management NAPI_EXTERN napi_status NAPI_CDECL @@ -197,7 +215,7 @@ napi_close_callback_scope(napi_env env, napi_callback_scope scope); #if NAPI_VERSION >= 4 -#ifndef __wasm32__ +#if NAPI_HAS_THREADS // Calling into JS from other threads NAPI_EXTERN napi_status NAPI_CDECL napi_create_threadsafe_function(napi_env env, @@ -231,7 +249,7 @@ napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); NAPI_EXTERN napi_status NAPI_CDECL napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); -#endif // __wasm32__ +#endif // NAPI_HAS_THREADS #endif // NAPI_VERSION >= 4 From 1ca52b311c7de1f0f8dda560cb121ea9fb724d9e Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Sun, 6 Aug 2023 09:31:29 +0800 Subject: [PATCH 2/5] remove `NAPI_HAS_THREADS` --- src/node_api.h | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/node_api.h b/src/node_api.h index dd83bafd79fe95..ce5d91c57e3dd2 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -16,16 +16,6 @@ #include "js_native_api.h" #include "node_api_types.h" -// See https://github.com/nodejs/node-addon-api/pull/1283 -#ifndef NAPI_HAS_THREADS -#if !defined(__wasm__) || (defined(__EMSCRIPTEN_PTHREADS__) || \ - (defined(__wasi__) && defined(_REENTRANT))) -#define NAPI_HAS_THREADS 1 -#else -#define NAPI_HAS_THREADS 0 -#endif -#endif - struct uv_loop_s; // Forward declaration. #ifdef _WIN32 @@ -161,7 +151,6 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_get_buffer_info(napi_env env, void** data, size_t* length); -#if NAPI_HAS_THREADS // Methods to manage simple async operations NAPI_EXTERN napi_status NAPI_CDECL napi_create_async_work(napi_env env, @@ -177,7 +166,6 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(napi_env env, napi_async_work work); NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(napi_env env, napi_async_work work); -#endif // NAPI_HAS_THREADS // version management NAPI_EXTERN napi_status NAPI_CDECL @@ -215,7 +203,6 @@ napi_close_callback_scope(napi_env env, napi_callback_scope scope); #if NAPI_VERSION >= 4 -#if NAPI_HAS_THREADS // Calling into JS from other threads NAPI_EXTERN napi_status NAPI_CDECL napi_create_threadsafe_function(napi_env env, @@ -249,7 +236,6 @@ napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); NAPI_EXTERN napi_status NAPI_CDECL napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); -#endif // NAPI_HAS_THREADS #endif // NAPI_VERSION >= 4 From d76e0ec6e6018aa1caea19aa435baef6fdee1ff5 Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Sun, 6 Aug 2023 10:51:56 +0800 Subject: [PATCH 3/5] fix lint --- src/node_api.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/node_api.h b/src/node_api.h index ce5d91c57e3dd2..80e3718966b98e 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -22,7 +22,8 @@ struct uv_loop_s; // Forward declaration. #define NAPI_MODULE_EXPORT __declspec(dllexport) #else #ifdef __EMSCRIPTEN__ -#define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) __attribute__((used)) +#define NAPI_MODULE_EXPORT \ + __attribute__((visibility("default"))) __attribute__((used)) #else #define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) #endif From d1162917d221569d38272efecc7e83f692152313 Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Tue, 15 Aug 2023 11:22:28 +0800 Subject: [PATCH 4/5] revert emscripten NAPI_EXTERN --- src/js_native_api.h | 6 ------ src/node_api.h | 4 ---- 2 files changed, 10 deletions(-) diff --git a/src/js_native_api.h b/src/js_native_api.h index 2950f0c0565a3d..5e95452bd700bb 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -29,15 +29,9 @@ #ifdef _WIN32 #define NAPI_EXTERN __declspec(dllexport) #elif defined(__wasm__) -#ifdef __EMSCRIPTEN__ -#define NAPI_EXTERN \ - __attribute__((visibility("default"))) \ - __attribute__((__import_module__("env"))) -#else #define NAPI_EXTERN \ __attribute__((visibility("default"))) \ __attribute__((__import_module__("napi"))) -#endif #else #define NAPI_EXTERN __attribute__((visibility("default"))) #endif diff --git a/src/node_api.h b/src/node_api.h index 80e3718966b98e..86a91dc9971117 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -6,13 +6,9 @@ // Building native addon against node #define NAPI_EXTERN __declspec(dllimport) #elif defined(__wasm__) -#ifdef __EMSCRIPTEN__ -#define NAPI_EXTERN __attribute__((__import_module__("env"))) -#else #define NAPI_EXTERN __attribute__((__import_module__("napi"))) #endif #endif -#endif #include "js_native_api.h" #include "node_api_types.h" From adee653435b59c68e05b2b2832d0dede2448cc0f Mon Sep 17 00:00:00 2001 From: toyobayashi Date: Tue, 15 Aug 2023 18:29:12 +0800 Subject: [PATCH 5/5] always respect user-defined NAPI_EXTERN --- src/node_api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node_api.h b/src/node_api.h index 86a91dc9971117..49a23aed9c6e90 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -1,7 +1,7 @@ #ifndef SRC_NODE_API_H_ #define SRC_NODE_API_H_ -#ifdef BUILDING_NODE_EXTENSION +#if defined(BUILDING_NODE_EXTENSION) && !defined(NAPI_EXTERN) #ifdef _WIN32 // Building native addon against node #define NAPI_EXTERN __declspec(dllimport)