mirror of
https://github.com/nodejs/node.git
synced 2025-05-15 11:36:57 +00:00

Original commit message:
Reland^2 "Add ContinuationPreservedEmbedderData builtins to extras binding"
This reverts commit cb1277e97a0ed32fd893be9f4e927f6e8b6c566c.
> Original change's description:
> > Add ContinuationPreservedEmbedderData builtins to extras binding
> >
> > Node.js and Deno wish to use CPED for AsyncLocalStorage and APM, which
> > needs a high performance implementation. These builtins allow JavaScript
> > to handle CPED performantly.
> >
> > Change-Id: I7577be80818524baa52791dfce57d442d7c0c933
> > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5638129
> > Commit-Queue: snek <snek@chromium.org>
> > Reviewed-by: Darius Mercadier <dmercadier@chromium.org>
> > Reviewed-by: Leszek Swirski <leszeks@chromium.org>
> > Reviewed-by: Nico Hartmann <nicohartmann@chromium.org>
> > Cr-Commit-Position: refs/heads/main@{#94607}
>
> Change-Id: Ief390f0b99891c8de83b4c794180440f91cbaf1f
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5649024
> Auto-Submit: Shu-yu Guo <syg@chromium.org>
> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
> Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
> Cr-Commit-Position: refs/heads/main@{#94608}
Change-Id: I4943071ffe192084e83bfe3113cfe9c92ef31465
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/5677045
Reviewed-by: Darius Mercadier <dmercadier@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Commit-Queue: snek <snek@chromium.org>
Cr-Commit-Position: refs/heads/main@{#94866}
Refs: v8/v8@7857eb3
PR-URL: https://github.com/nodejs/node/pull/53997
Refs: 7857eb34db
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
86 lines
2.0 KiB
JavaScript
86 lines
2.0 KiB
JavaScript
// Copyright 2024 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
const {
|
|
getContinuationPreservedEmbedderData,
|
|
setContinuationPreservedEmbedderData,
|
|
} = d8.getExtrasBindingObject();
|
|
|
|
|
|
// Basic set and get
|
|
const foo = { bar: 'baz' };
|
|
setContinuationPreservedEmbedderData(foo);
|
|
assertEquals(foo, getContinuationPreservedEmbedderData());
|
|
|
|
// Captures at the point a continuation is created
|
|
{
|
|
// Resolve path
|
|
setContinuationPreservedEmbedderData('init');
|
|
let resolve;
|
|
const p = new Promise(r => {
|
|
resolve = r;
|
|
});
|
|
|
|
setContinuationPreservedEmbedderData('resolve');
|
|
resolve();
|
|
|
|
setContinuationPreservedEmbedderData('continuation-created');
|
|
p.then(deferredVerify('continuation-created'));
|
|
setContinuationPreservedEmbedderData('after');
|
|
%PerformMicrotaskCheckpoint();
|
|
}
|
|
{
|
|
// Reject path
|
|
setContinuationPreservedEmbedderData('init');
|
|
let reject;
|
|
const p = new Promise((_, r) => {
|
|
reject = r;
|
|
});
|
|
|
|
setContinuationPreservedEmbedderData('resolve');
|
|
reject();
|
|
|
|
setContinuationPreservedEmbedderData('continuation-created');
|
|
p.catch(deferredVerify('continuation-created'));
|
|
setContinuationPreservedEmbedderData('after');
|
|
%PerformMicrotaskCheckpoint();
|
|
}
|
|
|
|
// Should propagate through thenables
|
|
function thenable(expected) {
|
|
const verify = deferredVerify(expected);
|
|
return {
|
|
then(fulfill) {
|
|
verify();
|
|
fulfill();
|
|
}
|
|
}
|
|
}
|
|
|
|
async function testThenables() {
|
|
setContinuationPreservedEmbedderData('plain thenable');
|
|
await thenable('plain thenable');
|
|
|
|
setContinuationPreservedEmbedderData('resolved thenable');
|
|
await Promise.resolve(thenable('resolved thenable'));
|
|
|
|
setContinuationPreservedEmbedderData('async returned thenable');
|
|
await (async () => thenable('async returned thenable'))();
|
|
}
|
|
|
|
testThenables();
|
|
|
|
%PerformMicrotaskCheckpoint();
|
|
|
|
//
|
|
// Test helpers
|
|
//
|
|
function deferredVerify(expected) {
|
|
return () => {
|
|
assertEquals(expected, getContinuationPreservedEmbedderData());
|
|
};
|
|
}
|