node/deps/v8/test/mjsunit/extras-cped.js
Stephen Belanger 5e533710c8
deps: V8: backport 7857eb34db42
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>
2024-07-26 14:35:44 +00:00

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());
};
}