diff --git a/.eslintrc.js b/.eslintrc.js index dc83c0e8c11e90..a779517907390f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -243,6 +243,7 @@ module.exports = { 'node-core/no-unescaped-regexp-dot': 'error', }, globals: { + Atomics: false, BigInt: false, BigInt64Array: false, BigUint64Array: false, diff --git a/src/node.cc b/src/node.cc index b562e3112da72c..661b75e61394e9 100644 --- a/src/node.cc +++ b/src/node.cc @@ -4031,16 +4031,37 @@ Local NewContext(Isolate* isolate, auto context = Context::New(isolate, nullptr, object_template); if (context.IsEmpty()) return context; HandleScope handle_scope(isolate); - auto intl_key = FIXED_ONE_BYTE_STRING(isolate, "Intl"); - auto break_iter_key = FIXED_ONE_BYTE_STRING(isolate, "v8BreakIterator"); context->SetEmbedderData( ContextEmbedderIndex::kAllowWasmCodeGeneration, True(isolate)); + + auto intl_key = FIXED_ONE_BYTE_STRING(isolate, "Intl"); + auto break_iter_key = FIXED_ONE_BYTE_STRING(isolate, "v8BreakIterator"); Local intl_v; if (context->Global()->Get(context, intl_key).ToLocal(&intl_v) && intl_v->IsObject()) { Local intl = intl_v.As(); intl->Delete(context, break_iter_key).FromJust(); } + + // https://github.com/nodejs/node/issues/21219 + // TODO(devsnek): remove when v8 supports Atomics.notify + auto atomics_key = FIXED_ONE_BYTE_STRING(isolate, "Atomics"); + Local atomics_v; + if (context->Global()->Get(context, atomics_key).ToLocal(&atomics_v) && + atomics_v->IsObject()) { + Local atomics = atomics_v.As(); + auto wake_key = FIXED_ONE_BYTE_STRING(isolate, "wake"); + + Local wake = atomics->Get(context, wake_key).ToLocalChecked(); + auto notify_key = FIXED_ONE_BYTE_STRING(isolate, "notify"); + + v8::PropertyDescriptor desc(wake, true); + desc.set_enumerable(false); + desc.set_configurable(true); + + atomics->DefineProperty(context, notify_key, desc).ToChecked(); + } + return context; } diff --git a/test/parallel/test-atomics-notify.js b/test/parallel/test-atomics-notify.js new file mode 100644 index 00000000000000..dcca7a9fd16d2f --- /dev/null +++ b/test/parallel/test-atomics-notify.js @@ -0,0 +1,10 @@ +'use strict'; + +require('../common'); + +const assert = require('assert'); +const { runInNewContext } = require('vm'); + +assert.strictEqual(Atomics.wake, Atomics.notify); + +assert(runInNewContext('Atomics.wake === Atomics.notify'));