From 6ba3891954d8b56215d133e54a86cb621e476b9e Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Wed, 9 Oct 2024 08:20:41 +0900 Subject: [PATCH] fix: missing node_api_nogc_env definition (#1585) --- .github/workflows/node-api-headers.yml | 71 ++++++++++++++++++++++++++ napi-inl.h | 31 +++++------ napi.h | 19 +++++-- test/binding.gyp | 7 ++- 4 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/node-api-headers.yml diff --git a/.github/workflows/node-api-headers.yml b/.github/workflows/node-api-headers.yml new file mode 100644 index 000000000..b64002026 --- /dev/null +++ b/.github/workflows/node-api-headers.yml @@ -0,0 +1,71 @@ +name: Node.js CI with node-api-headers + +on: [push, pull_request] + +env: + PYTHON_VERSION: '3.11' + +permissions: + contents: read + +jobs: + test: + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + api_version: + - '9' + node-version: + - 22.x + node-api-headers-version: + - '1.1.0' + - '1.2.0' + - '1.3.0' + os: + - ubuntu-latest + compiler: + - gcc + - clang + runs-on: ${{ matrix.os }} + steps: + - name: Harden Runner + uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1 + with: + egress-policy: audit + + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + with: + node-version: ${{ matrix.node-version }} + - name: Check Node.js installation + run: | + node --version + npm --version + - name: Install dependencies + run: | + npm install + npm install "node-api-headers@${{ matrix.node-api-headers-version }}" + - name: npm test + run: | + export NAPI_VERSION=${{ matrix.api_version }} + if [ "${{ matrix.compiler }}" = "gcc" ]; then + export CC="gcc" CXX="g++" + fi + if [ "${{ matrix.compiler }}" = "clang" ]; then + export CC="clang" CXX="clang++" + fi + echo "CC=\"$CC\" CXX=\"$CXX\"" + echo "$CC --version" + $CC --version + echo "$CXX --version" + $CXX --version + export CFLAGS="$CFLAGS -O3 --coverage" LDFLAGS="$LDFLAGS --coverage" + export use_node_api_headers=true + echo "CFLAGS=\"$CFLAGS\" LDFLAGS=\"$LDFLAGS\"" + npm run pretest -- --verbose diff --git a/napi-inl.h b/napi-inl.h index 8631b9f9b..c3034e299 100644 --- a/napi-inl.h +++ b/napi-inl.h @@ -35,7 +35,7 @@ namespace details { constexpr int napi_no_external_buffers_allowed = 22; template -inline void default_basic_finalizer(node_api_nogc_env /*env*/, +inline void default_basic_finalizer(node_addon_api_basic_env /*env*/, void* data, void* /*hint*/) { delete static_cast(data); @@ -45,8 +45,9 @@ inline void default_basic_finalizer(node_api_nogc_env /*env*/, // garbage-collected. // TODO: Replace this code with `napi_add_finalizer()` whenever it becomes // available on all supported versions of Node.js. -template > +template < + typename FreeType, + node_addon_api_basic_finalize finalizer = default_basic_finalizer> inline napi_status AttachData(napi_env env, napi_value obj, FreeType* data, @@ -192,10 +193,10 @@ template struct FinalizeData { #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER template >> + typename = std::enable_if_t< + std::is_invocable_v>> #endif - static inline void Wrapper(node_api_nogc_env env, + static inline void Wrapper(node_addon_api_basic_env env, void* data, void* finalizeHint) NAPI_NOEXCEPT { WrapVoidCallback([&] { @@ -208,9 +209,9 @@ struct FinalizeData { #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER template >, + !std::is_invocable_v>, typename = void> - static inline void Wrapper(node_api_nogc_env env, + static inline void Wrapper(node_addon_api_basic_env env, void* data, void* finalizeHint) NAPI_NOEXCEPT { #ifdef NODE_ADDON_API_REQUIRE_BASIC_FINALIZERS @@ -228,9 +229,9 @@ struct FinalizeData { #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER template >> + std::is_invocable_v>> #endif - static inline void WrapperWithHint(node_api_nogc_env env, + static inline void WrapperWithHint(node_addon_api_basic_env env, void* data, void* finalizeHint) NAPI_NOEXCEPT { WrapVoidCallback([&] { @@ -243,9 +244,9 @@ struct FinalizeData { #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER template >, + !std::is_invocable_v>, typename = void> - static inline void WrapperWithHint(node_api_nogc_env env, + static inline void WrapperWithHint(node_addon_api_basic_env env, void* data, void* finalizeHint) NAPI_NOEXCEPT { #ifdef NODE_ADDON_API_REQUIRE_BASIC_FINALIZERS @@ -576,9 +577,9 @@ inline Maybe Just(const T& t) { // BasicEnv / Env class //////////////////////////////////////////////////////////////////////////////// -inline BasicEnv::BasicEnv(node_api_nogc_env env) : _env(env) {} +inline BasicEnv::BasicEnv(node_addon_api_basic_env env) : _env(env) {} -inline BasicEnv::operator node_api_nogc_env() const { +inline BasicEnv::operator node_addon_api_basic_env() const { return _env; } @@ -5034,7 +5035,7 @@ inline napi_value ObjectWrap::StaticSetterCallbackWrapper( } template -inline void ObjectWrap::FinalizeCallback(node_api_nogc_env env, +inline void ObjectWrap::FinalizeCallback(node_addon_api_basic_env env, void* data, void* /*hint*/) { // If the child class does not override _any_ Finalize() method, `env` will be diff --git a/napi.h b/napi.h index 4710c66ba..6e1343e51 100644 --- a/napi.h +++ b/napi.h @@ -299,6 +299,14 @@ template using MaybeOrValue = T; #endif +#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER +using node_addon_api_basic_env = node_api_nogc_env; +using node_addon_api_basic_finalize = node_api_nogc_finalize; +#else +using node_addon_api_basic_env = napi_env; +using node_addon_api_basic_finalize = napi_finalize; +#endif + /// Environment for Node-API values and operations. /// /// All Node-API values and operations must be associated with an environment. @@ -313,7 +321,7 @@ using MaybeOrValue = T; /// corresponds to an Isolate. class BasicEnv { private: - node_api_nogc_env _env; + node_addon_api_basic_env _env; #if NAPI_VERSION > 5 template static void DefaultFini(Env, T* data); @@ -321,8 +329,9 @@ class BasicEnv { static void DefaultFiniWithHint(Env, DataType* data, HintType* hint); #endif // NAPI_VERSION > 5 public: - BasicEnv(node_api_nogc_env env); - operator node_api_nogc_env() const; + BasicEnv(node_addon_api_basic_env env); + + operator node_addon_api_basic_env() const; // Without these operator overloads, the error: // @@ -2469,7 +2478,9 @@ class ObjectWrap : public InstanceWrap, public Reference { napi_callback_info info); static napi_value StaticSetterCallbackWrapper(napi_env env, napi_callback_info info); - static void FinalizeCallback(node_api_nogc_env env, void* data, void* hint); + static void FinalizeCallback(node_addon_api_basic_env env, + void* data, + void* hint); static void PostFinalizeCallback(napi_env env, void* data, void* hint); diff --git a/test/binding.gyp b/test/binding.gyp index df8d5e84a..3dd861d0b 100644 --- a/test/binding.gyp +++ b/test/binding.gyp @@ -89,6 +89,7 @@ 'value_type_cast.cc' ], 'want_coverage': '