diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..81018e0 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Node CI + +on: [push] + +jobs: + build: + name: Test Node.js ${{ matrix.node-version }} on ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + node-version: [10.x, 12.x, 14.x, 16.x] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v1 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Print Node.js Version + run: node --version + + - name: Install Dependencies + run: npm install + env: + CI: true + + - name: Run "build" step + run: npm run build --if-present + env: + CI: true + + - name: Run tests + run: npm test + env: + CI: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f8138c6..0000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -sudo: false - -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - -language: node_js - -node_js: - - "4" - - "5" - - "6" - - "7" - - "8" - - "9" - -install: - - npm install - -script: - # Output useful info for debugging - - node --version - - npm --version - # Run tests - - npm test diff --git a/README.md b/README.md index c153bb5..a49df79 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ node-weak ========= ### Make weak references to JavaScript Objects. -[![Build Status](https://travis-ci.org/TooTallNate/node-weak.svg?branch=master)](https://travis-ci.org/TooTallNate/node-weak) -[![Build Status](https://ci.appveyor.com/api/projects/status/09lf09d1a5hm24bq?svg=true)](https://ci.appveyor.com/project/TooTallNate/node-weak) +[![Build Status](https://github.com/TooTallNate/node-weak/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-weak/actions?workflow=Node+CI) On certain rarer occasions, you run into the need to be notified when a JavaScript object is going to be garbage collected. This feature is exposed to V8's C++ API, @@ -125,12 +124,6 @@ Checks to see if `ref` is a dead reference. Returns `true` if the original Objec has already been GC'd, `false` otherwise. -### Boolean weak.isNearDeath(Weakref ref) - -Checks to see if `ref` is "near death". This will be `true` exactly during the -weak reference callback function, and `false` any other time. - - ### Boolean weak.isWeakRef(Object obj) Checks to see if `obj` is "weak reference" instance. Returns `true` if the diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index ba8a361..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,49 +0,0 @@ -# http://www.appveyor.com/docs/appveyor-yml - -# Test against these versions of Node.js. -environment: - # Visual Studio Version - MSVS_VERSION: 2013 - # Test against these versions of Node.js and io.js - matrix: - # node.js - - nodejs_version: "0.8" - - nodejs_version: "0.10" - - nodejs_version: "0.12" - # io.js - - nodejs_version: "2" - - nodejs_version: "3" - - nodejs_version: "4" - - nodejs_version: "5" - -platform: - - x86 - - x64 - -# Install scripts. (runs after repo cloning) -install: - # Get the latest stable version of Node 0.STABLE.latest - - ps: if($env:nodejs_version -eq "0.8") {Install-Product node $env:nodejs_version} - - ps: if($env:nodejs_version -ne "0.8") {Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)} - # Node 0.8 comes with a too obsolete npm - - IF %nodejs_version% == 0.8 (npm install -g npm@1.4.28) - # Install latest NPM only for node.js versions until built in node-gyp adds io.js support - # Update is required for node.js 0.8 because built in npm(node-gyp) does not know VS2013 - - IF %nodejs_version% LSS 1 (npm install -g npm@2) - - IF %nodejs_version% LSS 1 set PATH=%APPDATA%\npm;%PATH% - # Typical npm stuff. - - npm install --msvs_version=%MSVS_VERSION% - -# Post-install test scripts. -test_script: - # Output useful info for debugging. - - node --version - - npm --version - # run tests - - npm test - -# Don't actually build. -build: off - -# Set build version format here instead of in the admin panel. -version: "{build}" diff --git a/src/weakref.cc b/src/weakref.cc index 32f0790..319d69b 100644 --- a/src/weakref.cc +++ b/src/weakref.cc @@ -128,20 +128,26 @@ NAN_INDEX_DELETER(WeakIndexedPropertyDeleter) { info.GetReturnValue().Set(!dead && Nan::Delete(obj, index).FromJust()); } +NAN_PROPERTY_ENUMERATOR(WeakNamedPropertyEnumerator) { + UNWRAP +#if NODE_MAJOR_VERSION >= 7 + info.GetReturnValue().Set(dead ? Nan::New(0) : obj->GetPropertyNames(Nan::GetCurrentContext(), KeyCollectionMode::kIncludePrototypes, ONLY_ENUMERABLE, IndexFilter::kSkipIndices).ToLocalChecked()); +#else + info.GetReturnValue().Set(dead ? Nan::New(0) : Nan::GetPropertyNames(obj).ToLocalChecked()); +#endif +} -/** - * Only one "enumerator" function needs to be defined. This function is used for - * both the property and indexed enumerator functions. - */ - -NAN_PROPERTY_ENUMERATOR(WeakPropertyEnumerator) { +NAN_INDEX_ENUMERATOR(WeakIndexedPropertyEnumerator) { UNWRAP +#if NODE_MAJOR_VERSION >= 7 + info.GetReturnValue().Set(dead ? Nan::New(0) : obj->GetPropertyNames(Nan::GetCurrentContext(), KeyCollectionMode::kIncludePrototypes, static_cast (ONLY_ENUMERABLE | SKIP_STRINGS | SKIP_SYMBOLS), IndexFilter::kIncludeIndices).ToLocalChecked()); +#else info.GetReturnValue().Set(dead ? Nan::New(0) : Nan::GetPropertyNames(obj).ToLocalChecked()); +#endif } /** - * Weakref callback function. Invokes the "global" callback function, - * which emits the _CB event on the per-object EventEmitter. + * Weakref callback function. Invokes the "global" callback function. */ static void TargetCallback(const Nan::WeakCallbackInfo &info) { @@ -152,11 +158,7 @@ static void TargetCallback(const Nan::WeakCallbackInfo &info) { Local argv[] = { Nan::New(cont->emitter) }; - // Invoke callback directly, not via Nan::Callback->Call() which uses - // node::MakeCallback() which calls into process._tickCallback() - // too. Those other callbacks are not safe to run from here. - v8::Local globalCallbackDirect = globalCallback->GetFunction(); - globalCallbackDirect->Call(Nan::GetCurrentContext()->Global(), 1, argv); + Nan::Call(*globalCallback, 1, argv); // clean everything up Local proxy = Nan::New(cont->proxy); @@ -177,7 +179,7 @@ NAN_METHOD(Create) { Local _target = info[0].As(); Local _emitter = info[1].As(); - Local proxy = Nan::New(proxyClass)->NewInstance(); + Local proxy = Nan::NewInstance(Nan::New(proxyClass)).ToLocalChecked(); cont->proxy.Reset(proxy); cont->emitter.Reset(_emitter); cont->target.Reset(_target); @@ -224,23 +226,6 @@ NAN_METHOD(Get) { info.GetReturnValue().Set(Unwrap(proxy)); } -/** - * `isNearDeath(weakref)` JS function. - */ - -NAN_METHOD(IsNearDeath) { - WEAKREF_FIRST_ARG - - proxy_container *cont = reinterpret_cast( - Nan::GetInternalFieldPointer(proxy, FIELD_INDEX_CONTAINER) - ); - assert(cont != NULL); - - Local rtn = Nan::New(cont->target.IsNearDeath()); - - info.GetReturnValue().Set(rtn); -} - /** * `isDead(weakref)` JS function. */ @@ -282,18 +267,17 @@ NAN_MODULE_INIT(Initialize) { WeakNamedPropertySetter, WeakNamedPropertyQuery, WeakNamedPropertyDeleter, - WeakPropertyEnumerator); + WeakNamedPropertyEnumerator); Nan::SetIndexedPropertyHandler(p, WeakIndexedPropertyGetter, WeakIndexedPropertySetter, WeakIndexedPropertyQuery, WeakIndexedPropertyDeleter, - WeakPropertyEnumerator); + WeakIndexedPropertyEnumerator); p->SetInternalFieldCount(FIELD_COUNT); Nan::SetMethod(target, "get", Get); Nan::SetMethod(target, "isWeakRef", IsWeakRef); - Nan::SetMethod(target, "isNearDeath", IsNearDeath); Nan::SetMethod(target, "isDead", IsDead); Nan::SetMethod(target, "_create", Create); Nan::SetMethod(target, "_getEmitter", GetEmitter); diff --git a/test/exports.js b/test/exports.js index 348cffd..b96740f 100644 --- a/test/exports.js +++ b/test/exports.js @@ -18,7 +18,6 @@ describe('exports', function () { checkFunction('get') checkFunction('create') checkFunction('isWeakRef') - checkFunction('isNearDeath') checkFunction('isDead') checkFunction('callbacks') checkFunction('addCallback')