async_hooks: add an InactiveAsyncContextFrame class

This gives a class prototype for AsyncContextFrame that contains the
required methods, so that when we swap the prototype,
ActiveAsyncContextFrame methods are used instead. Previously, the
methods were defined in AsyncContextFrame, so swapping the prototype
didn't swap those static methods.

Also, make the ActiveAsyncContextFrame extend from Map.

Fixes: https://github.com/nodejs/node/issues/54503
PR-URL: https://github.com/nodejs/node/pull/54510
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Stephen Belanger <admin@stephenbelanger.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
This commit is contained in:
Bryan English 2024-08-30 16:27:28 -04:00 committed by GitHub
parent 9bdf2ee1d1
commit ef6b9ffc8d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 8 deletions

View File

@ -11,7 +11,7 @@ const {
let enabled_; let enabled_;
class ActiveAsyncContextFrame { class ActiveAsyncContextFrame extends Map {
static get enabled() { static get enabled() {
return true; return true;
} }
@ -50,12 +50,7 @@ function checkEnabled() {
return enabled; return enabled;
} }
class AsyncContextFrame extends Map { class InactiveAsyncContextFrame extends Map {
constructor(store, data) {
super(AsyncContextFrame.current());
this.set(store, data);
}
static get enabled() { static get enabled() {
enabled_ ??= checkEnabled(); enabled_ ??= checkEnabled();
return enabled_; return enabled_;
@ -65,6 +60,13 @@ class AsyncContextFrame extends Map {
static set(frame) {} static set(frame) {}
static exchange(frame) {} static exchange(frame) {}
static disable(store) {} static disable(store) {}
}
class AsyncContextFrame extends InactiveAsyncContextFrame {
constructor(store, data) {
super(AsyncContextFrame.current());
this.set(store, data);
}
disable(store) { disable(store) {
this.delete(store); this.delete(store);

View File

@ -5,6 +5,7 @@ import { opendir } from 'node:fs/promises';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { sep } from 'node:path'; import { sep } from 'node:path';
import { strictEqual } from 'node:assert';
const python = process.env.PYTHON || (isWindows ? 'python' : 'python3'); const python = process.env.PYTHON || (isWindows ? 'python' : 'python3');
@ -53,7 +54,8 @@ describe('AsyncContextFrame', {
stdio: ['ignore', 'ignore', 'inherit'], stdio: ['ignore', 'ignore', 'inherit'],
}); });
await once(proc, 'exit'); const [code] = await once(proc, 'exit');
strictEqual(code, 0, `Test ${test} failed with exit code ${code}`);
}); });
} }
}); });