From 259d0913669e34a7303dcef257f230c550c302ed Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 12 Jul 2021 12:01:25 -0700 Subject: [PATCH 001/117] test: mark test-domain-error-types flaky MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/nodejs/node/issues/39368 Signed-off-by: James M Snell PR-URL: https://github.com/nodejs/node/pull/39369 Reviewed-By: Gireesh Punathil Reviewed-By: Michaël Zasso --- test/parallel/parallel.status | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index 7cc1b5fb33c4d2..d1a52c520f4d69 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -13,6 +13,8 @@ test-timers-immediate-queue: PASS,FLAKY test-worker-memory: PASS,FLAKY [$system==linux] +# https://github.com/nodejs/node/issues/39368 +test-domain-error-types: PASS,FLAKY [$system==macos] From efe74746f080a4bdde7dec064cb8c3353d171b1a Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 12 Jul 2021 15:59:36 -0700 Subject: [PATCH 002/117] stream: fixup property definition to avoid prototype polution Fixup the definitions of the properties to avoid the possibility of prototype polution on the object definitions. Signed-off-by: James M Snell PR-URL: https://github.com/nodejs/node/pull/39371 Reviewed-By: Antoine du Hamel Reviewed-By: Robert Nagy Reviewed-By: Matteo Collina --- lib/internal/webstreams/queuingstrategies.js | 9 ++-- lib/internal/webstreams/readablestream.js | 53 ++++++++++---------- lib/internal/webstreams/transformstream.js | 13 ++--- lib/internal/webstreams/util.js | 4 ++ lib/internal/webstreams/writablestream.js | 29 +++++------ 5 files changed, 58 insertions(+), 50 deletions(-) diff --git a/lib/internal/webstreams/queuingstrategies.js b/lib/internal/webstreams/queuingstrategies.js index d8750665bd5e86..2db51b92a7f502 100644 --- a/lib/internal/webstreams/queuingstrategies.js +++ b/lib/internal/webstreams/queuingstrategies.js @@ -21,6 +21,7 @@ const { isBrandCheck, kType, kState, + kEnumerableProperty, } = require('internal/webstreams/util'); const { @@ -102,8 +103,8 @@ class ByteLengthQueuingStrategy { } ObjectDefineProperties(ByteLengthQueuingStrategy.prototype, { - highWaterMark: { enumerable: true }, - size: { enumerable: true }, + highWaterMark: kEnumerableProperty, + size: kEnumerableProperty, }); /** @@ -158,8 +159,8 @@ class CountQueuingStrategy { } ObjectDefineProperties(CountQueuingStrategy.prototype, { - highWaterMark: { enumerable: true }, - size: { enumerable: true }, + highWaterMark: kEnumerableProperty, + size: kEnumerableProperty, }); module.exports = { diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 978281dfa324e8..ce822d479437e3 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -103,6 +103,7 @@ const { nonOpStart, kType, kState, + kEnumerableProperty, } = require('internal/webstreams/util'); const { @@ -553,12 +554,12 @@ ObjectDefineProperties(ReadableStream.prototype, { writable: true, value: ReadableStream.prototype.values, }, - locked: { enumerable: true }, - cancel: { enumerable: true }, - getReader: { enumerable: true }, - pipeThrough: { enumerable: true }, - pipeTo: { enumerable: true }, - tee: { enumerable: true }, + locked: kEnumerableProperty, + cancel: kEnumerableProperty, + getReader: kEnumerableProperty, + pipeThrough: kEnumerableProperty, + pipeTo: kEnumerableProperty, + tee: kEnumerableProperty, }); function TransferredReadableStream() { @@ -654,9 +655,9 @@ class ReadableStreamBYOBRequest { } ObjectDefineProperties(ReadableStreamBYOBRequest.prototype, { - view: { enumerable: true }, - respond: { enumerable: true }, - respondWithNewView: { enumerable: true }, + view: kEnumerableProperty, + respond: kEnumerableProperty, + respondWithNewView: kEnumerableProperty, }); function createReadableStreamBYOBRequest(controller, view) { @@ -801,10 +802,10 @@ class ReadableStreamDefaultReader { } ObjectDefineProperties(ReadableStreamDefaultReader.prototype, { - closed: { enumerable: true }, - read: { enumerable: true }, - releaseLock: { enumerable: true }, - cancel: { enumerable: true }, + closed: kEnumerableProperty, + read: kEnumerableProperty, + releaseLock: kEnumerableProperty, + cancel: kEnumerableProperty, }); class ReadableStreamBYOBReader { @@ -918,10 +919,10 @@ class ReadableStreamBYOBReader { } ObjectDefineProperties(ReadableStreamBYOBReader.prototype, { - closed: { enumerable: true }, - read: { enumerable: true }, - releaseLock: { enumerable: true }, - cancel: { enumerable: true }, + closed: kEnumerableProperty, + read: kEnumerableProperty, + releaseLock: kEnumerableProperty, + cancel: kEnumerableProperty, }); class ReadableStreamDefaultController { @@ -977,10 +978,10 @@ class ReadableStreamDefaultController { } ObjectDefineProperties(ReadableStreamDefaultController.prototype, { - desiredSize: { enumerable: true }, - close: { enumerable: true }, - enqueue: { enumerable: true }, - error: { enumerable: true }, + desiredSize: kEnumerableProperty, + close: kEnumerableProperty, + enqueue: kEnumerableProperty, + error: kEnumerableProperty, }); function createReadableStreamDefaultController() { @@ -1106,11 +1107,11 @@ class ReadableByteStreamController { } ObjectDefineProperties(ReadableByteStreamController.prototype, { - byobRequest: { enumerable: true }, - desiredSize: { enumerable: true }, - close: { enumerable: true }, - enqueue: { enumerable: true }, - error: { enumerable: true }, + byobRequest: kEnumerableProperty, + desiredSize: kEnumerableProperty, + close: kEnumerableProperty, + enqueue: kEnumerableProperty, + error: kEnumerableProperty, }); function createReadableByteStreamController() { diff --git a/lib/internal/webstreams/transformstream.js b/lib/internal/webstreams/transformstream.js index 62940a1fb9da76..b4e690daa98c4a 100644 --- a/lib/internal/webstreams/transformstream.js +++ b/lib/internal/webstreams/transformstream.js @@ -45,6 +45,7 @@ const { nonOpFlush, kType, kState, + kEnumerableProperty, } = require('internal/webstreams/util'); const { @@ -226,8 +227,8 @@ class TransformStream { } ObjectDefineProperties(TransformStream.prototype, { - readable: { enumerable: true }, - writable: { enumerable: true }, + readable: kEnumerableProperty, + writable: kEnumerableProperty, }); function TransferredTransformStream() { @@ -310,10 +311,10 @@ class TransformStreamDefaultController { } ObjectDefineProperties(TransformStreamDefaultController.prototype, { - desiredSize: { enumerable: true }, - enqueue: { enumerable: true }, - error: { enumerable: true }, - terminate: { enumerable: true }, + desiredSize: kEnumerableProperty, + enqueue: kEnumerableProperty, + error: kEnumerableProperty, + terminate: kEnumerableProperty, }); function createTransformStreamDefaultController() { diff --git a/lib/internal/webstreams/util.js b/lib/internal/webstreams/util.js index 8cf31d1c307ca9..54e707e8525c09 100644 --- a/lib/internal/webstreams/util.js +++ b/lib/internal/webstreams/util.js @@ -207,6 +207,9 @@ function lazyTransfer() { return transfer; } +const kEnumerableProperty = ObjectCreate(null); +kEnumerableProperty.enumerable = true; + module.exports = { ArrayBufferViewGetBuffer, ArrayBufferViewGetByteLength, @@ -234,4 +237,5 @@ module.exports = { nonOpWrite, kType, kState, + kEnumerableProperty, }; diff --git a/lib/internal/webstreams/writablestream.js b/lib/internal/webstreams/writablestream.js index c36ce82fcdcfbf..dba7560c549a9a 100644 --- a/lib/internal/webstreams/writablestream.js +++ b/lib/internal/webstreams/writablestream.js @@ -64,6 +64,7 @@ const { nonOpWrite, kType, kState, + kEnumerableProperty, } = require('internal/webstreams/util'); const { @@ -280,10 +281,10 @@ class WritableStream { } ObjectDefineProperties(WritableStream.prototype, { - locked: { enumerable: true }, - abort: { enumerable: true }, - close: { enumerable: true }, - getWriter: { enumerable: true }, + locked: kEnumerableProperty, + abort: kEnumerableProperty, + close: kEnumerableProperty, + getWriter: kEnumerableProperty, }); function TransferredWritableStream() { @@ -469,13 +470,13 @@ class WritableStreamDefaultWriter { } ObjectDefineProperties(WritableStreamDefaultWriter.prototype, { - closed: { enumerable: true }, - ready: { enumerable: true }, - desiredSize: { enumerable: true }, - abort: { enumerable: true }, - close: { enumerable: true }, - releaseLock: { enumerable: true }, - write: { enumerable: true }, + closed: kEnumerableProperty, + ready: kEnumerableProperty, + desiredSize: kEnumerableProperty, + abort: kEnumerableProperty, + close: kEnumerableProperty, + releaseLock: kEnumerableProperty, + write: kEnumerableProperty, }); class WritableStreamDefaultController { @@ -534,9 +535,9 @@ class WritableStreamDefaultController { } ObjectDefineProperties(WritableStreamDefaultController.prototype, { - abortReason: { enumerable: true }, - signal: { enumerable: true }, - error: { enumerable: true }, + abortReason: kEnumerableProperty, + signal: kEnumerableProperty, + error: kEnumerableProperty, }); function createWritableStreamDefaultController() { From bbff5a9e47b7ed294169c239e153af31bb81837a Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 11 Jul 2021 16:08:46 -0700 Subject: [PATCH 003/117] doc: edit guide on pull requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replace _PR_ with Pull Request * Make some content more concise PR-URL: https://github.com/nodejs/node/pull/39359 Reviewed-By: Michaël Zasso Reviewed-By: Gireesh Punathil Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig Reviewed-By: Zeyu Yang Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- doc/guides/contributing/pull-requests.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/doc/guides/contributing/pull-requests.md b/doc/guides/contributing/pull-requests.md index 5f31bab0cfa9a7..1820fae69fb4df 100644 --- a/doc/guides/contributing/pull-requests.md +++ b/doc/guides/contributing/pull-requests.md @@ -354,8 +354,7 @@ your name on it. Congratulations and thanks for your contribution! All Node.js contributors who choose to review and provide feedback on Pull Requests have a responsibility to both the project and the individual making the contribution. Reviews and feedback must be helpful, insightful, and geared -towards improving the contribution as opposed to simply blocking it. If there -are reasons why you feel the PR should not land, explain what those are. Do not +towards improving the contribution as opposed to simply blocking it. Do not expect to be able to block a Pull Request from advancing simply because you say "No" without giving an explanation. Be open to having your mind changed. Be open to working with the contributor to make the Pull Request better. @@ -417,10 +416,8 @@ changes, so that people who may have important input in such a distributed project are able to respond. For non-trivial changes, Pull Requests must be left open for at least 48 hours. -In most cases, when the PR is relatively small and focused on a narrow set of -changes, that will provide more than enough time to adequately review. Sometimes -changes take far longer to review, or need more specialized review from subject -matter experts. When in doubt, do not rush. +Sometimes changes take far longer to review, or need more specialized review +from subject-matter experts. When in doubt, do not rush. Trivial changes, typically limited to small formatting changes or fixes to documentation, may be landed within the minimum 48 hour window. @@ -460,11 +457,9 @@ Change requests that are vague, dismissive, or unconstructive may also be dismissed if requests for greater clarification go unanswered within a reasonable period of time. -If you do not believe that the Pull Request should land at all, use -`Changes requested` to indicate that you are considering some of your comments -to block the PR from landing. When doing so, explain *why* you believe the -Pull Request should not land along with an explanation of what may be an -acceptable alternative course, if any. +Use `Changes requested` to block a Pull Request from landing. When doing so, +explain why you believe the Pull Request should not land along with an +explanation of what may be an acceptable alternative course, if any. ### Accept that there are different opinions about what belongs in Node.js From d0fb02c26a67ff3572015855bbe6674ed35deb9a Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 11 Jul 2021 15:35:09 -0700 Subject: [PATCH 004/117] test: put common lint exceptions into config file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For lint exceptions that are universal or near universal for `test/common`, put the exceptions in a config file rather than disabling the ESLint rules at the top of each file. PR-URL: https://github.com/nodejs/node/pull/39358 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- test/common/.eslintrc.yaml | 3 +++ test/common/arraystream.js | 1 - test/common/benchmark.js | 2 -- test/common/countdown.js | 2 -- test/common/cpu-prof.js | 2 -- test/common/dns.js | 1 - test/common/duplexpair.js | 1 - test/common/fixtures.js | 1 - test/common/fixtures.mjs | 1 - test/common/heap.js | 1 - test/common/hijackstdio.js | 1 - test/common/http2.js | 1 - test/common/index.js | 1 - test/common/index.mjs | 2 -- test/common/internet.js | 1 - test/common/measure-memory.js | 1 - test/common/report.js | 1 - test/common/require-as.js | 1 - test/common/tls.js | 1 - test/common/tmpdir.js | 1 - test/common/udppair.js | 1 - test/common/wpt.js | 1 - test/common/wpt/worker.js | 2 -- 23 files changed, 3 insertions(+), 27 deletions(-) create mode 100644 test/common/.eslintrc.yaml diff --git a/test/common/.eslintrc.yaml b/test/common/.eslintrc.yaml new file mode 100644 index 00000000000000..b3981bdd272eca --- /dev/null +++ b/test/common/.eslintrc.yaml @@ -0,0 +1,3 @@ +rules: + node-core/required-modules: off + node-core/require-common-first: off diff --git a/test/common/arraystream.js b/test/common/arraystream.js index 408d57712c73ef..c9dae0512b52cc 100644 --- a/test/common/arraystream.js +++ b/test/common/arraystream.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const { Stream } = require('stream'); diff --git a/test/common/benchmark.js b/test/common/benchmark.js index 56351c92505efa..88c918766fd76c 100644 --- a/test/common/benchmark.js +++ b/test/common/benchmark.js @@ -1,5 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ - 'use strict'; const assert = require('assert'); diff --git a/test/common/countdown.js b/test/common/countdown.js index 31507b61257633..4aa86b42533903 100644 --- a/test/common/countdown.js +++ b/test/common/countdown.js @@ -1,5 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ - 'use strict'; const assert = require('assert'); diff --git a/test/common/cpu-prof.js b/test/common/cpu-prof.js index ae81eefd45c307..e4bba24037dff9 100644 --- a/test/common/cpu-prof.js +++ b/test/common/cpu-prof.js @@ -1,5 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ - 'use strict'; require('./'); diff --git a/test/common/dns.js b/test/common/dns.js index 3574229db44117..70e171695ff20d 100644 --- a/test/common/dns.js +++ b/test/common/dns.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const assert = require('assert'); diff --git a/test/common/duplexpair.js b/test/common/duplexpair.js index 4eb4f326f2d295..1f41ed32f1b9e9 100644 --- a/test/common/duplexpair.js +++ b/test/common/duplexpair.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const { Duplex } = require('stream'); const assert = require('assert'); diff --git a/test/common/fixtures.js b/test/common/fixtures.js index e33ab1d3e1b3e6..e5e1d887df525e 100644 --- a/test/common/fixtures.js +++ b/test/common/fixtures.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const path = require('path'); diff --git a/test/common/fixtures.mjs b/test/common/fixtures.mjs index 3eeef6d6077c4a..06564de6fa3bb9 100644 --- a/test/common/fixtures.mjs +++ b/test/common/fixtures.mjs @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ import fixtures from './fixtures.js'; const { diff --git a/test/common/heap.js b/test/common/heap.js index a6232177ba9fd3..fa74e606f03ee0 100644 --- a/test/common/heap.js +++ b/test/common/heap.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const assert = require('assert'); const util = require('util'); diff --git a/test/common/hijackstdio.js b/test/common/hijackstdio.js index 6995f6665891d3..44e00ed0b11cc2 100644 --- a/test/common/hijackstdio.js +++ b/test/common/hijackstdio.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; // Hijack stdout and stderr diff --git a/test/common/http2.js b/test/common/http2.js index c4d430d1d93f98..baaed492e5a9a3 100644 --- a/test/common/http2.js +++ b/test/common/http2.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; // An HTTP/2 testing tool used to create mock frames for direct testing diff --git a/test/common/index.js b/test/common/index.js index df61b3c3cda1a0..0f0885997ce9a1 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -19,7 +19,6 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -/* eslint-disable node-core/require-common-first, node-core/required-modules */ /* eslint-disable node-core/crypto-check */ 'use strict'; const process = global.process; // Some tests tamper with the process global. diff --git a/test/common/index.mjs b/test/common/index.mjs index 1824497ff6533f..babc3fbbba0528 100644 --- a/test/common/index.mjs +++ b/test/common/index.mjs @@ -1,5 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ - import { createRequire } from 'module'; const require = createRequire(import.meta.url); diff --git a/test/common/internet.js b/test/common/internet.js index accea74969e276..227e979d3b8c75 100644 --- a/test/common/internet.js +++ b/test/common/internet.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; // Utilities for internet-related tests diff --git a/test/common/measure-memory.js b/test/common/measure-memory.js index 67c8fb3b9d2d67..a42f6344268d12 100644 --- a/test/common/measure-memory.js +++ b/test/common/measure-memory.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const assert = require('assert'); diff --git a/test/common/report.js b/test/common/report.js index 28c10181474f25..b1d6b058172590 100644 --- a/test/common/report.js +++ b/test/common/report.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const assert = require('assert'); const fs = require('fs'); diff --git a/test/common/require-as.js b/test/common/require-as.js index 7aba4fa6d825a2..9425404fa1416d 100644 --- a/test/common/require-as.js +++ b/test/common/require-as.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; if (require.main !== module) { diff --git a/test/common/tls.js b/test/common/tls.js index 27414c79eda040..2c91241c3b20b7 100644 --- a/test/common/tls.js +++ b/test/common/tls.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ /* eslint-disable node-core/crypto-check */ 'use strict'; diff --git a/test/common/tmpdir.js b/test/common/tmpdir.js index d911feb460a2f3..0bafea1582b38d 100644 --- a/test/common/tmpdir.js +++ b/test/common/tmpdir.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const fs = require('fs'); diff --git a/test/common/udppair.js b/test/common/udppair.js index a7e532a99778e9..6213f4becfd6aa 100644 --- a/test/common/udppair.js +++ b/test/common/udppair.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const { internalBinding } = require('internal/test/binding'); const { JSUDPWrap } = internalBinding('js_udp_wrap'); diff --git a/test/common/wpt.js b/test/common/wpt.js index 74508f0c8d2a56..3e2f8151a6c20b 100644 --- a/test/common/wpt.js +++ b/test/common/wpt.js @@ -1,4 +1,3 @@ -/* eslint-disable node-core/require-common-first, node-core/required-modules */ 'use strict'; const assert = require('assert'); diff --git a/test/common/wpt/worker.js b/test/common/wpt/worker.js index afaee075f7a32e..468e950ac10cb1 100644 --- a/test/common/wpt/worker.js +++ b/test/common/wpt/worker.js @@ -1,5 +1,3 @@ -/* eslint-disable node-core/required-modules,node-core/require-common-first */ - 'use strict'; const { runInThisContext } = require('vm'); From a7472576d7ef4c37cb62494625b5c703b5f8b8c7 Mon Sep 17 00:00:00 2001 From: himself65 Date: Thu, 8 Jul 2021 00:19:00 +0800 Subject: [PATCH 005/117] build: add `library_files` to gyp variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GYP uses the system path when parsing node.gyp; However, if system python is different from our gyp runtime python, like '2.7', gyp would crash. Co-authored-by: Michaël Zasso PR-URL: https://github.com/nodejs/node/pull/39293 Reviewed-By: Michaël Zasso Reviewed-By: James M Snell Reviewed-By: Joyee Cheung --- configure.py | 4 ++++ node.gyp | 2 +- tools/search_files.py | 22 ---------------------- 3 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 tools/search_files.py diff --git a/configure.py b/configure.py index d69c52521d80fb..1e9ee8adf3cc68 100755 --- a/configure.py +++ b/configure.py @@ -45,6 +45,7 @@ import getnapibuildversion import getsharedopensslhasquic from gyp_node import run_gyp +from utils import SearchFiles # parse our options parser = argparse.ArgumentParser() @@ -1155,6 +1156,8 @@ def gcc_version_ge(version_checked): return False return True +def configure_node_lib_files(o): + o['variables']['node_library_files'] = SearchFiles('lib', 'js') def configure_node(o): if options.dest_os == 'android': @@ -1903,6 +1906,7 @@ def make_bin_override(): flavor = GetFlavor(flavor_params) configure_node(output) +configure_node_lib_files(output) configure_napi(output) configure_library('zlib', output) configure_library('http_parser', output) diff --git a/node.gyp b/node.gyp index 691ce22ff3d664..be50b280fc5946 100644 --- a/node.gyp +++ b/node.gyp @@ -33,7 +33,7 @@ # Windows command length limit or there would be an error. # See https://docs.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation 'library_files': [ - ' Date: Sun, 11 Jul 2021 23:18:43 -0700 Subject: [PATCH 006/117] tools: use Node.js 16.x for GitHub workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit find-inactive-collaborators.mjs works fine with Node.js 16.x, but GitHub Actions currently use 14.x by default. PR-URL: https://github.com/nodejs/node/pull/39362 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel --- .github/workflows/find-inactive-collaborators.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index 8e459b5b8b2942..b975fb340308d3 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -13,5 +13,12 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - run: tools/find-inactive-collaborators.mjs '1 year ago' + - uses: actions/checkout@v2 + + - name: Install Node.js + uses: actions/setup-node@v2 + with: + node-version: 16.x + + - name: Find inactive collaborators + run: tools/find-inactive-collaborators.mjs '1 year ago' From 0f1d51578ea25388690a96fe7d306ebe2e0add87 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 12 Jul 2021 09:22:27 -0700 Subject: [PATCH 007/117] tools: change commit fetch limiting in find-inactive-collaborators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub Action workflows can be told to clone a certain number of commits or else everything. Change find-inactive-collaborators to take a number of commits to examine rather than a date range so that the parameter can be used in GitHub Actions. PR-URL: https://github.com/nodejs/node/pull/39362 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel --- .../workflows/find-inactive-collaborators.yml | 14 +++++++++---- tools/find-inactive-collaborators.mjs | 21 ++++++++++--------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index b975fb340308d3..45b3a8cebcd350 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -7,6 +7,10 @@ on: workflow_dispatch: +env: + NODE_VERSION: 16.x + NUM_COMMITS: 5000 + jobs: find: @@ -14,11 +18,13 @@ jobs: steps: - uses: actions/checkout@v2 - - - name: Install Node.js + with: + fetch-depth: ${{ env.NUM_COMMITS }} + + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v2 with: - node-version: 16.x + node-version: ${{ env.NODE_VERSION }} - name: Find inactive collaborators - run: tools/find-inactive-collaborators.mjs '1 year ago' + run: tools/find-inactive-collaborators.mjs ${{ env.NUM_COMMITS }} diff --git a/tools/find-inactive-collaborators.mjs b/tools/find-inactive-collaborators.mjs index 578adf05fb78c7..2951d81c534696 100755 --- a/tools/find-inactive-collaborators.mjs +++ b/tools/find-inactive-collaborators.mjs @@ -8,7 +8,7 @@ import cp from 'node:child_process'; import fs from 'node:fs'; import readline from 'node:readline'; -const SINCE = process.argv[2] || '6 months ago'; +const SINCE = +process.argv[2] || 5000; async function runGitCommand(cmd, mapFn) { const childProcess = cp.spawn('/bin/sh', ['-c', cmd], { @@ -36,19 +36,19 @@ async function runGitCommand(cmd, mapFn) { // Get all commit authors during the time period. const authors = await runGitCommand( - `git shortlog -n -s --since="${SINCE}"`, + `git shortlog -n -s --max-count="${SINCE}" HEAD`, (line) => line.trim().split('\t', 2)[1] ); // Get all commit landers during the time period. const landers = await runGitCommand( - `git shortlog -n -s -c --since="${SINCE}"`, + `git shortlog -n -s -c --max-count="${SINCE}" HEAD`, (line) => line.trim().split('\t', 2)[1] ); // Get all approving reviewers of landed commits during the time period. const approvingReviewers = await runGitCommand( - `git log --since="${SINCE}" | egrep "^ Reviewed-By: "`, + `git log --max-count="${SINCE}" | egrep "^ Reviewed-By: "`, (line) => /^ Reviewed-By: ([^<]+)/.exec(line)[1].trim() ); @@ -78,10 +78,11 @@ async function retrieveCollaboratorsFromReadme() { // Get list of current collaborators from README.md. const collaborators = await retrieveCollaboratorsFromReadme(); -console.log(`${authors.size.toLocaleString()} authors have made commits since ${SINCE}.`); -console.log(`${landers.size.toLocaleString()} landers have landed commits since ${SINCE}.`); -console.log(`${approvingReviewers.size.toLocaleString()} reviewers have approved landed commits since ${SINCE}.`); -console.log(`${collaborators.length.toLocaleString()} collaborators currently in the project.`); +console.log(`In the last ${SINCE} commits:\n`); +console.log(`* ${authors.size.toLocaleString()} authors have made commits.`); +console.log(`* ${landers.size.toLocaleString()} landers have landed commits.`); +console.log(`* ${approvingReviewers.size.toLocaleString()} reviewers have approved landed commits.`); +console.log(`* ${collaborators.length.toLocaleString()} collaborators currently in the project.`); const inactive = collaborators.filter((collaborator) => !authors.has(collaborator) && @@ -90,6 +91,6 @@ const inactive = collaborators.filter((collaborator) => ); if (inactive.length) { - console.log('\nInactive collaborators:'); - console.log(inactive.join('\n')); + console.log('\nInactive collaborators:\n'); + console.log(inactive.map((name) => `* ${name}`).join('\n')); } From 39e6536a87d90d6eb5312a47e9d24ef81829acfa Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 14 Jul 2021 04:38:06 -0700 Subject: [PATCH 008/117] doc: move jdalton to emeritus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In email, John-David Dalton confirmed that it was appropriate to move to emeritus at this time. PR-URL: https://github.com/nodejs/node/pull/39380 Reviewed-By: Tobias Nießen Reviewed-By: John-David Dalton Reviewed-By: James M Snell --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6725488daeb47..ac153fc6feca66 100644 --- a/README.md +++ b/README.md @@ -347,8 +347,6 @@ For information about the governance of the Node.js project, see **Jackson Tian** <shyvo1987@gmail.com> * [jasnell](https://github.com/jasnell) - **James M Snell** <jasnell@gmail.com> (he/him) -* [jdalton](https://github.com/jdalton) - -**John-David Dalton** <john.david.dalton@gmail.com> * [jkrems](https://github.com/jkrems) - **Jan Krems** <jan.krems@gmail.com> (he/him) * [joaocgreis](https://github.com/joaocgreis) - @@ -516,6 +514,8 @@ For information about the governance of the Node.js project, see **Jason Ginchereau** <jasongin@microsoft.com> * [jbergstroem](https://github.com/jbergstroem) - **Johan Bergström** <bugs@bergstroem.nu> +* [jdalton](https://github.com/jdalton) - +**John-David Dalton** <john.david.dalton@gmail.com> * [jhamhader](https://github.com/jhamhader) - **Yuval Brik** <yuval@brik.org.il> * [joshgav](https://github.com/joshgav) - From fc138376aa0d3701b617a674c16e16b8eae25859 Mon Sep 17 00:00:00 2001 From: legendecas Date: Thu, 22 Apr 2021 01:07:24 +0800 Subject: [PATCH 009/117] src: remove unused guards around node-api reference PR-URL: https://github.com/nodejs/node/pull/38334 Reviewed-By: Michael Dawson --- src/js_native_api_v8.cc | 3 --- src/js_native_api_v8.h | 1 - 2 files changed, 4 deletions(-) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 9c0f2b56c26d60..fe3d8fbc977c2e 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -627,9 +627,6 @@ v8::Local Reference::Get() { } void Reference::Finalize(bool is_env_teardown) { - if (is_env_teardown) env_teardown_finalize_started_ = true; - if (!is_env_teardown && env_teardown_finalize_started_) return; - // During env teardown, `~napi_env()` alone is responsible for finalizing. // Thus, we don't want any stray gc passes to trigger a second call to // `RefBase::Finalize()`. ClearWeak will ensure that even if the diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index 057113f2cb7549..91c2eeb98989ca 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -433,7 +433,6 @@ class Reference : public RefBase { static void SecondPassCallback( const v8::WeakCallbackInfo& data); - bool env_teardown_finalize_started_ = false; v8impl::Persistent _persistent; SecondPassCallParameterRef* _secondPassParameter; bool _secondPassScheduled; From e91053a465ace012f743c187570ec13c83324862 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 10 Jul 2021 19:26:31 -0700 Subject: [PATCH 010/117] stream: implement TextEncoderStream and TextDecoderStream Experimental as part of the web streams implementation Signed-off-by: James M Snell PR-URL: https://github.com/nodejs/node/pull/39347 Reviewed-By: Antoine du Hamel Reviewed-By: Matteo Collina --- doc/api/webstreams.md | 99 ++++++++ lib/internal/webstreams/encoding.js | 217 ++++++++++++++++++ lib/stream/web.js | 7 + .../test-whatwg-webstreams-encoding.js | 102 ++++++++ tools/doc/type-parser.mjs | 4 + 5 files changed, 429 insertions(+) create mode 100644 lib/internal/webstreams/encoding.js create mode 100644 test/parallel/test-whatwg-webstreams-encoding.js diff --git a/doc/api/webstreams.md b/doc/api/webstreams.md index 407230f96812ee..0bacb7b475f094 100644 --- a/doc/api/webstreams.md +++ b/doc/api/webstreams.md @@ -1118,5 +1118,104 @@ added: v16.5.0 * `chunk` {any} * Returns: {number} +### Class: `TextEncoderStream` + + +#### `new TextEncoderStream()` + + +Creates a new `TextEncoderStream` instance. + +#### `textEncoderStream.encoding` + + +* Type: {string} + +The encoding supported by the `TextEncoderStream` instance. + +#### `textEncoderStream.readable` + + +* Type: {ReadableStream} + +#### `textEncoderStream.writable` + + +* Type: {WritableStream} + +### Class: `TextDecoderStream` + + +#### `new TextDecoderStream([encoding[, options]])` + + +* `encoding` {string} Identifies the `encoding` that this `TextDecoder` instance + supports. **Default:** `'utf-8'`. +* `options` {Object} + * `fatal` {boolean} `true` if decoding failures are fatal. + * `ignoreBOM` {boolean} When `true`, the `TextDecoderStream` will include the + byte order mark in the decoded result. When `false`, the byte order mark + will be removed from the output. This option is only used when `encoding` is + `'utf-8'`, `'utf-16be'` or `'utf-16le'`. **Default:** `false`. + +Creates a new `TextDecoderStream` instance. + +#### `textDecoderStream.encoding` + + +* Type: {string} + +The encoding supported by the `TextDecoderStream` instance. + +#### `textDecoderStream.fatal` + + +* Type: {boolean} + +The value will be `true` if decoding errors result in a `TypeError` being +thrown. + +#### `textDecoderStream.ignoreBOM` + + +* Type: {boolean} + +The value will be `true` if the decoding result will include the byte order +mark. + +#### `textDecoderStream.readable` + + +* Type: {ReadableStream} + +#### `textDecoderStream.writable` + + +* Type: {WritableStream} + [Streams]: stream.md [WHATWG Streams Standard]: https://streams.spec.whatwg.org/ diff --git a/lib/internal/webstreams/encoding.js b/lib/internal/webstreams/encoding.js new file mode 100644 index 00000000000000..5af59bc9f4a502 --- /dev/null +++ b/lib/internal/webstreams/encoding.js @@ -0,0 +1,217 @@ +'use strict'; + +const { + ObjectDefineProperties, + Symbol, +} = primordials; + +const { + TextDecoder, + TextEncoder, +} = require('internal/encoding'); + +const { + TransformStream, +} = require('internal/webstreams/transformstream'); + +const { + customInspect, + kEnumerableProperty, +} = require('internal/webstreams/util'); + +const { + codes: { + ERR_INVALID_THIS, + }, +} = require('internal/errors'); + +const { + customInspectSymbol: kInspect +} = require('internal/util'); + +const kHandle = Symbol('kHandle'); +const kTransform = Symbol('kTransform'); +const kType = Symbol('kType'); + +/** + * @typedef {import('./readablestream').ReadableStream} ReadableStream + * @typedef {import('./writablestream').WritableStream} WritableStream + */ + +function isTextEncoderStream(value) { + return typeof value?.[kHandle] === 'object' && + value?.[kType] === 'TextEncoderStream'; +} + +function isTextDecoderStream(value) { + return typeof value?.[kHandle] === 'object' && + value?.[kType] === 'TextDecoderStream'; +} + +class TextEncoderStream { + constructor() { + this[kType] = 'TextEncoderStream'; + this[kHandle] = new TextEncoder(); + this[kTransform] = new TransformStream({ + transform: (chunk, controller) => { + const value = this[kHandle].encode(chunk); + if (value) + controller.enqueue(value); + }, + flush: (controller) => { + const value = this[kHandle].encode(); + if (value.byteLength > 0) + controller.enqueue(value); + controller.terminate(); + }, + }); + } + + /** + * @readonly + * @type {string} + */ + get encoding() { + if (!isTextEncoderStream(this)) + throw new ERR_INVALID_THIS('TextEncoderStream'); + return this[kHandle].encoding; + } + + /** + * @readonly + * @type {ReadableStream} + */ + get readable() { + if (!isTextEncoderStream(this)) + throw new ERR_INVALID_THIS('TextEncoderStream'); + return this[kTransform].readable; + } + + /** + * @readonly + * @type {WritableStream} + */ + get writable() { + if (!isTextEncoderStream(this)) + throw new ERR_INVALID_THIS('TextEncoderStream'); + return this[kTransform].writable; + } + + [kInspect](depth, options) { + if (!isTextEncoderStream(this)) + throw new ERR_INVALID_THIS('TextEncoderStream'); + return customInspect(depth, options, 'TextEncoderStream', { + encoding: this[kHandle].encoding, + readable: this[kTransform].readable, + writable: this[kTransform].writable, + }); + } +} + +class TextDecoderStream { + /** + * @param {string} [encoding] + * @param {{ + * fatal? : boolean, + * ignoreBOM? : boolean, + * }} [options] + */ + constructor(encoding = 'utf-8', options = {}) { + this[kType] = 'TextDecoderStream'; + this[kHandle] = new TextDecoder(encoding, options); + this[kTransform] = new TransformStream({ + transform: (chunk, controller) => { + const value = this[kHandle].decode(chunk, { stream: true }); + if (value) + controller.enqueue(value); + }, + flush: (controller) => { + const value = this[kHandle].decode(); + if (value) + controller.enqueue(value); + controller.terminate(); + }, + }); + } + + /** + * @readonly + * @type {string} + */ + get encoding() { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return this[kHandle].encoding; + } + + /** + * @readonly + * @type {boolean} + */ + get fatal() { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return this[kHandle].fatal; + } + + /** + * @readonly + * @type {boolean} + */ + get ignoreBOM() { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return this[kHandle].ignoreBOM; + } + + /** + * @readonly + * @type {ReadableStream} + */ + get readable() { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return this[kTransform].readable; + } + + /** + * @readonly + * @type {WritableStream} + */ + get writable() { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return this[kTransform].writable; + } + + [kInspect](depth, options) { + if (!isTextDecoderStream(this)) + throw new ERR_INVALID_THIS('TextDecoderStream'); + return customInspect(depth, options, 'TextDecoderStream', { + encoding: this[kHandle].encoding, + fatal: this[kHandle].fatal, + ignoreBOM: this[kHandle].ignoreBOM, + readable: this[kTransform].readable, + writable: this[kTransform].writable, + }); + } +} + +ObjectDefineProperties(TextEncoderStream.prototype, { + encoding: kEnumerableProperty, + readable: kEnumerableProperty, + writable: kEnumerableProperty, +}); + +ObjectDefineProperties(TextDecoderStream.prototype, { + encoding: kEnumerableProperty, + fatal: kEnumerableProperty, + ignoreBOM: kEnumerableProperty, + readable: kEnumerableProperty, + writable: kEnumerableProperty, +}); + +module.exports = { + TextEncoderStream, + TextDecoderStream, +}; diff --git a/lib/stream/web.js b/lib/stream/web.js index 929abd19044458..06b320f001a646 100644 --- a/lib/stream/web.js +++ b/lib/stream/web.js @@ -31,6 +31,11 @@ const { CountQueuingStrategy, } = require('internal/webstreams/queuingstrategies'); +const { + TextEncoderStream, + TextDecoderStream, +} = require('internal/webstreams/encoding'); + module.exports = { ReadableStream, ReadableStreamDefaultReader, @@ -45,4 +50,6 @@ module.exports = { WritableStreamDefaultController, ByteLengthQueuingStrategy, CountQueuingStrategy, + TextEncoderStream, + TextDecoderStream, }; diff --git a/test/parallel/test-whatwg-webstreams-encoding.js b/test/parallel/test-whatwg-webstreams-encoding.js new file mode 100644 index 00000000000000..97061650496c0d --- /dev/null +++ b/test/parallel/test-whatwg-webstreams-encoding.js @@ -0,0 +1,102 @@ +// Flags: --no-warnings +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const { + TextEncoderStream, + TextDecoderStream, +} = require('stream/web'); + +const kEuroBytes = Buffer.from([0xe2, 0x82, 0xac]); +const kEuro = Buffer.from([0xe2, 0x82, 0xac]).toString(); + +[1, false, [], {}, 'hello'].forEach((i) => { + assert.throws(() => new TextDecoderStream(i), { + code: 'ERR_ENCODING_NOT_SUPPORTED', + }); +}); + +[1, false, 'hello'].forEach((i) => { + assert.throws(() => new TextDecoderStream(undefined, i), { + code: 'ERR_INVALID_ARG_TYPE', + }); +}); + +{ + const tds = new TextDecoderStream(); + const writer = tds.writable.getWriter(); + const reader = tds.readable.getReader(); + reader.read().then(common.mustCall(({ value, done }) => { + assert(!done); + assert.strictEqual(kEuro, value); + reader.read().then(common.mustCall(({ done }) => { + assert(done); + })); + })); + Promise.all([ + writer.write(kEuroBytes.slice(0, 1)), + writer.write(kEuroBytes.slice(1, 2)), + writer.write(kEuroBytes.slice(2, 3)), + writer.close(), + ]).then(common.mustCall()); + + assert.strictEqual(tds.encoding, 'utf-8'); + assert.strictEqual(tds.fatal, false); + assert.strictEqual(tds.ignoreBOM, false); + + assert.throws( + () => Reflect.get(TextDecoderStream.prototype, 'encoding', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextDecoderStream.prototype, 'fatal', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextDecoderStream.prototype, 'ignoreBOM', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextDecoderStream.prototype, 'readable', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextDecoderStream.prototype, 'writable', {}), { + code: 'ERR_INVALID_THIS', + }); +} + +{ + const tds = new TextEncoderStream(); + const writer = tds.writable.getWriter(); + const reader = tds.readable.getReader(); + reader.read().then(common.mustCall(({ value, done }) => { + assert(!done); + const buf = Buffer.from(value.buffer, value.byteOffset, value.byteLength); + assert.deepStrictEqual(kEuroBytes, buf); + reader.read().then(common.mustCall(({ done }) => { + assert(done); + })); + })); + Promise.all([ + writer.write(kEuro), + writer.close(), + ]).then(common.mustCall()); + + assert.strictEqual(tds.encoding, 'utf-8'); + + assert.throws( + () => Reflect.get(TextEncoderStream.prototype, 'encoding', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextEncoderStream.prototype, 'readable', {}), { + code: 'ERR_INVALID_THIS', + }); + assert.throws( + () => Reflect.get(TextEncoderStream.prototype, 'writable', {}), { + code: 'ERR_INVALID_THIS', + }); +} diff --git a/tools/doc/type-parser.mjs b/tools/doc/type-parser.mjs index fff8f5afbd06cb..660a33e840466d 100644 --- a/tools/doc/type-parser.mjs +++ b/tools/doc/type-parser.mjs @@ -253,6 +253,10 @@ const customTypesMap = { 'webstreams.md#webstreamsapi_class_bytelengthqueuingstrategy', 'CountQueuingStrategy': 'webstreams.md#webstreamsapi_class_countqueuingstrategy', + 'TextEncoderStream': + 'webstreams.md#webstreamsapi_class_textencoderstream', + 'TextDecoderStream': + 'webstreams.md#webstreamsapi_class_textdecoderstream', }; const arrayPart = /(?:\[])+$/; From 25f45d50189ea6c7678b040a2f2ed0f0478336d4 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 12 Jul 2021 10:23:52 -0700 Subject: [PATCH 011/117] build: update to setup-node@v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit-lint.yml uses setup-node@v1 but all our other GitHub Actions use v2. Update commit-lint.yml. PR-URL: https://github.com/nodejs/node/pull/39366 Reviewed-By: Michaël Zasso Reviewed-By: Richard Lau Reviewed-By: Luigi Pinca Reviewed-By: Antoine du Hamel Reviewed-By: Zeyu Yang Reviewed-By: James M Snell --- .github/workflows/commit-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index 9ea6337b51f181..66587c7cb0af24 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -11,7 +11,7 @@ jobs: # Last 100 commits should be enough for a PR fetch-depth: 100 - name: Use Node.js 12 - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: 12.x - name: Validate commit messages From e44ccd9aad41f22d3f9f43c792fb559e3860a80c Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 12 Jul 2021 10:30:56 -0700 Subject: [PATCH 012/117] doc: update AUTHORS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39367 Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Tobias Nießen --- AUTHORS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/AUTHORS b/AUTHORS index 6d9af83ca23a64..06db580eb294ad 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3320,5 +3320,13 @@ Davidson Francis Rohan Sharma AkshayK FrankEntriken <42781627+FrankEntriken@users.noreply.github.com> +Cyrille Bourgois +Jacob <3012099+JakobJingleheimer@users.noreply.github.com> +ejose19 <8742215+ejose19@users.noreply.github.com> +Tobias Koppers +Makoto Kato +foxxyz +LitoMore +nerdthatnoonelikes # Generated by tools/update-authors.js From cdf7251370a5b22d9671f80cd89edcb27efa91cd Mon Sep 17 00:00:00 2001 From: legendecas Date: Sat, 19 Jun 2021 15:32:31 +0800 Subject: [PATCH 013/117] process: add api to enable source-maps programmatically Add `process.setSourceMapsEnabled` to enable source-maps programmatically. PR-URL: https://github.com/nodejs/node/pull/39085 Reviewed-By: Ben Coe Reviewed-By: James M Snell --- doc/api/process.md | 19 +++++++++ lib/internal/bootstrap/pre_execution.js | 8 ++++ lib/internal/main/worker_thread.js | 2 + lib/internal/source_map/source_map_cache.js | 39 +++++++++++++------ src/node_errors.cc | 9 +++-- test/message/source_map_disabled_by_api.js | 20 ++++++++++ test/message/source_map_disabled_by_api.out | 26 +++++++++++++ test/message/source_map_enabled_by_api.js | 17 ++++++++ test/message/source_map_enabled_by_api.out | 30 ++++++++++++++ .../test-process-setsourcemapsenabled.js | 16 ++++++++ 10 files changed, 170 insertions(+), 16 deletions(-) create mode 100644 test/message/source_map_disabled_by_api.js create mode 100644 test/message/source_map_disabled_by_api.out create mode 100644 test/message/source_map_enabled_by_api.js create mode 100644 test/message/source_map_enabled_by_api.out create mode 100644 test/parallel/test-process-setsourcemapsenabled.js diff --git a/doc/api/process.md b/doc/api/process.md index 575e19f66cd051..2fffa6479784a9 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -3248,6 +3248,24 @@ This function is only available on POSIX platforms (i.e. not Windows or Android). This feature is not available in [`Worker`][] threads. +## `process.setSourceMapsEnabled(val)` + + +> Stability: 1 - Experimental + +* `val` {boolean} + +This function enables or disables the [Source Map v3][Source Map] support for +stack traces. + +It provides same features as launching Node.js process with commandline options +`--enable-source-maps`. + +Only source maps in JavaScript files that are loaded after source maps has been +enabled will be parsed and loaded. + ## `process.setUncaughtExceptionCaptureCallback(fn)` - -Enable experimental top-level `await` keyword support in REPL. +added: REPLACEME + --> + Use this flag to disable top-level await in REPL. ### `--experimental-specifier-resolution=mode` -Type: Documentation-only +Type: Documentation-only (supports [`--pending-deprecation`][]) The [`punycode`][] module is deprecated. Please use a userland alternative instead. diff --git a/lib/punycode.js b/lib/punycode.js index 67905e3d7670e1..3483fd667bf40a 100644 --- a/lib/punycode.js +++ b/lib/punycode.js @@ -1,5 +1,15 @@ 'use strict'; +const { getOptionValue } = require('internal/options'); +if (getOptionValue('--pending-deprecation')){ + process.emitWarning( + 'The `punycode` module is deprecated. Please use a userland ' + + 'alternative instead.', + 'DeprecationWarning', + 'DEP0040', + ); +} + /** Highest positive signed 32-bit float value */ const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 diff --git a/test/message/core_line_numbers.out b/test/message/core_line_numbers.out index 215542404be02f..97b017f66e2395 100644 --- a/test/message/core_line_numbers.out +++ b/test/message/core_line_numbers.out @@ -1,9 +1,9 @@ -node:punycode:42 +node:punycode:52 throw new RangeError(errors[type]); ^ RangeError: Invalid input - at error (node:punycode:42:8) + at error (node:punycode:52:8) at Object.decode (node:punycode:*:*) at Object. (*test*message*core_line_numbers.js:*:*) at Module._compile (node:internal/modules/cjs/loader:*:*) diff --git a/test/parallel/test-punycode.js b/test/parallel/test-punycode.js index 190c0b22b313dc..efd3b92a6e7e50 100644 --- a/test/parallel/test-punycode.js +++ b/test/parallel/test-punycode.js @@ -1,3 +1,5 @@ +// Flags: --pending-deprecation + // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -20,7 +22,13 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; -require('../common'); +const common = require('../common'); + +const punycodeWarning = + 'The `punycode` module is deprecated. Please use a userland alternative ' + + 'instead.'; +common.expectWarning('DeprecationWarning', punycodeWarning, 'DEP0040'); + const punycode = require('punycode'); const assert = require('assert'); From 20bb3f6df07c1864964fb90860111596c5346a5c Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 14 Jul 2021 22:22:47 -0700 Subject: [PATCH 028/117] doc: add strategic initiatives from TSC repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This (along with a corresponding PR for the TSC repo) moves the strategic initiatives from the TSC repository to the main core repo. This will increase visibility for strategic initiatives. It will also facilitate the proposed reduced centrality of TSC champions to strategic plans. In the process, I made the text less wordy. I moved the Build Resources initiatve out of the active list, as discussed at the most recent TSC meeting. I alphabetized the table entries. (Chronological order isn't obvious to a reader if no dates are provided.) Refs: https://github.com/nodejs/TSC/issues/962#issuecomment-880233678 PR-URL: https://github.com/nodejs/node/pull/39394 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen Reviewed-By: Zijian Liu Reviewed-By: Michael Dawson --- README.md | 4 +-- doc/guides/strategic-initiatives.md | 40 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 doc/guides/strategic-initiatives.md diff --git a/README.md b/README.md index ac153fc6feca66..9055580138f218 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ For information on reporting security vulnerabilities in Node.js, see * [Contributing to the project][] * [Working Groups][] -* [Strategic Initiatives][] +* [Strategic initiatives][] * [Technical values and prioritization][] ## Current project team members @@ -704,6 +704,6 @@ license text. [Contributing to the project]: CONTRIBUTING.md [Node.js Website]: https://nodejs.org/ [OpenJS Foundation]: https://openjsf.org/ -[Strategic Initiatives]: https://github.com/nodejs/TSC/blob/HEAD/Strategic-Initiatives.md +[Strategic initiatives]: doc/guides/strategic-initiatives.md [Technical values and prioritization]: doc/guides/technical-values.md [Working Groups]: https://github.com/nodejs/TSC/blob/HEAD/WORKING_GROUPS.md diff --git a/doc/guides/strategic-initiatives.md b/doc/guides/strategic-initiatives.md new file mode 100644 index 00000000000000..6ccce2c6f6376d --- /dev/null +++ b/doc/guides/strategic-initiatives.md @@ -0,0 +1,40 @@ +# Strategic initiatives + +The Node.js project has several strategic initiatives underway. The goal of the +TSC is to have a champion for each of these initiatives and enable their +success. + +A review of the initiatives is a standing item on the TSC agenda to ensure they +are active and have the support needed. + +## Current initiatives + +| Initiative | Champion | Links | +|---------------------------|-----------------------------|------------------------------------------------------------------------------------------| +| Core Promise APIs | [Matteo Collina][mcollina] | | +| Future of Build Toolchain | [Mary Marchini][mmarchini] | , | +| QUIC / HTTP3 | [James M Snell][jasnell] | | +| Startup performance | [Joyee Cheung][joyeecheung] | | +| V8 Currency | [Michaël Zasso][targos] | | + +## Completed + +| Initiative | Champion | Links | +|--------------------|----------------------------|--------------------------------------------------| +| Build resources | Michael Dawson | | +| CVE Management | Michael Dawson | | +| Governance | Myles Borins | | +| Moderation Team | Rich Trott | | +| Modules | Myles Borins | | +| N-API | Michael Dawson | | +| npm Integration | Myles Borins | | +| OpenSSL Evolution | Rod Vagg | | +| Open Web Standards | Myles Borins, Joyee Cheung | | +| VM module fix | Franziska Hinkelmann | | +| Workers | Anna Henningsen | | + +[jasnell]: https://github.com/jasnell +[joyeecheung]: https://github.com/joyeecheung +[mcollina]: https://github.com/mcollina +[mmarchini]: https://github.com/mmarchini +[targos]: https://github.com/targos From 9dd232c42b829bf5644733225bb0f83f21383e68 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Thu, 15 Jul 2021 12:36:48 -0700 Subject: [PATCH 029/117] deps: update to cjs-module-lexer@1.2.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39402 Reviewed-By: Bradley Farias Reviewed-By: Antoine du Hamel Reviewed-By: Zijian Liu Reviewed-By: Michaël Zasso Reviewed-By: Jan Krems Reviewed-By: Colin Ihrig --- deps/cjs-module-lexer/CHANGELOG.md | 3 +++ deps/cjs-module-lexer/README.md | 2 +- deps/cjs-module-lexer/dist/lexer.js | 2 +- deps/cjs-module-lexer/dist/lexer.mjs | 4 ++-- deps/cjs-module-lexer/lexer.js | 8 +++++--- deps/cjs-module-lexer/package.json | 2 +- doc/api/esm.md | 2 +- 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/deps/cjs-module-lexer/CHANGELOG.md b/deps/cjs-module-lexer/CHANGELOG.md index d49499aaa2efcc..e7d12a70f1a329 100644 --- a/deps/cjs-module-lexer/CHANGELOG.md +++ b/deps/cjs-module-lexer/CHANGELOG.md @@ -1,3 +1,6 @@ +1.2.2 +- Fix RollupJS reexports bug (https://github.com/guybedford/cjs-module-lexer/pull/59) + 1.2.1 - Support Unicode escapes in strings (https://github.com/guybedford/cjs-module-lexer/pull/55) - Filter export strings to valid surrogate pairs (https://github.com/guybedford/cjs-module-lexer/pull/56) diff --git a/deps/cjs-module-lexer/README.md b/deps/cjs-module-lexer/README.md index 3893221beb79c7..a761c0c7dfd714 100755 --- a/deps/cjs-module-lexer/README.md +++ b/deps/cjs-module-lexer/README.md @@ -113,7 +113,7 @@ EXPORT_STAR_LIB: `Object.keys(` IDENTIFIER$1 `).forEach(function (` IDENTIFIER$2 (`if (` IDENTIFIER$2 `in` EXPORTS_IDENTIFIER `&&` EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] ===` IDENTIFIER$1 `[` IDENTIFIER$2 `]) return` `;`)? )? ) | - `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) (`&& !` (`Object` `.prototype`? `.hasOwnProperty.call(` IDENTIFIER$1 `, ` IDENTIFIER$2 `)` | IDENTIFIER$1 `.hasOwnProperty(` IDENTIFIER$2 `)`))? `)` + `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) (`&& !` (`Object` `.prototype`? `.hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)` | IDENTIFIER `.hasOwnProperty(` IDENTIFIER$2 `)`))? `)` ) ( EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] =` IDENTIFIER$1 `[` IDENTIFIER$2 `]` `;`? | diff --git a/deps/cjs-module-lexer/dist/lexer.js b/deps/cjs-module-lexer/dist/lexer.js index 4ac468b84952a4..391bc5624ee495 100644 --- a/deps/cjs-module-lexer/dist/lexer.js +++ b/deps/cjs-module-lexer/dist/lexer.js @@ -1 +1 @@ -"use strict";exports.parse=parse;exports.init=init;let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,J=new Set,K=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&J.add(Q)}for(;A.ru();)K.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||K.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...J]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLliYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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AEHuABATRQ0DQQAgAEEMajYCvKABECcaQQAoArygASIAIAIgBhBBDQNBACAAIAdBAXRqNgK8oAEQJ0HbAEcNA0EAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQNBACAAIAhBAXRqNgK8oAEQJ0HdAEcNA0EAQQAoArygAUECajYCvKABAkAQJyIAQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygAQJAECciAEEsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEACyAAQf0ARw0DQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0DQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQFBAEEAKAK8oAFBAmo2ArygAQsQJyEACyAAQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BQQAoArSgASEEQYAgIQADQAJAAkAgBCAARg0AIAcgAEEMaigCACAAQQhqKAIAIgNrQQF1Rw0BIAIgAyAGEEENASAAKAIAIABBBGooAgBBACgCoB8RAABBACABNgK8oAELDwsgAEEQaiEADAALCyACIABBACgCpB8RAAALQQAgATYCvKABC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA0DQAgAEHmAEHvAEHyABA1DQAgAEHpAEHmABArIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVqIgNBA00NACACQZt/aiIDQQNNDQEgAkEpRg0DIAJB+QBHDQIgAEF+akHmAEHpAEHuAEHhAEHsAEHsABA2DwsgAw4EAgEBBQILIAMOBAIAAAMCC0EAIQELIAEPCyAAQX5qQeUAQewAQfMAEDUPCyAAQX5qQeMAQeEAQfQAQeMAECwPCyAAQX5qLwEAQT1GC+0DAQJ/QQAhAQJAIAAvAQBBnH9qIgJBE0sNAAJAAkACQAJAAkACQAJAAkAgAg4UAAECCAgICAgICAMECAgFCAYICAcACyAAQX5qLwEAQZd/aiICQQNLDQcCQAJAIAIOBAAJCQEACyAAQXxqQfYAQe8AECsPCyAAQXxqQfkAQekAQeUAEDUPCyAAQX5qLwEAQY1/aiICQQFLDQYCQAJAIAIOAgABAAsCQCAAQXxqLwEAIgJB4QBGDQAgAkHsAEcNCCAAQXpqQeUAEDcPCyAAQXpqQeMAEDcPCyAAQXxqQeQAQeUAQewAQeUAECwPCyAAQX5qLwEAQe8ARw0FIABBfGovAQBB5QBHDQUCQCAAQXpqLwEAIgJB8ABGDQAgAkHjAEcNBiAAQXhqQekAQe4AQfMAQfQAQeEAQe4AEDYPCyAAQXhqQfQAQfkAECsPC0EBIQEgAEF+aiIAQekAEDcNBCAAQfIAQeUAQfQAQfUAQfIAEDQPCyAAQX5qQeQAEDcPCyAAQX5qQeQAQeUAQeIAQfUAQecAQecAQeUAEDgPCyAAQX5qQeEAQfcAQeEAQekAECwPCwJAIABBfmovAQAiAkHvAEYNACACQeUARw0BIABBfGpB7gAQNw8LIABBfGpB9ABB6ABB8gAQNSEBCyABC4cBAQN/A0BBAEEAKAK8oAEiAEECaiIBNgK8oAECQAJAAkAgAEEAKALAoAFPDQAgAS8BACIBQaV/aiICQQFNDQICQCABQXZqIgBBA00NACABQS9HDQQMAgsgAA4EAAMDAAALEB0LDwsCQAJAIAIOAgEAAQtBACAAQQRqNgK8oAEMAQsQQBoMAAsLlQEBBH9BACgCvKABIQFBACgCwKABIQICQAJAA0AgASIDQQJqIQEgAyACTw0BIAEvAQAiBCAARg0CAkAgBEHcAEYNACAEQXZqIgNBA0sNASADDgQCAQECAgsgA0EEaiEBIAMvAQRBDUcNACADQQZqIAEgAy8BBkEKRhshAQwACwtBACABNgK8oAEQHQ8LQQAgATYCvKABCzgBAX9BAEEBOgDwH0EAKAK8oAEhAEEAQQAoAsCgAUECajYCvKABQQAgAEEAKAKYH2tBAXU2AuwfC84BAQV/QQAoArygASEAQQAoAsCgASEBA0AgACICQQJqIQACQAJAIAIgAU8NACAALwEAIgNBpH9qIgRBBE0NASADQSRHDQIgAi8BBEH7AEcNAkEAQQAvAYRAIgBBAWo7AYRAQQAoAqBgIABBAXRqQQAvAYhAOwEAQQAgAkEEajYCvKABQQBBAC8BhkBBAWoiADsBiEBBACAAOwGGQA8LQQAgADYCvKABEB0PCwJAAkAgBA4FAQICAgABC0EAIAA2ArygAQ8LIAJBBGohAAwACwu2AgECf0EAQQAoArygASIBQQ5qNgK8oAECQAJAAkAQJyICQdsARg0AIAJBPUYNASACQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnIQJBACgCvKABIQAgAhAtRQ0CQQAoArygASECECdBPUcNAiAAIAJBACgCnB8RAAAPC0EAQQAoArygAUECajYCvKABAkAQJyICQSdGDQAgAkEiRw0CC0EAKAK8oAEhACACEBxBAEEAKAK8oAFBAmoiAjYCvKABECdB3QBHDQFBAEEAKAK8oAFBAmo2ArygARAnQT1HDQEgACACQQAoApwfEQAADAELIABFDQBBACgCqB8RAQBBAEEAKAK8oAFBAmo2ArygAQJAECciAkHyAEYNACACQfsARw0BEC4PC0EBEBAaC0EAIAFBDGo2ArygAQs2AQJ/QQBBACgCvKABQQxqIgA2ArygARAnIQECQAJAQQAoArygASAARw0AIAEQP0UNAQsQHQsLbAEBf0EAQQAoArygASIAQQxqNgK8oAECQBAnQS5HDQBBAEEAKAK8oAFBAmo2ArygARAnQeUARw0AQQAoArygAUECakH4AEHwAEHvAEHyAEH0AEHzABAmRQ0AQQEQHw8LQQAgAEEKajYCvKABC+kBAQF/QQAhFwJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhHDQAgAC8BECAJRw0AIAAvARIgCkcNACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUcNACAALwEaIA5HDQAgAC8BHCAPRw0AIAAvAR4gEEcNACAALwEgIBFHDQAgAC8BIiASRw0AIAAvASQgE0cNACAALwEmIBRHDQAgAC8BKCAVRw0AIAAvASogFkYhFwsgFwtTAQF/QQAhCAJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0YhCAsgCAukAQEEf0EAQQAoArygASIAQQxqIgE2ArygAQJAAkACQAJAAkAQJyICQVlqIgNBB00NACACQSJGDQIgAkH7AEYNAgwBCwJAIAMOCAIAAQIBAQEDAgtBAEEALwGGQCIDQQFqOwGGQEEAKAKwoAEgA0ECdGogADYCAA8LQQAoArygASABRg0CC0EALwGGQEUNAEEAQQAoArygAUF+ajYCvKABDwsQHQsLNAEBf0EBIQECQCAAQXdqQf//A3FBBUkNACAAQYABckGgAUYNACAAQS5HIAAQP3EhAQsgAQtJAQF/QQAhBwJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRiEHCyAHC3oBA39BACgCvKABIQACQANAAkAgAC8BACIBQXdqQQVJDQAgAUEgRg0AIAFBoAFGDQAgAUEvRw0CAkAgAC8BAiIAQSpGDQAgAEEvRw0DEBUMAQsQFgtBAEEAKAK8oAEiAkECaiIANgK8oAEgAkEAKALAoAFJDQALCyABCzkBAX8CQCAALwEAIgFBgPgDcUGAuANHDQAgAEF+ai8BAEH/B3FBCnQgAUH/B3FyQYCABGohAQsgAQt9AQF/AkAgAEEvSw0AIABBJEYPCwJAIABBOkkNAEEAIQECQCAAQcEASQ0AIABB2wBJDQECQCAAQeAASw0AIABB3wBGDwsgAEH7AEkNAQJAIABB//8DSw0AIABBqgFJDQEgABA5DwtBASEBIAAQOg0AIAAQOyEBCyABDwtBAQtjAQF/AkAgAEHAAEsNACAAQSRGDwtBASEBAkAgAEHbAEkNAAJAIABB4ABLDQAgAEHfAEYPCyAAQfsASQ0AAkAgAEH//wNLDQBBACEBIABBqgFJDQEgABA8DwsgABA6IQELIAELTAEDf0EAIQMCQCAAQX5qIgRBACgCmB8iBUkNACAELwEAIAFHDQAgAC8BACACRw0AAkAgBCAFRw0AQQEPCyAAQXxqLwEAECUhAwsgAwtmAQN/QQAhBQJAIABBemoiBkEAKAKYHyIHSQ0AIAYvAQAgAUcNACAAQXxqLwEAIAJHDQAgAEF+ai8BACADRw0AIAAvAQAgBEcNAAJAIAYgB0cNAEEBDwsgAEF4ai8BABAlIQULIAULhQEBAn8gABA+IgAQKiEBAkACQCAAQdwARg0AQQAhAiABRQ0BC0EAKAK8oAFBAkEEIABBgIAESRtqIQACQANAQQAgADYCvKABIAAvAQAQPiIBRQ0BAkAgARApRQ0AIABBAkEEIAFBgIAESRtqIQAMAQsLQQAhAiABQdwARg0BC0EBIQILIAIL2gMBBH9BACgCvKABIgBBfmohAQNAQQAgAEECajYCvKABAkACQAJAIABBACgCwKABTw0AECchAEEAKAK8oAEhAgJAAkAgABAtRQ0AQQAoArygASEDAkACQBAnIgBBOkcNAEEAQQAoArygAUECajYCvKABECcQLUUNAUEAKAK8oAEvAQAhAAsgAiADQQAoApwfEQAADAILQQAgATYCvKABDwsCQAJAIABBIkYNACAAQS5GDQEgAEEnRw0EC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiAzYCvKABECciAEE6Rw0BQQBBACgCvKABQQJqNgK8oAECQBAnEC1FDQBBACgCvKABLwEAIQAgAiADQQAoApwfEQAADAILQQAgATYCvKABDwtBACgCvKABIgAvAQJBLkcNAiAALwEEQS5HDQJBACAAQQZqNgK8oAECQAJAAkAgAC8BBiIAQfIARw0AQQEQECEAQQAoArygASECIAANASACLwEAIQALIABB//8DcRAtDQFBACABNgK8oAEPC0EAIAJBAmo2ArygAQsQJyEACyAAQf//A3EiAEEsRg0CIABB/QBGDQBBACABNgK8oAELDwtBACABNgK8oAEPC0EAKAK8oAEhAAwACwuPAQEBf0EAIQ4CQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAv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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file +"use strict";exports.parse=parse;exports.init=init;let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,o=new Set,J=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&o.add(Q)}for(;A.ru();)J.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||J.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...o]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLpCYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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ASADLwEGQQpGGyEBDAALC0EAIAE2ArygARAdDwtBACABNgK8oAELOAEBf0EAQQE6APAfQQAoArygASEAQQBBACgCwKABQQJqNgK8oAFBACAAQQAoApgfa0EBdTYC7B8LzgEBBX9BACgCvKABIQBBACgCwKABIQEDQCAAIgJBAmohAAJAAkAgAiABTw0AIAAvAQAiA0Gkf2oiBEEETQ0BIANBJEcNAiACLwEEQfsARw0CQQBBAC8BhEAiAEEBajsBhEBBACgCoGAgAEEBdGpBAC8BiEA7AQBBACACQQRqNgK8oAFBAEEALwGGQEEBaiIAOwGIQEEAIAA7AYZADwtBACAANgK8oAEQHQ8LAkACQCAEDgUBAgICAAELQQAgADYCvKABDwsgAkEEaiEADAALC7YCAQJ/QQBBACgCvKABIgFBDmo2ArygAQJAAkACQBAnIgJB2wBGDQAgAkE9Rg0BIAJBLkcNAkEAQQAoArygAUECajYCvKABECchAkEAKAK8oAEhACACEC1FDQJBACgCvKABIQIQJ0E9Rw0CIAAgAkEAKAKcHxEAAA8LQQBBACgCvKABQQJqNgK8oAECQBAnIgJBJ0YNACACQSJHDQILQQAoArygASEAIAIQHEEAQQAoArygAUECaiICNgK8oAEQJ0HdAEcNAUEAQQAoArygAUECajYCvKABECdBPUcNASAAIAJBACgCnB8RAAAMAQsgAEUNAEEAKAKoHxEBAEEAQQAoArygAUECajYCvKABAkAQJyICQfIARg0AIAJB+wBHDQEQLg8LQQEQEBoLQQAgAUEMajYCvKABCzYBAn9BAEEAKAK8oAFBDGoiADYCvKABECchAQJAAkBBACgCvKABIABHDQAgARA/RQ0BCxAdCwtsAQF/QQBBACgCvKABIgBBDGo2ArygAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABECdB5QBHDQBBACgCvKABQQJqQfgAQfAAQe8AQfIAQfQAQfMAECZFDQBBARAfDwtBACAAQQpqNgK8oAEL6QEBAX9BACEXAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlHDQAgAC8BEiAKRw0AIAAvARQgC0cN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ACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUYhDgsgDguoAQECf0EAIQFBACgCvKABIQICQAJAIABB7QBHDQAgAkECakHvAEHkAEH1AEHsAEHlABATRQ0BQQAgAkEMajYCvKABAkAQJ0EuRg0AQQAhAQwCC0EAQQAoArygAUECajYCvKABECchAAsgAEHlAEcNAEEAKAK8oAEiAEEOaiACIABBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJiIBGyECC0EAIAI2ArygASABC2cBAX9BACEKAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlGIQoLIAoLcQEBf0EAIQsCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApGIQsLIAsLgwQBAn9BACECAkAQJ0HPAEcNAEEAIQJBACgCvKABIgNBAmpB4gBB6gBB5QBB4wBB9AAQE0UNAEEAIQJBACADQQxqNgK8oAEQJ0EuRw0AQQBBACgCvKABQQJqNgK8oAECQBAnIgNB8ABHDQBBACECQQAoArygASIDQQJqQfIAQe8AQfQAQe8AQfQAQfkAQfAAQeUAED1FDQFBACECQQAgA0ESajYCvKABECdBLkcNAUEAQQAoArygAUECajYCvKABECchAwtBACECIANB6ABHDQBBACECQQAoArygASIDQQJqQeEAQfMAQc8AQfcAQe4AQdAAQfIAQe8AQfAAQeUAQfIAQfQAQfkAEC9FDQBBACECQQAgA0EcajYCvKABECdBLkcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnQeMARw0AQQAhAkEAKAK8oAEiAy8BAkHhAEcNACADLwEEQewARw0AIAMvAQZB7ABHDQBBACECQQAgA0EIajYCvKABECdBKEcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnEC1FDQAQJ0EsRw0AQQAhAkEAQQAoArygAUECajYCvKABECcaQQAoArygASIDIAAgAUEBdCIBEEENAEEAIQJBACAD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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file diff --git a/deps/cjs-module-lexer/dist/lexer.mjs b/deps/cjs-module-lexer/dist/lexer.mjs index acb87e58e2cb71..5dc4052af6965e 100644 --- a/deps/cjs-module-lexer/dist/lexer.mjs +++ b/deps/cjs-module-lexer/dist/lexer.mjs @@ -1,2 +1,2 @@ -/* cjs-module-lexer 1.2.1 */ -let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,J=new Set,K=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&J.add(Q)}for(;A.ru();)K.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||K.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...J]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLliYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKABAkACQAJAECciAEEhRg0AIABBPUcNBEEAKAK8oAEiAC8BAkE9Rw0EIAAvAQRBPUcNBEEAIABBBmo2ArygAQJAECciAEEnRg0AIABBIkcNBQtBACgCvKABIgVBAmpB5ABB5QBB5gBB4QBB9QBB7ABB9AAQI0UNBEEAIAVBEGo2ArygARAnIABHDQRBAEEAKAK8oAFBAmo2ArygARAnQfwARw0EQQAoArygASIALwECQfwARw0EQQAgAEEEajYCvKABECcaQQAoArygASIAIAQgAxBBDQRBACAAIAhBAXRqNgK8oAEQJ0E9Rw0EQQAoArygASIALwECQT1HDQQgAC8BBEE9Rw0EQQAgAEEGajYCvKABAkAQJyIAQSdGDQAgAEEiRw0FC0EAKAK8oAEiBUECakHfAEHfAEHlAEHzAEHNAEHvAEHkAEH1AEHsAEHlABAyRQ0EQQAgBUEWajYCvKABECcgAEcNBEEAQQAoArygAUECajYCvKABECdBKUcNBEEAQQAoArygAUECajYCvKABECdB8gBHDQRBACgCvKABIgBBAmpB5QBB9ABB9QBB8gBB7gAQE0UNBEEAIABBDGo2ArygAQJAECdBO0cNAEEAQQAoArygAUECajYCvKABCxAnIgBB6QBHDQJB6QAhAEEAKAK8oAEiBS8BAkHmAEcNAkEAIAVBBGo2ArygARAnQShHDQRBAEEAKAK8oAFBAmoiADYCvKABAkAgBCAIEDNFDQAQJ0EpRw0FQQBBACgCvKABQQJqNgK8oAEQJ0HyAEcNBUEAKAK8oAEiAEECakHlAEH0AEH1AEHyAEHuABATRQ0FQQAgAEEMajYCvKABAkAQJ0E7Rw0AQQBBACgCvKABQQJqNgK8oAELECciAEHpAEcNA0HpACEAQQAoArygASIFLwECQeYARw0DQQAgBUEEajYCvKABECdBKEcNBUEAKAK8oAFBAmohAAtBACAANgK8oAEgACAEIAMQQQ0EQQAgACAIQQF0ajYCvKABECdB6QBHDQRBACgCvKABIgAvAQJB7gBHDQQgAC8BBEEgRw0EQQAgAEEGajYCvKABECcQMEUNBBAnQSZHDQRBACgCvKABIgAvAQJBJkcNBEEAIABBBGo2ArygARAnEDBFDQQQJ0HbAEcNBEEAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQRBACAAIAhBAXRqNgK8oAEQJ0HdAEcNBEEAQQAoArygAUECajYCvKABECdBPUcNBEEAKAK8oAEiAC8BAkE9Rw0EIAAvAQRBPUcNBEEAIABBBmo2ArygARAnGkEAKAK8oAEiACACIAYQQQ0EQQAgACAHQQF0ajYCvKABECdB2wBHDQRBAEEAKAK8oAFBAmo2ArygARAnGkEAKAK8oAEiACAEIAMQQQ0EQQAgACAIQQF0ajYCvKABECdB3QBHDQRBAEEAKAK8oAFBAmo2ArygARAnQSlHDQRBAEEAKAK8oAFBAmo2ArygARAnQfIARw0EQQAoArygASIAQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQRBACAAQQxqNgK8oAEQJ0E7Rw0BQQBBACgCvKABQQJqNgK8oAEMAQtBACgCvKABIgAvAQJBPUcNAyAALwEEQT1HDQNBACAAQQZqNgK8oAECQBAnIgBBJ0YNACAAQSJHDQQLQQAoArygASIFQQJqQeQAQeUAQeYAQeEAQfUAQewAQfQAECNFDQNBACAFQRBqNgK8oAEQJyAARw0DQQBBACgCvKABQQJqNgK8oAECQBAnIgBBJkcNAEEAKAK8oAEiAC8BAkEmRw0EQQAgAEEEajYCvKABECdBIUcNBEEAQQAoArygAUECajYCvKABECcaAkACQEEAKAK8oAEiACACIAYQQQ0AQQAgACAHQQF0ajYCvKABECdBLkcNBkEAQQAoArygAUECajYCvKABECdB6ABHDQZBACgCvKABIgBBAmpB4QBB8wBBzwBB9wBB7gBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNBkEAIABBHGo2ArygARAnQShHDQZBAEEAKAK8oAFBAmo2ArygARAnGkEAKAK8oAEiACAEIAMQQQ0GQQAgACAIQQF0ajYCvKABECdBKUcNBkEAQQAoArygAUECajYCvKABDAELIAQgCBAzRQ0FCxAnIQALIABBKUcNA0EAQQAoArygAUECajYCvKABCxAnIQALAkACQAJAIAAQMEUNABAnQdsARw0EQQBBACgCvKABQQJqNgK8oAEQJxpBACgCvKABIgAgBCADEEENBEEAIAAgCEEBdGo2ArygARAnQd0ARw0EQQBBACgCvKABQQJqNgK8oAEQJ0E9Rw0EQQBBACgCvKABQQJqNgK8oAEQJxpBACgCvKABIgAgAiAGEEENBEEAIAAgB0EBdGo2ArygARAnQdsARw0EQQBBACgCvKABQQJqNgK8oAEQJxpBACgCvKABIgAgBCADEEENBEEAIAAgCEEBdGo2ArygARAnQd0ARw0EQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQJBAEEAKAK8oAFBAmo2ArygAQwBCyAAQc8ARw0DQQAoArygASIAQQJqQeIAQeoAQeUAQeMAQfQAEBNFDQNBACAAQQxqNgK8oAEQJ0EuRw0DQQBBACgCvKABQQJqNgK8oAEQJ0HkAEcNA0EAKAK8oAEiAEECakHlAEHmAEHpAEHuAEHlAEHQAEHyAEHvAEHwAEHlAEHyAEH0AEH5ABAvRQ0DQQAgAEEcajYCvKABECdBKEcNA0EAQQAoArygAUECajYCvKABECcQMEUNAxAnQSxHDQNBAEEAKAK8oAFBAmo2ArygARAnGkEAKAK8oAEiACAEIAMQQQ0DQQAgACAIQQF0ajYCvKABECdBLEcNA0EAQQAoArygAUECajYCvKABECdB+wBHDQNBAEEAKAK8oAFBAmo2ArygARAnQeUARw0DQQAoArygASIAQQJqQe4AQfUAQe0AQeUAQfIAQeEAQeIAQewAQeUAEDFFDQNBACAAQRRqNgK8oAEQJ0E6Rw0DQQBBACgCvKABQQJqNgK8oAEQJyEFQQAoArygASEAAkAgBUH0AEYNACAALwECQfIARw0EIAAvAQRB9QBHDQQgAC8BBkHlAEcNBAtBACAAQQhqNgK8oAEQJ0EsRw0DQQBBACgCvKABQQJqNgK8oAEQJ0HnAEcNA0EAKAK8oAEiAC8BAkHlAEcNAyAALwEEQfQARw0DQQAgAEEGajYCvKABAkAQJyIAQTpHDQBBAEEAKAK8oAFBAmo2ArygARAnQeYARw0EQQAoArygASIAQQJqQfUAQe4AQeMAQfQAQekAQe8AQe4AECNFDQRBACAAQRBqIgA2ArygAQJAECciBUEoRg0AIABBACgCvKABRg0FIAUQLUUNBQsQJyEACyAAQShHDQNBAEEAKAK8oAFBAmo2ArygARAnQSlHDQNBAEEAKAK8oAFBAmo2ArygARAnQfsARw0DQQBBACgCvKABQQJqNgK8oAEQJ0HyAEcNA0EAKAK8oAEiAEECakHlAEH0AEH1AEHyAEHuABATRQ0DQQAgAEEMajYCvKABECcaQQAoArygASIAIAIgBhBBDQNBACAAIAdBAXRqNgK8oAEQJ0HbAEcNA0EAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQNBACAAIAhBAXRqNgK8oAEQJ0HdAEcNA0EAQQAoArygAUECajYCvKABAkAQJyIAQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygAQJAECciAEEsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEACyAAQf0ARw0DQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0DQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQFBAEEAKAK8oAFBAmo2ArygAQsQJyEACyAAQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BQQAoArSgASEEQYAgIQADQAJAAkAgBCAARg0AIAcgAEEMaigCACAAQQhqKAIAIgNrQQF1Rw0BIAIgAyAGEEENASAAKAIAIABBBGooAgBBACgCoB8RAABBACABNgK8oAELDwsgAEEQaiEADAALCyACIABBACgCpB8RAAALQQAgATYCvKABC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA0DQAgAEHmAEHvAEHyABA1DQAgAEHpAEHmABArIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVqIgNBA00NACACQZt/aiIDQQNNDQEgAkEpRg0DIAJB+QBHDQIgAEF+akHmAEHpAEHuAEHhAEHsAEHsABA2DwsgAw4EAgEBBQILIAMOBAIAAAMCC0EAIQELIAEPCyAAQX5qQeUAQewAQfMAEDUPCyAAQX5qQeMAQeEAQfQAQeMAECwPCyAAQX5qLwEAQT1GC+0DAQJ/QQAhAQJAIAAvAQBBnH9qIgJBE0sNAAJAAkACQAJAAkACQAJAAkAgAg4UAAECCAgICAgICAMECAgFCAYICAcACyAAQX5qLwEAQZd/aiICQQNLDQcCQAJAIAIOBAAJCQEACyAAQXxqQfYAQe8AECsPCyAAQXxqQfkAQekAQeUAEDUPCyAAQX5qLwEAQY1/aiICQQFLDQYCQAJAIAIOAgABAAsCQCAAQXxqLwEAIgJB4QBGDQAgAkHsAEcNCCAAQXpqQeUAEDcPCyAAQXpqQeMAEDcPCyAAQXxqQeQAQeUAQewAQeUAECwPCyAAQX5qLwEAQe8ARw0FIABBfGovAQBB5QBHDQUCQCAAQXpqLwEAIgJB8ABGDQAgAkHjAEcNBiAAQXhqQekAQe4AQfMAQfQAQeEAQe4AEDYPCyAAQXhqQfQAQfkAECsPC0EBIQEgAEF+aiIAQekAEDcNBCAAQfIAQeUAQfQAQfUAQfIAEDQPCyAAQX5qQeQAEDcPCyAAQX5qQeQAQeUAQeIAQfUAQecAQecAQeUAEDgPCyAAQX5qQeEAQfcAQeEAQekAECwPCwJAIABBfmovAQAiAkHvAEYNACACQeUARw0BIABBfGpB7gAQNw8LIABBfGpB9ABB6ABB8gAQNSEBCyABC4cBAQN/A0BBAEEAKAK8oAEiAEECaiIBNgK8oAECQAJAAkAgAEEAKALAoAFPDQAgAS8BACIBQaV/aiICQQFNDQICQCABQXZqIgBBA00NACABQS9HDQQMAgsgAA4EAAMDAAALEB0LDwsCQAJAIAIOAgEAAQtBACAAQQRqNgK8oAEMAQsQQBoMAAsLlQEBBH9BACgCvKABIQFBACgCwKABIQICQAJAA0AgASIDQQJqIQEgAyACTw0BIAEvAQAiBCAARg0CAkAgBEHcAEYNACAEQXZqIgNBA0sNASADDgQCAQECAgsgA0EEaiEBIAMvAQRBDUcNACADQQZqIAEgAy8BBkEKRhshAQwACwtBACABNgK8oAEQHQ8LQQAgATYCvKABCzgBAX9BAEEBOgDwH0EAKAK8oAEhAEEAQQAoAsCgAUECajYCvKABQQAgAEEAKAKYH2tBAXU2AuwfC84BAQV/QQAoArygASEAQQAoAsCgASEBA0AgACICQQJqIQACQAJAIAIgAU8NACAALwEAIgNBpH9qIgRBBE0NASADQSRHDQIgAi8BBEH7AEcNAkEAQQAvAYRAIgBBAWo7AYRAQQAoAqBgIABBAXRqQQAvAYhAOwEAQQAgAkEEajYCvKABQQBBAC8BhkBBAWoiADsBiEBBACAAOwGGQA8LQQAgADYCvKABEB0PCwJAAkAgBA4FAQICAgABC0EAIAA2ArygAQ8LIAJBBGohAAwACwu2AgECf0EAQQAoArygASIBQQ5qNgK8oAECQAJAAkAQJyICQdsARg0AIAJBPUYNASACQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnIQJBACgCvKABIQAgAhAtRQ0CQQAoArygASECECdBPUcNAiAAIAJBACgCnB8RAAAPC0EAQQAoArygAUECajYCvKABAkAQJyICQSdGDQAgAkEiRw0CC0EAKAK8oAEhACACEBxBAEEAKAK8oAFBAmoiAjYCvKABECdB3QBHDQFBAEEAKAK8oAFBAmo2ArygARAnQT1HDQEgACACQQAoApwfEQAADAELIABFDQBBACgCqB8RAQBBAEEAKAK8oAFBAmo2ArygAQJAECciAkHyAEYNACACQfsARw0BEC4PC0EBEBAaC0EAIAFBDGo2ArygAQs2AQJ/QQBBACgCvKABQQxqIgA2ArygARAnIQECQAJAQQAoArygASAARw0AIAEQP0UNAQsQHQsLbAEBf0EAQQAoArygASIAQQxqNgK8oAECQBAnQS5HDQBBAEEAKAK8oAFBAmo2ArygARAnQeUARw0AQQAoArygAUECakH4AEHwAEHvAEHyAEH0AEHzABAmRQ0AQQEQHw8LQQAgAEEKajYCvKABC+kBAQF/QQAhFwJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhHDQAgAC8BECAJRw0AIAAvARIgCkcNACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUcNACAALwEaIA5HDQAgAC8BHCAPRw0AIAAvAR4gEEcNACAALwEgIBFHDQAgAC8BIiASRw0AIAAvASQgE0cNACAALwEmIBRHDQAgAC8BKCAVRw0AIAAvASogFkYhFwsgFwtTAQF/QQAhCAJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0YhCAsgCAukAQEEf0EAQQAoArygASIAQQxqIgE2ArygAQJAAkACQAJAAkAQJyICQVlqIgNBB00NACACQSJGDQIgAkH7AEYNAgwBCwJAIAMOCAIAAQIBAQEDAgtBAEEALwGGQCIDQQFqOwGGQEEAKAKwoAEgA0ECdGogADYCAA8LQQAoArygASABRg0CC0EALwGGQEUNAEEAQQAoArygAUF+ajYCvKABDwsQHQsLNAEBf0EBIQECQCAAQXdqQf//A3FBBUkNACAAQYABckGgAUYNACAAQS5HIAAQP3EhAQsgAQtJAQF/QQAhBwJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRiEHCyAHC3oBA39BACgCvKABIQACQANAAkAgAC8BACIBQXdqQQVJDQAgAUEgRg0AIAFBoAFGDQAgAUEvRw0CAkAgAC8BAiIAQSpGDQAgAEEvRw0DEBUMAQsQFgtBAEEAKAK8oAEiAkECaiIANgK8oAEgAkEAKALAoAFJDQALCyABCzkBAX8CQCAALwEAIgFBgPgDcUGAuANHDQAgAEF+ai8BAEH/B3FBCnQgAUH/B3FyQYCABGohAQsgAQt9AQF/AkAgAEEvSw0AIABBJEYPCwJAIABBOkkNAEEAIQECQCAAQcEASQ0AIABB2wBJDQECQCAAQeAASw0AIABB3wBGDwsgAEH7AEkNAQJAIABB//8DSw0AIABBqgFJDQEgABA5DwtBASEBIAAQOg0AIAAQOyEBCyABDwtBAQtjAQF/AkAgAEHAAEsNACAAQSRGDwtBASEBAkAgAEHbAEkNAAJAIABB4ABLDQAgAEHfAEYPCyAAQfsASQ0AAkAgAEH//wNLDQBBACEBIABBqgFJDQEgABA8DwsgABA6IQELIAELTAEDf0EAIQMCQCAAQX5qIgRBACgCmB8iBUkNACAELwEAIAFHDQAgAC8BACACRw0AAkAgBCAFRw0AQQEPCyAAQXxqLwEAECUhAwsgAwtmAQN/QQAhBQJAIABBemoiBkEAKAKYHyIHSQ0AIAYvAQAgAUcNACAAQXxqLwEAIAJHDQAgAEF+ai8BACADRw0AIAAvAQAgBEcNAAJAIAYgB0cNAEEBDwsgAEF4ai8BABAlIQULIAULhQEBAn8gABA+IgAQKiEBAkACQCAAQdwARg0AQQAhAiABRQ0BC0EAKAK8oAFBAkEEIABBgIAESRtqIQACQANAQQAgADYCvKABIAAvAQAQPiIBRQ0BAkAgARApRQ0AIABBAkEEIAFBgIAESRtqIQAMAQsLQQAhAiABQdwARg0BC0EBIQILIAIL2gMBBH9BACgCvKABIgBBfmohAQNAQQAgAEECajYCvKABAkACQAJAIABBACgCwKABTw0AECchAEEAKAK8oAEhAgJAAkAgABAtRQ0AQQAoArygASEDAkACQBAnIgBBOkcNAEEAQQAoArygAUECajYCvKABECcQLUUNAUEAKAK8oAEvAQAhAAsgAiADQQAoApwfEQAADAILQQAgATYCvKABDwsCQAJAIABBIkYNACAAQS5GDQEgAEEnRw0EC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiAzYCvKABECciAEE6Rw0BQQBBACgCvKABQQJqNgK8oAECQBAnEC1FDQBBACgCvKABLwEAIQAgAiADQQAoApwfEQAADAILQQAgATYCvKABDwtBACgCvKABIgAvAQJBLkcNAiAALwEEQS5HDQJBACAAQQZqNgK8oAECQAJAAkAgAC8BBiIAQfIARw0AQQEQECEAQQAoArygASECIAANASACLwEAIQALIABB//8DcRAtDQFBACABNgK8oAEPC0EAIAJBAmo2ArygAQsQJyEACyAAQf//A3EiAEEsRg0CIABB/QBGDQBBACABNgK8oAELDwtBACABNgK8oAEPC0EAKAK8oAEhAAwACwuPAQEBf0EAIQ4CQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAv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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file +/* cjs-module-lexer 1.2.2 */ +let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,o=new Set,J=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&o.add(Q)}for(;A.ru();)J.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||J.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...o]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLpCYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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ASADLwEGQQpGGyEBDAALC0EAIAE2ArygARAdDwtBACABNgK8oAELOAEBf0EAQQE6APAfQQAoArygASEAQQBBACgCwKABQQJqNgK8oAFBACAAQQAoApgfa0EBdTYC7B8LzgEBBX9BACgCvKABIQBBACgCwKABIQEDQCAAIgJBAmohAAJAAkAgAiABTw0AIAAvAQAiA0Gkf2oiBEEETQ0BIANBJEcNAiACLwEEQfsARw0CQQBBAC8BhEAiAEEBajsBhEBBACgCoGAgAEEBdGpBAC8BiEA7AQBBACACQQRqNgK8oAFBAEEALwGGQEEBaiIAOwGIQEEAIAA7AYZADwtBACAANgK8oAEQHQ8LAkACQCAEDgUBAgICAAELQQAgADYCvKABDwsgAkEEaiEADAALC7YCAQJ/QQBBACgCvKABIgFBDmo2ArygAQJAAkACQBAnIgJB2wBGDQAgAkE9Rg0BIAJBLkcNAkEAQQAoArygAUECajYCvKABECchAkEAKAK8oAEhACACEC1FDQJBACgCvKABIQIQJ0E9Rw0CIAAgAkEAKAKcHxEAAA8LQQBBACgCvKABQQJqNgK8oAECQBAnIgJBJ0YNACACQSJHDQILQQAoArygASEAIAIQHEEAQQAoArygAUECaiICNgK8oAEQJ0HdAEcNAUEAQQAoArygAUECajYCvKABECdBPUcNASAAIAJBACgCnB8RAAAMAQsgAEUNAEEAKAKoHxEBAEEAQQAoArygAUECajYCvKABAkAQJyICQfIARg0AIAJB+wBHDQEQLg8LQQEQEBoLQQAgAUEMajYCvKABCzYBAn9BAEEAKAK8oAFBDGoiADYCvKABECchAQJAAkBBACgCvKABIABHDQAgARA/RQ0BCxAdCwtsAQF/QQBBACgCvKABIgBBDGo2ArygAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABECdB5QBHDQBBACgCvKABQQJqQfgAQfAAQe8AQfIAQfQAQfMAECZFDQBBARAfDwtBACAAQQpqNgK8oAEL6QEBAX9BACEXAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlHDQAgAC8BEiAKRw0AIAAvARQgC0cNACAALwEWIAxHDQAgAC8BGCANRw0AIAAvARogDkcNACAALwEcIA9HDQAgAC8BHiAQRw0AIAAvASAgEUcNACAALwEiIBJHDQAgAC8BJCATRw0AIAAvASYgFEcNACAALwEoIBVHDQAgAC8BKiAWRiEXCyAXC1MBAX9BACEIAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRiEICyAIC6QBAQR/QQBBACgCvKABIgBBDGoiATYCvKABAkACQAJAAkACQBAnIgJBWWoiA0EHTQ0AIAJBIkYNAiACQfsARg0CDAELAkAgAw4IAgABAgEBAQMCC0EAQQAvAYZAIgNBAWo7AYZAQQAoArCgASADQQJ0aiAANgIADwtBACgCvKABIAFGDQILQQAvAYZARQ0AQQBBACgCvKABQX5qNgK8oAEPCxAdCws0AQF/QQEhAQJAIABBd2pB//8DcUEFSQ0AIABBgAFyQaABRg0AIABBLkcgABA/cSEBCyABC0kBAX9BACEHAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZGIQcLIAcLegEDf0EAKAK8oAEhAAJAA0ACQCAALwEAIgFBd2pBBUkNACABQSBGDQAgAUGgAUYNACABQS9HDQICQCAALwECIgBBKkYNACAAQS9HDQMQFQwBCxAWC0EAQQAoArygASICQQJqIgA2ArygASACQQAoAsCgAUkNAAsLIAELOQEBfwJAIAAvAQAiAUGA+ANxQYC4A0cNACAAQX5qLwEAQf8HcUEKdCABQf8HcXJBgIAEaiEBCyABC30BAX8CQCAAQS9LDQAgAEEkRg8LAkAgAEE6SQ0AQQAhAQJAIABBwQBJDQAgAEHbAEkNAQJAIABB4ABLDQAgAEHfAEYPCyAAQfsASQ0BAkAgAEH//wNLDQAgAEGqAUkNASAAEDkPC0EBIQEgABA6DQAgABA7IQELIAEPC0EBC2MBAX8CQCAAQcAASw0AIABBJEYPC0EBIQECQCAAQdsASQ0AAkAgAEHgAEsNACAAQd8ARg8LIABB+wBJDQACQCAAQf//A0sNAEEAIQEgAEGqAUkNASAAEDwPCyAAEDohAQsgAQtMAQN/QQAhAwJAIABBfmoiBEEAKAKYHyIFSQ0AIAQvAQAgAUcNACAALwEAIAJHDQACQCAEIAVHDQBBAQ8LIABBfGovAQAQJSEDCyADC2YBA39BACEFAkAgAEF6aiIGQQAoApgfIgdJDQAgBi8BACABRw0AIABBfGovAQAgAkcNACAAQX5qLwEAIANHDQAgAC8BACAERw0AAkAgBiAHRw0AQQEPCyAAQXhqLwEAECUhBQsgBQuFAQECfyAAED4iABAqIQECQAJAIABB3ABGDQBBACECIAFFDQELQQAoArygAUECQQQgAEGAgARJG2ohAAJAA0BBACAANgK8oAEgAC8BABA+IgFFDQECQCABEClFDQAgAEECQQQgAUGAgARJG2ohAAwBCwtBACECIAFB3ABGDQELQQEhAgsgAgvaAwEEf0EAKAK8oAEiAEF+aiEBA0BBACAAQQJqNgK8oAECQAJAAkAgAEEAKALAoAFPDQAQJyEAQQAoArygASECAkACQCAAEC1FDQBBACgCvKABIQMCQAJAECciAEE6Rw0AQQBBACgCvKABQQJqNgK8oAEQJxAtRQ0BQQAoArygAS8BACEACyACIANBACgCnB8RAAAMAgtBACABNgK8oAEPCwJAAkAgAEEiRg0AIABBLkYNASAAQSdHDQQLQQAoArygASECIAAQHEEAQQAoArygAUECaiIDNgK8oAEQJyIAQTpHDQFBAEEAKAK8oAFBAmo2ArygAQJAECcQLUUNAEEAKAK8oAEvAQAhACACIANBACgCnB8RAAAMAgtBACABNgK8oAEPC0EAKAK8oAEiAC8BAkEuRw0CIAAvAQRBLkcNAkEAIABBBmo2ArygAQJAAkACQCAALwEGIgBB8gBHDQBBARAQIQBBACgCvKABIQIgAA0BIAIvAQAhAAsgAEH//wNxEC0NAUEAIAE2ArygAQ8LQQAgAkECajYCvKABCxAnIQALIABB//8DcSIAQSxGDQIgAEH9AEYNAEEAIAE2ArygAQsPC0EAIAE2ArygAQ8LQQAoArygASEADAALC48BAQF/QQAhDgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhHDQAgAC8BECAJRw0AIAAvARIgCkcNACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUYhDgsgDguoAQECf0EAIQFBACgCvKABIQICQAJAIABB7QBHDQAgAkECakHvAEHkAEH1AEHsAEHlABATRQ0BQQAgAkEMajYCvKABAkAQJ0EuRg0AQQAhAQwCC0EAQQAoArygAUECajYCvKABECchAAsgAEHlAEcNAEEAKAK8oAEiAEEOaiACIABBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJiIBGyECC0EAIAI2ArygASABC2cBAX9BACEKAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlGIQoLIAoLcQEBf0EAIQsCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApGIQsLIAsLgwQBAn9BACECAkAQJ0HPAEcNAEEAIQJBACgCvKABIgNBAmpB4gBB6gBB5QBB4wBB9AAQE0UNAEEAIQJBACADQQxqNgK8oAEQJ0EuRw0AQQBBACgCvKABQQJqNgK8oAECQBAnIgNB8ABHDQBBACECQQAoArygASIDQQJqQfIAQe8AQfQAQe8AQfQAQfkAQfAAQeUAED1FDQFBACECQQAgA0ESajYCvKABECdBLkcNAUEAQQAoArygAUECajYCvKABECchAwtBACECIANB6ABHDQBBACECQQAoArygASIDQQJqQeEAQfMAQc8AQfcAQe4AQdAAQfIAQe8AQfAAQeUAQfIAQfQAQfkAEC9FDQBBACECQQAgA0EcajYCvKABECdBLkcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnQeMARw0AQQAhAkEAKAK8oAEiAy8BAkHhAEcNACADLwEEQewARw0AIAMvAQZB7ABHDQBBACECQQAgA0EIajYCvKABECdBKEcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnEC1FDQAQJ0EsRw0AQQAhAkEAQQAoArygAUECajYCvKABECcaQQAoArygASIDIAAgAUEBdCIBEEENAEEAIQJBACAD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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file diff --git a/deps/cjs-module-lexer/lexer.js b/deps/cjs-module-lexer/lexer.js index b66e37204b41d6..1bf3123c172c39 100755 --- a/deps/cjs-module-lexer/lexer.js +++ b/deps/cjs-module-lexer/lexer.js @@ -651,8 +651,10 @@ function tryParseObjectDefineOrKeys (keys) { if (ch !== 33/*!*/) break; pos += 1; ch = commentWhitespace(); - if (source.startsWith(id, pos)) { - pos += id.length; + if (ch === 79/*O*/ && source.startsWith('bject', pos + 1) && source[pos + 6] === '.') { + if (!tryParseObjectHasOwnProperty(it_id)) break; + } + else if (identifier()) { ch = commentWhitespace(); if (ch !== 46/*.*/) break; pos++; @@ -669,7 +671,7 @@ function tryParseObjectDefineOrKeys (keys) { if (ch !== 41/*)*/) break; pos += 1; } - else if (!tryParseObjectHasOwnProperty(it_id)) break; + else break; ch = commentWhitespace(); } if (ch !== 41/*)*/) break; diff --git a/deps/cjs-module-lexer/package.json b/deps/cjs-module-lexer/package.json index e550ac682ee9bb..13d13ca93c8d7d 100755 --- a/deps/cjs-module-lexer/package.json +++ b/deps/cjs-module-lexer/package.json @@ -1,6 +1,6 @@ { "name": "cjs-module-lexer", - "version": "1.2.1", + "version": "1.2.2", "description": "Lexes CommonJS modules, returning their named exports metadata", "main": "lexer.js", "exports": { diff --git a/doc/api/esm.md b/doc/api/esm.md index f3827b5663966c..f4493ee5ea8c1a 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -1348,7 +1348,7 @@ success! [`string`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String [`transformSource` hook]: #esm_transformsource_source_context_defaulttransformsource [`util.TextDecoder`]: util.md#util_class_util_textdecoder -[cjs-module-lexer]: https://github.com/guybedford/cjs-module-lexer/tree/1.2.1 +[cjs-module-lexer]: https://github.com/guybedford/cjs-module-lexer/tree/1.2.2 [custom https loader]: #esm_https_loader [special scheme]: https://url.spec.whatwg.org/#special-scheme [the official standard format]: https://tc39.github.io/ecma262/#sec-modules From 68fd6d5282a251eba2b772f2f78b843c4275a936 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Sat, 10 Jul 2021 18:37:47 +0530 Subject: [PATCH 030/117] url: prevent pathname setter from erasing path of path-only URLs This change prevents the pathname setter from erasing the path of path-only URLs as that would make them cannot-be-a-base URLs. The changes in all files except `src/node_url.cc` have been done by running: ```console git node wpt url ``` Fixes: https://github.com/nodejs/node/issues/39059 Signed-off-by: Darshan Sen PR-URL: https://github.com/nodejs/node/pull/39060 Reviewed-By: Anna Henningsen Reviewed-By: Khaidi Chu Reviewed-By: James M Snell Reviewed-By: Tiancheng "Timothy" Gu --- src/node_url.cc | 3 + test/fixtures/wpt/README.md | 2 +- .../wpt/url/resources/setters_tests.json | 103 ++++++++ .../wpt/url/resources/urltestdata.json | 224 +++++++++++++++++- test/fixtures/wpt/versions.json | 2 +- 5 files changed, 331 insertions(+), 3 deletions(-) diff --git a/src/node_url.cc b/src/node_url.cc index 4343b672c6a982..d7549e3bc05562 100644 --- a/src/node_url.cc +++ b/src/node_url.cc @@ -1477,6 +1477,9 @@ void URL::Parse(const char* input, if (ch != '/') { continue; } + } else if (has_state_override && !(url->flags & URL_FLAGS_HAS_HOST)) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path.emplace_back(""); } break; case kPath: diff --git a/test/fixtures/wpt/README.md b/test/fixtures/wpt/README.md index 60d3aeb98c17da..6019abd8aa8769 100644 --- a/test/fixtures/wpt/README.md +++ b/test/fixtures/wpt/README.md @@ -22,7 +22,7 @@ Last update: - interfaces: https://github.com/web-platform-tests/wpt/tree/fcb671ed8b/interfaces - resources: https://github.com/web-platform-tests/wpt/tree/972ca5b669/resources - streams: https://github.com/web-platform-tests/wpt/tree/8f60d94439/streams -- url: https://github.com/web-platform-tests/wpt/tree/1fcb39223d/url +- url: https://github.com/web-platform-tests/wpt/tree/77d54aa9e0/url [Web Platform Tests]: https://github.com/web-platform-tests/wpt [`git node wpt`]: https://github.com/nodejs/node-core-utils/blob/main/docs/git-node.md#git-node-wpt diff --git a/test/fixtures/wpt/url/resources/setters_tests.json b/test/fixtures/wpt/url/resources/setters_tests.json index 56bcae464a6f54..b709ef5234a4fd 100644 --- a/test/fixtures/wpt/url/resources/setters_tests.json +++ b/test/fixtures/wpt/url/resources/setters_tests.json @@ -990,6 +990,26 @@ "hostname": "test", "port": "12" } + }, + { + "comment": "Leading / is not stripped", + "href": "http://example.com/", + "new_value": "///bad.com", + "expected": { + "href": "http://example.com/", + "host": "example.com", + "hostname": "example.com" + } + }, + { + "comment": "Leading / is not stripped", + "href": "sc://example.com/", + "new_value": "///bad.com", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } } ], "hostname": [ @@ -1345,6 +1365,26 @@ "hostname": "", "pathname": "//p" } + }, + { + "comment": "Leading / is not stripped", + "href": "http://example.com/", + "new_value": "///bad.com", + "expected": { + "href": "http://example.com/", + "host": "example.com", + "hostname": "example.com" + } + }, + { + "comment": "Leading / is not stripped", + "href": "sc://example.com/", + "new_value": "///bad.com", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } } ], "port": [ @@ -1571,6 +1611,51 @@ "pathname": "me@example.net" } }, + { + "comment": "Special URLs cannot have their paths erased", + "href": "file:///some/path", + "new_value": "", + "expected": { + "href": "file:///", + "pathname": "/" + } + }, + { + "comment": "Non-special URLs can have their paths erased", + "href": "foo://somehost/some/path", + "new_value": "", + "expected": { + "href": "foo://somehost", + "pathname": "" + } + }, + { + "comment": "Non-special URLs with an empty host can have their paths erased", + "href": "foo:///some/path", + "new_value": "", + "expected": { + "href": "foo://", + "pathname": "" + } + }, + { + "comment": "Path-only URLs cannot have their paths erased", + "href": "foo:/some/path", + "new_value": "", + "expected": { + "href": "foo:/", + "pathname": "/" + } + }, + { + "comment": "Path-only URLs always have an initial slash", + "href": "foo:/some/path", + "new_value": "test", + "expected": { + "href": "foo:/test", + "pathname": "/test" + } + }, { "href": "unix:/run/foo.socket?timeout=10", "new_value": "/var/log/../run/bar.socket", @@ -1667,6 +1752,24 @@ "pathname": "/%23" } }, + { + "comment": "? doesn't mess up encoding", + "href": "http://example.net", + "new_value": "/?é", + "expected": { + "href": "http://example.net/%3F%C3%A9", + "pathname": "/%3F%C3%A9" + } + }, + { + "comment": "# doesn't mess up encoding", + "href": "http://example.net", + "new_value": "/#é", + "expected": { + "href": "http://example.net/%23%C3%A9", + "pathname": "/%23%C3%A9" + } + }, { "comment": "File URLs and (back)slashes", "href": "file://monkey/", diff --git a/test/fixtures/wpt/url/resources/urltestdata.json b/test/fixtures/wpt/url/resources/urltestdata.json index 96c42d2284ebf7..a56b30caf98cb1 100644 --- a/test/fixtures/wpt/url/resources/urltestdata.json +++ b/test/fixtures/wpt/url/resources/urltestdata.json @@ -539,6 +539,36 @@ "search": "", "hash": "" }, + { + "input": "\\x", + "base": "http://example.org/foo/bar", + "href": "http://example.org/x", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + { + "input": "\\\\x\\hello", + "base": "http://example.org/foo/bar", + "href": "http://x/hello", + "origin": "http://x", + "protocol": "http:", + "username": "", + "password": "", + "host": "x", + "hostname": "x", + "port": "", + "pathname": "/hello", + "search": "", + "hash": "" + }, { "input": "::", "base": "http://example.org/foo/bar", @@ -4698,6 +4728,140 @@ "base": "about:blank", "failure": true }, + { + "input": "foo://ho\u0000st/", + "base": "about:blank", + "failure": true + }, + { + "input": "foo://ho|st/", + "base": "about:blank", + "failure": true + }, + "Forbidden host codepoints: tabs and newlines are removed during preprocessing", + { + "input": "foo://ho\u0009st/", + "base": "about:blank", + "hash": "", + "host": "host", + "hostname": "host", + "href":"foo://host/", + "password": "", + "pathname": "/", + "port":"", + "protocol": "foo:", + "search": "", + "username": "" + }, + { + "input": "foo://ho\u000Ast/", + "base": "about:blank", + "hash": "", + "host": "host", + "hostname": "host", + "href":"foo://host/", + "password": "", + "pathname": "/", + "port":"", + "protocol": "foo:", + "search": "", + "username": "" + }, + { + "input": "foo://ho\u000Dst/", + "base": "about:blank", + "hash": "", + "host": "host", + "hostname": "host", + "href":"foo://host/", + "password": "", + "pathname": "/", + "port":"", + "protocol": "foo:", + "search": "", + "username": "" + }, + "Encoded forbidden host codepoints in special URLs", + { + "input": "http://ho%00st/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%09st/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%0Ast/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%0Dst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%20st/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%23st/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%2Fst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%3Ast/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%3Cst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%3Est/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%3Fst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%40st/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%5Bst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%5Cst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%5Dst/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://ho%7Cst/", + "base": "about:blank", + "failure": true + }, "Allowed host code points", { "input": "http://\u001F!\"$&'()*+,-.;=_`{}~/", @@ -7676,7 +7840,8 @@ "search": "", "username": "joe" }, - { "input": "foo://!\"$%&'()*+,-.;=_`{}~/", + { + "input": "foo://!\"$%&'()*+,-.;=_`{}~/", "base": "about:blank", "hash": "", "host": "!\"$%&'()*+,-.;=_`{}~", @@ -7794,5 +7959,62 @@ "protocol": "wss:", "search": "", "username": "" + }, + "Ensure that input schemes are not ignored when resolving non-special URLs", + { + "input": "abc:rootless", + "base": "abc://host/path", + "hash": "", + "host": "", + "hostname": "", + "href":"abc:rootless", + "password": "", + "pathname": "rootless", + "port":"", + "protocol": "abc:", + "search": "", + "username": "" + }, + { + "input": "abc:rootless", + "base": "abc:/path", + "hash": "", + "host": "", + "hostname": "", + "href":"abc:rootless", + "password": "", + "pathname": "rootless", + "port":"", + "protocol": "abc:", + "search": "", + "username": "" + }, + { + "input": "abc:rootless", + "base": "abc:path", + "hash": "", + "host": "", + "hostname": "", + "href":"abc:rootless", + "password": "", + "pathname": "rootless", + "port":"", + "protocol": "abc:", + "search": "", + "username": "" + }, + { + "input": "abc:/rooted", + "base": "abc://host/path", + "hash": "", + "host": "", + "hostname": "", + "href":"abc:/rooted", + "password": "", + "pathname": "/rooted", + "port":"", + "protocol": "abc:", + "search": "", + "username": "" } ] diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json index 6567782a1d47c9..fb10c7d403d730 100644 --- a/test/fixtures/wpt/versions.json +++ b/test/fixtures/wpt/versions.json @@ -48,7 +48,7 @@ "path": "streams" }, "url": { - "commit": "1fcb39223d3009fbb46c1b254755d6cc75e290f1", + "commit": "77d54aa9e0405f737987b59331f3584e3e1c26f9", "path": "url" } } \ No newline at end of file From 04355afd24454ebcebe3e8ae0993ee48f88f4d26 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 15 Jul 2021 13:00:19 -0400 Subject: [PATCH 031/117] test: add NumberFormat resolvedOptions test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a regression test for NumberFormat resolvedOptions. PR-URL: https://github.com/nodejs/node/pull/39401 Refs: https://github.com/nodejs/node/issues/39050 Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Tobias Nießen --- test/parallel/test-intl.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/parallel/test-intl.js b/test/parallel/test-intl.js index ba803973829b8a..956383c5281389 100644 --- a/test/parallel/test-intl.js +++ b/test/parallel/test-intl.js @@ -104,6 +104,13 @@ if (!common.hasIntl) { const numberFormat = new Intl.NumberFormat(['en']).format(12345.67890); assert.strictEqual(numberFormat, '12,345.679'); } + // Number format resolved options + { + const numberFormat = new Intl.NumberFormat('en-US', { style: 'percent' }); + const resolvedOptions = numberFormat.resolvedOptions(); + assert.strictEqual(resolvedOptions.locale, 'en-US'); + assert.strictEqual(resolvedOptions.style, 'percent'); + } // Significant Digits { const loc = ['en-US']; From 75130c94d12f27c08871d93ea9f5a7bef17c65f4 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 16 Jul 2021 07:12:00 -0700 Subject: [PATCH 032/117] doc: use _pull request_ instead of _PR_ in onboarding doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39409 Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig --- onboarding.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/onboarding.md b/onboarding.md index bbe37ce2c86e77..adcf23f41abad4 100644 --- a/onboarding.md +++ b/onboarding.md @@ -28,15 +28,15 @@ onboarding session. * [local setup](#local-setup) * [project goals and values](#project-goals-and-values) * [managing the issue tracker](#managing-the-issue-tracker) - * [reviewing PRs](#reviewing-prs) - * [landing PRs](#landing-prs) + * [reviewing pull requests](#reviewing-pull-requests) + * [landing pull requests](#landing-pull-requests) ## Local setup * git: * Make sure you have whitespace=fix: `git config --global --add apply.whitespace fix` - * Always continue to PR from your own GitHub fork + * Always create a branch in your own GitHub fork for pull requests * Branches in the `nodejs/node` repository are only for release lines * Add the canonical nodejs repository as `upstream` remote: * `git remote add upstream git://github.com/nodejs/node.git` @@ -44,7 +44,7 @@ onboarding session. * `git checkout master` * `git remote update -p` OR `git fetch --all` * `git merge --ff-only upstream/master` (or `REMOTENAME/BRANCH`) - * Make a new branch for each PR you submit. + * Make a new branch for each pull request you submit. * Membership: Consider making your membership in the Node.js GitHub organization public. This makes it easier to identify collaborators. Instructions on how to do that are available at @@ -77,9 +77,9 @@ The project has two venues for real-time discussion: ## Managing the issue tracker * You have (mostly) free rein; don't hesitate to close an issue if you are - confident that it should be closed - * Be nice about closing issues! Let people know why, and that issues and PRs - can be reopened if necessary + confident that it should be closed. + * Be nice about closing issues! Let people know why, and that issues and pull + requests can be reopened if necessary. * See [Labels][]. * There is [a bot](https://github.com/nodejs-github-bot/github-bot) that @@ -92,7 +92,7 @@ The project has two venues for real-time discussion: `semver-major` label * When adding a `semver-*` label, add a comment explaining why you're adding it. Do it right away so you don't forget! - * Please add the [`author-ready`][] label for PRs, if applicable. + * Please add the [`author-ready`][] label for pull requests, if applicable. * See [Who to CC in the issue tracker][who-to-cc]. * This will come more naturally over time @@ -110,7 +110,7 @@ The project has two venues for real-time discussion: * You can find the full moderation policy [here](https://github.com/nodejs/admin/blob/HEAD/Moderation-Policy.md). -## Reviewing PRs +## Reviewing pull requests * The primary goal is for the codebase to improve. * Secondary (but not far off) is for the person submitting code to succeed. A @@ -147,7 +147,7 @@ The project has two venues for real-time discussion: * If you see that the requested changes have been made, you can clear another collaborator's `Changes requested` review. * Use `Changes requested` to indicate that you are considering some of your - comments to block the PR from landing. + comments to block the pull request from landing. * What belongs in Node.js: * Opinions vary – it’s good to have a broad collaborator base for that reason! @@ -182,17 +182,17 @@ The project has two venues for real-time discussion: * Use the [Build WG repository](https://github.com/nodejs/build) to file issues for the Build WG members who maintain the CI infrastructure. -## Landing PRs +## Landing pull requests See the Collaborator Guide: [Landing pull requests][]. -Commits in one PR that belong to one logical change should +Commits in one pull request that belong to one logical change should be squashed. It is rarely the case in onboarding exercises, so this needs to be pointed out separately during the onboarding. -## Exercise: Make a PR adding yourself to the README +## Exercise: Make a pull request adding yourself to the README * Example: @@ -205,12 +205,14 @@ needs to be pointed out separately during the onboarding. automatically closed. * Label your pull request with the `doc`, `notable-change`, and `fast-track` labels. -* Run CI on the PR. Use the `node-test-pull-request` CI task. +* Run CI on the pull request. Use the `node-test-pull-request` CI task. * After two Collaborator approvals for the change and two Collaborator approvals - for fast-tracking, land the PR. -* Leave a comment in the PR: `Please 👍 this comment to approve fast-tracking`. + for fast-tracking, land the pull request. +* Leave a comment in the pull request: + `Please 👍 this comment to approve fast-tracking`. * If there are not enough approvals within a reasonable time, consider the - single approval of the onboarding TSC member sufficient, and land the PR. + single approval of the onboarding TSC member sufficient, and land the pull + request. * Be sure to add the `PR-URL: ` and appropriate `Reviewed-By:` metadata. * [`node-core-utils`][] automates the generation of metadata and the landing From ac43e3331cec884dacfe101a600888253c124127 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 16 Jul 2021 10:39:11 -0700 Subject: [PATCH 033/117] doc: update commit-queue.md to indicate GitHub Actions are checked MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/nodejs/node/pull/39384#issuecomment-881564491 PR-URL: https://github.com/nodejs/node/pull/39411 Reviewed-By: Michaël Zasso Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig --- doc/guides/commit-queue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/guides/commit-queue.md b/doc/guides/commit-queue.md index eeddb361a1b0c1..6d81ee8e652d2c 100644 --- a/doc/guides/commit-queue.md +++ b/doc/guides/commit-queue.md @@ -49,7 +49,7 @@ of the commit queue: option 2. A CI must've ran and succeeded since the last change on the PR 3. A collaborator must have approved the PR since the last change -4. Only Jenkins CI is checked (Actions, V8 CI and CITGM are ignored) +4. Only Jenkins CI and GitHub Actions are checked (V8 CI and CITGM are ignored) ## Implementation From c6a7c3d00dfe440d08ad547c9377cbcb32e055fe Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 22:16:55 -0700 Subject: [PATCH 034/117] tools: fix broken link hash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This typo results in a non-functional link in the WebCrypto docs. This change fixes it. PR-URL: https://github.com/nodejs/node/pull/39426 Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig --- tools/doc/type-parser.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/doc/type-parser.mjs b/tools/doc/type-parser.mjs index 660a33e840466d..481a35ca330c80 100644 --- a/tools/doc/type-parser.mjs +++ b/tools/doc/type-parser.mjs @@ -97,7 +97,7 @@ const customTypesMap = { 'EcKeyImportParams': 'webcrypto.html#webcrypto_class_eckeyimportparams', 'HmacImportParams': 'webcrypto.html#webcrypto_class_hmacimportparams', 'AesImportParams': 'webcrypto.html#webcrypto_class_aesimportparams', - 'Pbkdf2ImportParams': 'webcrypto.html#webcrypto_class.pbkdf2importparams', + 'Pbkdf2ImportParams': 'webcrypto.html#webcrypto_class_pbkdf2importparams', 'HmacParams': 'webcrypto.html#webcrypto_class_hmacparams', 'EcdsaParams': 'webcrypto.html#webcrypto_class_ecdsaparams', 'RsaPssParams': 'webcrypto.html#webcrypto_class_rsapssparams', From 95db54482a70a3a741da1a6b39d049d4fb2b7f8b Mon Sep 17 00:00:00 2001 From: Chris Opperwall Date: Mon, 19 Oct 2020 18:24:08 -0700 Subject: [PATCH 035/117] debugger: validate sec-websocket-accept response header This addresses a TODO to validate that the sec-websocket-accept header in the WebSocket handshake response is valid. To do this we need to append the WebSocket GUID to the original key sent in sec-websocket-key, sha1 hash it, and then compare the base64 encoding with the value sent in the sec-websocket-accept response header. If they don't match, an error is thrown. PR-URL: https://github.com/nodejs/node/pull/39357 Refs: https://github.com/nodejs/node-inspect/pull/93 Reviewed-By: Colin Ihrig --- lib/internal/debugger/inspect_client.js | 26 +++++++++++++++++++++---- src/node_native_module.cc | 1 + 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/internal/debugger/inspect_client.js b/lib/internal/debugger/inspect_client.js index cd277a4cf5a946..419b984cc9f473 100644 --- a/lib/internal/debugger/inspect_client.js +++ b/lib/internal/debugger/inspect_client.js @@ -11,6 +11,7 @@ const { } = primordials; const Buffer = require('buffer').Buffer; +const crypto = require('crypto'); const { ERR_DEBUGGER_ERROR } = require('internal/errors').codes; const { EventEmitter } = require('events'); const http = require('http'); @@ -35,6 +36,10 @@ const kTwoBytePayloadLengthField = 126; const kEightBytePayloadLengthField = 127; const kMaskingKeyWidthInBytes = 4; +// This guid is defined in the Websocket Protocol RFC +// https://tools.ietf.org/html/rfc6455#section-1.3 +const WEBSOCKET_HANDSHAKE_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; + function unpackError({ code, message, data }) { const err = new ERR_DEBUGGER_ERROR(`${message} - ${data}`); err.code = code; @@ -42,6 +47,19 @@ function unpackError({ code, message, data }) { return err; } +function validateHandshake(requestKey, responseKey) { + const expectedResponseKeyBase = requestKey + WEBSOCKET_HANDSHAKE_GUID; + const shasum = crypto.createHash('sha1'); + shasum.update(expectedResponseKeyBase); + const shabuf = shasum.digest(); + + if (shabuf.toString('base64') !== responseKey) { + throw new ERR_DEBUGGER_ERROR( + `WebSocket secret mismatch: ${requestKey} did not match ${responseKey}` + ); + } +} + function encodeFrameHybi17(payload) { var i; @@ -287,8 +305,8 @@ class Client extends EventEmitter { _connectWebsocket(urlPath) { this.reset(); - const key1 = require('crypto').randomBytes(16).toString('base64'); - debuglog('request websocket', key1); + const requestKey = crypto.randomBytes(16).toString('base64'); + debuglog('request WebSocket', requestKey); const httpReq = this._http = http.request({ host: this._host, @@ -297,7 +315,7 @@ class Client extends EventEmitter { headers: { 'Connection': 'Upgrade', 'Upgrade': 'websocket', - 'Sec-WebSocket-Key': key1, + 'Sec-WebSocket-Key': requestKey, 'Sec-WebSocket-Version': '13', }, }); @@ -314,7 +332,7 @@ class Client extends EventEmitter { }); const handshakeListener = (res, socket) => { - // TODO: we *could* validate res.headers[sec-websocket-accept] + validateHandshake(requestKey, res.headers['sec-websocket-accept']); debuglog('websocket upgrade'); this._socket = socket; diff --git a/src/node_native_module.cc b/src/node_native_module.cc index 2642982330e8cf..a5aa1edaf91143 100644 --- a/src/node_native_module.cc +++ b/src/node_native_module.cc @@ -70,6 +70,7 @@ void NativeModuleLoader::InitializeModuleCategories() { std::vector prefixes = { #if !HAVE_OPENSSL "internal/crypto/", + "internal/debugger/", #endif // !HAVE_OPENSSL "internal/bootstrap/", From a30d021b94b0ea1fbc3125e2fd7c446b47a257c8 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 11 Jul 2021 14:43:15 -0700 Subject: [PATCH 036/117] test: add test for WebSocket secret verification in debugger PR-URL: https://github.com/nodejs/node/pull/39357 Refs: https://github.com/nodejs/node-inspect/pull/93 Reviewed-By: Colin Ihrig --- ...test-debugger-websocket-secret-mismatch.js | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 test/parallel/test-debugger-websocket-secret-mismatch.js diff --git a/test/parallel/test-debugger-websocket-secret-mismatch.js b/test/parallel/test-debugger-websocket-secret-mismatch.js new file mode 100644 index 00000000000000..9b7b50c518f186 --- /dev/null +++ b/test/parallel/test-debugger-websocket-secret-mismatch.js @@ -0,0 +1,54 @@ +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const assert = require('assert'); +const childProcess = require('child_process'); +const http = require('http'); + +let port; + +const server = http.createServer(common.mustCall((req, res) => { + if (req.url.startsWith('/json')) { + res.writeHead(200); + res.end(`[ { + "description": "", + "devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:${port}/devtools/page/DAB7FB6187B554E10B0BD18821265734", + "cid": "DAB7FB6187B554E10B0BD18821265734", + "title": "Fhqwhgads", + "type": "page", + "url": "https://www.example.com/", + "webSocketDebuggerUrl": "ws://localhost:${port}/devtools/page/DAB7FB6187B554E10B0BD18821265734" + } ]`); + } else { + res.setHeader('Upgrade', 'websocket'); + res.setHeader('Connection', 'Upgrade'); + res.setHeader('Sec-WebSocket-Accept', 'fhqwhgads'); + res.setHeader('Sec-WebSocket-Protocol', 'chat'); + res.writeHead(101); + res.end(); + } +}, 2)).listen(0, common.mustCall(() => { + port = server.address().port; + const proc = + childProcess.spawn(process.execPath, ['inspect', `localhost:${port}`]); + + let stdout = ''; + proc.stdout.on('data', (data) => { + stdout += data.toString(); + assert.doesNotMatch(stdout, /\bok\b/); + }); + + let stderr = ''; + proc.stderr.on('data', (data) => { + stderr += data.toString(); + }); + + proc.on('exit', common.mustCall((code, signal) => { + assert.match(stderr, /\bWebSocket secret mismatch\b/); + assert.notStrictEqual(code, 0); + assert.strictEqual(signal, null); + server.close(); + })); +})); From 6d6396594b8f37e9c31405c2d0ca7c5e5aba3229 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 06:52:46 -0700 Subject: [PATCH 037/117] doc: use a details tag for completed initiatves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The list of completed initiatives is longer and visually more noticeable than the list of current initiatives, but the current initiatives are likely the ones of interest. The completed initiatives list is only going to get longer and longer, so let's put it in a details tag. PR-URL: https://github.com/nodejs/node/pull/39416 Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen --- doc/guides/strategic-initiatives.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/guides/strategic-initiatives.md b/doc/guides/strategic-initiatives.md index 6ccce2c6f6376d..6af22c0fc7811c 100644 --- a/doc/guides/strategic-initiatives.md +++ b/doc/guides/strategic-initiatives.md @@ -17,7 +17,10 @@ are active and have the support needed. | Startup performance | [Joyee Cheung][joyeecheung] | | | V8 Currency | [Michaël Zasso][targos] | | -## Completed +
+List of completed initiatives + +## Completed initiatives | Initiative | Champion | Links | |--------------------|----------------------------|--------------------------------------------------| @@ -33,6 +36,8 @@ are active and have the support needed. | VM module fix | Franziska Hinkelmann | | | Workers | Anna Henningsen | | +
+ [jasnell]: https://github.com/jasnell [joyeecheung]: https://github.com/joyeecheung [mcollina]: https://github.com/mcollina From 6b055f17b648ebac752909b2dd8016848d30b7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Fri, 16 Jul 2021 08:24:23 +0200 Subject: [PATCH 038/117] build: run workflows when a PR is ready for review Add `ready_for_review` to the activity types for the pull_request event. PR-URL: https://github.com/nodejs/node/pull/39405 Reviewed-By: Jiawen Geng Reviewed-By: Richard Lau Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell --- .github/workflows/build-tarball.yml | 1 + .github/workflows/build-windows.yml | 1 + .github/workflows/coverage-linux.yml | 1 + .github/workflows/coverage-windows.yml | 1 + .github/workflows/linters.yml | 1 + .github/workflows/misc.yml | 1 + .github/workflows/test-asan.yml | 1 + .github/workflows/test-linux.yml | 1 + .github/workflows/test-macos.yml | 1 + 9 files changed, 9 insertions(+) diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index 7022b6c1142678..37f4e707561606 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -2,6 +2,7 @@ name: Build from tarball on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] push: branches: - master diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index dea275876eacb3..1b0b336f4b8273 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -2,6 +2,7 @@ name: build-windows on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] push: branches: - master diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index 62881f63724f1d..f628521bb7ea12 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -2,6 +2,7 @@ name: coverage-linux on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths-ignore: - 'doc/**' - 'deps/**' diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 5387688e3c246a..5f515d1c24f2c7 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -2,6 +2,7 @@ name: coverage-windows on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths-ignore: - 'doc/**' - 'deps/**' diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 98a9e3374cb15b..6bdaee8d656c1d 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -2,6 +2,7 @@ name: linters on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] push: branches: - master diff --git a/.github/workflows/misc.yml b/.github/workflows/misc.yml index add72b8e531bf7..89793e85953181 100644 --- a/.github/workflows/misc.yml +++ b/.github/workflows/misc.yml @@ -2,6 +2,7 @@ name: misc on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] push: branches: - master diff --git a/.github/workflows/test-asan.yml b/.github/workflows/test-asan.yml index d6dd1b7b7ec83f..77839c314a569e 100644 --- a/.github/workflows/test-asan.yml +++ b/.github/workflows/test-asan.yml @@ -11,6 +11,7 @@ on: paths-ignore: - 'doc/**' pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths-ignore: - 'doc/**' diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index b191deb806ee1a..07e871bd07dc02 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -2,6 +2,7 @@ name: test-linux on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] push: branches: - master diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 725a3e4a8c9a26..686342f2f02081 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -2,6 +2,7 @@ name: test-macOS on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths-ignore: - 'doc/**' push: From 2b92b4ea2d84c8bf4f19d3cc38c91021d3769478 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 14 Jul 2021 13:24:43 -0700 Subject: [PATCH 039/117] doc: update mailmap and AUTHORS Based on their GitHub and other social media profiles as well as the most recent of their authored commits, I suspect watson goes by "Thomas Watson" and not the name currently listed in the .mailmap and AUTHORS files. Update. I'm doing this because it helps avoid false positives in `find-inactive-collaborators.mjs` which uses `git shortlog` which uses `.mailmap`. PR-URL: https://github.com/nodejs/node/pull/39393 Reviewed-By: Michael Dawson Reviewed-By: James M Snell --- .mailmap | 2 +- AUTHORS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.mailmap b/.mailmap index b7927d840cfe7c..a4e81378e2c2d7 100644 --- a/.mailmap +++ b/.mailmap @@ -393,7 +393,7 @@ Surya Panikkal suryagh Taehee Kang hugnosis Tanuja-Sawant Taylor Woll taylor.woll -Thomas Watson Steen Thomas Watson +Thomas Watson Timothy O. Peters Timur Shemsedinov tshemsedinov Ting Shao diff --git a/AUTHORS b/AUTHORS index 38e67e18f3b3d9..21b082f907b51b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1168,7 +1168,7 @@ Yoshiya Hinosawa Syuhei Kobayashi YutamaKotaro MURAKAMI Masahiko -Thomas Watson Steen +Thomas Watson Daijiro Yamada Kelvin Jin Mitsuo Utano From 9932e3589ce7f1588826b25e8dfdfad637915206 Mon Sep 17 00:00:00 2001 From: Nikita Rykov <40735471+angrymouse@users.noreply.github.com> Date: Sat, 17 Jul 2021 08:53:16 +0300 Subject: [PATCH 040/117] doc: remove typo (extra ' character) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39414 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel Reviewed-By: Colin Ihrig Reviewed-By: Tobias Nießen Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- doc/api/crypto.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 8defe0487d31bf..cb7fd21cf5f5ff 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -3220,7 +3220,7 @@ changes: * `key` {Object|string|ArrayBuffer|Buffer|TypedArray|DataView} * `key`: {string|ArrayBuffer|Buffer|TypedArray|DataView|Object} The key material, either in PEM, DER, or JWK format. - * `format`: {string} Must be `'pem'`, `'der'`, or '`'jwk'`. + * `format`: {string} Must be `'pem'`, `'der'`, or `'jwk'`. **Default:** `'pem'`. * `type`: {string} Must be `'pkcs1'` or `'spki'`. This option is required only if the `format` is `'der'` and ignored otherwise. From 94706c7012e6317baffb09dd9db241958bfc15c7 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 06:58:58 -0700 Subject: [PATCH 041/117] doc: revise strategic initiatives text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that it's in the core repo, so ome of the TSC-centric text doesn't make as much sense as it did when it was in the TSC repo. PR-URL: https://github.com/nodejs/node/pull/39417 Reviewed-By: Tobias Nießen Reviewed-By: James M Snell --- doc/guides/strategic-initiatives.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/guides/strategic-initiatives.md b/doc/guides/strategic-initiatives.md index 6af22c0fc7811c..c52f19c0632c8b 100644 --- a/doc/guides/strategic-initiatives.md +++ b/doc/guides/strategic-initiatives.md @@ -1,11 +1,8 @@ # Strategic initiatives -The Node.js project has several strategic initiatives underway. The goal of the -TSC is to have a champion for each of these initiatives and enable their -success. - -A review of the initiatives is a standing item on the TSC agenda to ensure they -are active and have the support needed. +The Node.js project has several strategic initiatives underway. A review of the +current initiatives is a standing item on the Technical Steering Committee +agenda to ensure they are active and have the support they need. ## Current initiatives From 5fdfcc069f2464498bcbf13305fee56414ad2340 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 16 Jul 2021 07:12:36 -0700 Subject: [PATCH 042/117] doc: remove outdated step in onboarding exercise The GitHub bot will leave a comment asking people to thumbs-up a fast track request so there is no need to manually leave such a comment. PR-URL: https://github.com/nodejs/node/pull/39410 Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell --- onboarding.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onboarding.md b/onboarding.md index adcf23f41abad4..ae65f07f37b621 100644 --- a/onboarding.md +++ b/onboarding.md @@ -204,12 +204,12 @@ needs to be pointed out separately during the onboarding. so that when the commit lands, the nomination issue url will be automatically closed. * Label your pull request with the `doc`, `notable-change`, and `fast-track` - labels. + labels. The `fast-track` label should cause the Node.js GitHub bot to post a + comment in the pull request asking collaborators to approve the pull request + by leaving a 👍 reaction on the comment. * Run CI on the pull request. Use the `node-test-pull-request` CI task. * After two Collaborator approvals for the change and two Collaborator approvals - for fast-tracking, land the pull request. -* Leave a comment in the pull request: - `Please 👍 this comment to approve fast-tracking`. + for fast-tracking, land the PR. * If there are not enough approvals within a reasonable time, consider the single approval of the onboarding TSC member sufficient, and land the pull request. From ade2eed9a60ae1036d33569abfaa2080dd82d8b9 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 21:59:32 -0700 Subject: [PATCH 043/117] doc: fix broken internal link in http.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39425 Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Tobias Nießen Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell --- doc/api/http.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/http.md b/doc/api/http.md index fdb77648b9c56e..2ab4b86ee86976 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -3175,7 +3175,7 @@ try { [`net.Socket`]: net.md#net_class_net_socket [`net.createConnection()`]: net.md#net_net_createconnection_options_connectlistener [`new URL()`]: url.md#url_new_url_input_base -[`outgoingMessage.socket`]: #http_outgoingMessage.socket +[`outgoingMessage.socket`]: #http_outgoingmessage_socket [`removeHeader(name)`]: #http_request_removeheader_name [`request.destroy()`]: #http_request_destroy_error [`request.end()`]: #http_request_end_data_encoding_callback From d059ed924285089d035c06c7b6dd0b7b19619f94 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 16:45:02 -0700 Subject: [PATCH 044/117] meta: add .mailmap entry for new email for existing contributor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39431 Reviewed-By: Tobias Nießen Reviewed-By: Darshan Sen Reviewed-By: James M Snell --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index a4e81378e2c2d7..8cf2428c9b9233 100644 --- a/.mailmap +++ b/.mailmap @@ -108,6 +108,7 @@ Danielle Adams Danielle Adams Danny Nemer Darshan Sen +Darshan Sen Dave Pacheco David Cai DavidCai David Mark Clements From cefd2fb1e4a7a5f5df2232dcf0aaf0ba23626c2b Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 07:53:22 -0700 Subject: [PATCH 045/117] doc: simplify .mailmap file We have a few cases in .mailmap where multiple entries are used where a single one would do. Consolidate those entries. PR-URL: https://github.com/nodejs/node/pull/39418 Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- .mailmap | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/.mailmap b/.mailmap index 8cf2428c9b9233..7d2bce359e776f 100644 --- a/.mailmap +++ b/.mailmap @@ -58,10 +58,7 @@ Benjamin Waters Bert Belder Bert Belder Bert Belder -Beth Griggs Beth Griggs -Beth Griggs Bethany Griggs -Beth Griggs Bethany N Griggs -Beth Griggs BethGriggs +Beth Griggs Bidisha Pyne bl-ue bl-ue <54780737+bl-ue@users.noreply.github.com> Brad Decker brad-decker @@ -286,7 +283,6 @@ Mikael Bourges-Sevenier Mike Kaufman Minqi Pan P.S.V.R Minuk Park -Minwoo Jung JungMinu Minwoo Jung Minwoo Jung Miroslav Bajtoš @@ -307,8 +303,7 @@ Noah Rose Ledesma Onne Gorter Paul Querna -Pedro Lima Pedro Victor -Pedro Lima Pedro lima +Pedro Lima Peng Lyu rebornix Peter Flannery Peter Marton @@ -375,8 +370,7 @@ Siobhan O'Donovan justshiv Siyuan Gao r1cebank solebox solebox <5013box@gmail.com> Sreepurna Jasti -Sreepurna Jasti sreepurnajasti -Sreepurna Jasti sreepurnajasti +Sreepurna Jasti Stanislav Opichal Stefan Budeanu Stefan Bühler @@ -384,13 +378,10 @@ Stephen Belanger Stephen Belanger Steve Mao Steven R. Loomis -Stewart X Addison Stewart Addison -Stewart X Addison sxa555 -Stewart X Addison Stewart X Addison +Stewart X Addison Suraiya Hameed suraiyah Suramya shah ss22ever -Surya Panikkal surya panikkal -Surya Panikkal suryagh +Surya Panikkal Taehee Kang hugnosis Tanuja-Sawant Taylor Woll taylor.woll @@ -450,10 +441,8 @@ Wyatt Preul geek Xavier J Ortiz xiaoyu <306766053@qq.com> Poker <306766053@qq.com> Yael Hermon -Yazhong Liu Yazhong Liu -Yazhong Liu Yorkie -Yazhong Liu Yorkie -Yazhong Liu Yorkie Liu +Yazhong Liu +Yazhong Liu Yingchen Xue Yongsheng Zhang Yongsheng Zhang <17367077526@163.com> From 19e9accf91cbf6338bddf4db45fc0b469877ba6a Mon Sep 17 00:00:00 2001 From: Gireesh Punathil Date: Sun, 14 Mar 2021 08:48:34 +0530 Subject: [PATCH 046/117] inspector: mark as stable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The module has been there for a while, evidence of usage in the field exists, and we have good test coverage for it. Last API change has been 18 months ago. Refs: https://github.com/nodejs/node/issues/37440#issuecomment-785763306 PR-URL: https://github.com/nodejs/node/pull/37748 Reviewed-By: Anna Henningsen Reviewed-By: Darshan Sen Reviewed-By: Michaël Zasso Reviewed-By: Benjamin Gruenbaum Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Jiawen Geng Reviewed-By: James M Snell --- doc/api/inspector.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/inspector.md b/doc/api/inspector.md index c22dbca03bcbf1..aa41556adc9a11 100644 --- a/doc/api/inspector.md +++ b/doc/api/inspector.md @@ -2,7 +2,7 @@ -> Stability: 1 - Experimental +> Stability: 2 - Stable From 4c32aa02db18535a4f57b9871ad4cd961b09a220 Mon Sep 17 00:00:00 2001 From: Ben Halverson Date: Mon, 8 Mar 2021 22:28:27 -0800 Subject: [PATCH 047/117] tools: added remark-frontmatter remark-frontmatter allows the use of frontmatter metadata in markdown files PR-URL: https://github.com/nodejs/node/pull/38717 Reviewed-By: James M Snell Reviewed-By: Daijiro Wachi Reviewed-By: Derek Lewis --- tools/doc/generate.mjs | 2 + tools/doc/package-lock.json | 106 ++++++++++++++++++++++++++++++++++++ tools/doc/package.json | 1 + 3 files changed, 109 insertions(+) diff --git a/tools/doc/generate.mjs b/tools/doc/generate.mjs index 3bf60878ab5e27..95f5528e31152e 100644 --- a/tools/doc/generate.mjs +++ b/tools/doc/generate.mjs @@ -27,6 +27,7 @@ import htmlStringify from 'rehype-stringify'; import gfm from 'remark-gfm'; import markdown from 'remark-parse'; import remark2rehype from 'remark-rehype'; +import frontmatter from 'remark-frontmatter'; import unified from 'unified'; import * as html from './html.mjs'; @@ -82,6 +83,7 @@ async function main() { const input = await fs.readFile(filename, 'utf8'); const content = await unified() + .use(frontmatter) .use(replaceLinks, { filename, linksMapper }) .use(markdown) .use(gfm) diff --git a/tools/doc/package-lock.json b/tools/doc/package-lock.json index 598a8fccd30e78..7d60e99f088c6c 100644 --- a/tools/doc/package-lock.json +++ b/tools/doc/package-lock.json @@ -15,6 +15,7 @@ "js-yaml": "4.1.0", "rehype-raw": "5.1.0", "rehype-stringify": "8.0.0", + "remark-frontmatter": "^3.0.0", "remark-gfm": "^1.0.0", "remark-html": "13.0.1", "remark-parse": "^9.0.0", @@ -181,6 +182,28 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dev": true, + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -551,6 +574,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dev": true, + "dependencies": { + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-gfm": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", @@ -712,6 +748,19 @@ "parse-entities": "^2.0.0" } }, + "node_modules/micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dev": true, + "dependencies": { + "fault": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", @@ -873,6 +922,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dev": true, + "dependencies": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", @@ -1380,6 +1443,21 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dev": true, + "requires": { + "format": "^0.2.0" + } + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "dev": true + }, "hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -1640,6 +1718,15 @@ "unist-util-stringify-position": "^2.0.0" } }, + "mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dev": true, + "requires": { + "micromark-extension-frontmatter": "^0.2.0" + } + }, "mdast-util-gfm": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", @@ -1757,6 +1844,15 @@ "parse-entities": "^2.0.0" } }, + "micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dev": true, + "requires": { + "fault": "^1.0.0" + } + }, "micromark-extension-gfm": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", @@ -1875,6 +1971,16 @@ "hast-util-to-html": "^7.1.1" } }, + "remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dev": true, + "requires": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + } + }, "remark-gfm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", diff --git a/tools/doc/package.json b/tools/doc/package.json index 4a5624952f85ed..92ac19660d5b42 100644 --- a/tools/doc/package.json +++ b/tools/doc/package.json @@ -11,6 +11,7 @@ "js-yaml": "4.1.0", "rehype-raw": "5.1.0", "rehype-stringify": "8.0.0", + "remark-frontmatter": "^3.0.0", "remark-gfm": "^1.0.0", "remark-html": "13.0.1", "remark-parse": "^9.0.0", From ce2011b7a1717f2634616570d45a0ee28492bae0 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 12 Jul 2021 07:01:03 -0400 Subject: [PATCH 048/117] build: update coverage Makefile target comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the comments for the `coverage` Makefile target. - Source files under `lib` are no longer instrumented since https://github.com/nodejs/node/commit/d1dee495db1451e74f5364c8687148a53ff0b50d - Fix the name of the related CI job. PR-URL: https://github.com/nodejs/node/pull/39365 Refs: https://github.com/nodejs/node/pull/25157 Reviewed-By: Tobias Nießen Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- Makefile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index e4d13a818a66b4..76874383f606a3 100644 --- a/Makefile +++ b/Makefile @@ -210,11 +210,10 @@ coverage-clean: -type f -exec $(RM) {} \; .PHONY: coverage -# Build and test with code coverage reporting. Leave the lib directory -# instrumented for any additional runs the user may want to make. -# For C++ coverage reporting, this needs to be run in conjunction with configure -# --coverage. html coverage reports will be created under coverage/ -# Related CI job: node-test-commit-linux-coverage +# Build and test with code coverage reporting. HTML coverage reports will be +# created under coverage/. For C++ coverage reporting, this needs to be run +# in conjunction with configure --coverage. +# Related CI job: node-test-commit-linux-coverage-daily coverage: coverage-test ## Run the tests and generate a coverage report. .PHONY: coverage-build From 4fd8db687d6fc470ae3fd6c9c1531ddec6218d2e Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 17 Jul 2021 22:25:09 -0700 Subject: [PATCH 049/117] doc: remove _Addenda_ from headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39427 Reviewed-By: Michaël Zasso Reviewed-By: Antoine du Hamel Reviewed-By: Gireesh Punathil Reviewed-By: Tobias Nießen Reviewed-By: James M Snell --- doc/api/modules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/modules.md b/doc/api/modules.md index 7ddfeab3a7b229..45ff896683f1f1 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -78,7 +78,7 @@ Because `module` provides a `filename` property (normally equivalent to `__filename`), the entry point of the current application can be obtained by checking `require.main.filename`. -## Addenda: Package manager tips +## Package manager tips @@ -131,7 +131,7 @@ variable. Since the module lookups using `node_modules` folders are all relative, and based on the real path of the files making the calls to `require()`, the packages themselves can be anywhere. -## Addenda: The `.mjs` extension +## The `.mjs` extension It is not possible to `require()` files that have the `.mjs` extension. Attempting to do so will throw [an error][]. The `.mjs` extension is From ae69656c61e9e0cd53298b32c42f96a0107b41f3 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Sat, 17 Jul 2021 21:18:28 +0530 Subject: [PATCH 050/117] doc: update checkbox label in backporting guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Darshan Sen PR-URL: https://github.com/nodejs/node/pull/39420 Reviewed-By: Tobias Nießen Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- doc/guides/backporting-to-release-lines.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/guides/backporting-to-release-lines.md b/doc/guides/backporting-to-release-lines.md index 3b3638bff2f463..5233173c882557 100644 --- a/doc/guides/backporting-to-release-lines.md +++ b/doc/guides/backporting-to-release-lines.md @@ -77,7 +77,8 @@ replace that with the staging branch for the targeted release line. 1. Include the backport target in the pull request title in the following format: `[v10.x backport] `. Example: `[v10.x backport] process: improve performance of nextTick` - 1. Check the checkbox labeled "Allow edits from maintainers". + 1. Check the checkbox labeled "Allow edits and access to secrets by + maintainers". 1. In the description add a reference to the original pull request. 1. Amend the commit message and include a `Backport-PR-URL:` metadata and re-push the change to your fork. From 9d950a0956bf2c3dd87bacb56807f37e16a91db4 Mon Sep 17 00:00:00 2001 From: Akshay K Date: Fri, 16 Jul 2021 20:28:07 -0400 Subject: [PATCH 051/117] http2: on receiving rst_stream with cancel code add it to pending list PR-URL: https://github.com/nodejs/node/pull/39423 Fixes: https://github.com/nodejs/node/issues/38964 Reviewed-By: James M Snell Reviewed-By: Matteo Collina --- src/node_http2.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/node_http2.cc b/src/node_http2.cc index d11bcf5eac077f..625f3adb3b9a9e 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -2195,6 +2195,25 @@ int Http2Stream::SubmitPriority(const Http2Priority& priority, void Http2Stream::SubmitRstStream(const uint32_t code) { CHECK(!this->is_destroyed()); code_ = code; + + // If RST_STREAM frame is received and stream is not writable + // because it is busy reading data, don't try force purging it. + // Instead add the stream to pending stream list and process + // the pending data when it is safe to do so. This is to avoid + // double free error due to unwanted behavior of nghttp2. + // Ref:https://github.com/nodejs/node/issues/38964 + + // Add stream to the pending list if it is received with scope + // below in the stack. The pending list may not get processed + // if RST_STREAM received is not in scope and added to the list + // causing endpoint to hang. + if (session_->is_in_scope() && + !is_writable() && is_reading()) { + session_->AddPendingRstStream(id_); + return; + } + + // If possible, force a purge of any currently pending data here to make sure // it is sent before closing the stream. If it returns non-zero then we need // to wait until the current write finishes and try again to avoid nghttp2 From 5c11a0279dce2432403da5caa560daa1fc2a6cce Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 07:04:00 -0700 Subject: [PATCH 052/117] tools: make internal link checker more robust MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The internal link checker was missing some broken links because it was being too restrictive about the characters it accepted as part of a link hash. Accept anything that isn't a terminating quotation mark. Refs: https://github.com/nodejs/node/pull/39426 Refs: https://github.com/nodejs/node/pull/39425 PR-URL: https://github.com/nodejs/node/pull/39429 Reviewed-By: Tobias Nießen Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Zeyu Yang --- tools/doc/allhtml.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/doc/allhtml.mjs b/tools/doc/allhtml.mjs index 54a51dd6316010..905ea5d3dd6c6f 100644 --- a/tools/doc/allhtml.mjs +++ b/tools/doc/allhtml.mjs @@ -76,13 +76,13 @@ fs.writeFileSync(new URL('./all.html', source), all, 'utf8'); // Validate all hrefs have a target. const ids = new Set(); -const idRe = / id="(\w+)"/g; +const idRe = / id="([^"]+)"/g; let match; while (match = idRe.exec(all)) { ids.add(match[1]); } -const hrefRe = / href="#(\w+)"/g; +const hrefRe = / href="#([^"]+)"/g; while (match = hrefRe.exec(all)) { if (!ids.has(match[1])) throw new Error(`link not found: ${match[1]}`); } From 7570f998df8b5c63bb48f5fee9d5442b68910267 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 16:20:23 -0700 Subject: [PATCH 053/117] tools: email matchin is case insensitive for .mailmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39430 Reviewed-By: Tobias Nießen Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- tools/update-authors.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tools/update-authors.js b/tools/update-authors.js index 312f253c4854e5..f9797b1998c3d9 100755 --- a/tools/update-authors.js +++ b/tools/update-authors.js @@ -41,19 +41,21 @@ const mailmap = new CaseIndifferentMap(); let match; // Replaced Name if (match = line.match(/^([^<]+)\s+(<[^>]+>)$/)) { - mailmap.set(match[2], { author: match[1] }); + mailmap.set(match[2].toLowerCase(), { + author: match[1], email: match[2] + }); // } else if (match = line.match(/^<([^>]+)>\s+(<[^>]+>)$/)) { - mailmap.set(match[2], { email: match[1] }); + mailmap.set(match[2].toLowerCase(), { email: match[1] }); // Replaced Name } else if (match = line.match(/^([^<]+)\s+(<[^>]+>)\s+(<[^>]+>)$/)) { - mailmap.set(match[3], { + mailmap.set(match[3].toLowerCase(), { author: match[1], email: match[2] }); // Replaced Name Original Name } else if (match = line.match(/^([^<]+)\s+(<[^>]+>)\s+([^<]+)\s+(<[^>]+>)$/)) { - mailmap.set(match[3] + '\0' + match[4], { + mailmap.set(match[3] + '\0' + match[4].toLowerCase(), { author: match[1], email: match[2] }); } else { @@ -75,8 +77,10 @@ rl.on('line', (line) => { if (!match) return; let { author, email } = match.groups; + const emailLower = email.toLowerCase(); - const replacement = mailmap.get(author + '\0' + email) || mailmap.get(email); + const replacement = + mailmap.get(author + '\0' + emailLower) || mailmap.get(emailLower); if (replacement) { ({ author, email } = { author, email, ...replacement }); } From aa1dfb3111c84fd4766e16de04a36e2224f417b1 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 16:38:49 -0700 Subject: [PATCH 054/117] doc: simplify unnecessarily specific .mailmap entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39430 Reviewed-By: Tobias Nießen Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- .mailmap | 222 +++++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 112 deletions(-) diff --git a/.mailmap b/.mailmap index 7d2bce359e776f..259b8271f6319e 100644 --- a/.mailmap +++ b/.mailmap @@ -1,50 +1,50 @@ Aaron Bieber Aaron Heckmann -Aayush Ahuja aayush.a +Aayush Ahuja Abe Fettig Abhimanyu Vashisht Akito Ito Alejandro Estrada Alejandro Estrada -Alejandro Oviedo Garcia Alejandro Oviedo -Alex Gilbert agilbert +Alejandro Oviedo Garcia +Alex Gilbert Alex Hultman -Alex Jordan AJ Jordan +Alex Jordan Alex Kocharin Alex Kocharin -Alexander Marchenko axvm +Alexander Marchenko Alexey Kupershtokh Alexis Campailla Alexis Sellier Alexis Sellier -Alfred Cepeda ALJCepeda +Alfred Cepeda Allen Yonghuang Wang -Amery 子丶言 +Amery Amit Bendor Anatoli Papirovski -Andreas Offenhaeuser anoff +Andreas Offenhaeuser Andrew Hughes Andy Bettisworth -Angel Stoyanov atstojanov +Angel Stoyanov Anna Henningsen Anna Henningsen Anna Magdalena Kedzierska AnnaMag -Antoine Amara Antoine AMARA +Antoine Amara Aria Stewart Arlo Breault -Arnaud Lefebvre BlackYoup +Arnaud Lefebvre Artem Zaytsev -Artur G Vieira Artur Vieira +Artur G Vieira Arnout Kazemier <3rd-Eden@users.noreply.github.com> -Asaf David asafdav2 +Asaf David Ash Cripps Ash Cripps Ash Cripps -Ashley Maceli ashleyraymaceli +Ashley Maceli Ashok Suthar Ashutosh Kumar Singh Atsuo Fukaya -Ben Lugavere blugavere +Ben Lugavere Ben Noordhuis Ben Noordhuis Ben Taber @@ -61,29 +61,29 @@ Bert Belder Beth Griggs Bidisha Pyne bl-ue bl-ue <54780737+bl-ue@users.noreply.github.com> -Brad Decker brad-decker -Brad Larson BradLarson -Bradley Meck Bradley Farias +Brad Decker +Brad Larson +Bradley Meck Brandon Benvie Brandon Kobel kobelb Brendan Ashworth -Brent Pendergraft penDerGraft +Brent Pendergraft Brian White Brian White Caleb Boyd Calvin Metcalf Calvin Metcalf -Caralyn Reisle creisle +Caralyn Reisle Charles Charles Rudolph Chen Gang Chew Choon Keat -Chris Andrews cpandrews8 +Chris Andrews Chris Johnson Chris Young Christian Clauss Christian Clauss -Christophe Naud-Dulude Chris911 +Christophe Naud-Dulude Christopher Lenz Claudio Rodriguez Colin Ihrig @@ -91,28 +91,28 @@ Corey Martin Damien Simonin Feugas Dan Kaplun Dan Williams Dan.Williams -Daniel Abrão Daniel Abrão -Daniel Bevenius daniel.bevenius +Daniel Abrão +Daniel Bevenius Daniel Berger Daniel Chcouri <333222@gmail.com> Daniel Gröber Daniel Gröber -Daniel Paulino dpaulino +Daniel Paulino Daniel Pihlström Daniel Wang firedfox -Daniel Wang firedfox +Daniel Wang Danielle Adams Danielle Adams Danny Nemer Danny Nemer Darshan Sen Darshan Sen Dave Pacheco -David Cai DavidCai +David Cai David Mark Clements David Mark Clements David Mark Clements David Siegel -DC dcposch@dcpos.ch +DC Deepjyoti Mondal Domenic Denicola Domenic Denicola @@ -122,22 +122,22 @@ Einar Otto Stangvik Elliott Cable Eric Phetteplace Ernesto Salazar -Erwin W. Ramadhan erwinwahyura -Eugene Obrezkov ghaiklor +Erwin W. Ramadhan +Eugene Obrezkov EungJun Yi Evan Larkin Evan Lucas Evan Lucas -FangDun Cai Fangdun Cai (Fundon) -Fangshi He hefangshi +FangDun Cai +Fangshi He Farid Neshat -Fatah N fatahn +Fatah N Fedor Indutny Felix Böhm Felix Geisendörfer Felix Geisendörfer -Flandre Scarlet Flandre -Florian Margaine Florian MARGAINE +Flandre Scarlet +Florian Margaine Forrest L Norvell Franziska Hinkelmann F. Hinkelmann Friedemann Altrock @@ -145,25 +145,25 @@ Fuji Goro Gabriel de Perthuis Gareth Ellis Garwah Lam -Geoffrey Bugaisky gbugaisky +Geoffrey Bugaisky Gerhard Stoebich Gibson Fahnestock Gil Pedersen Graham Fairweather Xotic750 Greg Sabia Tucker -Gregor Martynus Gregor -Guy Bedford guybedford -Halil İbrahim Şener hisener -Hannah Kim heeeunkimmm +Gregor Martynus +Guy Bedford +Halil İbrahim Şener +Hannah Kim Hannes Magnusson -Hendrik Schwalm hschwalm +Hendrik Schwalm Hitesh Kanwathirtha Henry Chin Herbert Vojčík himself65 himself65 Icer Liang -Igor Savin kibertoad +Igor Savin Igor Soarez Igor Zinkovsky Imran Iqbal @@ -171,52 +171,52 @@ Ionică Bizău Isaac Z. Schlueter Isaac Z. Schlueter Isaac Z. Schlueter isaacs -Isuru Siriwardana isurusiri +Isuru Siriwardana Italo A. Casas Jackson Tian Jake Verbaten Jamen Marzonie Jamen Marz -James Beavers Druotic +James Beavers James Hartig James M Snell -James Nimlos JamesNimlos +James Nimlos Jan Krems Jenna Vuong -JeongHoon Byun Outsider +JeongHoon Byun Jered Schmidt Jeremiah Senkpiel Jerry Chin -Jessica Quynh Tran jessicaquynh -Jesús Leganés-Combarro 'piranna Jesús Leganés Combarro "piranna +Jessica Quynh Tran +Jesús Leganés-Combarro 'piranna Joe Shaw Johan Bergström Johan Dahlberg Johann Hofmann John Barboza jBarz -John Barboza jBarz -John Gardner Alhadis -John McGuirk jmcgui05 -John Musgrave musgravejw +John Barboza +John Gardner +John McGuirk +John Musgrave Johnny Ray Austin Johnny Ray -Jon Tippens legalcodes +Jon Tippens Jonas Pfenniger -Jonathan Gourlay mrgorbo +Jonathan Gourlay Jonathan Ong Jonathan Persson Jonathan Rentzsch Joseph Leon -Jose Luis Vivero jlvivero +Jose Luis Vivero Josh Erickson -Josh Hunter jopann +Josh Hunter Joshua S. Weinstein -Joyee Cheung joyeecheung +Joyee Cheung Joyee Cheung Joyee Cheung Juan Soto -Julien Klepatch jklepatch -Julien Waechter julien.waechter +Julien Klepatch +Julien Waechter Junliang Yan Junliang Yan -Junshu Okamoto jun-oka +Junshu Okamoto Justin Beckwith Justin Lee Jérémy Lal @@ -225,16 +225,16 @@ Juan Sebastian Velez Posada Kai Sasaki Lewuathe Karl Skomski Kat Marchán -Kathy Truong k3kathy +Kathy Truong Kazuyuki Yamada Keith M Wesolowski Kelsey Breseman Ke Ding -Khaidi Chu XadillaX +Khaidi Chu Khaidi Chu Kimberly Wilber Kimberly Wilber -Kiyoshi Nomo kysnm +Kiyoshi Nomo Koichi Kobayashi Kostiantyn Wandalen Kris Kowal @@ -242,46 +242,46 @@ Kyle Robinson Young Lakshmi Swetha Gopireddy LAKSHMI SWETHA GOPIREDDY Leeseean Chiu Luke Bayes -Lydia Kats Lydia Katsamberis +Lydia Kats Maciej Małecki MaleDong Malte-Thorben Bruns -Malte-Thorben Bruns skenqbx +Malte-Thorben Bruns Mandeep Singh -Manil Chowdhurian Chowdhurian -Marcelo Gobelli decareano +Manil Chowdhurian +Marcelo Gobelli Marcin Cieślak Marcin Cieślak -Marcin Zielinski marzelin +Marcin Zielinski Marti Martz Martial James Jefferson -Martijn Schrage Oblosys +Martijn Schrage Masato Ohba Mary Marchini Mary Marchini Mary Marchini Mary Marchini Mary Marchini -Matt Lang matt-in-a-hat -Matt Reed matthewreed26 +Matt Lang +Matt Reed Matteo Collina Matthias Bastian piepmatz Mathias Buus Mathias Pettersson Matthew Lye Matthew Turner -Maurice Hayward maurice_hayward +Maurice Hayward Michael Bernstein Michael Dawson Michaël Zasso -Michael-Rainabba Richardson rainabba +Michael-Rainabba Richardson Michał Gołębiowski-Owczarek Micheil Smith Micleusanu Nicu -Miguel Angel Asencio Hurtado maasencioh +Miguel Angel Asencio Hurtado Mikael Bourges-Sevenier Mike Kaufman -Minqi Pan P.S.V.R +Minqi Pan Minuk Park Minwoo Jung Minwoo Jung @@ -292,52 +292,50 @@ Myles Borins Myles Borins Nam Nguyen Nebu Pookins -Netto Farah nettofarah +Netto Farah Nicholas Kinsey Nick Soggin Nikolai Vavilov Nils Kuhnhenn Nitzan Uziely Nitzan Uziely -Noah Rose Ledesma Noah Rose -Noah Rose Ledesma +Noah Rose Ledesma Oluwaseun Omoyajowo Onne Gorter Paul Querna Pedro Lima -Peng Lyu rebornix +Peng Lyu Peter Flannery Peter Marton -Peter Paugh Peter +Peter Paugh Phillip Johnsen Prateek Singh -Rachel White rachelnicole +Rachel White Ratikesh Misra -Ravindra Barthwal Ravindra barthwal +Ravindra Barthwal Ray Morgan Ray Solomon Raymond Feng Rebecca Turner Refael Ackermann -Reza Akhavan jedireza -Ricardo Sánchez Gregorio richnologies +Reza Akhavan +Ricardo Sánchez Gregorio Richard Lau Rick Olson Rob Adelmann -Rob Adelmann adelmann +Rob Adelmann Robert Nagy Robert Nagy Rod Machen Roman Klauke Roman Reiss Ron Korving -Ron Korving ronkorving +Ron Korving Ruben Bridgewater Ruben Bridgewater Russell Dempsey Ryan Dahl Ryan Emery Ryan Mahan -Ryan Scheel Ryan Scheel -Ryan Scheel Ryan Scheel (Havvy) +Ryan Scheel Saad Quadri saadq Sagir Khan Sakthipriyan Vairamani @@ -350,27 +348,27 @@ Samantha Sample = <=> Sambasiva Suda San-Tai Hsu Santiago Gimeno -Sarah Meyer sarahmeyer -Sartrey Lee sartrey +Sarah Meyer +Sartrey Lee Saúl Ibarra Corretgé Shobhit Chittora Scott Blomquist Segu Riluvan Sergey Kryzhanovsky Shannen Saez -Shaopeng Zhang szhang351 +Shaopeng Zhang Shelley Vohr Shelley Vohr Shigeki Ohtsu Shigeki Ohtsu Shivang Saxena -Shiya Luo shiya +Shiya Luo Siddharth Mahendraker Simon Willison -Siobhan O'Donovan justshiv -Siyuan Gao r1cebank +Siobhan O'Donovan +Siyuan Gao solebox solebox <5013box@gmail.com> Sreepurna Jasti -Sreepurna Jasti +Sreepurna Jasti Stanislav Opichal Stefan Budeanu Stefan Bühler @@ -379,24 +377,24 @@ Stephen Belanger Steve Mao Steven R. Loomis Stewart X Addison -Suraiya Hameed suraiyah +Suraiya Hameed Suramya shah ss22ever Surya Panikkal -Taehee Kang hugnosis +Taehee Kang Tanuja-Sawant Taylor Woll taylor.woll Thomas Watson Timothy O. Peters -Timur Shemsedinov tshemsedinov +Timur Shemsedinov Ting Shao -Toby Farley tobyfarley +Toby Farley Toby Stableford toboid Todd Kennedy TJ Holowaychuk TJ Holowaychuk Tadashi SAWADA Takahiro ANDO -Tarun Batra Tarun +Tarun Batra Ted Young Teppei Sato Theotime Poisseau @@ -404,31 +402,31 @@ Thomas Hunter II Thomas Lee Thomas Reggi Tierney Cyren &! (bitandbang) -Tierney Cyren bitandbang +Tierney Cyren Tim Caswell Tim Price Tim Smart -Tim Smart -Timothy Leverett Timothy +Tim Smart +Timothy Leverett Tobias Nießen Tom Atkinson Tom Atkinson Tom Hughes Tom Hughes-Croucher -Tom Purcell tpurcell +Tom Purcell Tom White -Tomoki Okahana umatoma -Tracy Hinds Tracy +Tomoki Okahana +Tracy Hinds Travis Meisenheimer Trevor Burnham Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Tyler Larson Ujjwal Sharma -Viktor Karpov vitkarpov +Viktor Karpov Vincent Voyer Vladimir de Turckheim Voltrex Voltrex <62040526+VoltrexMaster@users.noreply.github.com> -vsemozhetbyt Vse Mozhet Byt +vsemozhetbyt Wang Xinyong Weijia Wang <381152119@qq.com> Weijia Wang <381152119@qq.com> @@ -437,9 +435,9 @@ Wei-Wei Wu Willi Eggeling Will Hayslett Wilson Lin -Wyatt Preul geek +Wyatt Preul Xavier J Ortiz -xiaoyu <306766053@qq.com> Poker <306766053@qq.com> +xiaoyu <306766053@qq.com> Yael Hermon Yazhong Liu Yazhong Liu @@ -450,12 +448,12 @@ Yongsheng Zhang Yoshihiro KIKUCHI Yosuke Furukawa Yuichiro MASUI -Yuta Hiroto abouthiroppy +Yuta Hiroto Zach Bjornson Zachary Scott Zachary Vacura Zoran Tomicic -Сковорода Никита Андреевич ChALkeR +Сковорода Никита Андреевич 隋鑫磊 # These people didn't contribute patches to node directly, From 0a46e66253be192441aab2f8318733b4b5c04137 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 21:30:03 -0700 Subject: [PATCH 055/117] tools: use mailmap for find-inactive-collaborators The current version of find-inactive-collaborators can generate a false positive if the mailmap entry for a collaborator does not match the entry in the README. (We should probably lint or otherwise check for that sort of mismatch but regardless, it is relatively easy to avoid having find-inactive-collaborators tripped up by it, so let's fix that too, which is this commit.) PR-URL: https://github.com/nodejs/node/pull/39432 Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell --- tools/find-inactive-collaborators.mjs | 42 ++++++++++++++++++--------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tools/find-inactive-collaborators.mjs b/tools/find-inactive-collaborators.mjs index 2951d81c534696..c205e931bd87b0 100755 --- a/tools/find-inactive-collaborators.mjs +++ b/tools/find-inactive-collaborators.mjs @@ -22,27 +22,33 @@ async function runGitCommand(cmd, mapFn) { const errorHandler = new Promise( (_, reject) => childProcess.on('error', reject) ); - const returnedSet = new Set(); + let returnValue = mapFn ? new Set() : ''; await Promise.race([errorHandler, Promise.resolve()]); + // If no mapFn, return the value. If there is a mapFn, use it to make a Set to + // return. for await (const line of lines) { await Promise.race([errorHandler, Promise.resolve()]); - const val = mapFn(line); - if (val) { - returnedSet.add(val); + if (mapFn) { + const val = mapFn(line); + if (val) { + returnValue.add(val); + } + } else { + returnValue += line; } } - return Promise.race([errorHandler, Promise.resolve(returnedSet)]); + return Promise.race([errorHandler, Promise.resolve(returnValue)]); } // Get all commit authors during the time period. const authors = await runGitCommand( - `git shortlog -n -s --max-count="${SINCE}" HEAD`, + `git shortlog -n -s --email --max-count="${SINCE}" HEAD`, (line) => line.trim().split('\t', 2)[1] ); // Get all commit landers during the time period. const landers = await runGitCommand( - `git shortlog -n -s -c --max-count="${SINCE}" HEAD`, + `git shortlog -n -s -c --email --max-count="${SINCE}" HEAD`, (line) => line.trim().split('\t', 2)[1] ); @@ -52,7 +58,7 @@ const approvingReviewers = await runGitCommand( (line) => /^ Reviewed-By: ([^<]+)/.exec(line)[1].trim() ); -async function retrieveCollaboratorsFromReadme() { +async function getCollaboratorsFromReadme() { const readmeText = readline.createInterface({ input: fs.createReadStream(new URL('../README.md', import.meta.url)), crlfDelay: Infinity, @@ -69,14 +75,22 @@ async function retrieveCollaboratorsFromReadme() { break; } if (line.startsWith('**') && isCollaborator) { - returnedArray.push(line.split('**', 2)[1].trim()); + const [, name, email] = /^\*\*([^*]+)\*\* <(.+)>/.exec(line); + const mailmap = await runGitCommand( + `git check-mailmap '${name} <${email}>'` + ); + returnedArray.push({ + name, + email, + mailmap, + }); } } return returnedArray; } // Get list of current collaborators from README.md. -const collaborators = await retrieveCollaboratorsFromReadme(); +const collaborators = await getCollaboratorsFromReadme(); console.log(`In the last ${SINCE} commits:\n`); console.log(`* ${authors.size.toLocaleString()} authors have made commits.`); @@ -85,10 +99,10 @@ console.log(`* ${approvingReviewers.size.toLocaleString()} reviewers have approv console.log(`* ${collaborators.length.toLocaleString()} collaborators currently in the project.`); const inactive = collaborators.filter((collaborator) => - !authors.has(collaborator) && - !landers.has(collaborator) && - !approvingReviewers.has(collaborator) -); + !authors.has(collaborator.mailmap) && + !landers.has(collaborator.mailmap) && + !approvingReviewers.has(collaborator.name) +).map((collaborator) => collaborator.name); if (inactive.length) { console.log('\nInactive collaborators:\n'); From 902ef9aca0b8535383ba2fa84faaf95b923c01bd Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 21:44:05 -0700 Subject: [PATCH 056/117] doc,meta: update email addresses for misterdjules Julien Gilli appears twice with two email addresses in the current AUTHORS file. Use .mailmap to map one to the other (keeping the most recent one). Also update email in the README from a (I believe invalid, since it is not listed in the email repo aliases.json file) nodejs.org email to the email they more recently committed with. Finally, re-run `update-authors.js` so they only have one entry in AUTHORS. PR-URL: https://github.com/nodejs/node/pull/39433 Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- .mailmap | 1 + AUTHORS | 3 +-- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.mailmap b/.mailmap index 259b8271f6319e..e9fc78376263d9 100644 --- a/.mailmap +++ b/.mailmap @@ -212,6 +212,7 @@ Joshua S. Weinstein Joyee Cheung Joyee Cheung Joyee Cheung Juan Soto +Julien Gilli Julien Klepatch Julien Waechter Junliang Yan diff --git a/AUTHORS b/AUTHORS index 21b082f907b51b..a8159bdbd8e243 100644 --- a/AUTHORS +++ b/AUTHORS @@ -587,7 +587,7 @@ Ed Umansky Maurice Butler John Albietz Andrew Oppenlander -Julien Gilli +Julien Gilli Gabriel Wicke Jakob Gillich Lucio M. Tato @@ -2335,7 +2335,6 @@ Sintendo Nitish Sakhawalkar André Cruz Josh Broomfield -Julien Gilli Umang Raghuvanshi Duarte David Aleksey Chemakin diff --git a/README.md b/README.md index 9055580138f218..9b08e699a4f19a 100644 --- a/README.md +++ b/README.md @@ -382,7 +382,7 @@ For information about the governance of the Node.js project, see * [mildsunrise](https://github.com/mildsunrise) - **Alba Mendez** <me@alba.sh> (she/her) * [misterdjules](https://github.com/misterdjules) - -**Julien Gilli** <jgilli@nodejs.org> +**Julien Gilli** <jgilli@netflix.com> * [mmarchini](https://github.com/mmarchini) - **Mary Marchini** <oss@mmarchini.me> (she/her) * [mscdex](https://github.com/mscdex) - From db4f802fba012b4da9e6d8ab273e739efc34e3a2 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Mon, 19 Jul 2021 08:06:04 +0200 Subject: [PATCH 057/117] Revert "test: skip tests for openssl-3.0.0-alpha15" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2ff93c8975508736bbc07b98cf84f47d68b47201. PR-URL: https://github.com/nodejs/node/pull/39437 Reviewed-By: Michaël Zasso Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/benchmark/test-benchmark-crypto.js | 4 ---- test/parallel/test-crypto-async-sign-verify.js | 3 --- test/parallel/test-crypto-dh-stateless.js | 3 --- test/parallel/test-crypto-key-objects.js | 3 --- test/parallel/test-crypto-keygen.js | 3 --- test/parallel/test-crypto-rsa-dsa.js | 3 --- test/parallel/test-crypto-sign-verify.js | 3 --- test/parallel/test-webcrypto-derivebits-ecdh.js | 3 --- test/parallel/test-webcrypto-derivebits-node-dh.js | 3 --- test/parallel/test-webcrypto-derivekey-ecdh.js | 3 --- test/parallel/test-webcrypto-encrypt-decrypt-rsa.js | 3 --- test/parallel/test-webcrypto-export-import-dsa.js | 3 --- test/parallel/test-webcrypto-export-import-ec.js | 3 --- test/parallel/test-webcrypto-export-import-rsa.js | 3 --- test/parallel/test-webcrypto-export-import.js | 3 --- test/parallel/test-webcrypto-rsa-pss-params.js | 3 --- test/parallel/test-webcrypto-sign-verify-ecdsa.js | 3 --- test/parallel/test-webcrypto-sign-verify-node-dsa.js | 3 --- test/parallel/test-webcrypto-sign-verify-rsa.js | 3 --- test/parallel/test-webcrypto-wrap-unwrap.js | 3 --- 20 files changed, 61 deletions(-) diff --git a/test/benchmark/test-benchmark-crypto.js b/test/benchmark/test-benchmark-crypto.js index f7f155ac8e55d8..7f6988acf234d8 100644 --- a/test/benchmark/test-benchmark-crypto.js +++ b/test/benchmark/test-benchmark-crypto.js @@ -8,10 +8,6 @@ if (!common.hasCrypto) if (common.hasFipsCrypto) common.skip('some benchmarks are FIPS-incompatible'); -if (common.hasOpenSSL3) { - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); -} - const runBenchmark = require('../common/benchmark'); runBenchmark('crypto', { NODEJS_BENCHMARK_ZERO_ALLOWED: 1 }); diff --git a/test/parallel/test-crypto-async-sign-verify.js b/test/parallel/test-crypto-async-sign-verify.js index 2e6c9e0bc539f4..4e3c32fdcd23fb 100644 --- a/test/parallel/test-crypto-async-sign-verify.js +++ b/test/parallel/test-crypto-async-sign-verify.js @@ -3,9 +3,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const util = require('util'); const crypto = require('crypto'); diff --git a/test/parallel/test-crypto-dh-stateless.js b/test/parallel/test-crypto-dh-stateless.js index 658bd38fff655a..943ead06cda1fb 100644 --- a/test/parallel/test-crypto-dh-stateless.js +++ b/test/parallel/test-crypto-dh-stateless.js @@ -3,9 +3,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const crypto = require('crypto'); diff --git a/test/parallel/test-crypto-key-objects.js b/test/parallel/test-crypto-key-objects.js index 3159b0da3f2901..689fbadd29d926 100644 --- a/test/parallel/test-crypto-key-objects.js +++ b/test/parallel/test-crypto-key-objects.js @@ -4,9 +4,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { types: { isKeyObject } } = require('util'); const { diff --git a/test/parallel/test-crypto-keygen.js b/test/parallel/test-crypto-keygen.js index 4612fc4a1ac40a..58e5d305b6b05a 100644 --- a/test/parallel/test-crypto-keygen.js +++ b/test/parallel/test-crypto-keygen.js @@ -4,9 +4,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { constants, diff --git a/test/parallel/test-crypto-rsa-dsa.js b/test/parallel/test-crypto-rsa-dsa.js index 567d8650c5a177..9afcb38616dafd 100644 --- a/test/parallel/test-crypto-rsa-dsa.js +++ b/test/parallel/test-crypto-rsa-dsa.js @@ -3,9 +3,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const crypto = require('crypto'); diff --git a/test/parallel/test-crypto-sign-verify.js b/test/parallel/test-crypto-sign-verify.js index 15fa3db4a69f19..444135538ccff8 100644 --- a/test/parallel/test-crypto-sign-verify.js +++ b/test/parallel/test-crypto-sign-verify.js @@ -3,9 +3,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const fs = require('fs'); const path = require('path'); diff --git a/test/parallel/test-webcrypto-derivebits-ecdh.js b/test/parallel/test-webcrypto-derivebits-ecdh.js index 49076ce443a54a..64cbae7cec6a03 100644 --- a/test/parallel/test-webcrypto-derivebits-ecdh.js +++ b/test/parallel/test-webcrypto-derivebits-ecdh.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle, getRandomValues } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-derivebits-node-dh.js b/test/parallel/test-webcrypto-derivebits-node-dh.js index cab7d40c1a7abf..2503bc17032e0d 100644 --- a/test/parallel/test-webcrypto-derivebits-node-dh.js +++ b/test/parallel/test-webcrypto-derivebits-node-dh.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-derivekey-ecdh.js b/test/parallel/test-webcrypto-derivekey-ecdh.js index a0bf28e89e4e3a..bdd9bd7588a763 100644 --- a/test/parallel/test-webcrypto-derivekey-ecdh.js +++ b/test/parallel/test-webcrypto-derivekey-ecdh.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle, getRandomValues } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-encrypt-decrypt-rsa.js b/test/parallel/test-webcrypto-encrypt-decrypt-rsa.js index e01152c07f294d..151eebd36c9765 100644 --- a/test/parallel/test-webcrypto-encrypt-decrypt-rsa.js +++ b/test/parallel/test-webcrypto-encrypt-decrypt-rsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-export-import-dsa.js b/test/parallel/test-webcrypto-export-import-dsa.js index 6b47b99c1ddbf8..3fddd9dd9c4559 100644 --- a/test/parallel/test-webcrypto-export-import-dsa.js +++ b/test/parallel/test-webcrypto-export-import-dsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-export-import-ec.js b/test/parallel/test-webcrypto-export-import-ec.js index e5453878a19050..31ab2c09cdb1f9 100644 --- a/test/parallel/test-webcrypto-export-import-ec.js +++ b/test/parallel/test-webcrypto-export-import-ec.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-export-import-rsa.js b/test/parallel/test-webcrypto-export-import-rsa.js index 46e96628a33f8c..f43259fd22faea 100644 --- a/test/parallel/test-webcrypto-export-import-rsa.js +++ b/test/parallel/test-webcrypto-export-import-rsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-export-import.js b/test/parallel/test-webcrypto-export-import.js index 9cf8833cecfc47..d7db433b364011 100644 --- a/test/parallel/test-webcrypto-export-import.js +++ b/test/parallel/test-webcrypto-export-import.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle, getRandomValues } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-rsa-pss-params.js b/test/parallel/test-webcrypto-rsa-pss-params.js index d52a9bf6add223..964eaf32e890fd 100644 --- a/test/parallel/test-webcrypto-rsa-pss-params.js +++ b/test/parallel/test-webcrypto-rsa-pss-params.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const { createPrivateKey, createPublicKey, diff --git a/test/parallel/test-webcrypto-sign-verify-ecdsa.js b/test/parallel/test-webcrypto-sign-verify-ecdsa.js index 8620498d89b00c..2f8f3a2fd229bd 100644 --- a/test/parallel/test-webcrypto-sign-verify-ecdsa.js +++ b/test/parallel/test-webcrypto-sign-verify-ecdsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-sign-verify-node-dsa.js b/test/parallel/test-webcrypto-sign-verify-node-dsa.js index 24d739062fb098..73b006b9236249 100644 --- a/test/parallel/test-webcrypto-sign-verify-node-dsa.js +++ b/test/parallel/test-webcrypto-sign-verify-node-dsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-sign-verify-rsa.js b/test/parallel/test-webcrypto-sign-verify-rsa.js index 2cfcf6e2ec02bd..60815c5ea0451d 100644 --- a/test/parallel/test-webcrypto-sign-verify-rsa.js +++ b/test/parallel/test-webcrypto-sign-verify-rsa.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; diff --git a/test/parallel/test-webcrypto-wrap-unwrap.js b/test/parallel/test-webcrypto-wrap-unwrap.js index 54a5a782a09586..1094845c73e143 100644 --- a/test/parallel/test-webcrypto-wrap-unwrap.js +++ b/test/parallel/test-webcrypto-wrap-unwrap.js @@ -5,9 +5,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -if (common.hasOpenSSL3) - common.skip('temporarily skipping for OpenSSL 3.0-alpha15'); - const assert = require('assert'); const { subtle } = require('crypto').webcrypto; From b1d38ddc8a3229941e7d5169955f30abcc37bfb5 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Mon, 19 Jul 2021 08:46:00 +0200 Subject: [PATCH 058/117] test: update OpenSSL3 error messages for beta-1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit updates error messages that have changed while these tests were disabled. PR-URL: https://github.com/nodejs/node/pull/39437 Reviewed-By: Michaël Zasso Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/parallel/test-crypto-dh-stateless.js | 2 +- test/parallel/test-crypto-key-objects.js | 7 +++---- test/parallel/test-crypto-keygen.js | 6 ++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/test/parallel/test-crypto-dh-stateless.js b/test/parallel/test-crypto-dh-stateless.js index 943ead06cda1fb..b7bd83cac1621f 100644 --- a/test/parallel/test-crypto-dh-stateless.js +++ b/test/parallel/test-crypto-dh-stateless.js @@ -226,7 +226,7 @@ assert.throws(() => { crypto.generateKeyPairSync('ec', { namedCurve: not256k1 })); }, common.hasOpenSSL3 ? { name: 'Error', - code: 'ERR_OSSL_MISMATCHING_SHARED_PARAMETERS' + code: 'ERR_OSSL_MISMATCHING_DOMAIN_PARAMETERS' } : { name: 'Error', code: 'ERR_OSSL_EVP_DIFFERENT_PARAMETERS' diff --git a/test/parallel/test-crypto-key-objects.js b/test/parallel/test-crypto-key-objects.js index 689fbadd29d926..aa03a0379a291a 100644 --- a/test/parallel/test-crypto-key-objects.js +++ b/test/parallel/test-crypto-key-objects.js @@ -305,7 +305,7 @@ const privateDsa = fixtures.readKey('dsa_private_encrypted_1025.pem', assert.throws(() => { createPrivateKey({ key: '' }); }, common.hasOpenSSL3 ? { - message: 'Failed to read private key', + message: 'error:1E08010C:DECODER routines::unsupported', } : { message: 'error:0909006C:PEM routines:get_name:no start line', code: 'ERR_OSSL_PEM_NO_START_LINE', @@ -519,8 +519,7 @@ const privateDsa = fixtures.readKey('dsa_private_encrypted_1025.pem', // Reading an encrypted key without a passphrase should fail. assert.throws(() => createPrivateKey(privateDsa), common.hasOpenSSL3 ? { name: 'Error', - message: 'error:07880109:common libcrypto routines::interrupted or ' + - 'cancelled', + message: 'error:1E08010C:DECODER routines::unsupported', } : { name: 'TypeError', code: 'ERR_MISSING_PASSPHRASE', @@ -546,7 +545,7 @@ const privateDsa = fixtures.readKey('dsa_private_encrypted_1025.pem', passphrase: Buffer.alloc(1024, 'a') }), { message: common.hasOpenSSL3 ? - 'error:07880109:common libcrypto routines::interrupted or cancelled' : + 'error:1E08010C:DECODER routines::unsupported' : /bad decrypt/ }); diff --git a/test/parallel/test-crypto-keygen.js b/test/parallel/test-crypto-keygen.js index 58e5d305b6b05a..d9fb6489786685 100644 --- a/test/parallel/test-crypto-keygen.js +++ b/test/parallel/test-crypto-keygen.js @@ -549,8 +549,7 @@ const sec1EncExp = (cipher) => getRegExpForPEM('EC PRIVATE KEY', cipher); // Since the private key is encrypted, signing shouldn't work anymore. assert.throws(() => testSignVerify(publicKey, privateKey), common.hasOpenSSL3 ? { - message: 'error:07880109:common libcrypto ' + - 'routines::interrupted or cancelled' + message: 'error:1E08010C:DECODER routines::unsupported' } : { name: 'TypeError', code: 'ERR_MISSING_PASSPHRASE', @@ -587,8 +586,7 @@ const sec1EncExp = (cipher) => getRegExpForPEM('EC PRIVATE KEY', cipher); // Since the private key is encrypted, signing shouldn't work anymore. assert.throws(() => testSignVerify(publicKey, privateKey), common.hasOpenSSL3 ? { - message: 'error:07880109:common libcrypto ' + - 'routines::interrupted or cancelled' + message: 'error:1E08010C:DECODER routines::unsupported' } : { name: 'TypeError', code: 'ERR_MISSING_PASSPHRASE', From e552b1a79182bb5c2323c070bdcc55bf8f728fd1 Mon Sep 17 00:00:00 2001 From: Benjamin Mayr Date: Wed, 14 Jul 2021 20:20:21 +0200 Subject: [PATCH 059/117] doc: improve node.js+fips instructions Improves the documentation for building Node.js with openssl-3.0.0+quic with enabled FIPS support. Adds missing but necesary steps to the documentation and makes it complete. Co-authored-by: Antoine du Hamel PR-URL: https://github.com/nodejs/node/pull/39390 Reviewed-By: Daniel Bevenius --- BUILDING.md | 109 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 30 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index d8e6e715868db3..6f54601b5a078c 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -766,23 +766,42 @@ to enable FIPS using the configuration flag `--openssl-is-fips`. ### Configuring and building quictls/openssl for FIPS For quictls/openssl 3.0 it is possible to enable FIPS when dynamically linking. -Node.js currently uses openssl-3.0.0+quic which can be configured as -follows: -```console -$ git clone git@github.com:quictls/openssl.git -$ cd openssl -$ ./config --prefix=/path/to/install/dir/ shared enable-fips linux-x86_64 +If you want to build Node.js using openssl-3.0.0+quic, you can follow these +steps: + +**clone OpenSSL source and prepare build** +```bash +git clone git@github.com:quictls/openssl.git + +cd openssl + +./config \ + --prefix=/path/to/install/dir/ \ + shared \ + enable-fips \ + linux-x86_64 ``` -This can be compiled and installed using the following commands: + +The `/path/to/install/dir` is the path in which the `make install` instructions +will publish the OpenSSL libraries and such. We will also use this path +(and sub-paths) later when compiling Node.js. + +**compile and install OpenSSL** ```console -$ make -j8 -$ make install_ssldirs -$ make install_fips +make -j8 +make install +make install_ssldirs +make install_fips ``` -After the FIPS module and configuration file have been installed by the above -instructions we also need to update `/path/to/install/dir/ssl/openssl.cnf` to -use the generated FIPS configuration file (`fipsmodule.cnf`): +After the OpenSSL (including FIPS) modules have been compiled and installed +(into the `/path/to/install/dir`) by the above instructions we also need to +update the OpenSSL configuration file located under +`/path/to/install/dir/ssl/openssl.cnf`. Right next to this file, you should +find the `fipsmodule.cnf` file - let's add the following to the end of the +`openssl.cnf` file. + +**alter openssl.cnf** ```text .include fipsmodule.cnf @@ -797,25 +816,53 @@ fips = fips_sect activate = 1 ``` -In the above case OpenSSL is not installed in the default location so two -environment variables need to be set, `OPENSSL_CONF`, and `OPENSSL_MODULES` -which should point to the OpenSSL configuration file and the directory where -OpenSSL modules are located: +You can e.g. accomplish this by running the following command - be sure to +replace `/path/to/install/dir/` with the path you have selected. Please make +sure that you specify an absolute path for the `.include fipsmodule.cnf` line - +using relative paths did not work on my system! + +**alter openssl.cnf using a script** ```console -$ export OPENSSL_CONF=/path/to/install/dir/ssl/openssl.cnf -$ export OPENSSL_MODULES=/path/to/install/dir/lib/ossl-modules +cat <> /path/to/install/dir/ssl/openssl.cnf +.include /path/to/install/dir/ssl/fipsmodule.cnf + +# List of providers to load +[provider_sect] +default = default_sect +# The fips section name should match the section name inside the +# included /path/to/install/dir/ssl/fipsmodule.cnf. +fips = fips_sect + +[default_sect] +activate = 1 +EOT ``` -Node.js can then be configured to enable FIPS: +As you might have picked a non-custom path for your OpenSSL install dir, we +have to export the following two environment variables in order for Node.js to +find our OpenSSL modules we built beforehand: ```console -$ ./configure --shared-openssl --shared-openssl-libpath=/path/to/install/dir/lib --shared-openssl-includes=/path/to/install/dir/include --shared-openssl-libname=crypto,ssl --openssl-is-fips -$ export LD_LIBRARY_PATH=/path/to/install/dir/lib -$ make -j8 +export OPENSSL_CONF=/path/to/install/dir/ssl/openssl.cnf +export OPENSSL_MODULES=/path/to/install/dir/lib/ossl-modules ``` -Verify the produced executable: +**build Node.js** ```console -$ ldd ./node +./configure \ + --shared-openssl \ + --shared-openssl-libpath=/path/to/install/dir/lib \ + --shared-openssl-includes=/path/to/install/dir/include \ + --shared-openssl-libname=crypto,ssl \ + --openssl-is-fips + +export LD_LIBRARY_PATH=/path/to/install/dir/lib + +make -j8 +``` + +**verify the produced executable** +```console +ldd ./node linux-vdso.so.1 (0x00007ffd7917b000) libcrypto.so.81.3 => /path/to/install/dir/lib/libcrypto.so.81.3 (0x00007fd911321000) libssl.so.81.3 => /path/to/install/dir/lib/libssl.so.81.3 (0x00007fd91125e000) @@ -827,21 +874,23 @@ $ ldd ./node libc.so.6 => /usr/lib64/libc.so.6 (0x00007fd910cec000) /lib64/ld-linux-x86-64.so.2 (0x00007fd9117f2000) ``` + If the `ldd` command says that `libcrypto` cannot be found one needs to set `LD_LIBRARY_PATH` to point to the directory used above for `--shared-openssl-libpath` (see previous step). -Verify the OpenSSL version: +**verify the OpenSSL version** ```console -$ ./node -p process.versions.openssl +./node -p process.versions.openssl 3.0.0-alpha16+quic ``` -Verify that FIPS is available: +**verify that FIPS is available** ```console -$ ./node -p 'process.config.variables.openssl_is_fips' +./node -p 'process.config.variables.openssl_is_fips' true -$ ./node --enable-fips -p 'crypto.getFips()' + +./node --enable-fips -p 'crypto.getFips()' 1 ``` From 72ad6d3f27ba4a4df055a73269af4893a0cc96bf Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 20 Jul 2021 08:24:30 -0700 Subject: [PATCH 060/117] fs: check closing_ in FileHandle::Close MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix possible flaky failure. Keep uv_fs_close from being called twice on the same fd. Signed-off-by: James M Snell PR-URL: https://github.com/nodejs/node/pull/39472 Refs: https://github.com/nodejs/node/issues/39464 Reviewed-By: Matteo Collina Reviewed-By: Tobias Nießen --- src/node_file.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/node_file.cc b/src/node_file.cc index 906109e121ae82..350e66b6e426b8 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -215,6 +215,7 @@ FileHandle::TransferData::TransferData(int fd) : fd_(fd) {} FileHandle::TransferData::~TransferData() { if (fd_ > 0) { uv_fs_t close_req; + CHECK_NE(fd_, -1); CHECK_EQ(0, uv_fs_close(nullptr, &close_req, fd_, nullptr)); uv_fs_req_cleanup(&close_req); } @@ -237,8 +238,9 @@ BaseObjectPtr FileHandle::TransferData::Deserialize( // JS during GC. If closing the fd fails at this point, a fatal exception // will crash the process immediately. inline void FileHandle::Close() { - if (closed_) return; + if (closed_ || closing_) return; uv_fs_t req; + CHECK_NE(fd_, -1); int ret = uv_fs_close(env()->event_loop(), &req, fd_, nullptr); uv_fs_req_cleanup(&req); @@ -384,6 +386,7 @@ MaybeLocal FileHandle::ClosePromise() { close->Resolve(); } }}; + CHECK_NE(fd_, -1); int ret = req->Dispatch(uv_fs_close, fd_, AfterClose); if (ret < 0) { req->Reject(UVException(isolate, ret, "close")); @@ -555,8 +558,13 @@ ShutdownWrap* FileHandle::CreateShutdownWrap(Local object) { } int FileHandle::DoShutdown(ShutdownWrap* req_wrap) { + if (closing_ || closed_) { + req_wrap->Done(0); + return 1; + } FileHandleCloseWrap* wrap = static_cast(req_wrap); closing_ = true; + CHECK_NE(fd_, -1); wrap->Dispatch(uv_fs_close, fd_, uv_fs_callback_t{[](uv_fs_t* req) { FileHandleCloseWrap* wrap = static_cast( FileHandleCloseWrap::from_req(req)); From 89796d0c7fe160dde1ecfff62747d9cee22ab883 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Tue, 20 Jul 2021 09:40:57 +0200 Subject: [PATCH 061/117] deps: bump HdrHistogram_C to 0.11.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release tag: https://github.com/HdrHistogram/HdrHistogram_c/releases/tag/0.11.2 Fixes: https://github.com/nodejs/node/issues/39450 PR-URL: https://github.com/nodejs/node/pull/39462 Reviewed-By: Tobias Nießen Reviewed-By: Michaël Zasso Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- deps/histogram/src/hdr_atomic.h | 146 ++++++++++++++++++++ deps/histogram/src/hdr_histogram.c | 213 ++++++++++++++++++++++------- deps/histogram/src/hdr_histogram.h | 74 +++++++++- 3 files changed, 379 insertions(+), 54 deletions(-) create mode 100644 deps/histogram/src/hdr_atomic.h diff --git a/deps/histogram/src/hdr_atomic.h b/deps/histogram/src/hdr_atomic.h new file mode 100644 index 00000000000000..ae1056a83612af --- /dev/null +++ b/deps/histogram/src/hdr_atomic.h @@ -0,0 +1,146 @@ +/** + * hdr_atomic.h + * Written by Philip Orwig and released to the public domain, + * as explained at http://creativecommons.org/publicdomain/zero/1.0/ + */ + +#ifndef HDR_ATOMIC_H__ +#define HDR_ATOMIC_H__ + + +#if defined(_MSC_VER) + +#include +#include +#include + +static void __inline * hdr_atomic_load_pointer(void** pointer) +{ + _ReadBarrier(); + return *pointer; +} + +static void hdr_atomic_store_pointer(void** pointer, void* value) +{ + _WriteBarrier(); + *pointer = value; +} + +static int64_t __inline hdr_atomic_load_64(int64_t* field) +{ + _ReadBarrier(); + return *field; +} + +static void __inline hdr_atomic_store_64(int64_t* field, int64_t value) +{ + _WriteBarrier(); + *field = value; +} + +static int64_t __inline hdr_atomic_exchange_64(volatile int64_t* field, int64_t value) +{ +#if defined(_WIN64) + return _InterlockedExchange64(field, value); +#else + int64_t comparand; + int64_t initial_value = *field; + do + { + comparand = initial_value; + initial_value = _InterlockedCompareExchange64(field, value, comparand); + } + while (comparand != initial_value); + + return initial_value; +#endif +} + +static int64_t __inline hdr_atomic_add_fetch_64(volatile int64_t* field, int64_t value) +{ +#if defined(_WIN64) + return _InterlockedExchangeAdd64(field, value) + value; +#else + int64_t comparand; + int64_t initial_value = *field; + do + { + comparand = initial_value; + initial_value = _InterlockedCompareExchange64(field, comparand + value, comparand); + } + while (comparand != initial_value); + + return initial_value + value; +#endif +} + +static bool __inline hdr_atomic_compare_exchange_64(volatile int64_t* field, int64_t* expected, int64_t desired) +{ + return *expected == _InterlockedCompareExchange64(field, desired, *expected); +} + +#elif defined(__ATOMIC_SEQ_CST) + +#define hdr_atomic_load_pointer(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) +#define hdr_atomic_store_pointer(f,v) __atomic_store_n(f,v, __ATOMIC_SEQ_CST) +#define hdr_atomic_load_64(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) +#define hdr_atomic_store_64(f,v) __atomic_store_n(f,v, __ATOMIC_SEQ_CST) +#define hdr_atomic_exchange_64(f,i) __atomic_exchange_n(f,i, __ATOMIC_SEQ_CST) +#define hdr_atomic_add_fetch_64(field, value) __atomic_add_fetch(field, value, __ATOMIC_SEQ_CST) +#define hdr_atomic_compare_exchange_64(field, expected, desired) __atomic_compare_exchange_n(field, expected, desired, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) + +#elif defined(__x86_64__) + +#include +#include + +static inline void* hdr_atomic_load_pointer(void** pointer) +{ + void* p = *pointer; + asm volatile ("" ::: "memory"); + return p; +} + +static inline void hdr_atomic_store_pointer(void** pointer, void* value) +{ + asm volatile ("lock; xchgq %0, %1" : "+q" (value), "+m" (*pointer)); +} + +static inline int64_t hdr_atomic_load_64(int64_t* field) +{ + int64_t i = *field; + asm volatile ("" ::: "memory"); + return i; +} + +static inline void hdr_atomic_store_64(int64_t* field, int64_t value) +{ + asm volatile ("lock; xchgq %0, %1" : "+q" (value), "+m" (*field)); +} + +static inline int64_t hdr_atomic_exchange_64(volatile int64_t* field, int64_t value) +{ + int64_t result = 0; + asm volatile ("lock; xchgq %1, %2" : "=r" (result), "+q" (value), "+m" (*field)); + return result; +} + +static inline int64_t hdr_atomic_add_fetch_64(volatile int64_t* field, int64_t value) +{ + return __sync_add_and_fetch(field, value); +} + +static inline bool hdr_atomic_compare_exchange_64(volatile int64_t* field, int64_t* expected, int64_t desired) +{ + int64_t original; + asm volatile( "lock; cmpxchgq %2, %1" : "=a"(original), "+m"(*field) : "q"(desired), "0"(*expected)); + return original == *expected; +} + +#else + +#error "Unable to determine atomic operations for your platform" + +#endif + +#endif /* HDR_ATOMIC_H__ */ diff --git a/deps/histogram/src/hdr_histogram.c b/deps/histogram/src/hdr_histogram.c index d9565b802e3564..4bcfbeb049bf59 100644 --- a/deps/histogram/src/hdr_histogram.c +++ b/deps/histogram/src/hdr_histogram.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -16,6 +15,7 @@ #include "hdr_histogram.h" #include "hdr_tests.h" +#include "hdr_atomic.h" /* ###### ####### ## ## ## ## ######## ###### */ /* ## ## ## ## ## ## ### ## ## ## ## */ @@ -66,12 +66,49 @@ static void counts_inc_normalised( h->total_count += value; } +static void counts_inc_normalised_atomic( + struct hdr_histogram* h, int32_t index, int64_t value) +{ + int32_t normalised_index = normalize_index(h, index); + + hdr_atomic_add_fetch_64(&h->counts[normalised_index], value); + hdr_atomic_add_fetch_64(&h->total_count, value); +} + static void update_min_max(struct hdr_histogram* h, int64_t value) { h->min_value = (value < h->min_value && value != 0) ? value : h->min_value; h->max_value = (value > h->max_value) ? value : h->max_value; } +static void update_min_max_atomic(struct hdr_histogram* h, int64_t value) +{ + int64_t current_min_value; + int64_t current_max_value; + do + { + current_min_value = hdr_atomic_load_64(&h->min_value); + + if (0 == value || current_min_value <= value) + { + break; + } + } + while (!hdr_atomic_compare_exchange_64(&h->min_value, ¤t_min_value, value)); + + do + { + current_max_value = hdr_atomic_load_64(&h->max_value); + + if (value <= current_max_value) + { + break; + } + } + while (!hdr_atomic_compare_exchange_64(&h->max_value, ¤t_max_value, value)); +} + + /* ## ## ######## #### ## #### ######## ## ## */ /* ## ## ## ## ## ## ## ## ## */ /* ## ## ## ## ## ## ## #### */ @@ -91,33 +128,40 @@ static int64_t power(int64_t base, int64_t exp) } #if defined(_MSC_VER) -# if defined(_WIN64) -# pragma intrinsic(_BitScanReverse64) -# else -# pragma intrinsic(_BitScanReverse) -# endif +# if defined(_WIN64) +# pragma intrinsic(_BitScanReverse64) +# else +# pragma intrinsic(_BitScanReverse) +# endif #endif -static int32_t get_bucket_index(const struct hdr_histogram* h, int64_t value) +static int32_t count_leading_zeros_64(int64_t value) { #if defined(_MSC_VER) uint32_t leading_zero = 0; - int64_t masked_value = value | h->sub_bucket_mask; -# if defined(_WIN64) - _BitScanReverse64(&leading_zero, masked_value); -# else - uint32_t high = masked_value >> 32; - if (_BitScanReverse(&leading_zero, high)) { - leading_zero += 32; - } else { - uint32_t low = masked_value & 0x00000000FFFFFFFF; - _BitScanReverse(&leading_zero, low); +#if defined(_WIN64) + _BitScanReverse64(&leading_zero, value); +#else + uint32_t high = value >> 32; + if (_BitScanReverse(&leading_zero, high)) + { + leading_zero += 32; + } + else + { + uint32_t low = value & 0x00000000FFFFFFFF; + _BitScanReverse(&leading_zero, low); } -# endif - int32_t pow2ceiling = 64 - (63 - leading_zero); /* smallest power of 2 containing value */ +#endif + return 63 - leading_zero; /* smallest power of 2 containing value */ #else - int32_t pow2ceiling = 64 - __builtin_clzll(value | h->sub_bucket_mask); /* smallest power of 2 containing value */ + return __builtin_clzll(value); /* smallest power of 2 containing value */ #endif +} + +static int32_t get_bucket_index(const struct hdr_histogram* h, int64_t value) +{ + int32_t pow2ceiling = 64 - count_leading_zeros_64(value | h->sub_bucket_mask); /* smallest power of 2 containing value */ return pow2ceiling - h->unit_magnitude - (h->sub_bucket_half_count_magnitude + 1); } @@ -283,11 +327,8 @@ int hdr_calculate_bucket_config( int64_t largest_value_with_single_unit_resolution; if (lowest_trackable_value < 1 || - significant_figures < 1 || 5 < significant_figures) - { - return EINVAL; - } - else if (lowest_trackable_value * 2 > highest_trackable_value) + significant_figures < 1 || 5 < significant_figures || + lowest_trackable_value * 2 > highest_trackable_value) { return EINVAL; } @@ -300,8 +341,13 @@ int hdr_calculate_bucket_config( sub_bucket_count_magnitude = (int32_t) ceil(log((double)largest_value_with_single_unit_resolution) / log(2)); cfg->sub_bucket_half_count_magnitude = ((sub_bucket_count_magnitude > 1) ? sub_bucket_count_magnitude : 1) - 1; - cfg->unit_magnitude = (int32_t) floor(log((double)lowest_trackable_value) / log(2)); + double unit_magnitude = log((double)lowest_trackable_value) / log(2); + if (INT32_MAX < unit_magnitude) + { + return EINVAL; + } + cfg->unit_magnitude = (int32_t) unit_magnitude; cfg->sub_bucket_count = (int32_t) pow(2, (cfg->sub_bucket_half_count_magnitude + 1)); cfg->sub_bucket_half_count = cfg->sub_bucket_count / 2; cfg->sub_bucket_mask = ((int64_t) cfg->sub_bucket_count - 1) << cfg->unit_magnitude; @@ -352,11 +398,16 @@ int hdr_init( return r; } - counts = calloc((size_t) cfg.counts_len, sizeof(int64_t)); - histogram = calloc(1, sizeof(struct hdr_histogram)); + counts = (int64_t*) calloc((size_t) cfg.counts_len, sizeof(int64_t)); + if (!counts) + { + return ENOMEM; + } - if (!counts || !histogram) + histogram = (struct hdr_histogram*) calloc(1, sizeof(struct hdr_histogram)); + if (!histogram) { + free(counts); return ENOMEM; } @@ -370,8 +421,10 @@ int hdr_init( void hdr_close(struct hdr_histogram* h) { - free(h->counts); - free(h); + if (h) { + free(h->counts); + free(h); + } } int hdr_alloc(int64_t highest_trackable_value, int significant_figures, struct hdr_histogram** result) @@ -407,6 +460,11 @@ bool hdr_record_value(struct hdr_histogram* h, int64_t value) return hdr_record_values(h, value, 1); } +bool hdr_record_value_atomic(struct hdr_histogram* h, int64_t value) +{ + return hdr_record_values_atomic(h, value, 1); +} + bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count) { int32_t counts_index; @@ -429,11 +487,37 @@ bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count) return true; } +bool hdr_record_values_atomic(struct hdr_histogram* h, int64_t value, int64_t count) +{ + int32_t counts_index; + + if (value < 0) + { + return false; + } + + counts_index = counts_index_for(h, value); + + if (counts_index < 0 || h->counts_len <= counts_index) + { + return false; + } + + counts_inc_normalised_atomic(h, counts_index, count); + update_min_max_atomic(h, value); + + return true; +} + bool hdr_record_corrected_value(struct hdr_histogram* h, int64_t value, int64_t expected_interval) { return hdr_record_corrected_values(h, value, 1, expected_interval); } +bool hdr_record_corrected_value_atomic(struct hdr_histogram* h, int64_t value, int64_t expected_interval) +{ + return hdr_record_corrected_values_atomic(h, value, 1, expected_interval); +} bool hdr_record_corrected_values(struct hdr_histogram* h, int64_t value, int64_t count, int64_t expected_interval) { @@ -461,6 +545,32 @@ bool hdr_record_corrected_values(struct hdr_histogram* h, int64_t value, int64_t return true; } +bool hdr_record_corrected_values_atomic(struct hdr_histogram* h, int64_t value, int64_t count, int64_t expected_interval) +{ + int64_t missing_value; + + if (!hdr_record_values_atomic(h, value, count)) + { + return false; + } + + if (expected_interval <= 0 || value <= expected_interval) + { + return true; + } + + missing_value = value - expected_interval; + for (; missing_value >= expected_interval; missing_value -= expected_interval) + { + if (!hdr_record_values_atomic(h, missing_value, count)) + { + return false; + } + } + + return true; +} + int64_t hdr_add(struct hdr_histogram* h, const struct hdr_histogram* from) { struct hdr_iter iter; @@ -672,7 +782,7 @@ static bool next_value_greater_than_reporting_level_upper_bound( return peek_next_value_from_index(iter) > reporting_level_upper_bound; } -static bool _basic_iter_next(struct hdr_iter *iter) +static bool basic_iter_next(struct hdr_iter *iter) { if (!has_next(iter) || iter->counts_index >= iter->h->counts_len) { @@ -684,19 +794,19 @@ static bool _basic_iter_next(struct hdr_iter *iter) return true; } -static void _update_iterated_values(struct hdr_iter* iter, int64_t new_value_iterated_to) +static void update_iterated_values(struct hdr_iter* iter, int64_t new_value_iterated_to) { iter->value_iterated_from = iter->value_iterated_to; iter->value_iterated_to = new_value_iterated_to; } -static bool _all_values_iter_next(struct hdr_iter* iter) +static bool all_values_iter_next(struct hdr_iter* iter) { bool result = move_next(iter); if (result) { - _update_iterated_values(iter, iter->value); + update_iterated_values(iter, iter->value); } return result; @@ -715,7 +825,7 @@ void hdr_iter_init(struct hdr_iter* iter, const struct hdr_histogram* h) iter->value_iterated_from = 0; iter->value_iterated_to = 0; - iter->_next_fp = _all_values_iter_next; + iter->_next_fp = all_values_iter_next; } bool hdr_iter_next(struct hdr_iter* iter) @@ -731,7 +841,7 @@ bool hdr_iter_next(struct hdr_iter* iter) /* ## ## ## ## ## ## ## ## ### ## ## ## ## ## ## */ /* ## ######## ## ## ###### ######## ## ## ## #### ######## ######## ###### */ -static bool _percentile_iter_next(struct hdr_iter* iter) +static bool percentile_iter_next(struct hdr_iter* iter) { int64_t temp, half_distance, percentile_reporting_ticks; @@ -750,7 +860,7 @@ static bool _percentile_iter_next(struct hdr_iter* iter) return true; } - if (iter->counts_index == -1 && !_basic_iter_next(iter)) + if (iter->counts_index == -1 && !basic_iter_next(iter)) { return false; } @@ -761,7 +871,7 @@ static bool _percentile_iter_next(struct hdr_iter* iter) if (iter->count != 0 && percentiles->percentile_to_iterate_to <= current_percentile) { - _update_iterated_values(iter, highest_equivalent_value(iter->h, iter->value)); + update_iterated_values(iter, highest_equivalent_value(iter->h, iter->value)); percentiles->percentile = percentiles->percentile_to_iterate_to; temp = (int64_t)(log(100 / (100.0 - (percentiles->percentile_to_iterate_to))) / log(2)) + 1; @@ -772,7 +882,7 @@ static bool _percentile_iter_next(struct hdr_iter* iter) return true; } } - while (_basic_iter_next(iter)); + while (basic_iter_next(iter)); return true; } @@ -788,7 +898,7 @@ void hdr_iter_percentile_init(struct hdr_iter* iter, const struct hdr_histogram* iter->specifics.percentiles.percentile_to_iterate_to = 0.0; iter->specifics.percentiles.percentile = 0.0; - iter->_next_fp = _percentile_iter_next; + iter->_next_fp = percentile_iter_next; } static void format_line_string(char* str, size_t len, int significant_figures, format_type format) @@ -827,13 +937,13 @@ static void format_line_string(char* str, size_t len, int significant_figures, f /* ## ## ######## ###### ####### ## ## ######## ######## ######## */ -static bool _recorded_iter_next(struct hdr_iter* iter) +static bool recorded_iter_next(struct hdr_iter* iter) { - while (_basic_iter_next(iter)) + while (basic_iter_next(iter)) { if (iter->count != 0) { - _update_iterated_values(iter, iter->value); + update_iterated_values(iter, iter->value); iter->specifics.recorded.count_added_in_this_iteration_step = iter->count; return true; @@ -849,7 +959,7 @@ void hdr_iter_recorded_init(struct hdr_iter* iter, const struct hdr_histogram* h iter->specifics.recorded.count_added_in_this_iteration_step = 0; - iter->_next_fp = _recorded_iter_next; + iter->_next_fp = recorded_iter_next; } /* ## #### ## ## ######## ### ######## */ @@ -861,7 +971,7 @@ void hdr_iter_recorded_init(struct hdr_iter* iter, const struct hdr_histogram* h /* ######## #### ## ## ######## ## ## ## ## */ -static bool _iter_linear_next(struct hdr_iter* iter) +static bool iter_linear_next(struct hdr_iter* iter) { struct hdr_iter_linear* linear = &iter->specifics.linear; @@ -875,7 +985,7 @@ static bool _iter_linear_next(struct hdr_iter* iter) { if (iter->value >= linear->next_value_reporting_level_lowest_equivalent) { - _update_iterated_values(iter, linear->next_value_reporting_level); + update_iterated_values(iter, linear->next_value_reporting_level); linear->next_value_reporting_level += linear->value_units_per_bucket; linear->next_value_reporting_level_lowest_equivalent = @@ -907,7 +1017,7 @@ void hdr_iter_linear_init(struct hdr_iter* iter, const struct hdr_histogram* h, iter->specifics.linear.next_value_reporting_level = value_units_per_bucket; iter->specifics.linear.next_value_reporting_level_lowest_equivalent = lowest_equivalent_value(h, value_units_per_bucket); - iter->_next_fp = _iter_linear_next; + iter->_next_fp = iter_linear_next; } /* ## ####### ###### ### ######## #### ######## ## ## ## ## #### ###### */ @@ -918,7 +1028,7 @@ void hdr_iter_linear_init(struct hdr_iter* iter, const struct hdr_histogram* h, /* ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## */ /* ######## ####### ###### ## ## ## ## #### ## ## ## ## ## #### ###### */ -static bool _log_iter_next(struct hdr_iter *iter) +static bool log_iter_next(struct hdr_iter *iter) { struct hdr_iter_log* logarithmic = &iter->specifics.log; @@ -932,7 +1042,7 @@ static bool _log_iter_next(struct hdr_iter *iter) { if (iter->value >= logarithmic->next_value_reporting_level_lowest_equivalent) { - _update_iterated_values(iter, logarithmic->next_value_reporting_level); + update_iterated_values(iter, logarithmic->next_value_reporting_level); logarithmic->next_value_reporting_level *= (int64_t)logarithmic->log_base; logarithmic->next_value_reporting_level_lowest_equivalent = lowest_equivalent_value(iter->h, logarithmic->next_value_reporting_level); @@ -965,7 +1075,7 @@ void hdr_iter_log_init( iter->specifics.log.next_value_reporting_level = value_units_first_bucket; iter->specifics.log.next_value_reporting_level_lowest_equivalent = lowest_equivalent_value(h, value_units_first_bucket); - iter->_next_fp = _log_iter_next; + iter->_next_fp = log_iter_next; } /* Printing. */ @@ -977,7 +1087,6 @@ static const char* format_head_string(format_type format) case CSV: return "%s,%s,%s,%s\n"; case CLASSIC: - return "%12s %12s %12s %12s\n\n"; default: return "%12s %12s %12s %12s\n\n"; } diff --git a/deps/histogram/src/hdr_histogram.h b/deps/histogram/src/hdr_histogram.h index 4a0f4606b57172..aff51f1c11526a 100644 --- a/deps/histogram/src/hdr_histogram.h +++ b/deps/histogram/src/hdr_histogram.h @@ -110,6 +110,21 @@ size_t hdr_get_memory_size(struct hdr_histogram* h); */ bool hdr_record_value(struct hdr_histogram* h, int64_t value); +/** + * Records a value in the histogram, will round this value of to a precision at or better + * than the significant_figure specified at construction time. + * + * Will record this value atomically, however the whole structure may appear inconsistent + * when read concurrently with this update. Do NOT mix calls to this method with calls + * to non-atomic updates. + * + * @param h "This" pointer + * @param value Value to add to the histogram + * @return false if the value is larger than the highest_trackable_value and can't be recorded, + * true otherwise. + */ +bool hdr_record_value_atomic(struct hdr_histogram* h, int64_t value); + /** * Records count values in the histogram, will round this value of to a * precision at or better than the significant_figure specified at construction @@ -123,6 +138,22 @@ bool hdr_record_value(struct hdr_histogram* h, int64_t value); */ bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count); +/** + * Records count values in the histogram, will round this value of to a + * precision at or better than the significant_figure specified at construction + * time. + * + * Will record this value atomically, however the whole structure may appear inconsistent + * when read concurrently with this update. Do NOT mix calls to this method with calls + * to non-atomic updates. + * + * @param h "This" pointer + * @param value Value to add to the histogram + * @param count Number of 'value's to add to the histogram + * @return false if any value is larger than the highest_trackable_value and can't be recorded, + * true otherwise. + */ +bool hdr_record_values_atomic(struct hdr_histogram* h, int64_t value, int64_t count); /** * Record a value in the histogram and backfill based on an expected interval. @@ -140,6 +171,28 @@ bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count); * true otherwise. */ bool hdr_record_corrected_value(struct hdr_histogram* h, int64_t value, int64_t expexcted_interval); + +/** + * Record a value in the histogram and backfill based on an expected interval. + * + * Records a value in the histogram, will round this value of to a precision at or better + * than the significant_figure specified at contruction time. This is specifically used + * for recording latency. If the value is larger than the expected_interval then the + * latency recording system has experienced co-ordinated omission. This method fills in the + * values that would have occured had the client providing the load not been blocked. + * + * Will record this value atomically, however the whole structure may appear inconsistent + * when read concurrently with this update. Do NOT mix calls to this method with calls + * to non-atomic updates. + * + * @param h "This" pointer + * @param value Value to add to the histogram + * @param expected_interval The delay between recording values. + * @return false if the value is larger than the highest_trackable_value and can't be recorded, + * true otherwise. + */ +bool hdr_record_corrected_value_atomic(struct hdr_histogram* h, int64_t value, int64_t expexcted_interval); + /** * Record a value in the histogram 'count' times. Applies the same correcting logic * as 'hdr_record_corrected_value'. @@ -153,6 +206,23 @@ bool hdr_record_corrected_value(struct hdr_histogram* h, int64_t value, int64_t */ bool hdr_record_corrected_values(struct hdr_histogram* h, int64_t value, int64_t count, int64_t expected_interval); +/** + * Record a value in the histogram 'count' times. Applies the same correcting logic + * as 'hdr_record_corrected_value'. + * + * Will record this value atomically, however the whole structure may appear inconsistent + * when read concurrently with this update. Do NOT mix calls to this method with calls + * to non-atomic updates. + * + * @param h "This" pointer + * @param value Value to add to the histogram + * @param count Number of 'value's to add to the histogram + * @param expected_interval The delay between recording values. + * @return false if the value is larger than the highest_trackable_value and can't be recorded, + * true otherwise. + */ +bool hdr_record_corrected_values_atomic(struct hdr_histogram* h, int64_t value, int64_t count, int64_t expected_interval); + /** * Adds all of the values from 'from' to 'this' histogram. Will return the * number of values that are dropped when copying. Values will be dropped @@ -299,7 +369,7 @@ struct hdr_iter /** raw index into the counts array */ int32_t counts_index; /** snapshot of the length at the time the iterator is created */ - int32_t total_count; + int64_t total_count; /** value directly from array for the current counts_index */ int64_t count; /** sum of all of the counts up to and including the count at this index */ @@ -431,4 +501,4 @@ void hdr_reset_internal_counters(struct hdr_histogram* h); } #endif -#endif \ No newline at end of file +#endif From f0287e52aa8fd1a66d0dc6b7498c6035d6b53a6e Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 19 Jul 2021 11:52:58 +0200 Subject: [PATCH 062/117] src: close HandleWraps instead of deleting them in OnGCCollect() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When all strong `BaseObjectPtr`s to a `HandleWrap` are gone, we should not delete the `HandleWrap` outright, but instead close it and then delete it only once the libuv close callback has been called. Based on the valgrind output from the issue below, this has a good chance of fixing it. Fixes: https://github.com/nodejs/node/issues/39036 PR-URL: https://github.com/nodejs/node/pull/39441 Reviewed-By: Tobias Nießen Reviewed-By: Gireesh Punathil Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- src/base_object-inl.h | 2 +- src/handle_wrap.cc | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/base_object-inl.h b/src/base_object-inl.h index ff3610c60a822c..ad900b6399f149 100644 --- a/src/base_object-inl.h +++ b/src/base_object-inl.h @@ -201,7 +201,7 @@ void BaseObject::decrease_refcount() { unsigned int new_refcount = --metadata->strong_ptr_count; if (new_refcount == 0) { if (metadata->is_detached) { - delete this; + OnGCCollect(); } else if (metadata->wants_weak_jsobj && !persistent_handle_.IsEmpty()) { MakeWeak(); } diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc index d2bd67a5e405d1..caad0e0554622a 100644 --- a/src/handle_wrap.cc +++ b/src/handle_wrap.cc @@ -85,7 +85,16 @@ void HandleWrap::Close(Local close_callback) { void HandleWrap::OnGCCollect() { - Close(); + // When all references to a HandleWrap are lost and the object is supposed to + // be destroyed, we first call Close() to clean up the underlying libuv + // handle. The OnClose callback then acquires and destroys another reference + // to that object, and when that reference is lost, we perform the default + // action (i.e. destroying `this`). + if (state_ != kClosed) { + Close(); + } else { + BaseObject::OnGCCollect(); + } } From febeb0df16780721b3e9aba7c1ed0944ce72c9c5 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 19 Jul 2021 22:00:13 -0700 Subject: [PATCH 063/117] meta: update AUTHORS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39461 Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index a8159bdbd8e243..2c1718f2bdde75 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3326,5 +3326,6 @@ Makoto Kato foxxyz LitoMore nerdthatnoonelikes +Nikita Rykov <40735471+angrymouse@users.noreply.github.com> # Generated by tools/update-authors.js From e18778d409c6c4109a151062021288fa91c22225 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 23 Jun 2021 22:35:46 -0700 Subject: [PATCH 064/117] async_hooks: eliminate native PromiseHook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39135 Reviewed-By: Rich Trott Reviewed-By: Benjamin Gruenbaum Reviewed-By: Gerhard Stöbich --- lib/internal/async_hooks.js | 49 +++- src/async_wrap.cc | 287 -------------------- test/addons/async-hooks-promise/binding.cc | 41 --- test/addons/async-hooks-promise/binding.gyp | 9 - test/addons/async-hooks-promise/test.js | 104 ------- 5 files changed, 34 insertions(+), 456 deletions(-) delete mode 100644 test/addons/async-hooks-promise/binding.cc delete mode 100644 test/addons/async-hooks-promise/binding.gyp delete mode 100644 test/addons/async-hooks-promise/test.js diff --git a/lib/internal/async_hooks.js b/lib/internal/async_hooks.js index a6d258cf25757a..c5895bce1c036c 100644 --- a/lib/internal/async_hooks.js +++ b/lib/internal/async_hooks.js @@ -52,7 +52,7 @@ const { clearAsyncIdStack, } = async_wrap; // For performance reasons, only track Promises when a hook is enabled. -const { enablePromiseHook, disablePromiseHook, setPromiseHooks } = async_wrap; +const { setPromiseHooks } = async_wrap; // Properties in active_hooks are used to keep track of the set of hooks being // executed in case another hook is enabled/disabled. The new set of hooks is // then restored once the active set of hooks is finished executing. @@ -307,9 +307,13 @@ function trackPromise(promise, parent) { return; } - promise[async_id_symbol] = newAsyncId(); - promise[trigger_async_id_symbol] = parent ? getOrSetAsyncId(parent) : + // Get trigger id from parent async id before making the async id of the + // child so if a new one must be made it will be lower than the child. + const triggerAsyncId = parent ? getOrSetAsyncId(parent) : getDefaultTriggerAsyncId(); + + promise[async_id_symbol] = newAsyncId(); + promise[trigger_async_id_symbol] = triggerAsyncId; } function promiseInitHook(promise, parent) { @@ -319,6 +323,21 @@ function promiseInitHook(promise, parent) { emitInitScript(asyncId, 'PROMISE', triggerAsyncId, promise); } +function promiseInitHookWithDestroyTracking(promise, parent) { + promiseInitHook(promise, parent); + destroyTracking(promise, parent); +} + +const destroyedSymbol = Symbol('destroyed'); + +function destroyTracking(promise, parent) { + trackPromise(promise, parent); + const asyncId = promise[async_id_symbol]; + const destroyed = { destroyed: false }; + promise[destroyedSymbol] = destroyed; + registerDestroyHook(promise, asyncId, destroyed); +} + function promiseBeforeHook(promise) { trackPromise(promise); const asyncId = promise[async_id_symbol]; @@ -355,18 +374,19 @@ function enableHooks() { function updatePromiseHookMode() { wantPromiseHook = true; - if (destroyHooksExist()) { - enablePromiseHook(); - setPromiseHooks(undefined, undefined, undefined, undefined); - } else { - disablePromiseHook(); - setPromiseHooks( - initHooksExist() ? promiseInitHook : undefined, - promiseBeforeHook, - promiseAfterHook, - promiseResolveHooksExist() ? promiseResolveHook : undefined, - ); + let initHook; + if (initHooksExist()) { + initHook = destroyHooksExist() ? promiseInitHookWithDestroyTracking : + promiseInitHook; + } else if (destroyHooksExist()) { + initHook = destroyTracking; } + setPromiseHooks( + initHook, + promiseBeforeHook, + promiseAfterHook, + promiseResolveHooksExist() ? promiseResolveHook : undefined, + ); } function disableHooks() { @@ -381,7 +401,6 @@ function disableHooks() { function disablePromiseHookIfNecessary() { if (!wantPromiseHook) { - disablePromiseHook(); setPromiseHooks(undefined, undefined, undefined, undefined); } } diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 1bca27d6a0fd25..3fb2f8c309825c 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -39,19 +39,12 @@ using v8::Global; using v8::HandleScope; using v8::Integer; using v8::Isolate; -using v8::Just; using v8::Local; -using v8::Maybe; using v8::MaybeLocal; -using v8::Name; using v8::Nothing; using v8::Number; using v8::Object; -using v8::ObjectTemplate; -using v8::Promise; -using v8::PromiseHookType; using v8::PropertyAttribute; -using v8::PropertyCallbackInfo; using v8::ReadOnly; using v8::String; using v8::Undefined; @@ -161,255 +154,6 @@ void AsyncWrap::EmitAfter(Environment* env, double async_id) { // TODO(addaleax): Remove once we're on C++17. constexpr double AsyncWrap::kInvalidAsyncId; -static Maybe GetAssignedPromiseAsyncId(Environment* env, - Local promise, - Local id_symbol) { - Local maybe_async_id; - if (!promise->Get(env->context(), id_symbol).ToLocal(&maybe_async_id)) { - return Nothing(); - } - return maybe_async_id->IsNumber() - ? maybe_async_id->NumberValue(env->context()) - : Just(AsyncWrap::kInvalidAsyncId); -} - -class PromiseWrap : public AsyncWrap { - public: - PromiseWrap(Environment* env, Local object, bool silent) - : AsyncWrap(env, object, PROVIDER_PROMISE, kInvalidAsyncId, silent) { - MakeWeak(); - } - - PromiseWrap(Environment* env, Local object, double asyncId, - double triggerAsyncId) - : AsyncWrap(env, object, PROVIDER_PROMISE, asyncId, triggerAsyncId) { - MakeWeak(); - } - - SET_NO_MEMORY_INFO() - SET_MEMORY_INFO_NAME(PromiseWrap) - SET_SELF_SIZE(PromiseWrap) - - static PromiseWrap* New(Environment* env, - Local promise, - bool silent); - static void GetAsyncId(Local property, - const PropertyCallbackInfo& args); - static void GetTriggerAsyncId(Local property, - const PropertyCallbackInfo& args); - - static void Initialize(Environment* env); -}; - -PromiseWrap* PromiseWrap::New(Environment* env, - Local promise, - bool silent) { - Local context = env->context(); - - Local obj; - if (!env->promise_wrap_template()->NewInstance(context).ToLocal(&obj)) - return nullptr; - - CHECK_NULL(promise->GetAlignedPointerFromInternalField(0)); - promise->SetInternalField(0, obj); - - // Skip for init events - if (silent) { - double async_id; - double trigger_async_id; - if (!GetAssignedPromiseAsyncId(env, promise, env->async_id_symbol()) - .To(&async_id)) return nullptr; - if (!GetAssignedPromiseAsyncId(env, promise, env->trigger_async_id_symbol()) - .To(&trigger_async_id)) return nullptr; - - if (async_id != AsyncWrap::kInvalidAsyncId && - trigger_async_id != AsyncWrap::kInvalidAsyncId) { - return new PromiseWrap( - env, obj, async_id, trigger_async_id); - } - } - - return new PromiseWrap(env, obj, silent); -} - -void PromiseWrap::GetAsyncId(Local property, - const PropertyCallbackInfo& info) { - Isolate* isolate = info.GetIsolate(); - HandleScope scope(isolate); - - PromiseWrap* wrap = Unwrap(info.Holder()); - double value = wrap->get_async_id(); - - info.GetReturnValue().Set(Number::New(isolate, value)); -} - -void PromiseWrap::GetTriggerAsyncId(Local property, - const PropertyCallbackInfo& info) { - Isolate* isolate = info.GetIsolate(); - HandleScope scope(isolate); - - PromiseWrap* wrap = Unwrap(info.Holder()); - double value = wrap->get_trigger_async_id(); - - info.GetReturnValue().Set(Number::New(isolate, value)); -} - -void PromiseWrap::Initialize(Environment* env) { - Isolate* isolate = env->isolate(); - HandleScope scope(isolate); - - Local ctor = FunctionTemplate::New(isolate); - ctor->SetClassName(FIXED_ONE_BYTE_STRING(isolate, "PromiseWrap")); - - Local promise_wrap_template = ctor->InstanceTemplate(); - env->set_promise_wrap_template(promise_wrap_template); - - promise_wrap_template->SetInternalFieldCount( - PromiseWrap::kInternalFieldCount); - - promise_wrap_template->SetAccessor( - env->async_id_symbol(), - PromiseWrap::GetAsyncId); - - promise_wrap_template->SetAccessor( - env->trigger_async_id_symbol(), - PromiseWrap::GetTriggerAsyncId); -} - -static PromiseWrap* extractPromiseWrap(Local promise) { - // This check is imperfect. If the internal field is set, it should - // be an object. If it's not, we just ignore it. Ideally v8 would - // have had GetInternalField returning a MaybeLocal but this works - // for now. - Local obj = promise->GetInternalField(0); - return obj->IsObject() ? Unwrap(obj.As()) : nullptr; -} - -static uint16_t ToAsyncHooksType(PromiseHookType type) { - switch (type) { - case PromiseHookType::kInit: return AsyncHooks::kInit; - case PromiseHookType::kBefore: return AsyncHooks::kBefore; - case PromiseHookType::kAfter: return AsyncHooks::kAfter; - case PromiseHookType::kResolve: return AsyncHooks::kPromiseResolve; - } - UNREACHABLE(); -} - -// Simplified JavaScript hook fast-path for when there is no destroy hook -static void FastPromiseHook(PromiseHookType type, Local promise, - Local parent) { - Local context = promise->GetCreationContext().ToLocalChecked(); - Environment* env = Environment::GetCurrent(context); - if (env == nullptr) return; - - if (type == PromiseHookType::kBefore && - env->async_hooks()->fields()[AsyncHooks::kBefore] == 0) { - double async_id; - double trigger_async_id; - if (!GetAssignedPromiseAsyncId(env, promise, env->async_id_symbol()) - .To(&async_id)) return; - if (!GetAssignedPromiseAsyncId(env, promise, env->trigger_async_id_symbol()) - .To(&trigger_async_id)) return; - - if (async_id != AsyncWrap::kInvalidAsyncId && - trigger_async_id != AsyncWrap::kInvalidAsyncId) { - env->async_hooks()->push_async_context( - async_id, trigger_async_id, promise); - return; - } - } - - if (type == PromiseHookType::kAfter && - env->async_hooks()->fields()[AsyncHooks::kAfter] == 0) { - double async_id; - if (!GetAssignedPromiseAsyncId(env, promise, env->async_id_symbol()) - .To(&async_id)) return; - - if (async_id != AsyncWrap::kInvalidAsyncId) { - if (env->execution_async_id() == async_id) { - // This condition might not be true if async_hooks was enabled during - // the promise callback execution. - env->async_hooks()->pop_async_context(async_id); - } - return; - } - } - - if (type == PromiseHookType::kResolve && - env->async_hooks()->fields()[AsyncHooks::kPromiseResolve] == 0) { - return; - } - - // Getting up to this point means either init type or - // that there are active hooks of another type. - // In both cases fast-path JS hook should be called. - - Local argv[] = { - Integer::New(env->isolate(), ToAsyncHooksType(type)), - promise, - parent - }; - - TryCatchScope try_catch(env, TryCatchScope::CatchMode::kFatal); - Local promise_hook = env->promise_hook_handler(); - USE(promise_hook->Call(context, Undefined(env->isolate()), 3, argv)); -} - -static void FullPromiseHook(PromiseHookType type, Local promise, - Local parent) { - Local context = promise->GetCreationContext().ToLocalChecked(); - - Environment* env = Environment::GetCurrent(context); - if (env == nullptr) return; - TraceEventScope trace_scope(TRACING_CATEGORY_NODE1(environment), - "EnvPromiseHook", env); - - PromiseWrap* wrap = extractPromiseWrap(promise); - if (type == PromiseHookType::kInit || wrap == nullptr) { - bool silent = type != PromiseHookType::kInit; - - // set parent promise's async Id as this promise's triggerAsyncId - if (parent->IsPromise()) { - // parent promise exists, current promise - // is a chained promise, so we set parent promise's id as - // current promise's triggerAsyncId - Local parent_promise = parent.As(); - PromiseWrap* parent_wrap = extractPromiseWrap(parent_promise); - if (parent_wrap == nullptr) { - parent_wrap = PromiseWrap::New(env, parent_promise, true); - if (parent_wrap == nullptr) return; - } - - AsyncHooks::DefaultTriggerAsyncIdScope trigger_scope(parent_wrap); - wrap = PromiseWrap::New(env, promise, silent); - } else { - wrap = PromiseWrap::New(env, promise, silent); - } - } - - if (wrap == nullptr) return; - - if (type == PromiseHookType::kBefore) { - env->async_hooks()->push_async_context(wrap->get_async_id(), - wrap->get_trigger_async_id(), wrap->object()); - wrap->EmitTraceEventBefore(); - AsyncWrap::EmitBefore(wrap->env(), wrap->get_async_id()); - } else if (type == PromiseHookType::kAfter) { - wrap->EmitTraceEventAfter(wrap->provider_type(), wrap->get_async_id()); - AsyncWrap::EmitAfter(wrap->env(), wrap->get_async_id()); - if (env->execution_async_id() == wrap->get_async_id()) { - // This condition might not be true if async_hooks was enabled during - // the promise callback execution. - // Popping it off the stack can be skipped in that case, because it is - // known that it would correspond to exactly one call with - // PromiseHookType::kBefore that was not witnessed by the PromiseHook. - env->async_hooks()->pop_async_context(wrap->get_async_id()); - } - } else if (type == PromiseHookType::kResolve) { - AsyncWrap::EmitPromiseResolve(wrap->env(), wrap->get_async_id()); - } -} - static void SetupHooks(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -441,17 +185,6 @@ static void SetupHooks(const FunctionCallbackInfo& args) { #undef SET_HOOK_FN } -static void EnablePromiseHook(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - - if (args[0]->IsFunction()) { - env->set_promise_hook_handler(args[0].As()); - args.GetIsolate()->SetPromiseHook(FastPromiseHook); - } else { - args.GetIsolate()->SetPromiseHook(FullPromiseHook); - } -} - static void SetPromiseHooks(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -462,17 +195,6 @@ static void SetPromiseHooks(const FunctionCallbackInfo& args) { args[3]->IsFunction() ? args[3].As() : Local()); } -static void DisablePromiseHook(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - env->set_promise_hook_handler(Local()); - - // The per-Isolate API provides no way of knowing whether there are multiple - // users of the PromiseHook. That hopefully goes away when V8 introduces - // a per-context API. - args.GetIsolate()->SetPromiseHook(nullptr); -} - - class DestroyParam { public: double asyncId; @@ -639,9 +361,7 @@ void AsyncWrap::Initialize(Local target, env->SetMethod(target, "executionAsyncResource", ExecutionAsyncResource); env->SetMethod(target, "clearAsyncIdStack", ClearAsyncIdStack); env->SetMethod(target, "queueDestroyAsyncId", QueueDestroyAsyncId); - env->SetMethod(target, "enablePromiseHook", EnablePromiseHook); env->SetMethod(target, "setPromiseHooks", SetPromiseHooks); - env->SetMethod(target, "disablePromiseHook", DisablePromiseHook); env->SetMethod(target, "registerDestroyHook", RegisterDestroyHook); PropertyAttribute ReadOnlyDontDelete = @@ -720,9 +440,6 @@ void AsyncWrap::Initialize(Local target, env->set_async_hooks_destroy_function(Local()); env->set_async_hooks_promise_resolve_function(Local()); env->set_async_hooks_binding(target); - - // TODO(qard): maybe this should be GetConstructorTemplate instead? - PromiseWrap::Initialize(env); } void AsyncWrap::RegisterExternalReferences( @@ -734,15 +451,11 @@ void AsyncWrap::RegisterExternalReferences( registry->Register(ExecutionAsyncResource); registry->Register(ClearAsyncIdStack); registry->Register(QueueDestroyAsyncId); - registry->Register(EnablePromiseHook); registry->Register(SetPromiseHooks); - registry->Register(DisablePromiseHook); registry->Register(RegisterDestroyHook); registry->Register(AsyncWrap::GetAsyncId); registry->Register(AsyncWrap::AsyncReset); registry->Register(AsyncWrap::GetProviderType); - registry->Register(PromiseWrap::GetAsyncId); - registry->Register(PromiseWrap::GetTriggerAsyncId); } AsyncWrap::AsyncWrap(Environment* env, diff --git a/test/addons/async-hooks-promise/binding.cc b/test/addons/async-hooks-promise/binding.cc deleted file mode 100644 index 8fe6b9471bcee5..00000000000000 --- a/test/addons/async-hooks-promise/binding.cc +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include - -namespace { - -using v8::FunctionCallbackInfo; -using v8::Isolate; -using v8::Local; -using v8::Object; -using v8::Promise; -using v8::String; -using v8::Value; - -static void ThrowError(Isolate* isolate, const char* err_msg) { - Local str = String::NewFromOneByte( - isolate, - reinterpret_cast(err_msg)).ToLocalChecked(); - isolate->ThrowException(str); -} - -static void GetPromiseField(const FunctionCallbackInfo& args) { - auto isolate = args.GetIsolate(); - - if (!args[0]->IsPromise()) - return ThrowError(isolate, "arg is not an Promise"); - - auto p = args[0].As(); - if (p->InternalFieldCount() < 1) - return ThrowError(isolate, "Promise has no internal field"); - - auto l = p->GetInternalField(0); - args.GetReturnValue().Set(l); -} - -inline void Initialize(v8::Local binding) { - NODE_SET_METHOD(binding, "getPromiseField", GetPromiseField); -} - -NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) - -} // anonymous namespace diff --git a/test/addons/async-hooks-promise/binding.gyp b/test/addons/async-hooks-promise/binding.gyp deleted file mode 100644 index 55fbe7050f18e4..00000000000000 --- a/test/addons/async-hooks-promise/binding.gyp +++ /dev/null @@ -1,9 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'binding', - 'sources': [ 'binding.cc' ], - 'includes': ['../common.gypi'], - } - ] -} diff --git a/test/addons/async-hooks-promise/test.js b/test/addons/async-hooks-promise/test.js deleted file mode 100644 index d38bf9bd978103..00000000000000 --- a/test/addons/async-hooks-promise/test.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; -// Flags: --expose-internals - -const common = require('../../common'); -const assert = require('assert'); -const async_hooks = require('async_hooks'); -const { async_id_symbol, - trigger_async_id_symbol } = require('internal/async_hooks').symbols; -const binding = require(`./build/${common.buildType}/binding`); - -if (process.env.NODE_TEST_WITH_ASYNC_HOOKS) { - common.skip('cannot test with env var NODE_TEST_WITH_ASYNC_HOOKS'); - return; -} - -// Baseline to make sure the internal field isn't being set. -assert.strictEqual( - binding.getPromiseField(Promise.resolve(1)), - 0); - -const emptyHook = async_hooks.createHook({}).enable(); - -// Check that no PromiseWrap is created when there are no hook callbacks. -assert.strictEqual( - binding.getPromiseField(Promise.resolve(1)), - 0); - -emptyHook.disable(); - -let lastResource; -let lastAsyncId; -let lastTriggerAsyncId; -const initOnlyHook = async_hooks.createHook({ - init(asyncId, type, triggerAsyncId, resource) { - lastAsyncId = asyncId; - lastTriggerAsyncId = triggerAsyncId; - lastResource = resource; - } -}).enable(); - -// Check that no PromiseWrap is created when only using an init hook. -{ - const promise = Promise.resolve(1); - assert.strictEqual(binding.getPromiseField(promise), 0); - assert.strictEqual(lastResource, promise); - assert.strictEqual(lastAsyncId, promise[async_id_symbol]); - assert.strictEqual(lastTriggerAsyncId, promise[trigger_async_id_symbol]); -} - -initOnlyHook.disable(); - -lastResource = null; -const hookWithDestroy = async_hooks.createHook({ - init(asyncId, type, triggerAsyncId, resource) { - lastAsyncId = asyncId; - lastTriggerAsyncId = triggerAsyncId; - lastResource = resource; - }, - - destroy() { - - } -}).enable(); - -// Check that the internal field returns the same PromiseWrap passed to init(). -{ - const promise = Promise.resolve(1); - const promiseWrap = binding.getPromiseField(promise); - assert.strictEqual(lastResource, promiseWrap); - assert.strictEqual(lastAsyncId, promiseWrap[async_id_symbol]); - assert.strictEqual(lastTriggerAsyncId, promiseWrap[trigger_async_id_symbol]); -} - -hookWithDestroy.disable(); - -// Check that internal fields are no longer being set. This needs to be delayed -// a bit because the `disable()` call only schedules disabling the hook in a -// future microtask. -setImmediate(() => { - assert.strictEqual( - binding.getPromiseField(Promise.resolve(1)), - 0); - - const noDestroyHook = async_hooks.createHook({ - init(asyncId, type, triggerAsyncId, resource) { - lastAsyncId = asyncId; - lastTriggerAsyncId = triggerAsyncId; - lastResource = resource; - }, - - before() {}, - after() {}, - resolve() {} - }).enable(); - - // Check that no PromiseWrap is created when there is no destroy hook. - const promise = Promise.resolve(1); - assert.strictEqual(binding.getPromiseField(promise), 0); - assert.strictEqual(lastResource, promise); - assert.strictEqual(lastAsyncId, promise[async_id_symbol]); - assert.strictEqual(lastTriggerAsyncId, promise[trigger_async_id_symbol]); - - noDestroyHook.disable(); -}); From b5248d40008a1beaf2d4df68a63125f6c251155c Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Mon, 5 Jul 2021 14:12:45 -0700 Subject: [PATCH 065/117] async_hooks: emit promise trace events from JS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39135 Reviewed-By: Rich Trott Reviewed-By: Benjamin Gruenbaum Reviewed-By: Gerhard Stöbich --- lib/internal/trace_events_async_hooks.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/internal/trace_events_async_hooks.js b/lib/internal/trace_events_async_hooks.js index 9796f6866d96c8..9a2db5aeee9215 100644 --- a/lib/internal/trace_events_async_hooks.js +++ b/lib/internal/trace_events_async_hooks.js @@ -31,6 +31,7 @@ const kEnabled = Symbol('enabled'); // twice the async_wrap.Providers list is used to filter the events. const nativeProviders = new SafeSet(ObjectKeys(async_wrap.Providers)); const typeMemory = new SafeMap(); +nativeProviders.delete('PROMISE'); function createHook() { // In traceEvents it is not only the id but also the name that needs to be From e2fd015cdaaba683042a1b974f8c6c486aef521a Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Mon, 5 Jul 2021 15:15:30 -0700 Subject: [PATCH 066/117] domain: do not add domain to promise from other context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39135 Reviewed-By: Rich Trott Reviewed-By: Benjamin Gruenbaum Reviewed-By: Gerhard Stöbich --- lib/domain.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/domain.js b/lib/domain.js index 74cd59c54e705b..85f9eed2243295 100644 --- a/lib/domain.js +++ b/lib/domain.js @@ -36,6 +36,7 @@ const { Error, FunctionPrototypeCall, ObjectDefineProperty, + Promise, ReflectApply, SafeMap, Symbol, @@ -73,12 +74,14 @@ const asyncHook = createHook({ if (process.domain !== null && process.domain !== undefined) { // If this operation is created while in a domain, let's mark it pairing.set(asyncId, process.domain[kWeak]); - ObjectDefineProperty(resource, 'domain', { - configurable: true, - enumerable: false, - value: process.domain, - writable: true - }); + if (type !== 'PROMISE' || resource instanceof Promise) { + ObjectDefineProperty(resource, 'domain', { + configurable: true, + enumerable: false, + value: process.domain, + writable: true + }); + } } }, before(asyncId) { From e4331cd43db68be9a2cc848c3d06bc32b59712c1 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 21 Jul 2021 09:37:51 -0700 Subject: [PATCH 067/117] lib: comment explaining special-case handling of promises MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Promise handling is special-cased for domains and trace_events. Domains must not add the `domain` property to promises in other contexts, and trace_events must be emitted from JavaScript as promises no longer have an AsyncWrap type attached to them. PR-URL: https://github.com/nodejs/node/pull/39135 Reviewed-By: Rich Trott Reviewed-By: Benjamin Gruenbaum Reviewed-By: Gerhard Stöbich --- lib/domain.js | 2 ++ lib/internal/trace_events_async_hooks.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/domain.js b/lib/domain.js index 85f9eed2243295..fcc8bb0a6dbc69 100644 --- a/lib/domain.js +++ b/lib/domain.js @@ -74,6 +74,8 @@ const asyncHook = createHook({ if (process.domain !== null && process.domain !== undefined) { // If this operation is created while in a domain, let's mark it pairing.set(asyncId, process.domain[kWeak]); + // Promises from other contexts, such as with the VM module, should not + // have a domain property as it can be used to escape the sandbox. if (type !== 'PROMISE' || resource instanceof Promise) { ObjectDefineProperty(resource, 'domain', { configurable: true, diff --git a/lib/internal/trace_events_async_hooks.js b/lib/internal/trace_events_async_hooks.js index 9a2db5aeee9215..482a635f25edb2 100644 --- a/lib/internal/trace_events_async_hooks.js +++ b/lib/internal/trace_events_async_hooks.js @@ -31,6 +31,8 @@ const kEnabled = Symbol('enabled'); // twice the async_wrap.Providers list is used to filter the events. const nativeProviders = new SafeSet(ObjectKeys(async_wrap.Providers)); const typeMemory = new SafeMap(); + +// Promises are not AsyncWrap resources so they should emit trace_events here. nativeProviders.delete('PROMISE'); function createHook() { From 42ff6d952ab38a258a0d0a1718cedb855cf33e08 Mon Sep 17 00:00:00 2001 From: legendecas Date: Tue, 20 Jul 2021 11:56:36 +0800 Subject: [PATCH 068/117] src: print native module id on native module not found MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To help core contributors identify which file is missing from the build. PR-URL: https://github.com/nodejs/node/pull/39460 Refs: https://github.com/nodejs/node/issues/39408 Reviewed-By: Gireesh Punathil Reviewed-By: Zeyu Yang Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- src/node_native_module.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/node_native_module.cc b/src/node_native_module.cc index a5aa1edaf91143..c4fd96c75c1862 100644 --- a/src/node_native_module.cc +++ b/src/node_native_module.cc @@ -224,7 +224,10 @@ MaybeLocal NativeModuleLoader::LoadBuiltinModuleSource(Isolate* isolate, isolate, contents.c_str(), v8::NewStringType::kNormal, contents.length()); #else const auto source_it = source_.find(id); - CHECK_NE(source_it, source_.end()); + if (UNLIKELY(source_it == source_.end())) { + fprintf(stderr, "Cannot find native builtin: \"%s\".\n", id); + ABORT(); + } return source_it->second.ToStringChecked(isolate); #endif // NODE_BUILTIN_MODULES_PATH } From cc7b61721cffbb5d56a827345ca9e93022156da5 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 30 Jun 2021 12:19:24 +0200 Subject: [PATCH 069/117] doc,tools: remove `checkLinks.mjs` The checks made by this are now integrated to `remark-preset-lint-node`, there are no reason to keep it around anymore. PR-URL: https://github.com/nodejs/node/pull/39206 Reviewed-By: Rich Trott --- Makefile | 2 -- tools/doc/checkLinks.mjs | 77 ---------------------------------------- 2 files changed, 79 deletions(-) delete mode 100644 tools/doc/checkLinks.mjs diff --git a/Makefile b/Makefile index 76874383f606a3..81907c9220f202 100644 --- a/Makefile +++ b/Makefile @@ -580,12 +580,10 @@ test-doc: doc-only lint-md ## Builds, lints, and verifies the docs. else \ $(PYTHON) tools/test.py $(PARALLEL_ARGS) doctool; \ fi - $(NODE) tools/doc/checkLinks.mjs . .PHONY: test-doc-ci test-doc-ci: doc-only $(PYTHON) tools/test.py --shell $(NODE) $(TEST_CI_ARGS) $(PARALLEL_ARGS) doctool - $(NODE) tools/doc/checkLinks.mjs . test-known-issues: all $(PYTHON) tools/test.py $(PARALLEL_ARGS) known_issues diff --git a/tools/doc/checkLinks.mjs b/tools/doc/checkLinks.mjs deleted file mode 100644 index cb302ea27fefb6..00000000000000 --- a/tools/doc/checkLinks.mjs +++ /dev/null @@ -1,77 +0,0 @@ -import fs from 'fs'; -import { extname, join, resolve } from 'path'; -import { pathToFileURL } from 'url'; - -import gfm from 'remark-gfm'; -import markdown from 'remark-parse'; -import unified from 'unified'; - -const DIR = resolve(process.argv[2]); - -console.log('Running Markdown link checker...'); -findMarkdownFilesRecursively(DIR); - -function* getLinksRecursively(node) { - if (node.url && !node.url.startsWith('#')) { - yield node; - } - for (const child of node.children || []) { - yield* getLinksRecursively(child); - } -} - -function findMarkdownFilesRecursively(dirPath) { - const entries = fs.readdirSync(dirPath, { withFileTypes: true }); - - for (const entry of entries) { - const path = join(dirPath, entry.name); - - if ( - entry.isDirectory() && - entry.name !== 'build' && - entry.name !== 'changelogs' && - entry.name !== 'deps' && - entry.name !== 'fixtures' && - entry.name !== 'gyp' && - entry.name !== 'node_modules' && - entry.name !== 'out' && - entry.name !== 'tmp' - ) { - findMarkdownFilesRecursively(path); - } else if (entry.isFile() && extname(entry.name) === '.md') { - checkFile(path); - } - } -} - -function checkFile(path) { - const tree = unified() - .use(markdown) - .use(gfm) - .parse(fs.readFileSync(path)); - - const base = pathToFileURL(path); - let previousDefinitionLabel; - for (const node of getLinksRecursively(tree)) { - const targetURL = new URL(node.url, base); - if (targetURL.protocol === 'file:' && !fs.existsSync(targetURL)) { - const { line, column } = node.position.start; - console.error((process.env.GITHUB_ACTIONS ? - `::error file=${path},line=${line},col=${column}::` : '') + - `Broken link at ${path}:${line}:${column} (${node.url})`); - process.exitCode = 1; - } - if (node.type === 'definition') { - if (previousDefinitionLabel && - previousDefinitionLabel > node.label) { - const { line, column } = node.position.start; - console.error( - (process.env.GITHUB_ACTIONS ? `::error file=${path},line=${line},col=${column}::` : '') + - `Unordered reference at ${path}:${line}:${column} ("${node.label}" should be before "${previousDefinitionLabel}")` - ); - process.exitCode = 1; - } - previousDefinitionLabel = node.label; - } - } -} From d16d36f1c2a898fdc3c3d9dab1946665558deea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Mon, 19 Jul 2021 13:55:53 +0200 Subject: [PATCH 070/117] crypto: support Big(U)Int64Array in getRandomValues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/w3c/webcrypto/issues/255 Fixes: https://github.com/nodejs/node/issues/39442 PR-URL: https://github.com/nodejs/node/pull/39443 Reviewed-By: Colin Ihrig Reviewed-By: Tobias Nießen Reviewed-By: James M Snell Reviewed-By: Zeyu Yang --- lib/internal/crypto/random.js | 2 -- test/parallel/test-webcrypto-random.js | 46 ++++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/internal/crypto/random.js b/lib/internal/crypto/random.js index 5ce158324851d4..c45d53c796d26a 100644 --- a/lib/internal/crypto/random.js +++ b/lib/internal/crypto/random.js @@ -50,7 +50,6 @@ const { const { isArrayBufferView, isAnyArrayBuffer, - isBigInt64Array, isFloat32Array, isFloat64Array, } = require('internal/util/types'); @@ -309,7 +308,6 @@ function onJobDone(buf, callback, error) { // be an integer-type TypedArray. function getRandomValues(data) { if (!isArrayBufferView(data) || - isBigInt64Array(data) || isFloat32Array(data) || isFloat64Array(data)) { // Ordinarily this would be an ERR_INVALID_ARG_TYPE. However, diff --git a/test/parallel/test-webcrypto-random.js b/test/parallel/test-webcrypto-random.js index fd933915c5e48e..f2bf2c396fd20a 100644 --- a/test/parallel/test-webcrypto-random.js +++ b/test/parallel/test-webcrypto-random.js @@ -9,8 +9,15 @@ const { Buffer } = require('buffer'); const assert = require('assert'); const { getRandomValues } = require('crypto').webcrypto; -[undefined, null, '', 1, {}, []].forEach((i) => { - assert.throws(() => getRandomValues(i), { code: 17 }); +[ + undefined, null, '', 1, {}, [], + new Float32Array(1), + new Float64Array(1), +].forEach((i) => { + assert.throws( + () => getRandomValues(i), + { name: 'TypeMismatchError', code: 17 }, + ); }); { @@ -18,32 +25,27 @@ const { getRandomValues } = require('crypto').webcrypto; getRandomValues(buf); } -{ - const buf = new Uint8Array(new Array(10).fill(0)); - const before = Buffer.from(buf).toString('hex'); - getRandomValues(buf); - const after = Buffer.from(buf).toString('hex'); - assert.notStrictEqual(before, after); -} - -{ - const buf = new Uint16Array(new Array(10).fill(0)); - const before = Buffer.from(buf).toString('hex'); - getRandomValues(buf); - const after = Buffer.from(buf).toString('hex'); - assert.notStrictEqual(before, after); -} +const intTypedConstructors = [ + Int8Array, + Int16Array, + Int32Array, + Uint8Array, + Uint16Array, + Uint32Array, + BigInt64Array, + BigUint64Array, +]; -{ - const buf = new Uint32Array(new Array(10).fill(0)); - const before = Buffer.from(buf).toString('hex'); +for (const ctor of intTypedConstructors) { + const buf = new ctor(10); + const before = Buffer.from(buf.buffer).toString('hex'); getRandomValues(buf); - const after = Buffer.from(buf).toString('hex'); + const after = Buffer.from(buf.buffer).toString('hex'); assert.notStrictEqual(before, after); } { - const buf = new Uint16Array(new Array(10).fill(0)); + const buf = new Uint16Array(10); const before = Buffer.from(buf).toString('hex'); getRandomValues(new DataView(buf.buffer)); const after = Buffer.from(buf).toString('hex'); From e58cf4e44c6a4e78b47d9ae7a49367f6fdc622d6 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 18 Jul 2021 22:04:10 -0700 Subject: [PATCH 071/117] tools: flag README/mailmap mismatches in find-inactive-collaborators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39477 Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Tobias Nießen --- tools/find-inactive-collaborators.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/find-inactive-collaborators.mjs b/tools/find-inactive-collaborators.mjs index c205e931bd87b0..282a49dc965308 100755 --- a/tools/find-inactive-collaborators.mjs +++ b/tools/find-inactive-collaborators.mjs @@ -79,6 +79,9 @@ async function getCollaboratorsFromReadme() { const mailmap = await runGitCommand( `git check-mailmap '${name} <${email}>'` ); + if (mailmap !== `${name} <${email}>`) { + console.log(`README entry for Collaborator does not match mailmap:\n ${name} <${email}> => ${mailmap}`); + } returnedArray.push({ name, email, From dc9c6aa428dfa754018edd2715f5ac70b2a1081f Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 20 Jul 2021 22:16:29 -0700 Subject: [PATCH 072/117] meta: align collaborator email in .mailmap/AUTHORS with README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the most recent and presumably preferred email for a collaborator whose .mailmap and README entries differ. PR-URL: https://github.com/nodejs/node/pull/39478 Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Tobias Nießen --- .mailmap | 4 ++-- AUTHORS | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.mailmap b/.mailmap index e9fc78376263d9..a70c23c9a96d2d 100644 --- a/.mailmap +++ b/.mailmap @@ -231,8 +231,8 @@ Kazuyuki Yamada Keith M Wesolowski Kelsey Breseman Ke Ding -Khaidi Chu -Khaidi Chu +Khaidi Chu +Khaidi Chu Kimberly Wilber Kimberly Wilber Kiyoshi Nomo diff --git a/AUTHORS b/AUTHORS index 2c1718f2bdde75..feebd35513f438 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1494,7 +1494,7 @@ Sreepurna Jasti Rafael Fragoso Andrei Cioromila Frank Lanitz -Khaidi Chu +Khaidi Chu Akshay Iyer Rick Bullotta Rajaram Gaunker From f6fbb3892432e8ef17a7d7920d63c2668dd61001 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 20 Jul 2021 21:59:02 -0700 Subject: [PATCH 073/117] meta: alphabetize .mailmap file The file is mostly sorted in lexical order but there are exceptins, a few of them significant. This puts everything in lexical order. PR-URL: https://github.com/nodejs/node/pull/39434 Reviewed-By: James M Snell Reviewed-By: Myles Borins --- .mailmap | 98 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/.mailmap b/.mailmap index a70c23c9a96d2d..abf488996ce2c5 100644 --- a/.mailmap +++ b/.mailmap @@ -26,34 +26,34 @@ Andreas Offenhaeuser Andrew Hughes Andy Bettisworth Angel Stoyanov -Anna Henningsen Anna Henningsen +Anna Henningsen Anna Magdalena Kedzierska AnnaMag Antoine Amara Aria Stewart Arlo Breault Arnaud Lefebvre +Arnout Kazemier <3rd-Eden@users.noreply.github.com> Artem Zaytsev Artur G Vieira -Arnout Kazemier <3rd-Eden@users.noreply.github.com> Asaf David Ash Cripps -Ash Cripps Ash Cripps +Ash Cripps Ashley Maceli Ashok Suthar Ashutosh Kumar Singh Atsuo Fukaya Ben Lugavere -Ben Noordhuis Ben Noordhuis +Ben Noordhuis Ben Taber Benjamin Coe Benjamin Coe Benjamin Fleischer Benjamin Fleischer +Benjamin Gruenbaum Benjamin Gruenbaum Benjamin Gruenbaum -Benjamin Gruenbaum Benjamin Waters Bert Belder Bert Belder @@ -92,15 +92,15 @@ Damien Simonin Feugas Dan Kaplun Dan Williams Dan.Williams Daniel Abrão -Daniel Bevenius Daniel Berger +Daniel Bevenius Daniel Chcouri <333222@gmail.com> Daniel Gröber Daniel Gröber Daniel Paulino Daniel Pihlström -Daniel Wang firedfox Daniel Wang +Daniel Wang firedfox Danielle Adams Danielle Adams Danny Nemer Danny Nemer @@ -109,8 +109,8 @@ Darshan Sen Dave Pacheco David Cai David Mark Clements -David Mark Clements David Mark Clements +David Mark Clements David Siegel DC Deepjyoti Mondal @@ -126,8 +126,8 @@ Erwin W. Ramadhan Eugene Obrezkov EungJun Yi Evan Larkin -Evan Lucas Evan Lucas +Evan Lucas FangDun Cai Fangshi He Farid Neshat @@ -157,11 +157,11 @@ Halil İbrahim Şener Hannah Kim Hannes Magnusson Hendrik Schwalm -Hitesh Kanwathirtha Henry Chin Herbert Vojčík -himself65 himself65 +himself65 +Hitesh Kanwathirtha Icer Liang Igor Savin Igor Soarez @@ -185,6 +185,8 @@ Jenna Vuong JeongHoon Byun Jered Schmidt Jeremiah Senkpiel +Jérémy Lal +Jérémy Lal Jerry Chin Jessica Quynh Tran Jesús Leganés-Combarro 'piranna @@ -192,8 +194,8 @@ Joe Shaw Johan Bergström Johan Dahlberg Johann Hofmann -John Barboza jBarz John Barboza +John Barboza jBarz John Gardner John McGuirk John Musgrave @@ -204,13 +206,14 @@ Jonathan Gourlay Jonathan Ong Jonathan Persson Jonathan Rentzsch -Joseph Leon Jose Luis Vivero +Joseph Leon Josh Erickson Josh Hunter Joshua S. Weinstein Joyee Cheung Joyee Cheung Joyee Cheung +Juan Sebastian Velez Posada Juan Soto Julien Gilli Julien Klepatch @@ -220,17 +223,14 @@ Junliang Yan Junshu Okamoto Justin Beckwith Justin Lee -Jérémy Lal -Jérémy Lal -Juan Sebastian Velez Posada Kai Sasaki Lewuathe Karl Skomski Kat Marchán Kathy Truong Kazuyuki Yamada +Ke Ding Keith M Wesolowski Kelsey Breseman -Ke Ding Khaidi Chu Khaidi Chu Kimberly Wilber @@ -246,8 +246,8 @@ Luke Bayes Lydia Kats Maciej Małecki MaleDong -Malte-Thorben Bruns Malte-Thorben Bruns +Malte-Thorben Bruns Mandeep Singh Manil Chowdhurian Marcelo Gobelli @@ -257,20 +257,20 @@ Marcin Zielinski Marti Martz Martial James Jefferson Martijn Schrage -Masato Ohba -Mary Marchini +Mary Marchini Mary Marchini Mary Marchini +Mary Marchini Mary Marchini -Mary Marchini +Masato Ohba +Mathias Buus +Mathias Pettersson Matt Lang Matt Reed Matteo Collina -Matthias Bastian piepmatz -Mathias Buus -Mathias Pettersson Matthew Lye Matthew Turner +Matthias Bastian piepmatz Maurice Hayward Michael Bernstein Michael Dawson @@ -289,8 +289,8 @@ Minwoo Jung Miroslav Bajtoš Mitar Milutinovic Myles Borins -Myles Borins Myles Borins +Myles Borins Nam Nguyen Nebu Pookins Netto Farah @@ -322,14 +322,14 @@ Reza Akhavan Ricardo Sánchez Gregorio Richard Lau Rick Olson -Rob Adelmann Rob Adelmann +Rob Adelmann Robert Nagy Robert Nagy Rod Machen Roman Klauke Roman Reiss -Ron Korving Ron Korving +Ron Korving Ruben Bridgewater Ruben Bridgewater Russell Dempsey @@ -342,9 +342,9 @@ Sagir Khan Sakthipriyan Vairamani Sam Mikes Sam P Gallagher-Bishop +Sam Roberts Sam Shull Sam Shull -Sam Roberts Samantha Sample = <=> Sambasiva Suda San-Tai Hsu @@ -352,24 +352,24 @@ Santiago Gimeno Sarah Meyer Sartrey Lee Saúl Ibarra Corretgé -Shobhit Chittora Scott Blomquist Segu Riluvan Sergey Kryzhanovsky Shannen Saez Shaopeng Zhang Shelley Vohr Shelley Vohr -Shigeki Ohtsu Shigeki Ohtsu +Shigeki Ohtsu Shivang Saxena Shiya Luo +Shobhit Chittora Siddharth Mahendraker Simon Willison Siobhan O'Donovan Siyuan Gao solebox solebox <5013box@gmail.com> -Sreepurna Jasti Sreepurna Jasti +Sreepurna Jasti Stanislav Opichal Stefan Budeanu Stefan Bühler @@ -381,35 +381,35 @@ Stewart X Addison Suraiya Hameed Suramya shah ss22ever Surya Panikkal -Taehee Kang -Tanuja-Sawant -Taylor Woll taylor.woll -Thomas Watson -Timothy O. Peters -Timur Shemsedinov -Ting Shao -Toby Farley -Toby Stableford toboid -Todd Kennedy -TJ Holowaychuk -TJ Holowaychuk Tadashi SAWADA +Taehee Kang Takahiro ANDO +Tanuja-Sawant Tarun Batra +Taylor Woll taylor.woll Ted Young Teppei Sato Theotime Poisseau Thomas Hunter II Thomas Lee Thomas Reggi -Tierney Cyren &! (bitandbang) +Thomas Watson Tierney Cyren +Tierney Cyren &! (bitandbang) Tim Caswell Tim Price -Tim Smart Tim Smart +Tim Smart Timothy Leverett +Timothy O. Peters +Timur Shemsedinov +Ting Shao +TJ Holowaychuk +TJ Holowaychuk Tobias Nießen +Toby Farley +Toby Stableford toboid +Todd Kennedy Tom Atkinson Tom Atkinson Tom Hughes @@ -429,19 +429,19 @@ Vladimir de Turckheim Voltrex Voltrex <62040526+VoltrexMaster@users.noreply.github.com> vsemozhetbyt Wang Xinyong +Wei-Wei Wu Weijia Wang <381152119@qq.com> -Weijia Wang <381152119@qq.com> Weijia Wang <381152119@qq.com> -Wei-Wei Wu -Willi Eggeling +Weijia Wang <381152119@qq.com> Will Hayslett +Willi Eggeling Wilson Lin Wyatt Preul Xavier J Ortiz xiaoyu <306766053@qq.com> Yael Hermon -Yazhong Liu Yazhong Liu +Yazhong Liu Yingchen Xue Yongsheng Zhang Yongsheng Zhang <17367077526@163.com> From 9fbe3f6b49467e01f3e8d8d66698b097ea6df644 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 19 Jul 2021 15:30:12 -0700 Subject: [PATCH 074/117] meta: revise .mailmap for README consistency Update entry in .mailmap to reflect the same entry in README for an existing collaborator. PR-URL: https://github.com/nodejs/node/pull/39457 Reviewed-By: James M Snell Reviewed-By: Myles Borins --- .mailmap | 4 ++-- AUTHORS | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.mailmap b/.mailmap index abf488996ce2c5..216a9d19ba2961 100644 --- a/.mailmap +++ b/.mailmap @@ -440,12 +440,12 @@ Wyatt Preul Xavier J Ortiz xiaoyu <306766053@qq.com> Yael Hermon -Yazhong Liu -Yazhong Liu Yingchen Xue Yongsheng Zhang Yongsheng Zhang <17367077526@163.com> Yongsheng Zhang +Yorkie Liu +Yorkie Liu Yoshihiro KIKUCHI Yosuke Furukawa Yuichiro MASUI diff --git a/AUTHORS b/AUTHORS index feebd35513f438..f537af407f4c92 100644 --- a/AUTHORS +++ b/AUTHORS @@ -504,7 +504,7 @@ David Chan Alexis Campailla Nikolai Vavilov Michael Ridgway -Yazhong Liu +Yorkie Liu Gabriel Falkenberg Kai Groner Lalit Kapoor From 5f9b2187a1ba0c7051b0217554ea1e00e048d4e7 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 23 Jul 2021 21:43:08 -0700 Subject: [PATCH 075/117] meta: align email address in README/.mailmap/AUTHORS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modify .mailmap so Myles has the same email address in AUTHORS as he does in README. PR-URL: https://github.com/nodejs/node/pull/39503 Reviewed-By: Myles Borins Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen --- .mailmap | 6 +++--- AUTHORS | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.mailmap b/.mailmap index 216a9d19ba2961..59405e1381a7fc 100644 --- a/.mailmap +++ b/.mailmap @@ -288,9 +288,9 @@ Minwoo Jung Minwoo Jung Miroslav Bajtoš Mitar Milutinovic -Myles Borins -Myles Borins -Myles Borins +Myles Borins +Myles Borins +Myles Borins Nam Nguyen Nebu Pookins Netto Farah diff --git a/AUTHORS b/AUTHORS index f537af407f4c92..3edda85ea3d8fb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -808,7 +808,7 @@ David Boivin Liang-Chi Hsieh Timothy Gu Fábio Santos -Myles Borins +Myles Borins Jonas Dohse Коренберг Марк Caleb Boyd From d3f58cb650307a33b33958a909c5628e887b6e28 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 22 Jul 2021 12:59:58 -0700 Subject: [PATCH 076/117] meta: align collaborator name in .mailmap/AUTHORS with README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I exchanged email with Gerhard to make sure that this was the rendering of his name that was correct. PR-URL: https://github.com/nodejs/node/pull/39489 Reviewed-By: Gerhard Stöbich Reviewed-By: Anna Henningsen --- .mailmap | 2 +- AUTHORS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.mailmap b/.mailmap index 59405e1381a7fc..1e45380e421da7 100644 --- a/.mailmap +++ b/.mailmap @@ -146,7 +146,7 @@ Gabriel de Perthuis Gareth Ellis Garwah Lam Geoffrey Bugaisky -Gerhard Stoebich +Gerhard Stöbich Gibson Fahnestock Gil Pedersen Graham Fairweather Xotic750 diff --git a/AUTHORS b/AUTHORS index 3edda85ea3d8fb..ede5f61fe2f6a7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1489,7 +1489,7 @@ Madara Uchiha Gil Tayar Glenn Schlereth Artur G Vieira -Gerhard Stoebich +Gerhard Stöbich Sreepurna Jasti Rafael Fragoso Andrei Cioromila From 1d27ae15149ae96facc0497bd894eadc5e94c018 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 22 Jul 2021 12:45:58 -0700 Subject: [PATCH 077/117] doc: update strategic initiative champion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change was discussed at the TSC meeting today. PR-URL: https://github.com/nodejs/node/pull/39487 Reviewed-By: Antoine du Hamel Reviewed-By: Tobias Nießen Reviewed-By: James M Snell --- doc/guides/strategic-initiatives.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/guides/strategic-initiatives.md b/doc/guides/strategic-initiatives.md index c52f19c0632c8b..ddcdbbf1d334e5 100644 --- a/doc/guides/strategic-initiatives.md +++ b/doc/guides/strategic-initiatives.md @@ -8,7 +8,7 @@ agenda to ensure they are active and have the support they need. | Initiative | Champion | Links | |---------------------------|-----------------------------|------------------------------------------------------------------------------------------| -| Core Promise APIs | [Matteo Collina][mcollina] | | +| Core Promise APIs | [Antoine du Hamel][aduh95] | | | Future of Build Toolchain | [Mary Marchini][mmarchini] | , | | QUIC / HTTP3 | [James M Snell][jasnell] | | | Startup performance | [Joyee Cheung][joyeecheung] | | @@ -35,8 +35,8 @@ agenda to ensure they are active and have the support they need. +[aduh95]: https://github.com/aduh95 [jasnell]: https://github.com/jasnell [joyeecheung]: https://github.com/joyeecheung -[mcollina]: https://github.com/mcollina [mmarchini]: https://github.com/mmarchini [targos]: https://github.com/targos From 5f84f47e13d24ad6ff839577dd7a1f8d8db6ff0a Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 22 Jul 2021 12:49:05 -0700 Subject: [PATCH 078/117] doc: update AUTHORS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/39488 Reviewed-By: Michaël Zasso Reviewed-By: James M Snell Reviewed-By: Anna Henningsen --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index ede5f61fe2f6a7..d9ae717436d206 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3327,5 +3327,6 @@ foxxyz LitoMore nerdthatnoonelikes Nikita Rykov <40735471+angrymouse@users.noreply.github.com> +Benjamin Mayr # Generated by tools/update-authors.js From 487c45ffd98be4c9859d2ba88524c2427cb040e2 Mon Sep 17 00:00:00 2001 From: Lance Ball Date: Fri, 23 Jul 2021 13:41:18 -0400 Subject: [PATCH 079/117] doc: move lball@redhat.com to emeritus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I have not contributed to Node.js in a couple of years. While I would love to continue doing so, there's not a high likelihood of this happening in the near future. This commit moves my status from collaborator to emeritus. It's been fun! Signed-off-by: Lance Ball PR-URL: https://github.com/nodejs/node/pull/39501 Reviewed-By: Antoine du Hamel Reviewed-By: Richard Lau Reviewed-By: Luigi Pinca Reviewed-By: Gireesh Punathil Reviewed-By: Colin Ihrig Reviewed-By: Tobias Nießen Reviewed-By: Rich Trott --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b08e699a4f19a..8acf98aa5b4f21 100644 --- a/README.md +++ b/README.md @@ -357,8 +357,6 @@ For information about the governance of the Node.js project, see **Juan José Arboleda** <soyjuanarbol@gmail.com> (he/him) * [JungMinu](https://github.com/JungMinu) - **Minwoo Jung** <nodecorelab@gmail.com> (he/him) -* [lance](https://github.com/lance) - -**Lance Ball** <lball@redhat.com> (he/him) * [legendecas](https://github.com/legendecas) - **Chengzhong Wu** <legendecas@gmail.com> (he/him) * [Leko](https://github.com/Leko) - @@ -526,6 +524,8 @@ For information about the governance of the Node.js project, see **Kyle Farnung** <kfarnung@microsoft.com> (he/him) * [kunalspathak](https://github.com/kunalspathak) - **Kunal Pathak** <kunal.pathak@microsoft.com> +* [lance](https://github.com/lance) - +**Lance Ball** <lball@redhat.com> (he/him) * [lucamaraschi](https://github.com/lucamaraschi) - **Luca Maraschi** <luca.maraschi@gmail.com> (he/him) * [lxe](https://github.com/lxe) - From 6f2989c346ccb9dd29fbf8b911b0ce95d1b363c8 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Thu, 22 Jul 2021 15:50:47 +0200 Subject: [PATCH 080/117] events: allow the options argument to be null Make `EventTarget.prototype.addEventListener()` accept `null` as a valid value for the `options` argument. PR-URL: https://github.com/nodejs/node/pull/39486 Reviewed-By: James M Snell Reviewed-By: Antoine du Hamel Reviewed-By: Colin Ihrig Reviewed-By: Robert Nagy --- lib/internal/event_target.js | 3 +++ test/parallel/test-eventtarget.js | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index 825e1e8b2597ab..a64360df3caaa9 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -598,6 +598,9 @@ function shouldAddListener(listener) { function validateEventListenerOptions(options) { if (typeof options === 'boolean') return { capture: options }; + + if (options === null) + return {}; validateObject(options, 'options', { allowArray: true, allowFunction: true, }); diff --git a/test/parallel/test-eventtarget.js b/test/parallel/test-eventtarget.js index a85e2cd7f1b9f9..ffdd21a28f5743 100644 --- a/test/parallel/test-eventtarget.js +++ b/test/parallel/test-eventtarget.js @@ -177,6 +177,15 @@ let asyncTest = Promise.resolve(); eventTarget.dispatchEvent(event); } +{ + // The `options` argument can be `null`. + const eventTarget = new EventTarget(); + const event = new Event('foo'); + const fn = common.mustCall((event) => strictEqual(event.type, 'foo')); + eventTarget.addEventListener('foo', fn, null); + eventTarget.dispatchEvent(event); +} + { const uncaughtException = common.mustCall((err, origin) => { strictEqual(err.message, 'boom'); From 1fb095420267616f866a647c20270436340cb515 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Thu, 15 Jul 2021 09:33:06 +0200 Subject: [PATCH 081/117] events: allow an event to be dispatched multiple times Use a different flag to prevent recursive dispatching. PR-URL: https://github.com/nodejs/node/pull/39395 Reviewed-By: Antoine du Hamel Reviewed-By: James M Snell --- lib/internal/event_target.js | 18 +++++++++++++----- test/parallel/test-eventtarget.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index a64360df3caaa9..ce867cc1e35793 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -47,6 +47,7 @@ const { } = EventEmitter; const kEvents = Symbol('kEvents'); +const kIsBeingDispatched = Symbol('kIsBeingDispatched'); const kStop = Symbol('kStop'); const kTarget = Symbol('kTarget'); const kHandlers = Symbol('khandlers'); @@ -105,6 +106,7 @@ class Event { configurable: false }); this[kTarget] = null; + this[kIsBeingDispatched] = false; } [customInspectSymbol](depth, options) { @@ -151,12 +153,12 @@ class Event { // These are not supported in Node.js and are provided purely for // API completeness. - composedPath() { return this[kTarget] ? [this[kTarget]] : []; } + composedPath() { return this[kIsBeingDispatched] ? [this[kTarget]] : []; } get returnValue() { return !this.defaultPrevented; } get bubbles() { return this[kBubbles]; } get composed() { return this[kComposed]; } get eventPhase() { - return this[kTarget] ? Event.AT_TARGET : Event.NONE; + return this[kIsBeingDispatched] ? Event.AT_TARGET : Event.NONE; } get cancelBubble() { return this[kPropagationStopped]; } set cancelBubble(value) { @@ -397,7 +399,7 @@ class EventTarget { if (!isEventTarget(this)) throw new ERR_INVALID_THIS('EventTarget'); - if (event[kTarget] !== null) + if (event[kIsBeingDispatched]) throw new ERR_EVENT_RECURSION(event.type); this[kHybridDispatch](event, event.type, event); @@ -410,11 +412,14 @@ class EventTarget { if (event === undefined) { event = this[kCreateEvent](nodeValue, type); event[kTarget] = this; + event[kIsBeingDispatched] = true; } return event; }; - if (event !== undefined) + if (event !== undefined) { event[kTarget] = this; + event[kIsBeingDispatched] = true; + } const root = this[kEvents].get(type); if (root === undefined || root.next === undefined) @@ -453,6 +458,9 @@ class EventTarget { let result; if (callback) { result = FunctionPrototypeCall(callback, this, arg); + if (!handler.isNodeStyleListener) { + arg[kIsBeingDispatched] = false; + } } if (result !== undefined && result !== null) addCatch(result); @@ -464,7 +472,7 @@ class EventTarget { } if (event !== undefined) - event[kTarget] = undefined; + event[kIsBeingDispatched] = false; } [kCreateEvent](nodeValue, type) { diff --git a/test/parallel/test-eventtarget.js b/test/parallel/test-eventtarget.js index ffdd21a28f5743..cfad9c60a32c01 100644 --- a/test/parallel/test-eventtarget.js +++ b/test/parallel/test-eventtarget.js @@ -162,6 +162,36 @@ let asyncTest = Promise.resolve(); eventTarget.dispatchEvent(ev); } +{ + // Same event dispatched multiple times. + const event = new Event('foo'); + const eventTarget1 = new EventTarget(); + const eventTarget2 = new EventTarget(); + + eventTarget1.addEventListener('foo', common.mustCall((event) => { + strictEqual(event.eventPhase, Event.AT_TARGET); + strictEqual(event.target, eventTarget1); + deepStrictEqual(event.composedPath(), [eventTarget1]); + })); + + eventTarget2.addEventListener('foo', common.mustCall((event) => { + strictEqual(event.eventPhase, Event.AT_TARGET); + strictEqual(event.target, eventTarget2); + deepStrictEqual(event.composedPath(), [eventTarget2]); + })); + + eventTarget1.dispatchEvent(event); + strictEqual(event.eventPhase, Event.NONE); + strictEqual(event.target, eventTarget1); + deepStrictEqual(event.composedPath(), []); + + + eventTarget2.dispatchEvent(event); + strictEqual(event.eventPhase, Event.NONE); + strictEqual(event.target, eventTarget2); + deepStrictEqual(event.composedPath(), []); +} + { const eventTarget = new EventTarget(); const event = new Event('foo', { cancelable: true }); From 039f64f249a59c993fb2397f8fd2b68ac90eb55a Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 22 Jul 2021 08:11:57 -0400 Subject: [PATCH 082/117] test: fix WASI link test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The WASI link test attempts to create a link in the temporary directory to a file in the fixtures directory and can fail if those directories are on different devices. Update the test so that both the source and target of the link reside on the same device. PR-URL: https://github.com/nodejs/node/pull/39485 Fixes: https://github.com/nodejs/node/issues/39484 Reviewed-By: Tobias Nießen Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/wasi/test-wasi-symlinks.js | 7 ++++++- test/wasi/test-wasi.js | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/wasi/test-wasi-symlinks.js b/test/wasi/test-wasi-symlinks.js index 7dd9ae746b0886..1389707671adcb 100644 --- a/test/wasi/test-wasi-symlinks.js +++ b/test/wasi/test-wasi-symlinks.js @@ -14,7 +14,8 @@ if (process.argv[2] === 'wasi-child') { args: [], env: process.env, preopens: { - '/sandbox': process.argv[4] + '/sandbox': process.argv[4], + '/tmp': process.argv[5] } }); const importObject = { wasi_snapshot_preview1: wasi.wasiImport }; @@ -45,9 +46,11 @@ if (process.argv[2] === 'wasi-child') { const escapingSymlink = path.join(sandboxedDir, 'outside.txt'); const loopSymlink1 = path.join(sandboxedDir, 'loop1'); const loopSymlink2 = path.join(sandboxedDir, 'loop2'); + const sandboxedTmp = path.join(tmpdir.path, 'tmp'); fs.mkdirSync(sandbox); fs.mkdirSync(sandboxedDir); + fs.mkdirSync(sandboxedTmp); fs.writeFileSync(sandboxedFile, 'hello from input.txt', 'utf8'); fs.writeFileSync(externalFile, 'this should be inaccessible', 'utf8'); fs.symlinkSync(path.join('.', 'input.txt'), sandboxedSymlink, 'file'); @@ -66,6 +69,7 @@ if (process.argv[2] === 'wasi-child') { 'wasi-child', options.test, sandbox, + sandboxedTmp, ], opts); console.log(child.stderr.toString()); assert.strictEqual(child.status, 0); @@ -75,6 +79,7 @@ if (process.argv[2] === 'wasi-child') { runWASI({ test: 'create_symlink', stdout: 'hello from input.txt' }); runWASI({ test: 'follow_symlink', stdout: 'hello from input.txt' }); + runWASI({ test: 'link' }); runWASI({ test: 'symlink_escape' }); runWASI({ test: 'symlink_loop' }); } diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js index 26002a7e5536ed..8d99a91b4af570 100644 --- a/test/wasi/test-wasi.js +++ b/test/wasi/test-wasi.js @@ -78,7 +78,6 @@ if (process.argv[2] === 'wasi-child') { runWASI({ test: 'getrusage' }); } runWASI({ test: 'gettimeofday' }); - runWASI({ test: 'link' }); runWASI({ test: 'main_args' }); runWASI({ test: 'notdir' }); runWASI({ test: 'poll' }); From e1910ef2903df3b8147626f71c33d3da6468459c Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Wed, 21 Jul 2021 20:49:48 -0400 Subject: [PATCH 083/117] build: fix `host_arch_cc()` for AIX/IBM i MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The AIX/IBM i branch in `host_arch_cc()` that hardcodes the compiler executable to `gcc` precludes picking up either `CC_host` or `CC` environment variables (if set) as is done on other platforms. On an AIX/IBM i platform where the compiler is, e.g. `gcc-10` instead of just `gcc`, the current check will fail to detect the host architecture and incorrectly default to `ia32`. Removing the AIX/IBM i specific branch will follow the same logic as on the other platforms: 1. The value, if set, of the `CC_host` environment variable. 2. Otherwise, if set, the value of the `CC` environment variable. 3. `gcc` (`cc` if on macOS). PR-URL: https://github.com/nodejs/node/pull/39481 Reviewed-By: Daniel Bevenius Reviewed-By: Ash Cripps Reviewed-By: Anna Henningsen Reviewed-By: Tobias Nießen Reviewed-By: Michael Dawson --- configure.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/configure.py b/configure.py index 1e9ee8adf3cc68..a4c4d26987cb10 100755 --- a/configure.py +++ b/configure.py @@ -1050,12 +1050,7 @@ def is_arm_hard_float_abi(): def host_arch_cc(): """Host architecture check using the CC command.""" - if sys.platform.startswith('aix'): - # we only support gcc at this point and the default on AIX - # would be xlc so hard code gcc - k = cc_macros('gcc') - else: - k = cc_macros(os.environ.get('CC_host')) + k = cc_macros(os.environ.get('CC_host')) matchup = { '__aarch64__' : 'arm64', From 61141987174d5fd100e85c1a0d63beb4c88699e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 20 Jul 2021 16:11:08 +0200 Subject: [PATCH 084/117] deps: update V8 to 9.2.230.21 PR-URL: https://github.com/nodejs/node/pull/39470 Reviewed-By: Anna Henningsen Reviewed-By: Beth Griggs Reviewed-By: Jiawen Geng --- deps/v8/.gn | 12 +- deps/v8/AUTHORS | 3 + deps/v8/BUILD.gn | 351 +- deps/v8/DEPS | 38 +- deps/v8/OWNERS | 2 +- deps/v8/PRESUBMIT.py | 6 +- deps/v8/RISCV_OWNERS | 2 +- deps/v8/WATCHLISTS | 14 + .../trace_event/common/trace_event_common.h | 6 +- deps/v8/gni/v8.gni | 5 +- deps/v8/include/cppgc/allocation.h | 5 + .../include/cppgc/cross-thread-persistent.h | 20 +- deps/v8/include/cppgc/explicit-management.h | 17 +- deps/v8/include/cppgc/heap-statistics.h | 4 +- .../cppgc/internal/compiler-specific.h | 4 +- .../include/cppgc/internal/pointer-policies.h | 39 +- deps/v8/include/cppgc/member.h | 31 +- deps/v8/include/cppgc/persistent.h | 6 +- deps/v8/include/cppgc/sentinel-pointer.h | 2 +- deps/v8/include/cppgc/type-traits.h | 19 + deps/v8/include/js_protocol.pdl | 11 +- deps/v8/include/v8-cppgc.h | 32 + deps/v8/include/v8-fast-api-calls.h | 50 +- deps/v8/include/v8-inspector.h | 12 +- deps/v8/include/v8-internal.h | 75 +- deps/v8/include/v8-metrics.h | 29 +- deps/v8/include/v8-platform.h | 18 +- deps/v8/include/v8-profiler.h | 17 +- deps/v8/include/v8-util.h | 2 +- deps/v8/include/v8-version.h | 6 +- deps/v8/include/v8.h | 468 +- deps/v8/include/v8config.h | 14 +- deps/v8/infra/mb/mb_config.pyl | 55 +- deps/v8/infra/testing/builders.pyl | 536 +- deps/v8/samples/OWNERS | 2 +- deps/v8/samples/shell.cc | 18 +- deps/v8/src/DEPS | 2 + deps/v8/src/api/api-arguments-inl.h | 44 +- deps/v8/src/api/api-inl.h | 23 +- deps/v8/src/api/api-macros.h | 10 +- deps/v8/src/api/api-natives.cc | 102 +- deps/v8/src/api/api.cc | 877 ++- deps/v8/src/ast/ast-value-factory.cc | 16 +- deps/v8/src/ast/ast-value-factory.h | 20 +- deps/v8/src/ast/ast.cc | 26 +- deps/v8/src/ast/ast.h | 38 +- deps/v8/src/ast/modules.cc | 16 +- deps/v8/src/ast/modules.h | 12 +- deps/v8/src/ast/scopes.cc | 15 +- deps/v8/src/ast/scopes.h | 8 +- deps/v8/src/ast/variables.cc | 7 +- deps/v8/src/ast/variables.h | 5 +- deps/v8/src/base/atomicops.h | 298 +- .../src/base/atomicops_internals_portable.h | 216 - deps/v8/src/base/atomicops_internals_std.h | 224 - deps/v8/src/base/bit-field.h | 2 +- deps/v8/src/base/bits.h | 4 +- deps/v8/src/base/bounds.h | 2 +- deps/v8/src/base/cpu.cc | 2 +- deps/v8/src/base/enum-set.h | 2 +- deps/v8/src/base/hashmap.h | 4 +- deps/v8/src/base/logging.h | 6 - deps/v8/src/base/once.h | 16 +- deps/v8/src/base/optional.h | 12 +- deps/v8/src/base/platform/mutex.h | 4 +- deps/v8/src/base/platform/platform-aix.cc | 2 +- deps/v8/src/base/platform/platform-freebsd.cc | 2 +- deps/v8/src/base/platform/platform-posix.cc | 11 +- deps/v8/src/base/platform/platform-win32.cc | 2 +- deps/v8/src/base/platform/semaphore.h | 4 +- deps/v8/src/base/sanitizer/asan.h | 37 + .../sanitizer/lsan-page-allocator.cc | 2 +- .../sanitizer/lsan-page-allocator.h | 9 +- deps/v8/src/base/{ => sanitizer}/lsan.h | 12 +- deps/v8/src/base/sanitizer/msan.h | 40 + deps/v8/src/base/small-vector.h | 7 + deps/v8/src/base/template-utils.h | 9 + deps/v8/src/base/v8-fallthrough.h | 2 +- deps/v8/src/base/vlq.h | 83 +- .../baseline/arm/baseline-assembler-arm-inl.h | 12 +- .../baseline/arm/baseline-compiler-arm-inl.h | 6 +- .../arm64/baseline-assembler-arm64-inl.h | 4 +- .../arm64/baseline-compiler-arm64-inl.h | 6 +- deps/v8/src/baseline/baseline-assembler-inl.h | 7 +- deps/v8/src/baseline/baseline-assembler.h | 5 +- deps/v8/src/baseline/baseline-compiler.cc | 889 +-- deps/v8/src/baseline/baseline-compiler.h | 34 +- deps/v8/src/baseline/baseline-osr-inl.h | 38 + deps/v8/src/baseline/baseline.cc | 38 +- deps/v8/src/baseline/baseline.h | 2 + .../ia32/baseline-assembler-ia32-inl.h | 8 +- .../ia32/baseline-compiler-ia32-inl.h | 6 +- .../riscv64/baseline-assembler-riscv64-inl.h | 615 ++ .../riscv64/baseline-compiler-riscv64-inl.h | 112 + .../baseline/x64/baseline-assembler-x64-inl.h | 11 +- .../baseline/x64/baseline-compiler-x64-inl.h | 6 +- deps/v8/src/bigint/bigint-internal.cc | 43 + deps/v8/src/bigint/bigint-internal.h | 65 + deps/v8/src/bigint/bigint.h | 108 + deps/v8/src/bigint/digit-arithmetic.h | 87 + deps/v8/src/bigint/mul-schoolbook.cc | 99 + deps/v8/src/bigint/vector-arithmetic.cc | 2 +- deps/v8/src/bigint/vector-arithmetic.h | 20 + deps/v8/src/builtins/accessors.cc | 34 +- deps/v8/src/builtins/aggregate-error.tq | 7 +- deps/v8/src/builtins/arm/builtins-arm.cc | 52 +- deps/v8/src/builtins/arm64/builtins-arm64.cc | 58 +- deps/v8/src/builtins/arraybuffer.tq | 105 +- deps/v8/src/builtins/base.tq | 10 +- deps/v8/src/builtins/builtins-api.cc | 6 +- deps/v8/src/builtins/builtins-array-gen.cc | 1 + deps/v8/src/builtins/builtins-array.cc | 65 +- deps/v8/src/builtins/builtins-arraybuffer.cc | 249 +- deps/v8/src/builtins/builtins-call-gen.cc | 103 +- deps/v8/src/builtins/builtins-call-gen.h | 7 + deps/v8/src/builtins/builtins-debug-gen.cc | 22 - deps/v8/src/builtins/builtins-definitions.h | 46 +- deps/v8/src/builtins/builtins-error.cc | 5 +- .../v8/src/builtins/builtins-generator-gen.cc | 2 +- deps/v8/src/builtins/builtins-handler-gen.cc | 55 +- deps/v8/src/builtins/builtins-ic-gen.cc | 273 +- deps/v8/src/builtins/builtins-internal-gen.cc | 40 +- deps/v8/src/builtins/builtins-intl.cc | 43 + deps/v8/src/builtins/builtins-lazy-gen.cc | 15 +- .../builtins/builtins-microtask-queue-gen.cc | 3 +- deps/v8/src/builtins/builtins-regexp-gen.cc | 31 +- deps/v8/src/builtins/builtins-trace.cc | 1 + .../src/builtins/builtins-typed-array-gen.cc | 69 +- deps/v8/src/builtins/builtins-typed-array.cc | 3 +- deps/v8/src/builtins/builtins-utils.h | 3 +- deps/v8/src/builtins/builtins-wasm-gen.cc | 1 - deps/v8/src/builtins/cast.tq | 18 + deps/v8/src/builtins/constructor.tq | 11 + deps/v8/src/builtins/conversion.tq | 21 +- deps/v8/src/builtins/ia32/builtins-ia32.cc | 65 +- deps/v8/src/builtins/ic-callable.tq | 73 +- deps/v8/src/builtins/ic.tq | 9 +- deps/v8/src/builtins/iterator.tq | 12 +- deps/v8/src/builtins/mips/builtins-mips.cc | 37 +- .../v8/src/builtins/mips64/builtins-mips64.cc | 49 +- deps/v8/src/builtins/ppc/builtins-ppc.cc | 241 +- .../src/builtins/riscv64/builtins-riscv64.cc | 460 +- deps/v8/src/builtins/s390/builtins-s390.cc | 51 +- .../src/builtins/setup-builtins-internal.cc | 16 +- .../builtins/typed-array-createtypedarray.tq | 72 +- deps/v8/src/builtins/wasm.tq | 5 +- deps/v8/src/builtins/x64/builtins-x64.cc | 194 +- deps/v8/src/codegen/arm/assembler-arm-inl.h | 2 +- deps/v8/src/codegen/arm/assembler-arm.cc | 148 +- deps/v8/src/codegen/arm/assembler-arm.h | 77 +- deps/v8/src/codegen/arm/cpu-arm.cc | 2 +- .../arm/interface-descriptors-arm-inl.h | 256 + .../codegen/arm/interface-descriptors-arm.cc | 306 - .../v8/src/codegen/arm/macro-assembler-arm.cc | 98 +- deps/v8/src/codegen/arm/macro-assembler-arm.h | 27 +- .../src/codegen/arm64/assembler-arm64-inl.h | 8 +- deps/v8/src/codegen/arm64/assembler-arm64.h | 6 +- deps/v8/src/codegen/arm64/cpu-arm64.cc | 9 +- .../arm64/interface-descriptors-arm64-inl.h | 265 + .../arm64/interface-descriptors-arm64.cc | 310 -- .../codegen/arm64/macro-assembler-arm64-inl.h | 10 +- .../codegen/arm64/macro-assembler-arm64.cc | 112 +- .../src/codegen/arm64/macro-assembler-arm64.h | 27 +- deps/v8/src/codegen/arm64/register-arm64.h | 10 +- deps/v8/src/codegen/assembler.cc | 4 +- deps/v8/src/codegen/assembler.h | 27 +- deps/v8/src/codegen/bailout-reason.h | 1 + deps/v8/src/codegen/code-factory.cc | 48 +- deps/v8/src/codegen/code-factory.h | 11 +- deps/v8/src/codegen/code-stub-assembler.cc | 311 +- deps/v8/src/codegen/code-stub-assembler.h | 69 +- deps/v8/src/codegen/compilation-cache.cc | 68 +- deps/v8/src/codegen/compilation-cache.h | 33 +- deps/v8/src/codegen/compiler.cc | 325 +- deps/v8/src/codegen/compiler.h | 9 +- deps/v8/src/codegen/constants-arch.h | 18 +- deps/v8/src/codegen/cpu-features.h | 3 + .../src/codegen/external-reference-table.cc | 131 +- .../v8/src/codegen/external-reference-table.h | 33 +- deps/v8/src/codegen/external-reference.cc | 8 +- deps/v8/src/codegen/external-reference.h | 10 +- deps/v8/src/codegen/handler-table.h | 4 +- deps/v8/src/codegen/ia32/assembler-ia32.cc | 77 +- deps/v8/src/codegen/ia32/assembler-ia32.h | 17 +- .../ia32/interface-descriptors-ia32-inl.h | 267 + .../ia32/interface-descriptors-ia32.cc | 318 -- .../src/codegen/ia32/macro-assembler-ia32.cc | 144 +- .../src/codegen/ia32/macro-assembler-ia32.h | 236 +- .../src/codegen/interface-descriptors-inl.h | 484 ++ deps/v8/src/codegen/interface-descriptors.cc | 561 +- deps/v8/src/codegen/interface-descriptors.h | 1384 ++--- deps/v8/src/codegen/machine-type.cc | 2 + deps/v8/src/codegen/machine-type.h | 29 +- deps/v8/src/codegen/macro-assembler.h | 6 +- deps/v8/src/codegen/mips/assembler-mips.cc | 18 +- deps/v8/src/codegen/mips/assembler-mips.h | 2 +- .../mips/interface-descriptors-mips-inl.h | 258 + .../mips/interface-descriptors-mips.cc | 332 -- .../src/codegen/mips/macro-assembler-mips.cc | 103 +- .../src/codegen/mips/macro-assembler-mips.h | 27 +- .../v8/src/codegen/mips64/assembler-mips64.cc | 18 +- .../mips64/interface-descriptors-mips64-inl.h | 258 + .../mips64/interface-descriptors-mips64.cc | 332 -- .../codegen/mips64/macro-assembler-mips64.cc | 103 +- .../codegen/mips64/macro-assembler-mips64.h | 27 +- .../src/codegen/optimized-compilation-info.cc | 16 +- .../src/codegen/optimized-compilation-info.h | 31 +- deps/v8/src/codegen/ppc/assembler-ppc.cc | 22 +- deps/v8/src/codegen/ppc/assembler-ppc.h | 7 +- deps/v8/src/codegen/ppc/constants-ppc.h | 42 +- .../ppc/interface-descriptors-ppc-inl.h | 256 + .../codegen/ppc/interface-descriptors-ppc.cc | 306 - .../v8/src/codegen/ppc/macro-assembler-ppc.cc | 279 +- deps/v8/src/codegen/ppc/macro-assembler-ppc.h | 72 +- deps/v8/src/codegen/register-arch.h | 21 + deps/v8/src/codegen/register.h | 4 +- deps/v8/src/codegen/reloc-info.cc | 39 +- deps/v8/src/codegen/reloc-info.h | 4 +- .../codegen/riscv64/assembler-riscv64-inl.h | 32 +- .../src/codegen/riscv64/assembler-riscv64.cc | 146 +- .../src/codegen/riscv64/assembler-riscv64.h | 80 +- .../src/codegen/riscv64/constants-riscv64.cc | 5 +- .../src/codegen/riscv64/constants-riscv64.h | 15 +- .../interface-descriptors-riscv64-inl.h | 265 + .../riscv64/interface-descriptors-riscv64.cc | 313 -- .../riscv64/macro-assembler-riscv64.cc | 367 +- .../codegen/riscv64/macro-assembler-riscv64.h | 59 +- .../v8/src/codegen/riscv64/register-riscv64.h | 2 +- deps/v8/src/codegen/s390/assembler-s390.cc | 4 + .../s390/interface-descriptors-s390-inl.h | 256 + .../s390/interface-descriptors-s390.cc | 306 - .../src/codegen/s390/macro-assembler-s390.cc | 155 +- .../src/codegen/s390/macro-assembler-s390.h | 41 +- deps/v8/src/codegen/safepoint-table.cc | 58 +- deps/v8/src/codegen/safepoint-table.h | 43 +- .../macro-assembler-shared-ia32-x64.cc | 195 + .../macro-assembler-shared-ia32-x64.h | 221 +- deps/v8/src/codegen/signature.h | 8 + deps/v8/src/codegen/source-position-table.cc | 4 +- deps/v8/src/codegen/source-position-table.h | 4 +- deps/v8/src/codegen/string-constants.cc | 3 +- deps/v8/src/codegen/turbo-assembler.cc | 7 - deps/v8/src/codegen/turbo-assembler.h | 33 +- deps/v8/src/codegen/x64/assembler-x64.cc | 66 +- deps/v8/src/codegen/x64/assembler-x64.h | 11 +- .../x64/interface-descriptors-x64-inl.h | 258 + .../codegen/x64/interface-descriptors-x64.cc | 309 -- .../v8/src/codegen/x64/macro-assembler-x64.cc | 363 +- deps/v8/src/codegen/x64/macro-assembler-x64.h | 178 +- deps/v8/src/codegen/x64/register-x64.h | 6 +- deps/v8/src/common/external-pointer-inl.h | 21 +- deps/v8/src/common/external-pointer.h | 4 +- deps/v8/src/common/globals.h | 41 +- deps/v8/src/common/message-template.h | 5 +- deps/v8/src/common/ptr-compr-inl.h | 24 +- .../compiler-dispatcher.cc | 9 +- .../optimizing-compile-dispatcher.cc | 17 +- .../optimizing-compile-dispatcher.h | 3 +- deps/v8/src/compiler/OWNERS | 6 +- deps/v8/src/compiler/access-builder.cc | 14 +- deps/v8/src/compiler/access-builder.h | 6 +- deps/v8/src/compiler/access-info.cc | 260 +- deps/v8/src/compiler/access-info.h | 32 +- .../compiler/add-type-assertions-reducer.cc | 4 +- .../backend/arm/code-generator-arm.cc | 27 +- .../backend/arm/instruction-selector-arm.cc | 8 + .../backend/arm64/code-generator-arm64.cc | 27 +- .../arm64/instruction-selector-arm64.cc | 14 + .../v8/src/compiler/backend/code-generator.cc | 8 +- .../backend/ia32/code-generator-ia32.cc | 215 +- .../backend/ia32/instruction-codes-ia32.h | 6 +- .../ia32/instruction-scheduler-ia32.cc | 6 +- .../backend/ia32/instruction-selector-ia32.cc | 85 +- .../compiler/backend/instruction-scheduler.h | 6 +- .../backend/instruction-selector-impl.h | 10 +- .../compiler/backend/instruction-selector.cc | 30 +- .../compiler/backend/instruction-selector.h | 3 + deps/v8/src/compiler/backend/instruction.cc | 7 +- deps/v8/src/compiler/backend/instruction.h | 20 +- .../backend/mid-tier-register-allocator.cc | 44 +- .../backend/mips/code-generator-mips.cc | 85 +- .../mips/instruction-scheduler-mips.cc | 4 +- .../backend/mips/instruction-selector-mips.cc | 15 +- .../backend/mips64/code-generator-mips64.cc | 61 +- .../mips64/instruction-scheduler-mips64.cc | 4 +- .../mips64/instruction-selector-mips64.cc | 19 +- deps/v8/src/compiler/backend/ppc/OWNERS | 5 - .../backend/ppc/code-generator-ppc.cc | 207 +- .../backend/ppc/instruction-codes-ppc.h | 6 - .../backend/ppc/instruction-scheduler-ppc.cc | 6 - .../backend/ppc/instruction-selector-ppc.cc | 8 + .../compiler/backend/register-allocation.h | 1 + .../backend/register-allocator-verifier.cc | 22 +- .../backend/register-allocator-verifier.h | 2 +- .../compiler/backend/register-allocator.cc | 48 +- .../src/compiler/backend/register-allocator.h | 3 - .../backend/riscv64/code-generator-riscv64.cc | 112 +- .../riscv64/instruction-codes-riscv64.h | 1 + .../riscv64/instruction-scheduler-riscv64.cc | 5 +- .../riscv64/instruction-selector-riscv64.cc | 22 +- .../backend/s390/code-generator-s390.cc | 165 +- .../backend/s390/instruction-selector-s390.cc | 11 +- .../backend/x64/code-generator-x64.cc | 230 +- .../backend/x64/instruction-codes-x64.h | 1 + .../backend/x64/instruction-scheduler-x64.cc | 1 + .../backend/x64/instruction-selector-x64.cc | 91 +- .../v8/src/compiler/bytecode-graph-builder.cc | 136 +- deps/v8/src/compiler/code-assembler.cc | 41 +- deps/v8/src/compiler/code-assembler.h | 19 +- .../src/compiler/common-operator-reducer.cc | 10 +- deps/v8/src/compiler/common-operator.h | 17 +- .../src/compiler/compilation-dependencies.cc | 22 +- .../src/compiler/compilation-dependencies.h | 4 + .../src/compiler/constant-folding-reducer.cc | 3 +- deps/v8/src/compiler/dead-code-elimination.cc | 8 +- deps/v8/src/compiler/dead-code-elimination.h | 5 +- .../src/compiler/decompression-optimizer.cc | 7 +- .../src/compiler/effect-control-linearizer.cc | 127 +- .../src/compiler/effect-control-linearizer.h | 15 +- deps/v8/src/compiler/globals.h | 21 +- deps/v8/src/compiler/graph-assembler.cc | 66 + deps/v8/src/compiler/graph-assembler.h | 24 + deps/v8/src/compiler/graph-reducer.cc | 4 +- deps/v8/src/compiler/graph-visualizer.cc | 7 +- deps/v8/src/compiler/graph-visualizer.h | 3 +- deps/v8/src/compiler/graph.h | 2 +- deps/v8/src/compiler/heap-refs.cc | 4594 +++++++++++++++ deps/v8/src/compiler/heap-refs.h | 297 +- deps/v8/src/compiler/int64-lowering.cc | 33 +- deps/v8/src/compiler/js-call-reducer.cc | 318 +- .../src/compiler/js-context-specialization.cc | 25 +- deps/v8/src/compiler/js-create-lowering.cc | 120 +- deps/v8/src/compiler/js-create-lowering.h | 11 +- deps/v8/src/compiler/js-generic-lowering.cc | 7 +- deps/v8/src/compiler/js-graph.cc | 3 +- deps/v8/src/compiler/js-graph.h | 7 +- deps/v8/src/compiler/js-heap-broker.cc | 4938 +---------------- deps/v8/src/compiler/js-heap-broker.h | 173 +- deps/v8/src/compiler/js-heap-copy-reducer.cc | 43 +- deps/v8/src/compiler/js-inlining-heuristic.cc | 4 +- deps/v8/src/compiler/js-inlining.cc | 7 +- deps/v8/src/compiler/js-intrinsic-lowering.cc | 20 +- deps/v8/src/compiler/js-intrinsic-lowering.h | 1 + .../js-native-context-specialization.cc | 132 +- deps/v8/src/compiler/js-operator.cc | 10 +- deps/v8/src/compiler/js-operator.h | 84 +- deps/v8/src/compiler/js-typed-lowering.cc | 28 +- deps/v8/src/compiler/load-elimination.cc | 3 + deps/v8/src/compiler/loop-analysis.cc | 25 +- .../v8/src/compiler/machine-graph-verifier.cc | 1 + deps/v8/src/compiler/machine-operator.cc | 10 + deps/v8/src/compiler/machine-operator.h | 55 +- deps/v8/src/compiler/map-inference.cc | 8 +- deps/v8/src/compiler/memory-lowering.cc | 95 +- deps/v8/src/compiler/memory-lowering.h | 1 + deps/v8/src/compiler/memory-optimizer.cc | 39 +- deps/v8/src/compiler/memory-optimizer.h | 2 + deps/v8/src/compiler/node-matchers.h | 9 +- deps/v8/src/compiler/node-observer.h | 2 +- deps/v8/src/compiler/node-properties.h | 10 +- deps/v8/src/compiler/opcodes.h | 14 +- deps/v8/src/compiler/operation-typer.cc | 11 +- deps/v8/src/compiler/operator.h | 2 +- deps/v8/src/compiler/pipeline.cc | 204 +- deps/v8/src/compiler/processed-feedback.h | 8 +- .../src/compiler/property-access-builder.cc | 27 +- deps/v8/src/compiler/raw-machine-assembler.cc | 7 +- deps/v8/src/compiler/raw-machine-assembler.h | 47 +- deps/v8/src/compiler/refs-map.cc | 4 + deps/v8/src/compiler/refs-map.h | 1 + deps/v8/src/compiler/representation-change.cc | 33 +- deps/v8/src/compiler/representation-change.h | 11 +- .../compiler/scheduled-machine-lowering.cc | 68 - .../src/compiler/scheduled-machine-lowering.h | 51 - deps/v8/src/compiler/scheduler.cc | 156 +- deps/v8/src/compiler/scheduler.h | 7 +- deps/v8/src/compiler/select-lowering.cc | 10 +- .../serializer-for-background-compilation.cc | 216 +- deps/v8/src/compiler/simd-scalar-lowering.cc | 2829 ---------- deps/v8/src/compiler/simd-scalar-lowering.h | 150 - deps/v8/src/compiler/simplified-lowering.cc | 207 +- .../compiler/simplified-operator-reducer.cc | 7 +- deps/v8/src/compiler/simplified-operator.cc | 38 +- deps/v8/src/compiler/simplified-operator.h | 44 +- .../src/compiler/store-store-elimination.cc | 4 +- deps/v8/src/compiler/type-cache.h | 18 +- .../v8/src/compiler/type-narrowing-reducer.cc | 8 +- deps/v8/src/compiler/type-narrowing-reducer.h | 1 + deps/v8/src/compiler/typed-optimization.cc | 2 +- deps/v8/src/compiler/typer.cc | 6 +- deps/v8/src/compiler/types.cc | 13 +- deps/v8/src/compiler/types.h | 6 +- deps/v8/src/compiler/verifier.cc | 27 +- deps/v8/src/compiler/wasm-compiler.cc | 404 +- deps/v8/src/compiler/wasm-compiler.h | 5 +- deps/v8/src/d8/async-hooks-wrapper.cc | 6 +- deps/v8/src/d8/d8-console.cc | 5 +- deps/v8/src/d8/d8-posix.cc | 132 +- deps/v8/src/d8/d8-test.cc | 200 +- deps/v8/src/d8/d8.cc | 217 +- deps/v8/src/d8/d8.h | 12 +- deps/v8/src/debug/arm/debug-arm.cc | 57 - deps/v8/src/debug/arm64/debug-arm64.cc | 58 - deps/v8/src/debug/debug-coverage.cc | 3 +- deps/v8/src/debug/debug-evaluate.cc | 29 +- deps/v8/src/debug/debug-evaluate.h | 4 + deps/v8/src/debug/debug-frames.cc | 17 +- deps/v8/src/debug/debug-frames.h | 3 +- deps/v8/src/debug/debug-interface.cc | 67 + deps/v8/src/debug/debug-interface.h | 31 +- deps/v8/src/debug/debug-scopes.cc | 8 +- .../src/debug/debug-stack-trace-iterator.cc | 8 - .../v8/src/debug/debug-stack-trace-iterator.h | 1 - deps/v8/src/debug/debug-wasm-objects.cc | 117 +- deps/v8/src/debug/debug-wasm-objects.h | 11 +- deps/v8/src/debug/debug.cc | 65 +- deps/v8/src/debug/debug.h | 32 - deps/v8/src/debug/ia32/debug-ia32.cc | 54 - deps/v8/src/debug/liveedit.cc | 289 +- deps/v8/src/debug/liveedit.h | 7 - deps/v8/src/debug/mips/debug-mips.cc | 55 - deps/v8/src/debug/mips64/debug-mips64.cc | 55 - deps/v8/src/debug/ppc/OWNERS | 5 - deps/v8/src/debug/ppc/debug-ppc.cc | 53 - deps/v8/src/debug/riscv64/debug-riscv64.cc | 55 - deps/v8/src/debug/s390/debug-s390.cc | 55 - deps/v8/src/debug/x64/debug-x64.cc | 55 - .../deoptimizer/deoptimizer-cfi-builtins.cc | 8 +- deps/v8/src/deoptimizer/deoptimizer.cc | 17 +- .../riscv64/deoptimizer-riscv64.cc | 6 +- deps/v8/src/deoptimizer/translated-state.cc | 4 +- .../src/diagnostics/compilation-statistics.cc | 5 +- deps/v8/src/diagnostics/disassembler.cc | 13 +- deps/v8/src/diagnostics/eh-frame.cc | 6 +- deps/v8/src/diagnostics/eh-frame.h | 8 +- deps/v8/src/diagnostics/ia32/disasm-ia32.cc | 5 +- deps/v8/src/diagnostics/objects-debug.cc | 31 +- deps/v8/src/diagnostics/objects-printer.cc | 341 +- deps/v8/src/diagnostics/perf-jit.cc | 1 - deps/v8/src/diagnostics/ppc/disasm-ppc.cc | 36 +- .../src/diagnostics/riscv64/disasm-riscv64.cc | 25 +- .../src/diagnostics/system-jit-metadata-win.h | 3 + deps/v8/src/diagnostics/system-jit-win.cc | 4 + .../src/diagnostics/unwinding-info-win64.cc | 78 +- deps/v8/src/execution/arguments.h | 45 +- deps/v8/src/execution/arm/simulator-arm.cc | 696 +-- deps/v8/src/execution/arm/simulator-arm.h | 9 +- .../v8/src/execution/arm64/simulator-arm64.cc | 2 +- deps/v8/src/execution/execution.cc | 16 +- .../v8/src/execution/external-pointer-table.h | 9 +- deps/v8/src/execution/frame-constants.h | 18 +- deps/v8/src/execution/frames.cc | 41 +- deps/v8/src/execution/frames.h | 7 +- deps/v8/src/execution/isolate-data.h | 32 +- deps/v8/src/execution/isolate-utils-inl.h | 19 +- deps/v8/src/execution/isolate.cc | 289 +- deps/v8/src/execution/isolate.h | 136 +- deps/v8/src/execution/local-isolate-inl.h | 2 +- deps/v8/src/execution/local-isolate.h | 5 +- deps/v8/src/execution/messages.cc | 45 +- deps/v8/src/execution/messages.h | 7 +- deps/v8/src/execution/microtask-queue.cc | 10 + deps/v8/src/execution/mips/simulator-mips.cc | 2 +- .../src/execution/mips64/simulator-mips64.cc | 2 +- deps/v8/src/execution/ppc/simulator-ppc.cc | 52 +- deps/v8/src/execution/ppc/simulator-ppc.h | 12 + deps/v8/src/execution/protectors.h | 2 + .../execution/riscv64/simulator-riscv64.cc | 39 +- .../src/execution/riscv64/simulator-riscv64.h | 1 + deps/v8/src/execution/runtime-profiler.cc | 15 +- deps/v8/src/execution/s390/simulator-s390.cc | 96 +- .../shared-mutex-guard-if-off-thread.h | 2 +- deps/v8/src/execution/stack-guard.cc | 1 + .../src/extensions/cputracemark-extension.cc | 5 +- .../externalize-string-extension.cc | 21 +- .../vtunedomain-support-extension.cc | 7 +- deps/v8/src/flags/flag-definitions.h | 144 +- deps/v8/src/flags/flags.cc | 2 + deps/v8/src/handles/global-handles.cc | 23 +- deps/v8/src/handles/handles-inl.h | 2 +- deps/v8/src/handles/local-handles-inl.h | 2 +- deps/v8/src/heap/array-buffer-sweeper.cc | 55 +- deps/v8/src/heap/array-buffer-sweeper.h | 9 +- .../base/asm/riscv64/push_registers_asm.cc | 34 +- .../heap/base/asm/x64/push_registers_asm.cc | 16 +- .../heap/base/asm/x64/push_registers_masm.S | 18 +- deps/v8/src/heap/base/stack.cc | 17 +- deps/v8/src/heap/base/stack.h | 14 +- deps/v8/src/heap/basic-memory-chunk.h | 7 + deps/v8/src/heap/code-range.cc | 172 + deps/v8/src/heap/code-range.h | 147 + deps/v8/src/heap/collection-barrier.cc | 3 +- deps/v8/src/heap/combined-heap.h | 3 +- deps/v8/src/heap/concurrent-allocator-inl.h | 1 + deps/v8/src/heap/concurrent-marking.cc | 31 +- deps/v8/src/heap/cppgc-js/cpp-heap.cc | 115 +- deps/v8/src/heap/cppgc-js/cpp-heap.h | 9 + deps/v8/src/heap/cppgc-js/cpp-snapshot.cc | 10 +- .../cppgc-js/unified-heap-marking-verifier.cc | 11 +- .../cppgc-js/unified-heap-marking-verifier.h | 2 - deps/v8/src/heap/cppgc/caged-heap.cc | 23 +- deps/v8/src/heap/cppgc/compactor.cc | 21 +- deps/v8/src/heap/cppgc/concurrent-marker.cc | 2 +- deps/v8/src/heap/cppgc/explicit-management.cc | 67 +- deps/v8/src/heap/cppgc/free-list.cc | 12 +- deps/v8/src/heap/cppgc/gc-info-table.cc | 5 +- deps/v8/src/heap/cppgc/heap-base.cc | 32 +- deps/v8/src/heap/cppgc/heap-base.h | 30 +- deps/v8/src/heap/cppgc/heap-object-header.cc | 8 +- deps/v8/src/heap/cppgc/heap-object-header.h | 43 +- deps/v8/src/heap/cppgc/heap-page.cc | 5 + deps/v8/src/heap/cppgc/heap-page.h | 22 +- .../heap/cppgc/heap-statistics-collector.cc | 2 +- deps/v8/src/heap/cppgc/heap.cc | 4 +- deps/v8/src/heap/cppgc/liveness-broker.cc | 2 +- deps/v8/src/heap/cppgc/marker.cc | 42 +- deps/v8/src/heap/cppgc/marking-state.h | 41 +- deps/v8/src/heap/cppgc/marking-verifier.cc | 61 +- deps/v8/src/heap/cppgc/marking-verifier.h | 14 +- deps/v8/src/heap/cppgc/marking-visitor.cc | 2 +- deps/v8/src/heap/cppgc/memory.cc | 22 + deps/v8/src/heap/cppgc/memory.h | 76 + deps/v8/src/heap/cppgc/metric-recorder.h | 2 +- deps/v8/src/heap/cppgc/object-allocator.cc | 2 +- deps/v8/src/heap/cppgc/object-allocator.h | 10 +- deps/v8/src/heap/cppgc/object-poisoner.h | 4 +- deps/v8/src/heap/cppgc/object-size-trait.cc | 7 +- deps/v8/src/heap/cppgc/object-view.h | 54 + deps/v8/src/heap/cppgc/page-memory.cc | 2 +- deps/v8/src/heap/cppgc/pointer-policies.cc | 59 +- .../src/heap/cppgc/process-heap-statistics.h | 2 +- deps/v8/src/heap/cppgc/process-heap.cc | 56 + deps/v8/src/heap/cppgc/process-heap.h | 35 + deps/v8/src/heap/cppgc/sanitizers.h | 82 - deps/v8/src/heap/cppgc/stats-collector.h | 4 +- deps/v8/src/heap/cppgc/sweeper.cc | 81 +- deps/v8/src/heap/cppgc/sweeper.h | 4 + deps/v8/src/heap/cppgc/trace-trait.cc | 7 +- deps/v8/src/heap/cppgc/visitor.cc | 21 +- deps/v8/src/heap/embedder-tracing.cc | 34 +- deps/v8/src/heap/embedder-tracing.h | 42 +- deps/v8/src/heap/factory-base-inl.h | 26 +- deps/v8/src/heap/factory-base.cc | 121 +- deps/v8/src/heap/factory-base.h | 9 +- deps/v8/src/heap/factory.cc | 245 +- deps/v8/src/heap/factory.h | 19 +- .../finalization-registry-cleanup-task.cc | 15 +- deps/v8/src/heap/free-list.cc | 21 +- deps/v8/src/heap/gc-tracer.cc | 32 +- deps/v8/src/heap/gc-tracer.h | 6 + deps/v8/src/heap/heap-inl.h | 89 +- deps/v8/src/heap/heap-write-barrier.cc | 11 +- deps/v8/src/heap/heap.cc | 550 +- deps/v8/src/heap/heap.h | 127 +- deps/v8/src/heap/incremental-marking.cc | 43 +- deps/v8/src/heap/large-spaces.cc | 6 +- deps/v8/src/heap/large-spaces.h | 1 + deps/v8/src/heap/local-allocator.h | 2 +- deps/v8/src/heap/local-heap-inl.h | 2 + deps/v8/src/heap/local-heap.cc | 2 +- deps/v8/src/heap/mark-compact-inl.h | 8 +- deps/v8/src/heap/mark-compact.cc | 161 +- deps/v8/src/heap/mark-compact.h | 7 +- deps/v8/src/heap/marking-barrier-inl.h | 10 +- deps/v8/src/heap/marking-visitor-inl.h | 6 +- deps/v8/src/heap/marking-visitor.h | 9 +- deps/v8/src/heap/memory-allocator.cc | 112 +- deps/v8/src/heap/memory-allocator.h | 68 +- deps/v8/src/heap/memory-chunk.cc | 3 + deps/v8/src/heap/memory-measurement.cc | 2 +- deps/v8/src/heap/new-spaces-inl.h | 8 +- deps/v8/src/heap/new-spaces.cc | 9 +- deps/v8/src/heap/object-stats.cc | 2 +- deps/v8/src/heap/objects-visiting-inl.h | 7 +- deps/v8/src/heap/objects-visiting.h | 7 +- deps/v8/src/heap/paged-spaces-inl.h | 3 + deps/v8/src/heap/paged-spaces.cc | 6 +- deps/v8/src/heap/read-only-heap.cc | 4 + deps/v8/src/heap/read-only-heap.h | 5 +- deps/v8/src/heap/read-only-spaces.cc | 40 +- deps/v8/src/heap/read-only-spaces.h | 3 + deps/v8/src/heap/scavenger-inl.h | 20 +- deps/v8/src/heap/scavenger.cc | 18 +- deps/v8/src/heap/setup-heap-internal.cc | 32 +- deps/v8/src/heap/spaces-inl.h | 3 +- deps/v8/src/heap/spaces.cc | 2 +- deps/v8/src/heap/spaces.h | 3 + deps/v8/src/heap/sweeper.cc | 6 +- deps/v8/src/heap/third-party/heap-api-stub.cc | 6 + deps/v8/src/heap/third-party/heap-api.h | 6 + deps/v8/src/ic/accessor-assembler.cc | 265 +- deps/v8/src/ic/accessor-assembler.h | 6 + deps/v8/src/ic/call-optimization.cc | 40 +- deps/v8/src/ic/call-optimization.h | 29 +- deps/v8/src/ic/ic.cc | 97 +- deps/v8/src/ic/ic.h | 5 +- deps/v8/src/ic/keyed-store-generic.cc | 6 +- deps/v8/src/init/bootstrapper.cc | 195 +- deps/v8/src/init/heap-symbols.h | 451 +- deps/v8/src/init/isolate-allocator.cc | 238 +- deps/v8/src/init/isolate-allocator.h | 39 +- deps/v8/src/init/v8.cc | 23 + deps/v8/src/inspector/injected-script.cc | 3 +- deps/v8/src/inspector/injected-script.h | 3 +- deps/v8/src/inspector/string-16.h | 4 +- deps/v8/src/inspector/v8-console-message.cc | 2 +- deps/v8/src/inspector/v8-console.cc | 94 +- .../src/inspector/v8-debugger-agent-impl.cc | 18 +- deps/v8/src/inspector/v8-debugger.cc | 2 +- .../inspector/v8-heap-profiler-agent-impl.cc | 15 +- .../inspector/v8-heap-profiler-agent-impl.h | 9 +- .../inspector/v8-inspector-session-impl.cc | 14 + .../src/inspector/v8-inspector-session-impl.h | 3 + .../src/inspector/v8-profiler-agent-impl.cc | 9 +- .../v8/src/inspector/v8-runtime-agent-impl.cc | 19 +- deps/v8/src/inspector/v8-runtime-agent-impl.h | 3 +- deps/v8/src/inspector/v8-stack-trace-impl.cc | 17 +- deps/v8/src/inspector/v8-stack-trace-impl.h | 5 +- .../v8/src/inspector/v8-string-conversions.cc | 7 +- deps/v8/src/inspector/value-mirror.cc | 69 +- .../src/interpreter/bytecode-array-builder.cc | 57 +- .../src/interpreter/bytecode-array-builder.h | 8 +- .../interpreter/bytecode-array-iterator.cc | 8 +- .../src/interpreter/bytecode-array-iterator.h | 8 +- .../src/interpreter/bytecode-array-writer.cc | 8 +- .../src/interpreter/bytecode-array-writer.h | 10 +- deps/v8/src/interpreter/bytecode-generator.cc | 45 +- deps/v8/src/interpreter/bytecode-generator.h | 16 +- deps/v8/src/interpreter/bytecode-operands.h | 2 - deps/v8/src/interpreter/bytecodes.h | 75 +- .../src/interpreter/constant-array-builder.cc | 17 +- .../src/interpreter/constant-array-builder.h | 16 +- .../src/interpreter/handler-table-builder.cc | 4 +- .../src/interpreter/handler-table-builder.h | 4 +- .../src/interpreter/interpreter-assembler.cc | 26 +- .../src/interpreter/interpreter-assembler.h | 3 - .../src/interpreter/interpreter-generator.cc | 27 +- .../interpreter-intrinsics-generator.cc | 6 - .../src/interpreter/interpreter-intrinsics.h | 1 - deps/v8/src/interpreter/interpreter.cc | 36 +- deps/v8/src/json/json-parser.cc | 16 +- .../libplatform/tracing/recorder-default.cc | 25 - .../src/libplatform/tracing/recorder-mac.cc | 43 + deps/v8/src/libplatform/tracing/recorder.h | 23 +- .../src/libplatform/tracing/trace-writer.cc | 5 + .../v8/src/libplatform/tracing/trace-writer.h | 2 + deps/v8/src/logging/code-events.h | 6 + deps/v8/src/logging/counters-definitions.h | 5 + deps/v8/src/logging/counters-inl.h | 64 - deps/v8/src/logging/counters.cc | 370 +- deps/v8/src/logging/counters.h | 687 +-- deps/v8/src/logging/log.cc | 10 +- deps/v8/src/logging/log.h | 3 + deps/v8/src/logging/runtime-call-stats.cc | 370 ++ deps/v8/src/logging/runtime-call-stats.h | 763 +++ deps/v8/src/numbers/conversions.cc | 48 +- deps/v8/src/numbers/conversions.h | 4 +- deps/v8/src/numbers/dtoa.h | 11 +- deps/v8/src/objects/all-objects-inl.h | 1 + deps/v8/src/objects/allocation-site-inl.h | 12 +- deps/v8/src/objects/allocation-site.h | 10 +- deps/v8/src/objects/api-callbacks.h | 2 + deps/v8/src/objects/arguments.tq | 2 +- deps/v8/src/objects/backing-store.cc | 319 +- deps/v8/src/objects/backing-store.h | 60 +- deps/v8/src/objects/bigint.cc | 131 +- deps/v8/src/objects/bigint.h | 16 +- deps/v8/src/objects/code-inl.h | 6 +- deps/v8/src/objects/code-kind.cc | 2 - deps/v8/src/objects/code-kind.h | 39 +- deps/v8/src/objects/code.cc | 124 +- deps/v8/src/objects/code.h | 3 +- .../v8/src/objects/compilation-cache-table.cc | 34 - deps/v8/src/objects/compilation-cache-table.h | 7 - deps/v8/src/objects/compressed-slots-inl.h | 21 + deps/v8/src/objects/compressed-slots.h | 4 + deps/v8/src/objects/contexts-inl.h | 87 +- deps/v8/src/objects/contexts.cc | 7 +- deps/v8/src/objects/contexts.h | 59 +- deps/v8/src/objects/contexts.tq | 27 +- deps/v8/src/objects/debug-objects-inl.h | 6 - deps/v8/src/objects/debug-objects.cc | 35 +- deps/v8/src/objects/debug-objects.h | 8 +- deps/v8/src/objects/debug-objects.tq | 6 +- deps/v8/src/objects/descriptor-array.h | 4 +- deps/v8/src/objects/dictionary.h | 12 +- deps/v8/src/objects/elements-kind.cc | 12 + deps/v8/src/objects/elements-kind.h | 58 +- deps/v8/src/objects/elements.cc | 870 ++- deps/v8/src/objects/elements.h | 43 +- deps/v8/src/objects/embedder-data-slot-inl.h | 30 +- deps/v8/src/objects/embedder-data-slot.h | 5 +- deps/v8/src/objects/feedback-vector-inl.h | 14 +- deps/v8/src/objects/feedback-vector.cc | 73 +- deps/v8/src/objects/feedback-vector.h | 26 +- deps/v8/src/objects/feedback-vector.tq | 2 +- deps/v8/src/objects/fixed-array-inl.h | 25 +- deps/v8/src/objects/fixed-array.h | 28 +- deps/v8/src/objects/fixed-array.tq | 4 +- deps/v8/src/objects/foreign-inl.h | 3 +- deps/v8/src/objects/free-space-inl.h | 8 +- deps/v8/src/objects/free-space.h | 3 +- deps/v8/src/objects/function-kind.h | 8 + deps/v8/src/objects/hash-table-inl.h | 5 +- deps/v8/src/objects/hash-table.h | 16 +- deps/v8/src/objects/heap-object.h | 16 +- deps/v8/src/objects/instance-type-inl.h | 4 +- deps/v8/src/objects/instance-type.h | 7 +- deps/v8/src/objects/internal-index.h | 3 +- deps/v8/src/objects/intl-objects.cc | 85 +- deps/v8/src/objects/intl-objects.h | 2 +- deps/v8/src/objects/js-array-buffer-inl.h | 51 +- deps/v8/src/objects/js-array-buffer.cc | 51 +- deps/v8/src/objects/js-array-buffer.h | 37 +- deps/v8/src/objects/js-array-buffer.tq | 32 + deps/v8/src/objects/js-array.h | 4 +- deps/v8/src/objects/js-function-inl.h | 21 +- deps/v8/src/objects/js-function.cc | 65 +- deps/v8/src/objects/js-function.h | 12 +- deps/v8/src/objects/js-locale.cc | 344 ++ deps/v8/src/objects/js-locale.h | 15 + deps/v8/src/objects/js-objects-inl.h | 29 +- deps/v8/src/objects/js-objects.cc | 60 +- deps/v8/src/objects/js-objects.h | 22 +- deps/v8/src/objects/js-objects.tq | 7 +- deps/v8/src/objects/js-regexp.cc | 21 + deps/v8/src/objects/js-regexp.h | 3 + deps/v8/src/objects/literal-objects.cc | 62 +- deps/v8/src/objects/literal-objects.h | 12 +- deps/v8/src/objects/lookup-inl.h | 5 +- deps/v8/src/objects/lookup.cc | 35 +- deps/v8/src/objects/map-inl.h | 140 +- deps/v8/src/objects/map-updater.cc | 280 +- deps/v8/src/objects/map-updater.h | 26 + deps/v8/src/objects/map.cc | 317 +- deps/v8/src/objects/map.h | 61 +- deps/v8/src/objects/map.tq | 3 +- deps/v8/src/objects/megadom-handler-inl.h | 26 + deps/v8/src/objects/megadom-handler.h | 32 + deps/v8/src/objects/megadom-handler.tq | 11 + deps/v8/src/objects/object-list-macros.h | 4 + deps/v8/src/objects/object-macros-undef.h | 6 +- deps/v8/src/objects/object-macros.h | 27 +- .../objects/objects-body-descriptors-inl.h | 62 +- deps/v8/src/objects/objects-definitions.h | 6 +- deps/v8/src/objects/objects-inl.h | 81 +- deps/v8/src/objects/objects.cc | 274 +- deps/v8/src/objects/objects.h | 26 +- deps/v8/src/objects/ordered-hash-table.cc | 44 +- deps/v8/src/objects/ordered-hash-table.h | 50 +- deps/v8/src/objects/property-array-inl.h | 7 +- deps/v8/src/objects/property-array.h | 6 +- deps/v8/src/objects/scope-info.cc | 17 +- deps/v8/src/objects/scope-info.h | 13 +- deps/v8/src/objects/script-inl.h | 46 +- deps/v8/src/objects/script.h | 36 +- deps/v8/src/objects/script.tq | 8 +- .../v8/src/objects/shared-function-info-inl.h | 32 +- deps/v8/src/objects/shared-function-info.cc | 10 +- deps/v8/src/objects/shared-function-info.h | 34 +- deps/v8/src/objects/shared-function-info.tq | 1 - deps/v8/src/objects/slots-inl.h | 21 + deps/v8/src/objects/slots.h | 4 + deps/v8/src/objects/smi.h | 10 +- deps/v8/src/objects/source-text-module.cc | 6 +- deps/v8/src/objects/source-text-module.h | 13 +- deps/v8/src/objects/source-text-module.tq | 2 +- deps/v8/src/objects/string-inl.h | 95 +- deps/v8/src/objects/string-table.cc | 25 +- deps/v8/src/objects/string-table.h | 4 +- deps/v8/src/objects/string.cc | 25 +- deps/v8/src/objects/string.h | 105 +- deps/v8/src/objects/struct-inl.h | 7 - deps/v8/src/objects/struct.h | 1 - .../src/objects/swiss-name-dictionary-inl.h | 43 +- deps/v8/src/objects/swiss-name-dictionary.cc | 5 +- deps/v8/src/objects/swiss-name-dictionary.h | 26 +- deps/v8/src/objects/tagged-field-inl.h | 62 +- deps/v8/src/objects/tagged-field.h | 11 +- deps/v8/src/objects/tagged-impl.h | 3 +- deps/v8/src/objects/tagged-index.h | 4 +- deps/v8/src/objects/templates-inl.h | 33 +- deps/v8/src/objects/templates.h | 51 +- deps/v8/src/objects/templates.tq | 8 +- deps/v8/src/objects/torque-defined-classes.h | 1 + deps/v8/src/objects/transitions.cc | 10 +- deps/v8/src/objects/transitions.h | 8 +- deps/v8/src/objects/value-serializer.cc | 48 +- deps/v8/src/objects/visitors.h | 5 + deps/v8/src/parsing/literal-buffer.cc | 4 +- deps/v8/src/parsing/literal-buffer.h | 4 +- deps/v8/src/parsing/parse-info.cc | 4 +- deps/v8/src/parsing/parse-info.h | 4 +- deps/v8/src/parsing/parser-base.h | 49 +- deps/v8/src/parsing/parser.cc | 62 +- deps/v8/src/parsing/parser.h | 13 +- .../pending-compilation-error-handler.cc | 12 +- .../pending-compilation-error-handler.h | 12 +- deps/v8/src/parsing/preparser.cc | 7 +- deps/v8/src/parsing/rewriter.cc | 7 +- .../src/parsing/scanner-character-streams.cc | 6 +- deps/v8/src/parsing/scanner.cc | 8 +- deps/v8/src/parsing/scanner.h | 8 +- deps/v8/src/profiler/cpu-profiler.cc | 21 +- deps/v8/src/profiler/cpu-profiler.h | 20 +- deps/v8/src/profiler/heap-profiler.cc | 5 +- deps/v8/src/profiler/heap-profiler.h | 3 +- .../src/profiler/heap-snapshot-generator.cc | 148 +- .../v8/src/profiler/heap-snapshot-generator.h | 31 +- deps/v8/src/profiler/profile-generator.cc | 33 +- deps/v8/src/profiler/profile-generator.h | 33 +- deps/v8/src/profiler/profiler-listener.cc | 7 + deps/v8/src/profiler/profiler-listener.h | 1 + .../v8/src/profiler/sampling-heap-profiler.cc | 2 +- deps/v8/src/profiler/tick-sample.cc | 20 +- deps/v8/src/profiler/tick-sample.h | 1 + .../arm64/regexp-macro-assembler-arm64.cc | 14 +- deps/v8/src/regexp/ppc/OWNERS | 5 - .../regexp/ppc/regexp-macro-assembler-ppc.cc | 98 +- deps/v8/src/regexp/regexp-ast.cc | 4 +- deps/v8/src/regexp/regexp-ast.h | 3 +- deps/v8/src/regexp/regexp-bytecodes.h | 4 +- deps/v8/src/regexp/regexp-compiler.cc | 34 +- deps/v8/src/regexp/regexp-dotprinter.cc | 3 +- deps/v8/src/regexp/regexp-macro-assembler.cc | 7 +- deps/v8/src/regexp/regexp-nodes.h | 5 + .../regexp/x64/regexp-macro-assembler-x64.cc | 15 +- deps/v8/src/roots/roots.cc | 4 + deps/v8/src/roots/roots.h | 9 + deps/v8/src/runtime/runtime-array.cc | 15 +- deps/v8/src/runtime/runtime-classes.cc | 7 +- deps/v8/src/runtime/runtime-compiler.cc | 64 +- deps/v8/src/runtime/runtime-debug.cc | 364 +- deps/v8/src/runtime/runtime-internal.cc | 28 +- deps/v8/src/runtime/runtime-literals.cc | 3 +- deps/v8/src/runtime/runtime-object.cc | 117 +- deps/v8/src/runtime/runtime-promise.cc | 17 +- deps/v8/src/runtime/runtime-regexp.cc | 10 +- deps/v8/src/runtime/runtime-scopes.cc | 4 +- deps/v8/src/runtime/runtime-strings.cc | 2 +- deps/v8/src/runtime/runtime-test-wasm.cc | 9 +- deps/v8/src/runtime/runtime-test.cc | 69 + deps/v8/src/runtime/runtime-typedarray.cc | 24 +- deps/v8/src/runtime/runtime.cc | 3 + deps/v8/src/runtime/runtime.h | 260 +- deps/v8/src/sanitizer/asan.h | 28 - deps/v8/src/sanitizer/msan.h | 36 - deps/v8/src/sanitizer/tsan.h | 47 - deps/v8/src/snapshot/code-serializer.cc | 3 +- deps/v8/src/snapshot/context-deserializer.cc | 4 +- deps/v8/src/snapshot/deserializer.cc | 3 + .../v8/src/snapshot/embedded/embedded-data.cc | 21 +- deps/v8/src/snapshot/embedded/embedded-data.h | 8 + deps/v8/src/snapshot/mksnapshot.cc | 4 +- deps/v8/src/snapshot/object-deserializer.cc | 4 +- deps/v8/src/snapshot/read-only-serializer.cc | 17 + deps/v8/src/snapshot/read-only-serializer.h | 2 + .../v8/src/snapshot/serializer-deserializer.h | 9 +- deps/v8/src/snapshot/serializer.cc | 2 +- deps/v8/src/snapshot/serializer.h | 4 + deps/v8/src/snapshot/snapshot-utils.cc | 2 +- deps/v8/src/snapshot/snapshot.cc | 26 +- deps/v8/src/snapshot/snapshot.h | 9 + deps/v8/src/strings/unicode.cc | 4461 +++++++-------- deps/v8/src/third_party/vtune/BUILD.gn | 9 +- .../torque/class-debug-reader-generator.cc | 5 + deps/v8/src/torque/constants.h | 18 +- deps/v8/src/torque/global-context.h | 2 + deps/v8/src/torque/implementation-visitor.cc | 248 +- deps/v8/src/torque/torque-parser.cc | 19 +- deps/v8/src/torque/torque.cc | 5 + deps/v8/src/tracing/trace-event.cc | 4 + deps/v8/src/tracing/trace-event.h | 9 + deps/v8/src/trap-handler/DEPS | 19 +- .../src/trap-handler/handler-inside-posix.h | 1 + deps/v8/src/trap-handler/handler-inside-win.h | 4 +- deps/v8/src/trap-handler/handler-inside.cc | 7 +- .../src/trap-handler/handler-outside-posix.cc | 6 +- .../src/trap-handler/handler-outside-win.cc | 2 +- deps/v8/src/trap-handler/handler-outside.cc | 35 +- deps/v8/src/trap-handler/handler-shared.cc | 2 +- .../src/trap-handler/trap-handler-internal.h | 2 +- deps/v8/src/trap-handler/trap-handler.h | 72 +- deps/v8/src/utils/allocation.cc | 138 +- deps/v8/src/utils/allocation.h | 105 +- deps/v8/src/utils/ostreams.cc | 2 +- deps/v8/src/utils/ostreams.h | 10 +- deps/v8/src/utils/v8dll-main.cc | 2 +- deps/v8/src/utils/vector.h | 2 +- deps/v8/src/wasm/OWNERS | 1 + .../wasm/baseline/arm/liftoff-assembler-arm.h | 11 +- .../baseline/arm64/liftoff-assembler-arm64.h | 44 +- .../baseline/ia32/liftoff-assembler-ia32.h | 161 +- .../v8/src/wasm/baseline/liftoff-assembler.cc | 32 +- deps/v8/src/wasm/baseline/liftoff-assembler.h | 11 +- deps/v8/src/wasm/baseline/liftoff-compiler.cc | 490 +- deps/v8/src/wasm/baseline/liftoff-register.h | 21 +- .../baseline/mips/liftoff-assembler-mips.h | 15 +- .../mips64/liftoff-assembler-mips64.h | 15 +- deps/v8/src/wasm/baseline/ppc/OWNERS | 5 - .../wasm/baseline/ppc/liftoff-assembler-ppc.h | 168 +- .../riscv64/liftoff-assembler-riscv64.h | 306 +- .../baseline/s390/liftoff-assembler-s390.h | 358 +- .../wasm/baseline/x64/liftoff-assembler-x64.h | 153 +- deps/v8/src/wasm/branch-hint-map.h | 46 + deps/v8/src/wasm/c-api.cc | 46 +- deps/v8/src/wasm/compilation-environment.h | 12 +- deps/v8/src/wasm/function-body-decoder-impl.h | 748 ++- deps/v8/src/wasm/function-compiler.cc | 17 +- deps/v8/src/wasm/function-compiler.h | 9 +- deps/v8/src/wasm/graph-builder-interface.cc | 177 +- deps/v8/src/wasm/graph-builder-interface.h | 3 +- deps/v8/src/wasm/memory-protection-key.cc | 189 + deps/v8/src/wasm/memory-protection-key.h | 90 + deps/v8/src/wasm/memory-tracing.cc | 2 +- deps/v8/src/wasm/module-compiler.cc | 67 +- deps/v8/src/wasm/module-decoder.cc | 360 +- deps/v8/src/wasm/module-decoder.h | 10 +- deps/v8/src/wasm/module-instantiate.cc | 48 +- deps/v8/src/wasm/value-type.h | 39 +- deps/v8/src/wasm/wasm-code-manager.cc | 439 +- deps/v8/src/wasm/wasm-code-manager.h | 119 +- deps/v8/src/wasm/wasm-constants.h | 7 +- deps/v8/src/wasm/wasm-debug.cc | 10 +- deps/v8/src/wasm/wasm-engine.cc | 78 +- deps/v8/src/wasm/wasm-engine.h | 12 +- deps/v8/src/wasm/wasm-feature-flags.h | 14 +- deps/v8/src/wasm/wasm-init-expr.cc | 57 + deps/v8/src/wasm/wasm-init-expr.h | 150 + deps/v8/src/wasm/wasm-js.cc | 35 +- deps/v8/src/wasm/wasm-limits.h | 5 +- deps/v8/src/wasm/wasm-module-builder.cc | 12 +- deps/v8/src/wasm/wasm-module-builder.h | 2 + deps/v8/src/wasm/wasm-module.cc | 14 +- deps/v8/src/wasm/wasm-module.h | 32 +- deps/v8/src/wasm/wasm-objects-inl.h | 38 +- deps/v8/src/wasm/wasm-objects.cc | 130 +- deps/v8/src/wasm/wasm-objects.h | 43 +- deps/v8/src/wasm/wasm-objects.tq | 22 +- deps/v8/src/wasm/wasm-opcodes-inl.h | 8 +- deps/v8/src/wasm/wasm-opcodes.cc | 3 - deps/v8/src/wasm/wasm-opcodes.h | 185 +- deps/v8/src/wasm/wasm-serialization.cc | 6 +- deps/v8/src/wasm/wasm-subtyping.cc | 71 +- deps/v8/src/wasm/wasm-subtyping.h | 14 +- deps/v8/src/wasm/wasm-value.h | 2 +- deps/v8/src/web-snapshot/web-snapshot.cc | 189 +- deps/v8/src/web-snapshot/web-snapshot.h | 15 +- deps/v8/src/zone/zone-segment.cc | 2 +- deps/v8/src/zone/zone.cc | 2 +- deps/v8/test/benchmarks/cpp/BUILD.gn | 5 +- deps/v8/test/benchmarks/cpp/DEPS | 1 + deps/v8/test/benchmarks/cpp/cppgc/DEPS | 1 + .../benchmarks/cpp/cppgc/allocation_perf.cc | 3 + .../test/benchmarks/cpp/cppgc/trace_perf.cc | 5 +- deps/v8/test/benchmarks/cpp/empty.cc | 6 +- deps/v8/test/cctest/BUILD.gn | 4 +- deps/v8/test/cctest/cctest.cc | 6 +- deps/v8/test/cctest/cctest.h | 8 +- deps/v8/test/cctest/cctest.status | 498 +- .../test/cctest/compiler/serializer-tester.cc | 6 +- .../cctest/compiler/test-code-assembler.cc | 2 + .../test-concurrent-shared-function-info.cc | 2 - .../test-js-context-specialization.cc | 50 +- .../compiler/test-representation-change.cc | 15 +- .../test/cctest/compiler/test-run-machops.cc | 126 + .../test/cctest/compiler/test-verify-type.cc | 70 + deps/v8/test/cctest/heap/heap-utils.cc | 3 +- .../cctest/heap/test-array-buffer-tracker.cc | 15 +- .../cctest/heap/test-concurrent-allocation.cc | 3 + .../cctest/heap/test-concurrent-marking.cc | 8 + .../test/cctest/heap/test-embedder-tracing.cc | 9 +- .../heap/test-external-string-tracker.cc | 1 + deps/v8/test/cctest/heap/test-heap.cc | 178 +- .../cctest/heap/test-invalidated-slots.cc | 4 + deps/v8/test/cctest/heap/test-iterators.cc | 2 +- deps/v8/test/cctest/heap/test-mark-compact.cc | 1 + .../cctest/heap/test-memory-measurement.cc | 2 - deps/v8/test/cctest/heap/test-shared-heap.cc | 91 + deps/v8/test/cctest/heap/test-spaces.cc | 26 +- .../test/cctest/heap/test-weak-references.cc | 9 +- .../v8/test/cctest/heap/test-write-barrier.cc | 7 + .../PrivateAccessorAccess.golden | 8 +- .../PrivateMethodAccess.golden | 4 +- .../StaticPrivateMethodAccess.golden | 32 +- deps/v8/test/cctest/test-allocation.cc | 2 +- deps/v8/test/cctest/test-api-accessors.cc | 210 +- deps/v8/test/cctest/test-api-array-buffer.cc | 189 +- deps/v8/test/cctest/test-api-icu.cc | 2 +- deps/v8/test/cctest/test-api-interceptors.cc | 16 +- deps/v8/test/cctest/test-api-stack-traces.cc | 26 +- deps/v8/test/cctest/test-api.cc | 319 +- deps/v8/test/cctest/test-assembler-arm.cc | 2 +- deps/v8/test/cctest/test-assembler-ia32.cc | 29 + deps/v8/test/cctest/test-assembler-mips.cc | 6 +- deps/v8/test/cctest/test-assembler-mips64.cc | 6 +- deps/v8/test/cctest/test-assembler-riscv64.cc | 24 +- deps/v8/test/cctest/test-assembler-x64.cc | 29 + deps/v8/test/cctest/test-code-pages.cc | 21 +- .../test/cctest/test-code-stub-assembler.cc | 10 +- deps/v8/test/cctest/test-compiler.cc | 116 +- .../test/cctest/test-concurrent-prototype.cc | 4 +- deps/v8/test/cctest/test-concurrent-string.cc | 2 +- deps/v8/test/cctest/test-cpu-profiler.cc | 155 +- deps/v8/test/cctest/test-debug-helper.cc | 16 +- deps/v8/test/cctest/test-debug.cc | 56 +- deps/v8/test/cctest/test-disasm-riscv64.cc | 1 + deps/v8/test/cctest/test-disasm-x64.cc | 8 + deps/v8/test/cctest/test-double.cc | 15 +- deps/v8/test/cctest/test-factory.cc | 2 +- deps/v8/test/cctest/test-feedback-vector.cc | 43 + .../test/cctest/test-field-type-tracking.cc | 24 +- deps/v8/test/cctest/test-global-handles.cc | 4 + deps/v8/test/cctest/test-heap-profiler.cc | 31 +- .../cctest/test-inobject-slack-tracking.cc | 5 +- deps/v8/test/cctest/test-js-to-wasm.cc | 30 +- deps/v8/test/cctest/test-js-weak-refs.cc | 9 + deps/v8/test/cctest/test-log-stack-tracer.cc | 2 +- .../test/cctest/test-macro-assembler-mips.cc | 3 +- .../cctest/test-macro-assembler-mips64.cc | 3 +- .../cctest/test-macro-assembler-riscv64.cc | 17 +- .../test/cctest/test-macro-assembler-x64.cc | 30 +- deps/v8/test/cctest/test-mementos.cc | 6 +- deps/v8/test/cctest/test-parsing.cc | 10 + .../test/cctest/test-poison-disasm-arm64.cc | 8 + deps/v8/test/cctest/test-ptr-compr-cage.cc | 175 + deps/v8/test/cctest/test-serialize.cc | 1 + deps/v8/test/cctest/test-simple-riscv64.cc | 2 +- deps/v8/test/cctest/test-strings.cc | 2 +- deps/v8/test/cctest/test-typedarrays.cc | 24 - deps/v8/test/cctest/test-weakmaps.cc | 7 +- deps/v8/test/cctest/test-weaksets.cc | 8 +- deps/v8/test/cctest/test-web-snapshots.cc | 369 +- deps/v8/test/cctest/wasm/test-c-wasm-entry.cc | 1 - deps/v8/test/cctest/wasm/test-gc.cc | 220 +- .../cctest/wasm/test-jump-table-assembler.cc | 10 +- .../cctest/wasm/test-liftoff-inspection.cc | 25 +- .../cctest/wasm/test-run-wasm-bulk-memory.cc | 3 +- .../cctest/wasm/test-run-wasm-exceptions.cc | 70 + .../cctest/wasm/test-run-wasm-relaxed-simd.cc | 42 +- .../cctest/wasm/test-run-wasm-simd-liftoff.cc | 16 +- .../test-run-wasm-simd-scalar-lowering.cc | 332 -- .../v8/test/cctest/wasm/test-run-wasm-simd.cc | 776 ++- deps/v8/test/cctest/wasm/test-run-wasm.cc | 77 +- .../test/cctest/wasm/test-wasm-breakpoints.cc | 1 - .../cctest/wasm/test-wasm-serialization.cc | 1 - .../cctest/wasm/test-wasm-shared-engine.cc | 93 +- deps/v8/test/cctest/wasm/wasm-run-utils.cc | 24 +- deps/v8/test/cctest/wasm/wasm-run-utils.h | 50 +- deps/v8/test/cctest/wasm/wasm-simd-utils.cc | 132 +- deps/v8/test/cctest/wasm/wasm-simd-utils.h | 82 +- deps/v8/test/common/wasm/wasm-interpreter.cc | 5 +- deps/v8/test/common/wasm/wasm-macro-gen.h | 5 + .../debug-evaluate-repl-mode-optimized.js | 33 + .../debug/debug-evaluate-repl-mode.js | 150 +- .../debug/debug-liveedit-check-stack.js | 7 - .../debug/debug-liveedit-double-call.js | 137 - .../debug/debug-liveedit-exceptions.js | 63 - .../debug/debug-liveedit-recursion.js | 8 +- .../debug/debug-liveedit-replace-code.js | 31 - .../debug/debug-liveedit-restart-frame.js | 154 - .../debugger/debug/debug-liveedit-stepin.js | 73 - .../debug/es6/debug-liveedit-new-target-1.js | 2 +- .../debug/es6/debug-liveedit-new-target-2.js | 2 +- .../debug/es6/debug-liveedit-new-target-3.js | 4 +- .../debug/es6/generators-debug-liveedit.js | 131 - .../debug/es8/debug-async-liveedit.js | 146 - .../test/debugger/debug/wasm/breakpoints.js | 12 +- .../debug/wasm/debug-step-into-wasm.js | 2 +- .../debugger/debug/wasm/frame-inspection.js | 4 +- .../debugger/debug/wasm/stepping-from-js.js | 14 +- deps/v8/test/debugger/debugger.status | 15 +- .../debugger/regress/regress-crbug-1156498.js | 20 + deps/v8/test/debugger/test-api.js | 7 +- deps/v8/test/fuzzer/fuzzer.status | 9 + deps/v8/test/fuzzer/inspector-fuzzer.cc | 8 +- deps/v8/test/fuzzer/multi-return.cc | 2 +- .../access-obsolete-frame-expected.txt | 9 - .../debugger/access-obsolete-frame.js | 69 - ...-line-api-with-arrow-function-expected.txt | 23 + .../command-line-api-with-arrow-function.js | 67 + .../get-properties-paused-expected.txt | 17 +- .../debugger/get-properties-paused.js | 2 - .../debugger/restart-frame-expected.txt | 16 +- .../test/inspector/debugger/restart-frame.js | 19 +- .../debugger/set-script-source-2-expected.txt | 73 - .../inspector/debugger/set-script-source-2.js | 99 - ...t-script-source-stack-padding-expected.txt | 15 - .../set-script-source-stack-padding.js | 54 - .../debugger/set-variable-value-expected.txt | 74 +- ...sm-breakpoint-reset-on-debugger-restart.js | 1 + .../debugger/wasm-conditional-breakpoints.js | 1 + .../inspector/debugger/wasm-debug-command.js | 1 + .../wasm-evaluate-on-call-frame-expected.txt | 44 +- .../debugger/wasm-gc-breakpoints-expected.txt | 4 +- .../inspector/debugger/wasm-gc-breakpoints.js | 1 + .../wasm-gc-in-debug-break-expected.txt | 4 +- .../debugger/wasm-gc-in-debug-break.js | 4 +- ...sm-get-breakable-locations-byte-offsets.js | 1 + .../test/inspector/debugger/wasm-imports.js | 3 +- .../debugger/wasm-inspect-many-registers.js | 1 + .../wasm-instrumentation-breakpoint.js | 8 + .../debugger/wasm-remove-breakpoint.js | 4 +- .../debugger/wasm-scope-info-expected.txt | 48 +- .../inspector/debugger/wasm-scope-info.js | 5 +- ...oint-breaks-on-first-breakable-location.js | 1 + .../debugger/wasm-set-breakpoint-expected.txt | 74 +- .../inspector/debugger/wasm-set-breakpoint.js | 1 + ...de-effect-free-debug-evaluate-expected.txt | 33 + .../wasm-side-effect-free-debug-evaluate.js | 72 + .../inspector/debugger/wasm-stack-check.js | 1 + .../debugger/wasm-stack-expected.txt | 4 +- .../inspector/debugger/wasm-step-a-lot.js | 1 + .../wasm-step-after-trap-expected.txt | 4 +- .../debugger/wasm-step-after-trap.js | 1 + .../wasm-step-from-non-breakable-position.js | 1 + .../debugger/wasm-stepping-in-from-js.js | 4 +- .../wasm-stepping-no-opcode-merging.js | 1 + .../debugger/wasm-stepping-out-from-js.js | 1 + .../inspector/debugger/wasm-stepping-to-js.js | 4 +- .../debugger/wasm-stepping-with-skiplist.js | 1 + ...wasm-stepping-with-source-map-expected.txt | 58 +- .../debugger/wasm-stepping-with-source-map.js | 1 + .../test/inspector/debugger/wasm-stepping.js | 1 + .../wasm-unnamed-function-names-expected.txt | 4 +- deps/v8/test/inspector/inspector-test.cc | 12 +- deps/v8/test/inspector/inspector.status | 336 +- deps/v8/test/inspector/isolate-data.cc | 10 +- .../regress-crbug-1195927-expected.txt | 32 + .../regress/regress-crbug-1195927.js | 54 + .../regress-crbug-1197392-expected.txt | 10 + .../regress/regress-crbug-1197392.js | 16 + .../regress-crbug-1207867-expected.txt | 41 + .../regress/regress-crbug-1207867.js | 59 + .../runtime/add-binding-expected.txt | 44 + deps/v8/test/inspector/runtime/add-binding.js | 42 +- .../runtime/clear-of-command-line-api.js | 2 +- .../runtime/command-line-api-expected.txt | 24 +- .../runtime/get-properties-expected.txt | 55 +- .../test/inspector/runtime/get-properties.js | 6 - .../runtime/internal-properties-expected.txt | 201 +- .../runtime/remote-object-expected.txt | 24 +- .../remote-object-get-properties-expected.txt | 44 +- .../test/inspector/runtime/remote-object.js | 8 +- .../runtime-remote-object-expected.txt | 70 +- deps/v8/test/inspector/task-runner.cc | 4 +- deps/v8/test/inspector/wasm-inspector-test.js | 7 +- .../test/intl/general/getCanonicalLocales.js | 2 +- .../intl/locale/locale-info-check-property.js | 23 + .../locale/locale-info-check-return-types.js | 46 + deps/v8/test/intl/locale/locale-info-ext.js | 26 + deps/v8/test/intl/locale/locale.js | 2 +- deps/v8/test/memory/Memory.json | 3 +- .../message/fail/wasm-async-compile-fail.out | 4 +- .../fail/wasm-async-instantiate-fail.out | 4 +- deps/v8/test/message/fail/wasm-module-name.js | 2 +- deps/v8/test/message/fail/wasm-no-name.out | 2 +- .../fail/wasm-streaming-compile-fail.out | 4 +- .../fail/wasm-streaming-instantiate-fail.out | 4 +- .../message/fail/wasm-sync-compile-fail.out | 4 +- deps/v8/test/message/message.status | 18 +- deps/v8/test/message/testcfg.py | 15 +- .../v8/test/message/wasm-module-name-async.js | 2 +- deps/v8/test/message/wasm-no-name-async.out | 2 +- .../test/message/wasm-no-name-streaming.out | 2 +- .../test/message/wasm-trace-memory-liftoff.js | 1 - .../message/wasm-trace-memory-liftoff.out | 28 +- deps/v8/test/message/wasm-trace-memory.js | 1 - deps/v8/test/message/wasm-trace-memory.out | 28 +- deps/v8/test/mjsunit/BUILD.gn | 8 +- deps/v8/test/mjsunit/baseline/test-osr.js | 51 + .../test/mjsunit/compiler/bigint-asuintn.js | 37 + .../concurrent-invalidate-transition-map.js | 2 +- .../compiler/concurrent-proto-change.js | 2 +- .../test/mjsunit/compiler/deopt-pretenure.js | 72 + .../test/mjsunit/compiler/fast-api-calls.js | 58 +- .../compiler/fast-api-interface-types.js | 61 + .../compiler/load-elimination-const-field.js | 4 +- .../compiler/opt-higher-order-functions.js | 45 + .../test/mjsunit/compiler/regress-1195650.js | 31 + .../test/mjsunit/compiler/regress-1196185.js | 46 + .../test/mjsunit/compiler/regress-1196683.js | 2 +- .../test/mjsunit/compiler/regress-1202312.js | 24 + .../test/mjsunit/compiler/regress-1202625.js | 21 + .../test/mjsunit/compiler/regress-1202924.js | 18 + .../test/mjsunit/compiler/regress-1203116.js | 30 + .../mjsunit/compiler/regress-crbug-11564.js | 32 + .../mjsunit/compiler/regress-crbug-1201011.js | 11 + .../mjsunit/compiler/regress-crbug-1201057.js | 9 + .../mjsunit/compiler/regress-crbug-1201082.js | 11 + .../compiler/test-literal-map-migration.js | 30 + .../concurrent-initial-prototype-change-1.js | 4 +- deps/v8/test/mjsunit/const-dict-tracking.js | 1 + .../mjsunit/harmony/class-static-blocks.js | 23 + deps/v8/test/mjsunit/harmony/error-cause.js | 221 + .../modules-import-assertions-dynamic-12.mjs | 26 + deps/v8/test/mjsunit/harmony/to-string.js | 13 - ...nalizationregistry-independent-lifetime.js | 2 +- deps/v8/test/mjsunit/ic-megadom-2.js | 52 + deps/v8/test/mjsunit/ic-megadom.js | 48 + deps/v8/test/mjsunit/mjsunit.js | 2 + deps/v8/test/mjsunit/mjsunit.status | 214 +- deps/v8/test/mjsunit/regress-10782.js | 10 + .../test/mjsunit/regress/regress-1189077.js | 56 + .../test/mjsunit/regress/regress-1201114.js | 19 + .../test/mjsunit/regress/regress-1204748.js | 24 + .../test/mjsunit/regress/regress-1205290.js | 24 + .../test/mjsunit/regress/regress-1207679.js | 24 + .../test/mjsunit/regress/regress-1208782.js | 6 + .../test/mjsunit/regress/regress-1212583.js | 25 + .../mjsunit/regress/regress-crbug-1163499.js | 15 + .../mjsunit/regress/regress-crbug-1209152.js | 13 + .../test/mjsunit/regress/regress-v8-11290.js | 5 + .../test/mjsunit/regress/regress-v8-11616.js | 8 + .../test/mjsunit/regress/regress-v8-11851.js | 22 + .../mjsunit/regress/wasm/regress-1046472.js | 4 +- .../mjsunit/regress/wasm/regress-10702.js | 2 +- .../mjsunit/regress/wasm/regress-11809.js | 64 - .../mjsunit/regress/wasm/regress-1187831.js | 2 +- .../mjsunit/regress/wasm/regress-1196837.js | 39 + .../mjsunit/regress/wasm/regress-1199662.js | 38 + .../mjsunit/regress/wasm/regress-1200231.js | 19 + .../mjsunit/regress/wasm/regress-1202736.js | 34 + .../mjsunit/regress/wasm/regress-1217064.js | 32 + .../mjsunit/regress/wasm/regress-1227351.js | 13 + .../mjsunit/regress/wasm/regress-1228720.js | 13 + .../mjsunit/regress/wasm/regress-739768.js | 2 +- .../mjsunit/regress/wasm/regress-803788.js | 2 +- .../mjsunit/regress/wasm/regress-817380.js | 3 +- .../mjsunit/regress/wasm/regress-834619.js | 2 +- .../regress/wasm/regress-crbug-1203692.js | 12 + .../mjsunit/regress/wasm/regress-v8-9106.js | 2 - ...learraybuffer-growablesharedarraybuffer.js | 430 ++ ...kprocessor-test-func-info.log.symbols.json | 7 + .../tools/tickprocessor-test-large.default | 85 + .../mjsunit/tools/tickprocessor-test-large.js | 58 + .../tools/tickprocessor-test-large.log | 2759 +++++++++ .../tickprocessor-test-large.log.symbols.json | 1 + .../tools/tickprocessor-test.log.symbols.json | 7 + ...kprocessor-test.separate-baseline-handlers | 61 + .../tickprocessor-test.separate-bytecodes | 61 + deps/v8/test/mjsunit/tools/tickprocessor.mjs | 178 +- .../typedarray-growablesharedarraybuffer.js | 354 ++ .../typedarray-resizablearraybuffer-detach.js | 138 + .../typedarray-resizablearraybuffer.js | 605 ++ deps/v8/test/mjsunit/wasm/async-compile.js | 2 +- deps/v8/test/mjsunit/wasm/bulk-memory.js | 20 +- deps/v8/test/mjsunit/wasm/call-ref.js | 17 + .../compilation-hints-async-compilation.js | 2 +- .../compilation-hints-sync-compilation.js | 2 +- .../wasm/compiled-module-serialization.js | 4 +- deps/v8/test/mjsunit/wasm/data-segments.js | 2 +- .../wasm/element-segments-with-reftypes.js | 99 + deps/v8/test/mjsunit/wasm/exceptions.js | 21 + .../mjsunit/wasm/export-mutable-global.js | 28 +- .../v8/test/mjsunit/wasm/externref-globals.js | 17 +- deps/v8/test/mjsunit/wasm/externref-table.js | 8 +- deps/v8/test/mjsunit/wasm/globals.js | 25 +- deps/v8/test/mjsunit/wasm/import-table.js | 39 +- .../wasm/indirect-call-non-zero-table.js | 15 +- deps/v8/test/mjsunit/wasm/indirect-calls.js | 6 +- deps/v8/test/mjsunit/wasm/indirect-tables.js | 41 +- deps/v8/test/mjsunit/wasm/loop-unrolling.js | 23 + deps/v8/test/mjsunit/wasm/memory64.js | 11 +- .../wasm/multi-table-element-section.js | 12 +- .../v8/test/mjsunit/wasm/reference-globals.js | 6 +- deps/v8/test/mjsunit/wasm/reference-tables.js | 3 +- deps/v8/test/mjsunit/wasm/return-calls.js | 2 +- deps/v8/test/mjsunit/wasm/simd-globals.js | 5 +- deps/v8/test/mjsunit/wasm/stack.js | 33 +- deps/v8/test/mjsunit/wasm/table-access.js | 6 +- .../test/mjsunit/wasm/table-copy-externref.js | 2 +- deps/v8/test/mjsunit/wasm/table-copy.js | 2 - deps/v8/test/mjsunit/wasm/table-get.js | 30 +- deps/v8/test/mjsunit/wasm/table-grow.js | 11 +- .../mjsunit/wasm/unreachable-validation.js | 4 +- .../test/mjsunit/wasm/wasm-module-builder.js | 381 +- deps/v8/test/test262/test262.status | 16 +- deps/v8/test/test262/testcfg.py | 3 + deps/v8/test/unittests/BUILD.gn | 9 + .../base/division-by-constant-unittest.cc | 2 +- .../base/platform/platform-unittest.cc | 2 + .../codegen/code-stub-assembler-unittest.cc | 2 +- .../instruction-selector-arm64-unittest.cc | 23 +- .../backend/instruction-selector-unittest.cc | 8 + .../backend/instruction-selector-unittest.h | 2 + .../backend/instruction-sequence-unittest.cc | 4 +- .../backend/instruction-sequence-unittest.h | 4 +- .../dead-code-elimination-unittest.cc | 3 +- .../effect-control-linearizer-unittest.cc | 60 +- .../instruction-selector-ia32-unittest.cc | 15 + .../compiler/int64-lowering-unittest.cc | 335 +- .../compiler/js-call-reducer-unittest.cc | 2 +- ...-native-context-specialization-unittest.cc | 3 +- .../compiler/machine-operator-unittest.cc | 4 +- .../test/unittests/compiler/node-test-utils.h | 2 +- deps/v8/test/unittests/compiler/ppc/OWNERS | 5 - .../instruction-selector-riscv64-unittest.cc | 16 +- .../x64/instruction-selector-x64-unittest.cc | 46 + .../execution/microtask-queue-unittest.cc | 5 + .../heap/cppgc/allocation-unittest.cc | 134 + .../heap/cppgc/concurrent-sweeper-unittest.cc | 17 +- .../heap/cppgc/custom-spaces-unittest.cc | 12 + .../heap/cppgc/ephemeron-pair-unittest.cc | 30 +- .../cppgc/explicit-management-unittest.cc | 58 +- .../heap/cppgc/garbage-collected-unittest.cc | 96 +- .../unittests/heap/cppgc/gc-info-unittest.cc | 8 +- .../heap/cppgc/gc-invoker-unittest.cc | 8 +- .../heap/cppgc/heap-growing-unittest.cc | 27 +- .../heap/cppgc/heap-object-header-unittest.cc | 20 +- .../heap/cppgc/heap-page-unittest.cc | 10 +- .../heap/cppgc/heap-registry-unittest.cc | 88 + .../unittests/heap/cppgc/heap-unittest.cc | 116 +- .../unittests/heap/cppgc/logging-unittest.cc | 10 +- .../unittests/heap/cppgc/marker-unittest.cc | 54 +- .../heap/cppgc/marking-verifier-unittest.cc | 83 +- .../heap/cppgc/marking-visitor-unittest.cc | 30 +- .../unittests/heap/cppgc/member-unittest.cc | 193 + .../unittests/heap/cppgc/minor-gc-unittest.cc | 20 +- .../heap/cppgc/name-trait-unittest.cc | 8 +- .../heap/cppgc/persistent-family-unittest.cc | 124 +- .../heap/cppgc/sanitizer-unittest.cc | 59 + .../unittests/heap/cppgc/stack-unittest.cc | 153 +- .../unittests/heap/cppgc/sweeper-unittest.cc | 59 +- deps/v8/test/unittests/heap/cppgc/tests.h | 10 + .../unittests/heap/cppgc/visitor-unittest.cc | 38 +- .../heap/cppgc/weak-container-unittest.cc | 64 +- .../heap/cppgc/workloads-unittest.cc | 351 ++ .../heap/cppgc/write-barrier-unittest.cc | 23 +- deps/v8/test/unittests/heap/heap-unittest.cc | 9 +- .../heap/unified-heap-snapshot-unittest.cc | 97 +- .../unittests/heap/unified-heap-unittest.cc | 144 + .../test/unittests/heap/unified-heap-utils.cc | 7 +- .../test/unittests/heap/unified-heap-utils.h | 2 + .../test/unittests/heap/unmapper-unittest.cc | 13 + .../bytecode-array-builder-unittest.cc | 26 +- .../bytecode-array-iterator-unittest.cc | 5 +- .../unittests/logging/counters-unittest.cc | 616 -- .../logging/runtime-call-stats-unittest.cc | 643 +++ .../test/unittests/regexp/regexp-unittest.cc | 39 + .../regress/regress-crbug-1041240-unittest.cc | 4 +- .../regress/regress-crbug-938251-unittest.cc | 2 +- deps/v8/test/unittests/test-utils.cc | 2 +- deps/v8/test/unittests/test-utils.h | 2 +- deps/v8/test/unittests/unittests.status | 39 +- .../unittests/utils/allocation-unittest.cc | 4 +- .../wasm/function-body-decoder-unittest.cc | 202 +- .../unittests/wasm/module-decoder-unittest.cc | 59 +- .../test/unittests/wasm/subtyping-unittest.cc | 184 +- .../wasm/trap-handler-x64-unittest.cc | 6 +- .../wasm-api-tests/run-all-wasm-api-tests.cc | 9 + .../test/wasm-api-tests/wasm-api-tests.status | 8 + deps/v8/test/wasm-js/tests.tar.gz.sha1 | 2 +- .../v8/test/wasm-spec-tests/tests.tar.gz.sha1 | 2 +- .../wasm-spec-tests/wasm-spec-tests.status | 22 +- deps/v8/third_party/google_benchmark/BUILD.gn | 75 + deps/v8/third_party/google_benchmark/OWNERS | 3 + .../v8/third_party/google_benchmark/README.v8 | 21 + deps/v8/third_party/googletest/BUILD.gn | 38 +- .../src/googletest/include/gtest/gtest_prod.h | 6 +- .../third_party/inspector_protocol/BUILD.gn | 6 +- .../third_party/inspector_protocol/README.v8 | 2 +- .../inspector_protocol/crdtp/serializable.cc | 5 +- .../inspector_protocol/crdtp/status.cc | 2 + .../inspector_protocol/crdtp/status.h | 1 + .../lib/ValueConversions_cpp.template | 4 + .../lib/base_string_adapter_cc.template | 5 +- deps/v8/third_party/inspector_protocol/pdl.py | 3 + deps/v8/third_party/jsoncpp/BUILD.gn | 2 - deps/v8/third_party/zlib/OWNERS | 1 + deps/v8/third_party/zlib/google/OWNERS | 2 + deps/v8/third_party/zlib/google/zip.cc | 140 +- deps/v8/third_party/zlib/google/zip.h | 138 +- .../zlib/google/zip_reader_unittest.cc | 5 +- .../third_party/zlib/google/zip_unittest.cc | 187 +- deps/v8/third_party/zlib/google/zip_writer.cc | 191 +- deps/v8/third_party/zlib/google/zip_writer.h | 63 +- .../tools/clusterfuzz/testdata/baseline/d8.py | 5 + .../tools/clusterfuzz/testdata/build3/d8.py | 7 + .../testdata/failure_output_arch.txt | 50 + .../testdata/failure_output_second.txt | 50 + deps/v8/tools/clusterfuzz/v8_foozzie.py | 87 +- deps/v8/tools/clusterfuzz/v8_foozzie_test.py | 32 +- deps/v8/tools/clusterfuzz/v8_mock.js | 12 +- deps/v8/tools/codemap.mjs | 11 +- deps/v8/tools/cppgc/gen_cmake.py | 4 + .../debug_helper/get-object-properties.cc | 14 +- deps/v8/tools/dev/gm.py | 7 +- deps/v8/tools/dev/v8gen.py | 10 +- .../tools/generate-header-include-checks.py | 2 + deps/v8/tools/mb/mb.py | 17 +- deps/v8/tools/profile.mjs | 13 +- deps/v8/tools/profview/profile-utils.js | 63 +- deps/v8/tools/profview/profview.js | 166 +- deps/v8/tools/release/auto_roll.py | 4 +- deps/v8/tools/release/test_scripts.py | 4 +- deps/v8/tools/system-analyzer/index.css | 2 +- deps/v8/tools/system-analyzer/index.mjs | 14 +- deps/v8/tools/system-analyzer/processor.mjs | 24 +- .../view/code-panel-template.html | 4 +- .../tools/system-analyzer/view/code-panel.mjs | 13 +- deps/v8/tools/system-analyzer/view/helper.mjs | 95 +- .../view/list-panel-template.html | 4 +- .../tools/system-analyzer/view/list-panel.mjs | 20 +- .../view/map-panel-template.html | 2 +- .../tools/system-analyzer/view/map-panel.mjs | 197 +- .../view/map-panel/map-details.mjs | 2 +- .../view/map-panel/map-transitions.mjs | 2 +- .../view/script-panel-template.html | 10 +- .../system-analyzer/view/script-panel.mjs | 6 +- .../view/timeline/timeline-track.mjs | 4 +- .../view/tool-tip-template.html | 1 + .../tools/system-analyzer/view/tool-tip.mjs | 7 +- deps/v8/tools/testrunner/base_runner.py | 36 +- .../v8/tools/testrunner/local/junit_output.py | 49 - deps/v8/tools/testrunner/local/statusfile.py | 2 +- deps/v8/tools/testrunner/local/utils.py | 52 + deps/v8/tools/testrunner/local/variants.py | 20 +- deps/v8/tools/testrunner/outproc/message.py | 8 +- deps/v8/tools/testrunner/standard_runner.py | 2 +- deps/v8/tools/testrunner/testproc/fuzzer.py | 1 + deps/v8/tools/testrunner/testproc/progress.py | 40 - deps/v8/tools/tickprocessor-driver.mjs | 8 +- deps/v8/tools/tickprocessor.mjs | 25 +- .../ubsan/{blacklist.txt => ignorelist.txt} | 2 +- ...vptr_blacklist.txt => vptr_ignorelist.txt} | 6 +- deps/v8/tools/unittests/run_tests_test.py | 3 +- .../testdata/testroot1/v8_build_config.json | 3 + .../testdata/testroot2/v8_build_config.json | 3 + deps/v8/tools/v8.xcodeproj/README.txt | 11 + deps/v8/tools/v8_presubmit.py | 3 + deps/v8/tools/v8heapconst.py | 650 +-- deps/v8/tools/v8windbg/BUILD.gn | 5 +- deps/v8/tools/v8windbg/README.md | 4 - deps/v8/tools/v8windbg/src/list-chunks.cc | 238 - deps/v8/tools/v8windbg/src/list-chunks.h | 100 - .../tools/v8windbg/src/v8windbg-extension.cc | 4 - deps/v8/tools/whitespace.txt | 4 +- 1438 files changed, 54904 insertions(+), 39346 deletions(-) delete mode 100644 deps/v8/src/base/atomicops_internals_portable.h delete mode 100644 deps/v8/src/base/atomicops_internals_std.h create mode 100644 deps/v8/src/base/sanitizer/asan.h rename deps/v8/src/{ => base}/sanitizer/lsan-page-allocator.cc (97%) rename deps/v8/src/{ => base}/sanitizer/lsan-page-allocator.h (86%) rename deps/v8/src/base/{ => sanitizer}/lsan.h (75%) create mode 100644 deps/v8/src/base/sanitizer/msan.h create mode 100644 deps/v8/src/baseline/baseline-osr-inl.h create mode 100644 deps/v8/src/baseline/riscv64/baseline-assembler-riscv64-inl.h create mode 100644 deps/v8/src/baseline/riscv64/baseline-compiler-riscv64-inl.h create mode 100644 deps/v8/src/bigint/bigint-internal.cc create mode 100644 deps/v8/src/bigint/bigint-internal.h create mode 100644 deps/v8/src/bigint/digit-arithmetic.h create mode 100644 deps/v8/src/bigint/mul-schoolbook.cc create mode 100644 deps/v8/src/bigint/vector-arithmetic.h delete mode 100644 deps/v8/src/builtins/builtins-debug-gen.cc create mode 100644 deps/v8/src/codegen/arm/interface-descriptors-arm-inl.h delete mode 100644 deps/v8/src/codegen/arm/interface-descriptors-arm.cc create mode 100644 deps/v8/src/codegen/arm64/interface-descriptors-arm64-inl.h delete mode 100644 deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc create mode 100644 deps/v8/src/codegen/ia32/interface-descriptors-ia32-inl.h delete mode 100644 deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc create mode 100644 deps/v8/src/codegen/interface-descriptors-inl.h create mode 100644 deps/v8/src/codegen/mips/interface-descriptors-mips-inl.h delete mode 100644 deps/v8/src/codegen/mips/interface-descriptors-mips.cc create mode 100644 deps/v8/src/codegen/mips64/interface-descriptors-mips64-inl.h delete mode 100644 deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc create mode 100644 deps/v8/src/codegen/ppc/interface-descriptors-ppc-inl.h delete mode 100644 deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc create mode 100644 deps/v8/src/codegen/riscv64/interface-descriptors-riscv64-inl.h delete mode 100644 deps/v8/src/codegen/riscv64/interface-descriptors-riscv64.cc create mode 100644 deps/v8/src/codegen/s390/interface-descriptors-s390-inl.h delete mode 100644 deps/v8/src/codegen/s390/interface-descriptors-s390.cc create mode 100644 deps/v8/src/codegen/x64/interface-descriptors-x64-inl.h delete mode 100644 deps/v8/src/codegen/x64/interface-descriptors-x64.cc delete mode 100644 deps/v8/src/compiler/backend/ppc/OWNERS create mode 100644 deps/v8/src/compiler/heap-refs.cc delete mode 100644 deps/v8/src/compiler/scheduled-machine-lowering.cc delete mode 100644 deps/v8/src/compiler/scheduled-machine-lowering.h delete mode 100644 deps/v8/src/compiler/simd-scalar-lowering.cc delete mode 100644 deps/v8/src/compiler/simd-scalar-lowering.h delete mode 100644 deps/v8/src/debug/arm/debug-arm.cc delete mode 100644 deps/v8/src/debug/arm64/debug-arm64.cc delete mode 100644 deps/v8/src/debug/ia32/debug-ia32.cc delete mode 100644 deps/v8/src/debug/mips/debug-mips.cc delete mode 100644 deps/v8/src/debug/mips64/debug-mips64.cc delete mode 100644 deps/v8/src/debug/ppc/OWNERS delete mode 100644 deps/v8/src/debug/ppc/debug-ppc.cc delete mode 100644 deps/v8/src/debug/riscv64/debug-riscv64.cc delete mode 100644 deps/v8/src/debug/s390/debug-s390.cc delete mode 100644 deps/v8/src/debug/x64/debug-x64.cc create mode 100644 deps/v8/src/heap/code-range.cc create mode 100644 deps/v8/src/heap/code-range.h create mode 100644 deps/v8/src/heap/cppgc/memory.cc create mode 100644 deps/v8/src/heap/cppgc/memory.h create mode 100644 deps/v8/src/heap/cppgc/object-view.h delete mode 100644 deps/v8/src/heap/cppgc/sanitizers.h delete mode 100644 deps/v8/src/libplatform/tracing/recorder-default.cc create mode 100644 deps/v8/src/libplatform/tracing/recorder-mac.cc delete mode 100644 deps/v8/src/logging/counters-inl.h create mode 100644 deps/v8/src/logging/runtime-call-stats.cc create mode 100644 deps/v8/src/logging/runtime-call-stats.h create mode 100644 deps/v8/src/objects/megadom-handler-inl.h create mode 100644 deps/v8/src/objects/megadom-handler.h create mode 100644 deps/v8/src/objects/megadom-handler.tq delete mode 100644 deps/v8/src/regexp/ppc/OWNERS delete mode 100644 deps/v8/src/sanitizer/asan.h delete mode 100644 deps/v8/src/sanitizer/msan.h delete mode 100644 deps/v8/src/sanitizer/tsan.h delete mode 100644 deps/v8/src/wasm/baseline/ppc/OWNERS create mode 100644 deps/v8/src/wasm/branch-hint-map.h create mode 100644 deps/v8/src/wasm/memory-protection-key.cc create mode 100644 deps/v8/src/wasm/memory-protection-key.h create mode 100644 deps/v8/src/wasm/wasm-init-expr.cc create mode 100644 deps/v8/src/wasm/wasm-init-expr.h create mode 100644 deps/v8/test/cctest/compiler/test-verify-type.cc create mode 100644 deps/v8/test/cctest/heap/test-shared-heap.cc create mode 100644 deps/v8/test/cctest/test-ptr-compr-cage.cc delete mode 100644 deps/v8/test/cctest/wasm/test-run-wasm-simd-scalar-lowering.cc delete mode 100644 deps/v8/test/debugger/debug/debug-liveedit-double-call.js delete mode 100644 deps/v8/test/debugger/debug/debug-liveedit-exceptions.js delete mode 100644 deps/v8/test/debugger/debug/debug-liveedit-replace-code.js delete mode 100644 deps/v8/test/debugger/debug/debug-liveedit-restart-frame.js delete mode 100644 deps/v8/test/debugger/debug/debug-liveedit-stepin.js delete mode 100644 deps/v8/test/debugger/debug/es6/generators-debug-liveedit.js delete mode 100644 deps/v8/test/debugger/debug/es8/debug-async-liveedit.js create mode 100644 deps/v8/test/debugger/regress/regress-crbug-1156498.js delete mode 100644 deps/v8/test/inspector/debugger/access-obsolete-frame-expected.txt delete mode 100644 deps/v8/test/inspector/debugger/access-obsolete-frame.js create mode 100644 deps/v8/test/inspector/debugger/command-line-api-with-arrow-function-expected.txt create mode 100644 deps/v8/test/inspector/debugger/command-line-api-with-arrow-function.js delete mode 100644 deps/v8/test/inspector/debugger/set-script-source-2-expected.txt delete mode 100644 deps/v8/test/inspector/debugger/set-script-source-2.js delete mode 100644 deps/v8/test/inspector/debugger/set-script-source-stack-padding-expected.txt delete mode 100644 deps/v8/test/inspector/debugger/set-script-source-stack-padding.js create mode 100644 deps/v8/test/inspector/debugger/wasm-side-effect-free-debug-evaluate-expected.txt create mode 100644 deps/v8/test/inspector/debugger/wasm-side-effect-free-debug-evaluate.js create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1195927-expected.txt create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1195927.js create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1197392-expected.txt create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1197392.js create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1207867-expected.txt create mode 100644 deps/v8/test/inspector/regress/regress-crbug-1207867.js create mode 100644 deps/v8/test/intl/locale/locale-info-check-property.js create mode 100644 deps/v8/test/intl/locale/locale-info-check-return-types.js create mode 100644 deps/v8/test/intl/locale/locale-info-ext.js create mode 100644 deps/v8/test/mjsunit/baseline/test-osr.js create mode 100644 deps/v8/test/mjsunit/compiler/bigint-asuintn.js create mode 100644 deps/v8/test/mjsunit/compiler/deopt-pretenure.js create mode 100644 deps/v8/test/mjsunit/compiler/fast-api-interface-types.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1195650.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1196185.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1202312.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1202625.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1202924.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1203116.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-crbug-11564.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-crbug-1201011.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-crbug-1201057.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-crbug-1201082.js create mode 100644 deps/v8/test/mjsunit/compiler/test-literal-map-migration.js create mode 100644 deps/v8/test/mjsunit/harmony/error-cause.js create mode 100644 deps/v8/test/mjsunit/harmony/modules-import-assertions-dynamic-12.mjs create mode 100644 deps/v8/test/mjsunit/ic-megadom-2.js create mode 100644 deps/v8/test/mjsunit/ic-megadom.js create mode 100644 deps/v8/test/mjsunit/regress-10782.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1189077.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1201114.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1204748.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1205290.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1207679.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1208782.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1212583.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-1163499.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-1209152.js create mode 100644 deps/v8/test/mjsunit/regress/regress-v8-11290.js create mode 100644 deps/v8/test/mjsunit/regress/regress-v8-11616.js create mode 100644 deps/v8/test/mjsunit/regress/regress-v8-11851.js delete mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-11809.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1196837.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1199662.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1200231.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1202736.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1217064.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1227351.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1228720.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-crbug-1203692.js create mode 100644 deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test-func-info.log.symbols.json create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test-large.default create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test-large.js create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test-large.log create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test-large.log.symbols.json create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test.log.symbols.json create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test.separate-baseline-handlers create mode 100644 deps/v8/test/mjsunit/tools/tickprocessor-test.separate-bytecodes create mode 100644 deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js create mode 100644 deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js create mode 100644 deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js create mode 100644 deps/v8/test/mjsunit/wasm/element-segments-with-reftypes.js delete mode 100644 deps/v8/test/unittests/compiler/ppc/OWNERS create mode 100644 deps/v8/test/unittests/heap/cppgc/allocation-unittest.cc create mode 100644 deps/v8/test/unittests/heap/cppgc/heap-registry-unittest.cc create mode 100644 deps/v8/test/unittests/heap/cppgc/sanitizer-unittest.cc create mode 100644 deps/v8/test/unittests/heap/cppgc/workloads-unittest.cc create mode 100644 deps/v8/test/unittests/logging/runtime-call-stats-unittest.cc create mode 100644 deps/v8/test/unittests/regexp/regexp-unittest.cc create mode 100644 deps/v8/third_party/google_benchmark/BUILD.gn create mode 100644 deps/v8/third_party/google_benchmark/OWNERS create mode 100644 deps/v8/third_party/google_benchmark/README.v8 create mode 100644 deps/v8/tools/clusterfuzz/testdata/failure_output_arch.txt create mode 100644 deps/v8/tools/clusterfuzz/testdata/failure_output_second.txt delete mode 100644 deps/v8/tools/testrunner/local/junit_output.py rename deps/v8/tools/ubsan/{blacklist.txt => ignorelist.txt} (97%) rename deps/v8/tools/ubsan/{vptr_blacklist.txt => vptr_ignorelist.txt} (79%) create mode 100644 deps/v8/tools/v8.xcodeproj/README.txt delete mode 100644 deps/v8/tools/v8windbg/src/list-chunks.cc delete mode 100644 deps/v8/tools/v8windbg/src/list-chunks.h diff --git a/deps/v8/.gn b/deps/v8/.gn index d4ad959954845f..a691fa339b0430 100644 --- a/deps/v8/.gn +++ b/deps/v8/.gn @@ -7,11 +7,21 @@ import("//build/dotfile_settings.gni") # The location of the build configuration file. buildconfig = "//build/config/BUILDCONFIG.gn" +# The python interpreter to use by default. On Windows, this will look +# for python3.exe and python3.bat. +script_executable = "python3" + # These are the targets to check headers for by default. The files in targets # matching these patterns (see "gn help label_pattern" for format) will have # their includes checked for proper dependencies when you run either # "gn check" or "gn gen --check". -check_targets = [] +no_check_targets = [ + "//:cppgc_base", + "//:v8_internal_headers", + "//src/inspector:inspector", + "//test/cctest:cctest_sources", + "//third_party/icu:*", +] # These are the list of GN files that run exec_script. This whitelist exists # to force additional review for new uses of exec_script, which is strongly diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index abfdc7887ba512..15909406cc6ebe 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -84,6 +84,7 @@ Colin Ihrig Cong Zuo Daniel Andersson Daniel Bevenius +Daniel Dromboski Daniel James David Carlier David Manouchehri @@ -229,6 +230,7 @@ Vladimir Krivosheev Vladimir Shutoff Wei Wu Wenlu Wang +Wenyu Zhao Wiktor Garbacz Wouter Vermeiren Xiaofang Zou @@ -240,6 +242,7 @@ Yong Wang Youfeng Hao Yu Yin Yusif Khudhur +Yuri Iozzelli Zac Hansen Zeynep Cankara Zhao Jiazhong diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index d2bfb6129dcf2b..5e3045bfdc1d80 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -41,7 +41,7 @@ declare_args() { v8_enable_future = false # Sets -DSYSTEM_INSTRUMENTATION. Enables OS-dependent event tracing - v8_enable_system_instrumentation = true + v8_enable_system_instrumentation = is_win || is_mac # Sets the GUID for the ETW provider v8_etw_guid = "" @@ -95,8 +95,19 @@ declare_args() { v8_win64_unwinding_info = true # Enable code comments for builtins in the snapshot (impacts performance). + # This also enables v8_code_comments. v8_enable_snapshot_code_comments = false + # Allow runtime-enabled code comments (with --code-comments). Enabled by + # default in debug builds. + # Sets -dV8_CODE_COMMENTS + v8_code_comments = "" + + # Allow runtime-enabled debug code (with --debug-code). Enabled by default in + # debug builds. + # Sets -dV8_ENABLE_DEBUG_CODE + v8_enable_debug_code = "" + # Enable native counters from the snapshot (impacts performance, sets # -dV8_SNAPSHOT_NATIVE_CODE_COUNTERS). # This option will generate extra code in the snapshot to increment counters, @@ -200,10 +211,6 @@ declare_args() { (is_linux || is_chromeos || is_mac)) || (v8_current_cpu == "ppc64" && (is_linux || is_chromeos)) - # Temporary flag to allow embedders to update their microtasks scopes - # while rolling in a new version of V8. - v8_check_microtasks_scopes_consistency = "" - # Enable mitigations for executing untrusted code. # Disabled by default on ia32 due to conflicting requirements with embedded # builtins. Enabled by default on Android since it doesn't support @@ -272,6 +279,10 @@ declare_args() { # Enable heap reservation of size 4GB. Only possible for 64bit archs. cppgc_enable_caged_heap = v8_current_cpu == "x64" || v8_current_cpu == "arm64" + # Enable verification of live bytes in the marking verifier. + # TODO(v8:11785): Enable by default when running with the verifier. + cppgc_enable_verify_live_bytes = false + # Enable young generation in cppgc. cppgc_enable_young_generation = false @@ -300,6 +311,12 @@ declare_args() { # meaning that they are not switched to fast mode. # Sets -DV8_DICT_PROPERTY_CONST_TRACKING v8_dict_property_const_tracking = false + + # Enable map packing & unpacking (sets -dV8_MAP_PACKING). + v8_enable_map_packing = false + + # Allow for JS promise hooks (instead of just C++). + v8_allow_javascript_in_promise_hooks = false } # Derived defaults. @@ -321,9 +338,15 @@ if (v8_enable_test_features == "") { if (v8_enable_v8_checks == "") { v8_enable_v8_checks = v8_enable_debugging_features } -if (v8_check_microtasks_scopes_consistency == "") { - v8_check_microtasks_scopes_consistency = - v8_enable_debugging_features || dcheck_always_on +if (v8_enable_snapshot_code_comments) { + assert(v8_code_comments == true || v8_code_comments == "", + "v8_enable_snapshot_code_comments conflicts with v8_code_comments.") + v8_code_comments = true +} else if (v8_code_comments == "") { + v8_code_comments = v8_enable_debugging_features +} +if (v8_enable_debug_code == "") { + v8_enable_debug_code = v8_enable_debugging_features } if (v8_enable_snapshot_native_code_counters == "") { v8_enable_snapshot_native_code_counters = v8_enable_debugging_features @@ -333,7 +356,7 @@ if (v8_enable_pointer_compression == "") { v8_current_cpu == "arm64" || v8_current_cpu == "x64" } if (v8_enable_pointer_compression_shared_cage == "") { - v8_enable_pointer_compression_shared_cage = false + v8_enable_pointer_compression_shared_cage = v8_enable_pointer_compression } if (v8_enable_fast_torque == "") { v8_enable_fast_torque = v8_enable_fast_mksnapshot @@ -357,6 +380,13 @@ if (v8_enable_atomic_object_field_writes == "") { if (v8_enable_atomic_marking_state == "") { v8_enable_atomic_marking_state = v8_enable_concurrent_marking } +if (v8_enable_third_party_heap) { + v8_disable_write_barriers = true + v8_enable_single_generation = true + v8_enable_shared_ro_heap = false + v8_enable_pointer_compression = false + v8_enable_pointer_compression_shared_cage = false +} assert(!v8_enable_concurrent_marking || v8_enable_atomic_object_field_writes, "Concurrent marking requires atomic object field writes.") assert(!v8_enable_concurrent_marking || v8_enable_atomic_marking_state, @@ -386,7 +416,8 @@ if (v8_enable_short_builtin_calls && v8_enable_short_builtin_calls = false } if (v8_enable_shared_ro_heap == "") { - v8_enable_shared_ro_heap = !v8_enable_pointer_compression + v8_enable_shared_ro_heap = !v8_enable_pointer_compression || + v8_enable_pointer_compression_shared_cage } assert(!v8_disable_write_barriers || v8_enable_single_generation, @@ -398,15 +429,18 @@ assert(v8_current_cpu != "x86" || !v8_untrusted_code_mitigations, assert(v8_current_cpu == "arm64" || !v8_control_flow_integrity, "Control-flow integrity is only supported on arm64") -if (v8_enable_shared_ro_heap && v8_enable_pointer_compression) { +if (v8_enable_shared_ro_heap && v8_enable_pointer_compression && + !v8_enable_pointer_compression_shared_cage) { assert( is_linux || is_chromeos || is_android, "Sharing read-only heap with pointer compression is only supported on Linux or Android") } -assert( - !v8_enable_pointer_compression_shared_cage || !v8_enable_shared_ro_heap, - "Sharing read-only heap is not yet supported when sharing a pointer compression cage") +assert(!v8_enable_map_packing || !v8_enable_pointer_compression, + "Map packing does not support pointer compression") + +assert(!v8_enable_map_packing || v8_current_cpu == "x64", + "Map packing is only supported on x64") assert(!v8_use_multi_snapshots || !v8_control_flow_integrity, "Control-flow integrity does not support multisnapshots") @@ -418,6 +452,10 @@ assert( !v8_enable_pointer_compression_shared_cage || v8_enable_pointer_compression, "Can't share a pointer compression cage if pointers aren't compressed") +assert(!v8_enable_pointer_compression_shared_cage || v8_current_cpu == "x64" || + v8_current_cpu == "arm64", + "Sharing a pointer compression cage is only supported on x64 and arm64") + assert(!v8_enable_unconditional_write_barriers || !v8_disable_write_barriers, "Write barriers can't be both enabled and disabled") @@ -566,6 +604,7 @@ external_v8_defines = [ "V8_IMMINENT_DEPRECATION_WARNINGS", "V8_NO_ARGUMENTS_ADAPTOR", "V8_USE_PERFETTO", + "V8_MAP_PACKING", ] enabled_external_v8_defines = [] @@ -575,11 +614,11 @@ if (v8_enable_v8_checks) { } if (v8_enable_pointer_compression) { enabled_external_v8_defines += [ "V8_COMPRESS_POINTERS" ] -} -if (v8_enable_pointer_compression_shared_cage) { - enabled_external_v8_defines += [ "V8_COMPRESS_POINTERS_IN_SHARED_CAGE" ] -} else if (v8_enable_pointer_compression) { - enabled_external_v8_defines += [ "V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE" ] + if (v8_enable_pointer_compression_shared_cage) { + enabled_external_v8_defines += [ "V8_COMPRESS_POINTERS_IN_SHARED_CAGE" ] + } else { + enabled_external_v8_defines += [ "V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE" ] + } } if (v8_enable_pointer_compression || v8_enable_31bit_smis_on_64bit_arch) { enabled_external_v8_defines += [ "V8_31BIT_SMIS_ON_64BIT_ARCH" ] @@ -599,6 +638,9 @@ if (v8_imminent_deprecation_warnings) { if (v8_use_perfetto) { enabled_external_v8_defines += [ "V8_USE_PERFETTO" ] } +if (v8_enable_map_packing) { + enabled_external_v8_defines += [ "V8_MAP_PACKING" ] +} disabled_external_v8_defines = external_v8_defines - enabled_external_v8_defines @@ -665,6 +707,10 @@ config("features") { ":cppgc_header_features", ] + if (cppgc_enable_verify_live_bytes) { + defines += [ "CPPGC_VERIFY_LIVE_BYTES" ] + } + if (v8_embedder_string != "") { defines += [ "V8_EMBEDDER_STRING=\"$v8_embedder_string\"" ] } @@ -729,6 +775,12 @@ config("features") { if (v8_enable_handle_zapping) { defines += [ "ENABLE_HANDLE_ZAPPING" ] } + if (v8_code_comments == true) { + defines += [ "V8_CODE_COMMENTS" ] + } + if (v8_enable_debug_code) { + defines += [ "V8_ENABLE_DEBUG_CODE" ] + } if (v8_enable_snapshot_native_code_counters) { defines += [ "V8_SNAPSHOT_NATIVE_CODE_COUNTERS" ] } @@ -756,9 +808,6 @@ config("features") { if (v8_enable_lazy_source_positions) { defines += [ "V8_ENABLE_LAZY_SOURCE_POSITIONS" ] } - if (v8_check_microtasks_scopes_consistency) { - defines += [ "V8_CHECK_MICROTASKS_SCOPES_CONSISTENCY" ] - } if (v8_use_multi_snapshots) { defines += [ "V8_MULTI_SNAPSHOTS" ] } @@ -807,6 +856,9 @@ config("features") { if (v8_dict_property_const_tracking) { defines += [ "V8_DICT_PROPERTY_CONST_TRACKING" ] } + if (v8_allow_javascript_in_promise_hooks) { + defines += [ "V8_ALLOW_JAVASCRIPT_IN_PROMISE_HOOKS" ] + } } config("toolchain") { @@ -1038,6 +1090,10 @@ config("toolchain") { defines += [ "ENABLE_VERIFY_CSA" ] } + if (v8_enable_runtime_call_stats) { + defines += [ "V8_RUNTIME_CALL_STATS" ] + } + if (!v8_untrusted_code_mitigations) { defines += [ "DISABLE_UNTRUSTED_CODE_MITIGATIONS" ] } @@ -1244,6 +1300,8 @@ action("postmortem-metadata") { "src/objects/map.cc", "src/objects/map.h", "src/objects/map-inl.h", + "src/objects/megadom-handler.h", + "src/objects/megadom-handler-inl.h", "src/objects/name.h", "src/objects/name-inl.h", "src/objects/objects.h", @@ -1432,6 +1490,7 @@ torque_files = [ "src/objects/js-weak-refs.tq", "src/objects/literal-objects.tq", "src/objects/map.tq", + "src/objects/megadom-handler.tq", "src/objects/microtask.tq", "src/objects/module.tq", "src/objects/name.tq", @@ -1515,44 +1574,37 @@ template("run_torque") { destination_folder = "$target_gen_dir/torque-generated$suffix" - files = [ - "$target_gen_dir/torque-generated/bit-fields.h", - "$target_gen_dir/torque-generated/builtin-definitions.h", - "$target_gen_dir/torque-generated/class-debug-readers.cc", - "$target_gen_dir/torque-generated/class-debug-readers.h", - "$target_gen_dir/torque-generated/class-forward-declarations.h", - "$target_gen_dir/torque-generated/class-verifiers.cc", - "$target_gen_dir/torque-generated/class-verifiers.h", - "$target_gen_dir/torque-generated/csa-types.h", - "$target_gen_dir/torque-generated/debug-macros.cc", - "$target_gen_dir/torque-generated/debug-macros.h", - "$target_gen_dir/torque-generated/enum-verifiers.cc", - "$target_gen_dir/torque-generated/exported-macros-assembler.cc", - "$target_gen_dir/torque-generated/exported-macros-assembler.h", - "$target_gen_dir/torque-generated/factory.cc", - "$target_gen_dir/torque-generated/factory.inc", - "$target_gen_dir/torque-generated/field-offsets.h", - "$target_gen_dir/torque-generated/instance-types.h", - "$target_gen_dir/torque-generated/interface-descriptors.inc", - "$target_gen_dir/torque-generated/objects-body-descriptors-inl.inc", - "$target_gen_dir/torque-generated/objects-printer.cc", + outputs = [ + "$destination_folder/bit-fields.h", + "$destination_folder/builtin-definitions.h", + "$destination_folder/class-debug-readers.cc", + "$destination_folder/class-debug-readers.h", + "$destination_folder/class-forward-declarations.h", + "$destination_folder/class-verifiers.cc", + "$destination_folder/class-verifiers.h", + "$destination_folder/csa-types.h", + "$destination_folder/debug-macros.cc", + "$destination_folder/debug-macros.h", + "$destination_folder/enum-verifiers.cc", + "$destination_folder/exported-macros-assembler.cc", + "$destination_folder/exported-macros-assembler.h", + "$destination_folder/factory.cc", + "$destination_folder/factory.inc", + "$destination_folder/field-offsets.h", + "$destination_folder/instance-types.h", + "$destination_folder/interface-descriptors.inc", + "$destination_folder/objects-body-descriptors-inl.inc", + "$destination_folder/objects-printer.cc", ] - outputs = [] - foreach(file, files) { - outputs += [ string_replace(file, - "$target_gen_dir/torque-generated", - destination_folder) ] - } - foreach(file, torque_files) { filetq = string_replace(file, ".tq", "-tq") outputs += [ - "$target_gen_dir/torque-generated/$filetq-csa.cc", - "$target_gen_dir/torque-generated/$filetq-csa.h", - "$target_gen_dir/torque-generated/$filetq-inl.inc", - "$target_gen_dir/torque-generated/$filetq.cc", - "$target_gen_dir/torque-generated/$filetq.inc", + "$destination_folder/$filetq-csa.cc", + "$destination_folder/$filetq-csa.h", + "$destination_folder/$filetq-inl.inc", + "$destination_folder/$filetq.cc", + "$destination_folder/$filetq.inc", ] } @@ -1892,11 +1944,16 @@ action("v8_dump_build_config") { "v8_enable_atomic_object_field_writes=" + "$v8_enable_atomic_object_field_writes", "v8_enable_concurrent_marking=$v8_enable_concurrent_marking", + "v8_enable_single_generation=$v8_enable_single_generation", "v8_enable_i18n_support=$v8_enable_i18n_support", "v8_enable_verify_predictable=$v8_enable_verify_predictable", "v8_enable_verify_csa=$v8_enable_verify_csa", "v8_enable_lite_mode=$v8_enable_lite_mode", + "v8_enable_runtime_call_stats=$v8_enable_runtime_call_stats", "v8_enable_pointer_compression=$v8_enable_pointer_compression", + "v8_enable_pointer_compression_shared_cage=" + + "$v8_enable_pointer_compression_shared_cage", + "v8_enable_third_party_heap=$v8_enable_third_party_heap", "v8_enable_webassembly=$v8_enable_webassembly", "v8_control_flow_integrity=$v8_control_flow_integrity", "v8_target_cpu=\"$v8_target_cpu\"", @@ -1918,7 +1975,10 @@ action("v8_dump_build_config") { v8_source_set("v8_snapshot") { visibility = [ ":*" ] # Targets in this file can depend on this. - deps = [] + deps = [ + ":v8_internal_headers", + ":v8_libbase", + ] public_deps = [ # This should be public so downstream targets can declare the snapshot # output file as their inputs. @@ -2000,7 +2060,6 @@ v8_source_set("v8_initializers") { "src/builtins/builtins-conversion-gen.cc", "src/builtins/builtins-data-view-gen.h", "src/builtins/builtins-date-gen.cc", - "src/builtins/builtins-debug-gen.cc", "src/builtins/builtins-generator-gen.cc", "src/builtins/builtins-global-gen.cc", "src/builtins/builtins-handler-gen.cc", @@ -2226,9 +2285,8 @@ if (v8_generate_external_defines_header) { v8_header_set("v8_shared_internal_headers") { visibility = [ ":*", - "test/cctest:*", - "test/unittests:*", - "tools/debug_helper/:*", + "test/*", + "tools/*", ] configs = [ ":internal_config" ] @@ -2245,7 +2303,10 @@ v8_header_set("v8_shared_internal_headers") { } v8_header_set("v8_flags") { - visibility = [ ":*" ] + visibility = [ + ":*", + "tools/*", + ] configs = [ ":internal_config" ] @@ -2273,6 +2334,7 @@ v8_header_set("v8_internal_headers") { "src/api/api-arguments-inl.h", "src/api/api-arguments.h", "src/api/api-inl.h", + "src/api/api-macros-undef.h", "src/api/api-macros.h", "src/api/api-natives.h", "src/api/api.h", @@ -2289,6 +2351,7 @@ v8_header_set("v8_internal_headers") { "src/baseline/baseline-assembler-inl.h", "src/baseline/baseline-assembler.h", "src/baseline/baseline-compiler.h", + "src/baseline/baseline-osr-inl.h", "src/baseline/baseline.h", "src/baseline/bytecode-offset-iterator.h", "src/builtins/accessors.h", @@ -2321,6 +2384,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/external-reference.h", "src/codegen/flush-instruction-cache.h", "src/codegen/handler-table.h", + "src/codegen/interface-descriptors-inl.h", "src/codegen/interface-descriptors.h", "src/codegen/label.h", "src/codegen/machine-type.h", @@ -2382,6 +2446,7 @@ v8_header_set("v8_internal_headers") { "src/compiler/common-operator-reducer.h", "src/compiler/common-operator.h", "src/compiler/compilation-dependencies.h", + "src/compiler/compilation-dependency.h", "src/compiler/compiler-source-position-table.h", "src/compiler/constant-folding-reducer.h", "src/compiler/control-equivalence.h", @@ -2448,18 +2513,17 @@ v8_header_set("v8_internal_headers") { "src/compiler/persistent-map.h", "src/compiler/pipeline-statistics.h", "src/compiler/pipeline.h", + "src/compiler/processed-feedback.h", "src/compiler/property-access-builder.h", "src/compiler/raw-machine-assembler.h", "src/compiler/redundancy-elimination.h", "src/compiler/refs-map.h", "src/compiler/representation-change.h", "src/compiler/schedule.h", - "src/compiler/scheduled-machine-lowering.h", "src/compiler/scheduler.h", "src/compiler/select-lowering.h", "src/compiler/serializer-for-background-compilation.h", "src/compiler/serializer-hints.h", - "src/compiler/simd-scalar-lowering.h", "src/compiler/simplified-lowering.h", "src/compiler/simplified-operator-reducer.h", "src/compiler/simplified-operator.h", @@ -2517,6 +2581,7 @@ v8_header_set("v8_internal_headers") { "src/execution/interrupts-scope.h", "src/execution/isolate-data.h", "src/execution/isolate-inl.h", + "src/execution/isolate-utils-inl.h", "src/execution/isolate-utils.h", "src/execution/isolate.h", "src/execution/local-isolate-inl.h", @@ -2557,6 +2622,7 @@ v8_header_set("v8_internal_headers") { "src/heap/base-space.h", "src/heap/basic-memory-chunk.h", "src/heap/code-object-registry.h", + "src/heap/code-range.h", "src/heap/code-stats.h", "src/heap/collection-barrier.h", "src/heap/combined-heap.h", @@ -2592,11 +2658,13 @@ v8_header_set("v8_internal_headers") { "src/heap/list.h", "src/heap/local-allocator-inl.h", "src/heap/local-allocator.h", + "src/heap/local-factory-inl.h", "src/heap/local-factory.h", "src/heap/local-heap-inl.h", "src/heap/local-heap.h", "src/heap/mark-compact-inl.h", "src/heap/mark-compact.h", + "src/heap/marking-barrier-inl.h", "src/heap/marking-barrier.h", "src/heap/marking-visitor-inl.h", "src/heap/marking-visitor.h", @@ -2679,13 +2747,13 @@ v8_header_set("v8_internal_headers") { "src/libsampler/sampler.h", "src/logging/code-events.h", "src/logging/counters-definitions.h", - "src/logging/counters-inl.h", "src/logging/counters.h", "src/logging/local-logger.h", "src/logging/log-inl.h", "src/logging/log-utils.h", "src/logging/log.h", "src/logging/metrics.h", + "src/logging/runtime-call-stats.h", "src/logging/tracing-flags.h", "src/numbers/bignum-dtoa.h", "src/numbers/bignum.h", @@ -2766,6 +2834,7 @@ v8_header_set("v8_internal_headers") { "src/objects/js-array-inl.h", "src/objects/js-array.h", "src/objects/js-collection-inl.h", + "src/objects/js-collection-iterator-inl.h", "src/objects/js-collection-iterator.h", "src/objects/js-collection.h", "src/objects/js-function-inl.h", @@ -2782,6 +2851,8 @@ v8_header_set("v8_internal_headers") { "src/objects/js-regexp-string-iterator-inl.h", "src/objects/js-regexp-string-iterator.h", "src/objects/js-regexp.h", + "src/objects/js-segments-inl.h", + "src/objects/js-segments.h", "src/objects/js-weak-refs-inl.h", "src/objects/js-weak-refs.h", "src/objects/keys.h", @@ -2797,6 +2868,8 @@ v8_header_set("v8_internal_headers") { "src/objects/map.h", "src/objects/maybe-object-inl.h", "src/objects/maybe-object.h", + "src/objects/megadom-handler-inl.h", + "src/objects/megadom-handler.h", "src/objects/microtask-inl.h", "src/objects/microtask.h", "src/objects/module-inl.h", @@ -2831,6 +2904,7 @@ v8_header_set("v8_internal_headers") { "src/objects/property.h", "src/objects/prototype-info-inl.h", "src/objects/prototype-info.h", + "src/objects/prototype-inl.h", "src/objects/prototype.h", "src/objects/regexp-match-info.h", "src/objects/scope-info-inl.h", @@ -2842,6 +2916,7 @@ v8_header_set("v8_internal_headers") { "src/objects/slots-atomic-inl.h", "src/objects/slots-inl.h", "src/objects/slots.h", + "src/objects/source-text-module-inl.h", "src/objects/source-text-module.h", "src/objects/stack-frame-info-inl.h", "src/objects/stack-frame-info.h", @@ -2880,6 +2955,7 @@ v8_header_set("v8_internal_headers") { "src/parsing/expression-scope.h", "src/parsing/func-name-inferrer.h", "src/parsing/import-assertions.h", + "src/parsing/keywords-gen.h", "src/parsing/literal-buffer.h", "src/parsing/parse-info.h", "src/parsing/parser-base.h", @@ -2892,6 +2968,7 @@ v8_header_set("v8_internal_headers") { "src/parsing/preparser.h", "src/parsing/rewriter.h", "src/parsing/scanner-character-streams.h", + "src/parsing/scanner-inl.h", "src/parsing/scanner.h", "src/parsing/token.h", "src/profiler/allocation-tracker.h", @@ -2939,10 +3016,6 @@ v8_header_set("v8_internal_headers") { "src/roots/roots.h", "src/runtime/runtime-utils.h", "src/runtime/runtime.h", - "src/sanitizer/asan.h", - "src/sanitizer/lsan-page-allocator.h", - "src/sanitizer/msan.h", - "src/sanitizer/tsan.h", "src/snapshot/code-serializer.h", "src/snapshot/context-deserializer.h", "src/snapshot/context-serializer.h", @@ -2980,6 +3053,7 @@ v8_header_set("v8_internal_headers") { "src/tasks/task-utils.h", "src/third_party/siphash/halfsiphash.h", "src/third_party/utf8-decoder/utf8-decoder.h", + "src/torque/runtime-macro-shims.h", "src/tracing/trace-event.h", "src/tracing/traced-value.h", "src/tracing/tracing-category-observer.h", @@ -3046,6 +3120,7 @@ v8_header_set("v8_internal_headers") { "src/wasm/jump-table-assembler.h", "src/wasm/leb-helper.h", "src/wasm/local-decl-encoder.h", + "src/wasm/memory-protection-key.h", "src/wasm/memory-tracing.h", "src/wasm/module-compiler.h", "src/wasm/module-decoder.h", @@ -3063,6 +3138,7 @@ v8_header_set("v8_internal_headers") { "src/wasm/wasm-feature-flags.h", "src/wasm/wasm-features.h", "src/wasm/wasm-import-wrapper-cache.h", + "src/wasm/wasm-init-expr.h", "src/wasm/wasm-js.h", "src/wasm/wasm-linkage.h", "src/wasm/wasm-module-builder.h", @@ -3070,6 +3146,7 @@ v8_header_set("v8_internal_headers") { "src/wasm/wasm-module.h", "src/wasm/wasm-objects-inl.h", "src/wasm/wasm-objects.h", + "src/wasm/wasm-opcodes-inl.h", "src/wasm/wasm-opcodes.h", "src/wasm/wasm-result.h", "src/wasm/wasm-serialization.h", @@ -3140,6 +3217,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/ia32/assembler-ia32-inl.h", "src/codegen/ia32/assembler-ia32.h", "src/codegen/ia32/constants-ia32.h", + "src/codegen/ia32/interface-descriptors-ia32-inl.h", "src/codegen/ia32/macro-assembler-ia32.h", "src/codegen/ia32/register-ia32.h", "src/codegen/ia32/sse-instr.h", @@ -3158,6 +3236,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/x64/assembler-x64.h", "src/codegen/x64/constants-x64.h", "src/codegen/x64/fma-instr.h", + "src/codegen/x64/interface-descriptors-x64-inl.h", "src/codegen/x64/macro-assembler-x64.h", "src/codegen/x64/register-x64.h", "src/codegen/x64/sse-instr.h", @@ -3187,6 +3266,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/arm/assembler-arm-inl.h", "src/codegen/arm/assembler-arm.h", "src/codegen/arm/constants-arm.h", + "src/codegen/arm/interface-descriptors-arm-inl.h", "src/codegen/arm/macro-assembler-arm.h", "src/codegen/arm/register-arm.h", "src/compiler/backend/arm/instruction-codes-arm.h", @@ -3206,6 +3286,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/arm64/decoder-arm64-inl.h", "src/codegen/arm64/decoder-arm64.h", "src/codegen/arm64/instructions-arm64.h", + "src/codegen/arm64/interface-descriptors-arm64-inl.h", "src/codegen/arm64/macro-assembler-arm64-inl.h", "src/codegen/arm64/macro-assembler-arm64.h", "src/codegen/arm64/register-arm64.h", @@ -3259,11 +3340,10 @@ v8_header_set("v8_internal_headers") { ] } else if (v8_current_cpu == "ppc") { sources += [ ### gcmole(arch:ppc) ### - "src/baseline/ppc/baseline-assembler-ppc-inl.h", - "src/baseline/ppc/baseline-compiler-ppc-inl.h", "src/codegen/ppc/assembler-ppc-inl.h", "src/codegen/ppc/assembler-ppc.h", "src/codegen/ppc/constants-ppc.h", + "src/codegen/ppc/interface-descriptors-ppc-inl.h", "src/codegen/ppc/macro-assembler-ppc.h", "src/codegen/ppc/register-ppc.h", "src/compiler/backend/ppc/instruction-codes-ppc.h", @@ -3275,11 +3355,10 @@ v8_header_set("v8_internal_headers") { ] } else if (v8_current_cpu == "ppc64") { sources += [ ### gcmole(arch:ppc64) ### - "src/baseline/ppc/baseline-assembler-ppc-inl.h", - "src/baseline/ppc/baseline-compiler-ppc-inl.h", "src/codegen/ppc/assembler-ppc-inl.h", "src/codegen/ppc/assembler-ppc.h", "src/codegen/ppc/constants-ppc.h", + "src/codegen/ppc/interface-descriptors-ppc-inl.h", "src/codegen/ppc/macro-assembler-ppc.h", "src/codegen/ppc/register-ppc.h", "src/compiler/backend/ppc/instruction-codes-ppc.h", @@ -3296,6 +3375,7 @@ v8_header_set("v8_internal_headers") { "src/codegen/s390/assembler-s390-inl.h", "src/codegen/s390/assembler-s390.h", "src/codegen/s390/constants-s390.h", + "src/codegen/s390/interface-descriptors-s390-inl.h", "src/codegen/s390/macro-assembler-s390.h", "src/codegen/s390/register-s390.h", "src/compiler/backend/s390/instruction-codes-s390.h", @@ -3384,6 +3464,7 @@ v8_compiler_sources = [ "src/compiler/graph-trimmer.cc", "src/compiler/graph-visualizer.cc", "src/compiler/graph.cc", + "src/compiler/heap-refs.cc", "src/compiler/js-call-reducer.cc", "src/compiler/js-context-specialization.cc", "src/compiler/js-create-lowering.cc", @@ -3430,7 +3511,6 @@ v8_compiler_sources = [ "src/compiler/refs-map.cc", "src/compiler/representation-change.cc", "src/compiler/schedule.cc", - "src/compiler/scheduled-machine-lowering.cc", "src/compiler/scheduler.cc", "src/compiler/select-lowering.cc", "src/compiler/serializer-for-background-compilation.cc", @@ -3452,7 +3532,6 @@ v8_compiler_sources = [ if (v8_enable_webassembly) { v8_compiler_sources += [ "src/compiler/int64-lowering.cc", - "src/compiler/simd-scalar-lowering.cc", "src/compiler/wasm-compiler.cc", ] } @@ -3676,6 +3755,7 @@ v8_source_set("v8_base_without_compiler") { "src/heap/base-space.cc", "src/heap/basic-memory-chunk.cc", "src/heap/code-object-registry.cc", + "src/heap/code-range.cc", "src/heap/code-stats.cc", "src/heap/collection-barrier.cc", "src/heap/combined-heap.cc", @@ -3763,6 +3843,7 @@ v8_source_set("v8_base_without_compiler") { "src/logging/log-utils.cc", "src/logging/log.cc", "src/logging/metrics.cc", + "src/logging/runtime-call-stats.cc", "src/logging/tracing-flags.cc", "src/numbers/bignum-dtoa.cc", "src/numbers/bignum.cc", @@ -3908,7 +3989,6 @@ v8_source_set("v8_base_without_compiler") { "src/runtime/runtime-typedarray.cc", "src/runtime/runtime-weak-refs.cc", "src/runtime/runtime.cc", - "src/sanitizer/lsan-page-allocator.cc", "src/snapshot/code-serializer.cc", "src/snapshot/context-deserializer.cc", "src/snapshot/context-serializer.cc", @@ -3977,6 +4057,7 @@ v8_source_set("v8_base_without_compiler") { "src/wasm/graph-builder-interface.cc", "src/wasm/jump-table-assembler.cc", "src/wasm/local-decl-encoder.cc", + "src/wasm/memory-protection-key.cc", "src/wasm/memory-tracing.cc", "src/wasm/module-compiler.cc", "src/wasm/module-decoder.cc", @@ -3988,10 +4069,12 @@ v8_source_set("v8_base_without_compiler") { "src/wasm/value-type.cc", "src/wasm/wasm-code-manager.cc", "src/wasm/wasm-debug.cc", + "src/wasm/wasm-debug.h", "src/wasm/wasm-engine.cc", "src/wasm/wasm-external-refs.cc", "src/wasm/wasm-features.cc", "src/wasm/wasm-import-wrapper-cache.cc", + "src/wasm/wasm-init-expr.cc", "src/wasm/wasm-js.cc", "src/wasm/wasm-module-builder.cc", "src/wasm/wasm-module-sourcemap.cc", @@ -4007,7 +4090,10 @@ v8_source_set("v8_base_without_compiler") { if (v8_enable_third_party_heap) { sources += v8_third_party_heap_files } else { - sources += [ "src/heap/third-party/heap-api-stub.cc" ] + sources += [ + "src/heap/third-party/heap-api-stub.cc", + "src/heap/third-party/heap-api.h", + ] } if (v8_enable_conservative_stack_scanning) { @@ -4027,24 +4113,15 @@ v8_source_set("v8_base_without_compiler") { ] } - if (v8_check_header_includes) { - # This file will be generated by tools/generate-header-include-checks.py - # if the "check_v8_header_includes" gclient variable is set. - import("check-header-includes/sources.gni") - sources += check_header_includes_sources - } - if (v8_current_cpu == "x86") { sources += [ ### gcmole(arch:ia32) ### "src/codegen/ia32/assembler-ia32.cc", "src/codegen/ia32/cpu-ia32.cc", - "src/codegen/ia32/interface-descriptors-ia32.cc", "src/codegen/ia32/macro-assembler-ia32.cc", "src/codegen/shared-ia32-x64/macro-assembler-shared-ia32-x64.cc", "src/compiler/backend/ia32/code-generator-ia32.cc", "src/compiler/backend/ia32/instruction-scheduler-ia32.cc", "src/compiler/backend/ia32/instruction-selector-ia32.cc", - "src/debug/ia32/debug-ia32.cc", "src/deoptimizer/ia32/deoptimizer-ia32.cc", "src/diagnostics/ia32/disasm-ia32.cc", "src/diagnostics/ia32/unwinder-ia32.cc", @@ -4056,13 +4133,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/shared-ia32-x64/macro-assembler-shared-ia32-x64.cc", "src/codegen/x64/assembler-x64.cc", "src/codegen/x64/cpu-x64.cc", - "src/codegen/x64/interface-descriptors-x64.cc", "src/codegen/x64/macro-assembler-x64.cc", "src/compiler/backend/x64/code-generator-x64.cc", "src/compiler/backend/x64/instruction-scheduler-x64.cc", "src/compiler/backend/x64/instruction-selector-x64.cc", "src/compiler/backend/x64/unwinding-info-writer-x64.cc", - "src/debug/x64/debug-x64.cc", "src/deoptimizer/x64/deoptimizer-x64.cc", "src/diagnostics/x64/disasm-x64.cc", "src/diagnostics/x64/eh-frame-x64.cc", @@ -4091,13 +4166,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/arm/assembler-arm.cc", "src/codegen/arm/constants-arm.cc", "src/codegen/arm/cpu-arm.cc", - "src/codegen/arm/interface-descriptors-arm.cc", "src/codegen/arm/macro-assembler-arm.cc", "src/compiler/backend/arm/code-generator-arm.cc", "src/compiler/backend/arm/instruction-scheduler-arm.cc", "src/compiler/backend/arm/instruction-selector-arm.cc", "src/compiler/backend/arm/unwinding-info-writer-arm.cc", - "src/debug/arm/debug-arm.cc", "src/deoptimizer/arm/deoptimizer-arm.cc", "src/diagnostics/arm/disasm-arm.cc", "src/diagnostics/arm/eh-frame-arm.cc", @@ -4113,7 +4186,6 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/arm64/decoder-arm64.cc", "src/codegen/arm64/instructions-arm64-constants.cc", "src/codegen/arm64/instructions-arm64.cc", - "src/codegen/arm64/interface-descriptors-arm64.cc", "src/codegen/arm64/macro-assembler-arm64.cc", "src/codegen/arm64/register-arm64.cc", "src/codegen/arm64/utils-arm64.cc", @@ -4121,7 +4193,6 @@ v8_source_set("v8_base_without_compiler") { "src/compiler/backend/arm64/instruction-scheduler-arm64.cc", "src/compiler/backend/arm64/instruction-selector-arm64.cc", "src/compiler/backend/arm64/unwinding-info-writer-arm64.cc", - "src/debug/arm64/debug-arm64.cc", "src/deoptimizer/arm64/deoptimizer-arm64.cc", "src/diagnostics/arm64/disasm-arm64.cc", "src/diagnostics/arm64/eh-frame-arm64.cc", @@ -4146,12 +4217,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/mips/assembler-mips.cc", "src/codegen/mips/constants-mips.cc", "src/codegen/mips/cpu-mips.cc", - "src/codegen/mips/interface-descriptors-mips.cc", + "src/codegen/mips/interface-descriptors-mips-inl.h", "src/codegen/mips/macro-assembler-mips.cc", "src/compiler/backend/mips/code-generator-mips.cc", "src/compiler/backend/mips/instruction-scheduler-mips.cc", "src/compiler/backend/mips/instruction-selector-mips.cc", - "src/debug/mips/debug-mips.cc", "src/deoptimizer/mips/deoptimizer-mips.cc", "src/diagnostics/mips/disasm-mips.cc", "src/diagnostics/mips/unwinder-mips.cc", @@ -4164,12 +4234,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/mips64/assembler-mips64.cc", "src/codegen/mips64/constants-mips64.cc", "src/codegen/mips64/cpu-mips64.cc", - "src/codegen/mips64/interface-descriptors-mips64.cc", + "src/codegen/mips64/interface-descriptors-mips64-inl.h", "src/codegen/mips64/macro-assembler-mips64.cc", "src/compiler/backend/mips64/code-generator-mips64.cc", "src/compiler/backend/mips64/instruction-scheduler-mips64.cc", "src/compiler/backend/mips64/instruction-selector-mips64.cc", - "src/debug/mips64/debug-mips64.cc", "src/deoptimizer/mips64/deoptimizer-mips64.cc", "src/diagnostics/mips64/disasm-mips64.cc", "src/diagnostics/mips64/unwinder-mips64.cc", @@ -4182,13 +4251,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/ppc/assembler-ppc.cc", "src/codegen/ppc/constants-ppc.cc", "src/codegen/ppc/cpu-ppc.cc", - "src/codegen/ppc/interface-descriptors-ppc.cc", "src/codegen/ppc/macro-assembler-ppc.cc", "src/compiler/backend/ppc/code-generator-ppc.cc", "src/compiler/backend/ppc/instruction-scheduler-ppc.cc", "src/compiler/backend/ppc/instruction-selector-ppc.cc", "src/compiler/backend/ppc/unwinding-info-writer-ppc.cc", - "src/debug/ppc/debug-ppc.cc", "src/deoptimizer/ppc/deoptimizer-ppc.cc", "src/diagnostics/ppc/disasm-ppc.cc", "src/diagnostics/ppc/eh-frame-ppc.cc", @@ -4202,13 +4269,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/ppc/assembler-ppc.cc", "src/codegen/ppc/constants-ppc.cc", "src/codegen/ppc/cpu-ppc.cc", - "src/codegen/ppc/interface-descriptors-ppc.cc", "src/codegen/ppc/macro-assembler-ppc.cc", "src/compiler/backend/ppc/code-generator-ppc.cc", "src/compiler/backend/ppc/instruction-scheduler-ppc.cc", "src/compiler/backend/ppc/instruction-selector-ppc.cc", "src/compiler/backend/ppc/unwinding-info-writer-ppc.cc", - "src/debug/ppc/debug-ppc.cc", "src/deoptimizer/ppc/deoptimizer-ppc.cc", "src/diagnostics/ppc/disasm-ppc.cc", "src/diagnostics/ppc/eh-frame-ppc.cc", @@ -4222,13 +4287,11 @@ v8_source_set("v8_base_without_compiler") { "src/codegen/s390/assembler-s390.cc", "src/codegen/s390/constants-s390.cc", "src/codegen/s390/cpu-s390.cc", - "src/codegen/s390/interface-descriptors-s390.cc", "src/codegen/s390/macro-assembler-s390.cc", "src/compiler/backend/s390/code-generator-s390.cc", "src/compiler/backend/s390/instruction-scheduler-s390.cc", "src/compiler/backend/s390/instruction-selector-s390.cc", "src/compiler/backend/s390/unwinding-info-writer-s390.cc", - "src/debug/s390/debug-s390.cc", "src/deoptimizer/s390/deoptimizer-s390.cc", "src/diagnostics/s390/disasm-s390.cc", "src/diagnostics/s390/eh-frame-s390.cc", @@ -4239,15 +4302,17 @@ v8_source_set("v8_base_without_compiler") { ] } else if (v8_current_cpu == "riscv64") { sources += [ ### gcmole(arch:riscv64) ### + "src/baseline/riscv64/baseline-assembler-riscv64-inl.h", + "src/baseline/riscv64/baseline-compiler-riscv64-inl.h", + "src/codegen/riscv64/assembler-riscv64-inl.h", "src/codegen/riscv64/assembler-riscv64.cc", "src/codegen/riscv64/constants-riscv64.cc", "src/codegen/riscv64/cpu-riscv64.cc", - "src/codegen/riscv64/interface-descriptors-riscv64.cc", + "src/codegen/riscv64/interface-descriptors-riscv64-inl.h", "src/codegen/riscv64/macro-assembler-riscv64.cc", "src/compiler/backend/riscv64/code-generator-riscv64.cc", "src/compiler/backend/riscv64/instruction-scheduler-riscv64.cc", "src/compiler/backend/riscv64/instruction-selector-riscv64.cc", - "src/debug/riscv64/debug-riscv64.cc", "src/deoptimizer/riscv64/deoptimizer-riscv64.cc", "src/diagnostics/riscv64/disasm-riscv64.cc", "src/diagnostics/riscv64/unwinder-riscv64.cc", @@ -4497,8 +4562,6 @@ v8_component("v8_libbase") { "src/base/atomic-utils.h", "src/base/atomicops.h", "src/base/atomicops_internals_atomicword_compat.h", - "src/base/atomicops_internals_portable.h", - "src/base/atomicops_internals_std.h", "src/base/base-export.h", "src/base/bit-field.h", "src/base/bits-iterator.h", @@ -4532,7 +4595,6 @@ v8_component("v8_libbase") { "src/base/lazy-instance.h", "src/base/logging.cc", "src/base/logging.h", - "src/base/lsan.h", "src/base/macros.h", "src/base/memory.h", "src/base/once.cc", @@ -4558,6 +4620,11 @@ v8_component("v8_libbase") { "src/base/safe_conversions.h", "src/base/safe_conversions_arm_impl.h", "src/base/safe_conversions_impl.h", + "src/base/sanitizer/asan.h", + "src/base/sanitizer/lsan-page-allocator.cc", + "src/base/sanitizer/lsan-page-allocator.h", + "src/base/sanitizer/lsan.h", + "src/base/sanitizer/msan.h", "src/base/small-vector.h", "src/base/sys-info.cc", "src/base/sys-info.h", @@ -4694,9 +4761,11 @@ v8_component("v8_libbase") { if (is_tsan && !build_with_chromium) { data += [ "tools/sanitizers/tsan_suppressions.txt" ] + } - # llvm-symbolizer uses libstdc++ from the clang package. - data += [ "//third_party/llvm-build/Release+Asserts/lib/libstdc++.so.6" ] + if (using_sanitizer && !build_with_chromium) { + data_deps += + [ "//build/config/clang:llvm-symbolizer_data($host_toolchain)" ] } # TODO(jochen): Add support for qnx, freebsd, openbsd, netbsd, and solaris. @@ -4720,8 +4789,6 @@ v8_component("v8_libplatform") { "src/libplatform/delayed-task-queue.h", "src/libplatform/task-queue.cc", "src/libplatform/task-queue.h", - "src/libplatform/tracing/recorder-default.cc", - "src/libplatform/tracing/recorder.h", "src/libplatform/tracing/trace-buffer.cc", "src/libplatform/tracing/trace-buffer.h", "src/libplatform/tracing/trace-config.cc", @@ -4752,8 +4819,6 @@ v8_component("v8_libplatform") { if (v8_use_perfetto) { sources -= [ "//base/trace_event/common/trace_event_common.h", - "src/libplatform/tracing/recorder-default.cc", - "src/libplatform/tracing/recorder.h", "src/libplatform/tracing/trace-buffer.cc", "src/libplatform/tracing/trace-buffer.h", "src/libplatform/tracing/trace-object.cc", @@ -4768,9 +4833,15 @@ v8_component("v8_libplatform") { # TODO(skyostil): Switch TraceEventListener to protozero. "//third_party/perfetto/protos/perfetto/trace:lite", ] - } else if (is_win) { - sources -= [ "src/libplatform/tracing/recorder-default.cc" ] - sources += [ "src/libplatform/tracing/recorder-win.cc" ] + } + + if (v8_enable_system_instrumentation) { + sources += [ "src/libplatform/tracing/recorder.h" ] + if (is_mac) { + sources += [ "src/libplatform/tracing/recorder-mac.cc" ] + } else if (is_win) { + sources += [ "src/libplatform/tracing/recorder-win.cc" ] + } } } @@ -4794,8 +4865,13 @@ v8_source_set("fuzzer_support") { v8_source_set("v8_bigint") { sources = [ + "src/bigint/bigint-internal.cc", + "src/bigint/bigint-internal.h", "src/bigint/bigint.h", + "src/bigint/digit-arithmetic.h", + "src/bigint/mul-schoolbook.cc", "src/bigint/vector-arithmetic.cc", + "src/bigint/vector-arithmetic.h", ] configs = [ ":internal_config" ] @@ -4807,7 +4883,6 @@ v8_source_set("v8_cppgc_shared") { "src/heap/base/stack.h", "src/heap/base/worklist.cc", "src/heap/base/worklist.h", - "src/heap/cppgc/sanitizers.h", ] if (is_clang || !is_win) { @@ -4954,6 +5029,8 @@ v8_source_set("cppgc_base") { "src/heap/cppgc/marking-visitor.h", "src/heap/cppgc/marking-worklists.cc", "src/heap/cppgc/marking-worklists.h", + "src/heap/cppgc/memory.cc", + "src/heap/cppgc/memory.h", "src/heap/cppgc/metric-recorder.h", "src/heap/cppgc/name-trait.cc", "src/heap/cppgc/object-allocator.cc", @@ -4961,6 +5038,7 @@ v8_source_set("cppgc_base") { "src/heap/cppgc/object-poisoner.h", "src/heap/cppgc/object-size-trait.cc", "src/heap/cppgc/object-start-bitmap.h", + "src/heap/cppgc/object-view.h", "src/heap/cppgc/page-memory.cc", "src/heap/cppgc/page-memory.h", "src/heap/cppgc/persistent-node.cc", @@ -5032,6 +5110,35 @@ v8_source_set("cppgc_base_for_testing") { public_deps = [ ":cppgc_base" ] } +if (v8_check_header_includes) { + # This file will be generated by tools/generate-header-include-checks.py + # if the "check_v8_header_includes" gclient variable is set. + import("check-header-includes/sources.gni") + v8_source_set("check_headers") { + configs = [ ":internal_config" ] + sources = check_header_includes_sources + + # Any rules that contain headers files should be added here either directly + # or indirectly by including something that has it transitively in its + # public_deps. + deps = [ + ":d8", + ":mksnapshot", + ":torque_base", + ":torque_ls_base", + ":v8_base_without_compiler", + ":v8_bigint", + ":v8_initializers", + ":v8_internal_headers", + ":v8_libbase", + ":v8_maybe_icu", + ":wee8", + "src/inspector:inspector", + "src/inspector:inspector_string_conversions", + ] + } +} + ############################################################################### # Produce a single static library for embedders # @@ -5284,6 +5391,10 @@ group("gn_all") { if (want_v8_shell) { deps += [ ":v8_shell" ] } + + if (v8_check_header_includes) { + deps += [ ":check_headers" ] + } } group("v8_python_base") { @@ -6199,9 +6310,7 @@ if (!build_with_chromium && v8_use_perfetto) { configs = [ ":v8_tracing_config" ] public_configs = [ "//third_party/perfetto/gn:public_config" ] deps = [ - "//third_party/perfetto/src/trace_processor:export_json", "//third_party/perfetto/src/trace_processor:storage_minimal", - "//third_party/perfetto/src/tracing:client_api", "//third_party/perfetto/src/tracing/core", # TODO(skyostil): Support non-POSIX platforms. @@ -6210,5 +6319,11 @@ if (!build_with_chromium && v8_use_perfetto) { "//third_party/perfetto/src/tracing:in_process_backend", "//third_party/perfetto/src/tracing:platform_impl", ] + + public_deps = [ + "//third_party/perfetto/include/perfetto/trace_processor", + "//third_party/perfetto/src/trace_processor:export_json", + "//third_party/perfetto/src/tracing:client_api", + ] } } # if (!build_with_chromium && v8_use_perfetto) diff --git a/deps/v8/DEPS b/deps/v8/DEPS index b27a4e8e8fada7..d3de2c5ddc9eaf 100644 --- a/deps/v8/DEPS +++ b/deps/v8/DEPS @@ -9,7 +9,6 @@ gclient_gn_args = [ # TODO(https://crbug.com/1137662, https://crbug.com/1080854) # Remove when migration is complete. 'checkout_fuchsia_for_arm64_host', - 'checkout_google_benchmark', ] vars = { @@ -44,13 +43,11 @@ vars = { 'download_jsfunfuzz': False, 'check_v8_header_includes': False, - 'checkout_google_benchmark' : False, - # GN CIPD package version. - 'gn_version': 'git_revision:dba01723a441c358d843a575cb7720d54ddcdf92', + 'gn_version': 'git_revision:39a87c0b36310bdf06b692c098f199a0d97fc810', # luci-go CIPD package version. - 'luci_go': 'git_revision:d6d24b11ecded4d89f3dfd1b2e5a0072a3d4ab15', + 'luci_go': 'git_revision:22d464e2f8f3bd2bd33f69fe819326d63f881008', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version @@ -88,15 +85,15 @@ vars = { deps = { 'build': - Var('chromium_url') + '/chromium/src/build.git' + '@' + '77edba11e25386aa719d4f08c3ce2d8c4f868c15', + Var('chromium_url') + '/chromium/src/build.git' + '@' + '4036cf1b17581f5668b487a25e252d56e0321a7f', 'third_party/depot_tools': - Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '98a52e2e312dd10d7fcf281e322039a6b706b86b', + Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '6b0a611c2c692684f94c0c3629f793feebd16b39', 'third_party/icu': - Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '81d656878ec611cb0b42d52c82e9dae93920d9ba', + Var('chromium_url') + '/chromium/deps/icu.git' + '@' + 'f022e298b4f4a782486bb6d5ce6589c998b51fe2', 'third_party/instrumented_libraries': - Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '084aee04777db574038af9e9d33ca5caed577462', + Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '4ae2535e8e894c3cd81d46aacdaf151b5df30709', 'buildtools': - Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '5dbd89c9d9c0b0ff47cefdc2bc421b8c9a1c5a21', + Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '20b1d0fc13ebaa263a1248f08814f523a86e6bed', 'buildtools/clang_format/script': Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + '99803d74e35962f63a775f29477882afd4d57d94', 'buildtools/linux64': { @@ -122,9 +119,9 @@ deps = { 'buildtools/third_party/libc++/trunk': Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '8fa87946779682841e21e2da977eccfb6cb3bded', 'buildtools/third_party/libc++abi/trunk': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + 'd0f33885a2ffa7d5af74af6065b60eb48e3c70f5', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '767de317f97343db64af048e3d198ab8b10fee5d', 'buildtools/third_party/libunwind/trunk': - Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '08f35c8514a74817103121def05351186830d4b7', + Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '7846d256355e40273f7cc192c8f5893e8665a1f9', 'buildtools/win': { 'packages': [ { @@ -136,7 +133,7 @@ deps = { 'condition': 'host_os == "win"', }, 'base/trace_event/common': - Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + 'cab90cbdaaf4444d67aef6ce3cef09fc5fdeb560', + Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + 'd5bb24e5d9802c8c917fcaa4375d5239a586c168', 'third_party/android_ndk': { 'url': Var('chromium_url') + '/android_ndk.git' + '@' + '401019bf85744311b26c88ced255cd53401af8b7', 'condition': 'checkout_android', @@ -184,7 +181,7 @@ deps = { 'dep_type': 'cipd', }, 'third_party/catapult': { - 'url': Var('chromium_url') + '/catapult.git' + '@' + '41a5e5e465ad93d6e08224613d3544334a6278bc', + 'url': Var('chromium_url') + '/catapult.git' + '@' + 'c1e1d559b46476584ec0eb1d83bd7f43fa5a1b36', 'condition': 'checkout_android', }, 'third_party/colorama/src': { @@ -196,10 +193,9 @@ deps = { 'condition': 'checkout_fuchsia', }, 'third_party/googletest/src': - Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + '07f4869221012b16b7f9ee685d94856e1fc9f361', + Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + '23ef29555ef4789f555f1ba8c51b4c52975f0907', 'third_party/google_benchmark/src': { - 'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + '7f27afe83b82f3a98baf58ef595814b9d42a5b2b', - 'condition': 'checkout_google_benchmark', + 'url': Var('chromium_url') + '/external/github.com/google/benchmark.git' + '@' + '7d0d9061d83b663ce05d9de5da3d5865a3845b79', }, 'third_party/jinja2': Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + '11b6b3e5971d760bd2d310f77643f55a818a6d25', @@ -212,7 +208,7 @@ deps = { 'test/mozilla/data': Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be', 'test/test262/data': - Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '31126581e7290f9233c29cefd93f66c6ac78f1c9', + Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '6d353a4436747e2de8820efac27ae5ef7e601b60', 'test/test262/harness': Var('chromium_url') + '/external/github.com/test262-utils/test262-harness-py.git' + '@' + '278bcfaed0dcaa13936831fb1769d15e7c1e3b2b', 'third_party/qemu-linux-x64': { @@ -239,7 +235,7 @@ deps = { 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'SeLS6a0f6IL-PCOUKbMTN5LYgjjJbDSnb3DGf5q9pwsC' + 'version': '-Sz2gSN_5yVSHDlitjxUlmZpHuz-F2kFDW6TnmggCZoC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -256,7 +252,7 @@ deps = { 'dep_type': 'cipd', }, 'tools/clang': - Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + 'a387faa2a6741f565e45d78804a49a0e55de5909', + Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + 'a38f01b956e091d5e698d2af484c81cd4e9a2a2d', 'tools/luci-go': { 'packages': [ { @@ -290,7 +286,7 @@ deps = { 'third_party/protobuf': Var('chromium_url') + '/external/github.com/google/protobuf'+ '@' + '6a59a2ad1f61d9696092f79b6d74368b4d7970a3', 'third_party/zlib': - Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '09490503d0f201b81e03f5ca0ab8ba8ee76d4a8e', + Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '5b8d433953beb2a75a755ba321a3076b95f7cdb9', 'third_party/jsoncpp/source': Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '9059f5cad030ba11d37818847443a53918c327b1', 'third_party/ittapi': { diff --git a/deps/v8/OWNERS b/deps/v8/OWNERS index 2a478dbdc5c689..2ad1949b515935 100644 --- a/deps/v8/OWNERS +++ b/deps/v8/OWNERS @@ -21,7 +21,7 @@ per-file PRESUBMIT.py=file:INFRA_OWNERS per-file codereview.settings=file:INFRA_OWNERS per-file AUTHORS=file:COMMON_OWNERS -per-file WATCHLIST=file:COMMON_OWNERS +per-file WATCHLISTS=file:COMMON_OWNERS per-file *-mips*=file:MIPS_OWNERS per-file *-mips64*=file:MIPS_OWNERS diff --git a/deps/v8/PRESUBMIT.py b/deps/v8/PRESUBMIT.py index 2ee14d545ee66e..61963c62f62009 100644 --- a/deps/v8/PRESUBMIT.py +++ b/deps/v8/PRESUBMIT.py @@ -279,7 +279,7 @@ def PathToGuardMacro(path): for line in f.NewContents(): for i in range(len(guard_patterns)): if guard_patterns[i].match(line): - found_patterns[i] = True + found_patterns[i] = True if skip_check_pattern.match(line): file_omitted = True break @@ -485,7 +485,9 @@ def FilterFile(affected_file): files_to_check=(r'src[\\\/].*', r'test[\\\/].*'), # Skip api.cc since we cannot easily add the 'noexcept' annotation to # public methods. - files_to_skip=(r'src[\\\/]api[\\\/]api\.cc',)) + # Skip src/bigint/ because it's meant to be V8-independent. + files_to_skip=(r'src[\\\/]api[\\\/]api\.cc', + r'src[\\\/]bigint[\\\/].*')) # matches any class name. class_name = r'\b([A-Z][A-Za-z0-9_:]*)(?:::\1)?' diff --git a/deps/v8/RISCV_OWNERS b/deps/v8/RISCV_OWNERS index f3240b500b196f..8f8e15a40a0cd3 100644 --- a/deps/v8/RISCV_OWNERS +++ b/deps/v8/RISCV_OWNERS @@ -1,3 +1,3 @@ brice.dobry@futurewei.com -lazyparser@gmail.com peng.w@rioslab.org +qiuji@iscas.ac.cn diff --git a/deps/v8/WATCHLISTS b/deps/v8/WATCHLISTS index fa95f144cb73cb..c54f15ad797078 100644 --- a/deps/v8/WATCHLISTS +++ b/deps/v8/WATCHLISTS @@ -51,6 +51,9 @@ '|test/cctest/interpreter/' \ '|test/unittests/interpreter/', }, + 'baseline': { + 'filepath': 'src/baseline/' + }, 'feature_shipping_status': { 'filepath': 'src/flags/flag-definitions.h', }, @@ -91,6 +94,9 @@ 'filepath': 'src/base/ieee754\.(cc|h)' \ '|src/base/overflowing-math.h' \ '|LICENSE.fdlibm', + }, + 'regexp': { + 'filepath': 'src/.*regexp', } }, @@ -110,6 +116,10 @@ 'interpreter': [ 'rmcilroy@chromium.org', ], + 'baseline': [ + 'leszeks+watch@chromium.org', + 'verwaest+watch@chromium.org', + ], 'feature_shipping_status': [ 'hablich@chromium.org', ], @@ -142,5 +152,9 @@ 'rtoy+watch@chromium.org', 'hongchan+watch@chromium.org' ], + 'regexp': [ + 'jgruber+watch@chromium.org', + 'pthier+watch@chromium.org' + ], }, } diff --git a/deps/v8/base/trace_event/common/trace_event_common.h b/deps/v8/base/trace_event/common/trace_event_common.h index dcbb09bb663b0c..dff2f9b2773c68 100644 --- a/deps/v8/base/trace_event/common/trace_event_common.h +++ b/deps/v8/base/trace_event/common/trace_event_common.h @@ -256,10 +256,8 @@ namespace perfetto { namespace legacy { template <> -bool BASE_EXPORT ConvertThreadId(const ::base::PlatformThreadId& thread, - uint64_t* track_uuid_out, - int32_t* pid_override_out, - int32_t* tid_override_out); +perfetto::ThreadTrack BASE_EXPORT +ConvertThreadId(const ::base::PlatformThreadId& thread); } // namespace legacy diff --git a/deps/v8/gni/v8.gni b/deps/v8/gni/v8.gni index 9325baf996e666..8741e86c087069 100644 --- a/deps/v8/gni/v8.gni +++ b/deps/v8/gni/v8.gni @@ -75,13 +75,16 @@ declare_args() { # executed as standard JavaScript instead. v8_enable_webassembly = "" + # Enable runtime call stats. + v8_enable_runtime_call_stats = true + # Add fuzzilli fuzzer support. v8_fuzzilli = false # Scan the call stack conservatively during garbage collection. v8_enable_conservative_stack_scanning = false - v8_enable_google_benchmark = checkout_google_benchmark + v8_enable_google_benchmark = false cppgc_is_standalone = false } diff --git a/deps/v8/include/cppgc/allocation.h b/deps/v8/include/cppgc/allocation.h index f4f0e72bd512ae..7a803cf2cc43b3 100644 --- a/deps/v8/include/cppgc/allocation.h +++ b/deps/v8/include/cppgc/allocation.h @@ -8,6 +8,7 @@ #include #include +#include #include "cppgc/custom-space.h" #include "cppgc/garbage-collected.h" @@ -103,6 +104,10 @@ class MakeGarbageCollectedTraitBase * \returns the memory to construct an object of type T on. */ V8_INLINE static void* Allocate(AllocationHandle& handle, size_t size) { + static_assert( + std::is_base_of::value, + "U of GarbageCollected must be a base of T. Check " + "GarbageCollected base class inheritance."); return SpacePolicy< typename internal::GCInfoFolding< T, typename T::ParentMostGarbageCollectedType>::ResultType, diff --git a/deps/v8/include/cppgc/cross-thread-persistent.h b/deps/v8/include/cppgc/cross-thread-persistent.h index 9cfcd23fdf8e3b..fe61e9acbc3815 100644 --- a/deps/v8/include/cppgc/cross-thread-persistent.h +++ b/deps/v8/include/cppgc/cross-thread-persistent.h @@ -28,19 +28,19 @@ class BasicCrossThreadPersistent final : public PersistentBase, ~BasicCrossThreadPersistent() { Clear(); } - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( const SourceLocation& loc = SourceLocation::Current()) : LocationPolicy(loc) {} - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( std::nullptr_t, const SourceLocation& loc = SourceLocation::Current()) : LocationPolicy(loc) {} - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( SentinelPointer s, const SourceLocation& loc = SourceLocation::Current()) : PersistentBase(s), LocationPolicy(loc) {} - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( T* raw, const SourceLocation& loc = SourceLocation::Current()) : PersistentBase(raw), LocationPolicy(loc) { if (!IsValid(raw)) return; @@ -58,7 +58,7 @@ class BasicCrossThreadPersistent final : public PersistentBase, friend class BasicCrossThreadPersistent; }; - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( UnsafeCtorTag, T* raw, const SourceLocation& loc = SourceLocation::Current()) : PersistentBase(raw), LocationPolicy(loc) { @@ -68,14 +68,14 @@ class BasicCrossThreadPersistent final : public PersistentBase, this->CheckPointer(raw); } - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( T& raw, const SourceLocation& loc = SourceLocation::Current()) : BasicCrossThreadPersistent(&raw, loc) {} template ::value>> - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( internal::BasicMember member, @@ -94,7 +94,7 @@ class BasicCrossThreadPersistent final : public PersistentBase, template ::value>> - BasicCrossThreadPersistent( // NOLINT + BasicCrossThreadPersistent( const BasicCrossThreadPersistent& other, @@ -139,7 +139,7 @@ class BasicCrossThreadPersistent final : public PersistentBase, GetNode()->UpdateOwner(this); other.SetValue(nullptr); other.SetNode(nullptr); - this->CheckPointer(GetValue()); + this->CheckPointer(Get()); return *this; } @@ -236,7 +236,7 @@ class BasicCrossThreadPersistent final : public PersistentBase, * * \returns the object. */ - operator T*() const { return Get(); } // NOLINT + operator T*() const { return Get(); } /** * Dereferences the stored object. diff --git a/deps/v8/include/cppgc/explicit-management.h b/deps/v8/include/cppgc/explicit-management.h index 8fb321c08ca5e4..cdb6af48586e02 100644 --- a/deps/v8/include/cppgc/explicit-management.h +++ b/deps/v8/include/cppgc/explicit-management.h @@ -12,9 +12,12 @@ #include "cppgc/type-traits.h" namespace cppgc { + +class HeapHandle; + namespace internal { -V8_EXPORT void FreeUnreferencedObject(void*); +V8_EXPORT void FreeUnreferencedObject(HeapHandle&, void*); V8_EXPORT bool Resize(void*, size_t); } // namespace internal @@ -30,15 +33,19 @@ namespace subtle { * to `object` after calling `FreeUnreferencedObject()`. In case such a * reference exists, it's use results in a use-after-free. * + * To aid in using the API, `FreeUnreferencedObject()` may be called from + * destructors on objects that would be reclaimed in the same garbage collection + * cycle. + * + * \param heap_handle The corresponding heap. * \param object Reference to an object that is of type `GarbageCollected` and * should be immediately reclaimed. */ template -void FreeUnreferencedObject(T* object) { +void FreeUnreferencedObject(HeapHandle& heap_handle, T& object) { static_assert(IsGarbageCollectedTypeV, "Object must be of type GarbageCollected."); - if (!object) return; - internal::FreeUnreferencedObject(object); + internal::FreeUnreferencedObject(heap_handle, &object); } /** @@ -53,6 +60,8 @@ void FreeUnreferencedObject(T* object) { * object down, the reclaimed area is not used anymore. Any subsequent use * results in a use-after-free. * + * The `object` must be live when calling `Resize()`. + * * \param object Reference to an object that is of type `GarbageCollected` and * should be resized. * \param additional_bytes Bytes in addition to sizeof(T) that the object should diff --git a/deps/v8/include/cppgc/heap-statistics.h b/deps/v8/include/cppgc/heap-statistics.h index cf8d6633cc2751..2fe6e1ae58abbb 100644 --- a/deps/v8/include/cppgc/heap-statistics.h +++ b/deps/v8/include/cppgc/heap-statistics.h @@ -57,7 +57,7 @@ struct HeapStatistics final { }; /** - * Stastistics of the freelist (used only in non-large object spaces). For + * Statistics of the freelist (used only in non-large object spaces). For * each bucket in the freelist the statistics record the bucket size, the * number of freelist entries in the bucket, and the overall allocated memory * consumed by these freelist entries. @@ -67,7 +67,7 @@ struct HeapStatistics final { std::vector bucket_size; /** number of freelist entries per bucket. */ std::vector free_count; - /** memory size concumed by freelist entries per size. */ + /** memory size consumed by freelist entries per size. */ std::vector free_size; }; diff --git a/deps/v8/include/cppgc/internal/compiler-specific.h b/deps/v8/include/cppgc/internal/compiler-specific.h index c580894b35d0fe..595b6398cb720a 100644 --- a/deps/v8/include/cppgc/internal/compiler-specific.h +++ b/deps/v8/include/cppgc/internal/compiler-specific.h @@ -21,13 +21,13 @@ namespace cppgc { // [[no_unique_address]] comes in C++20 but supported in clang with -std >= // c++11. -#if CPPGC_HAS_CPP_ATTRIBUTE(no_unique_address) // NOLINTNEXTLINE +#if CPPGC_HAS_CPP_ATTRIBUTE(no_unique_address) #define CPPGC_NO_UNIQUE_ADDRESS [[no_unique_address]] #else #define CPPGC_NO_UNIQUE_ADDRESS #endif -#if CPPGC_HAS_ATTRIBUTE(unused) // NOLINTNEXTLINE +#if CPPGC_HAS_ATTRIBUTE(unused) #define CPPGC_UNUSED __attribute__((unused)) #else #define CPPGC_UNUSED diff --git a/deps/v8/include/cppgc/internal/pointer-policies.h b/deps/v8/include/cppgc/internal/pointer-policies.h index ceb002f02d555f..e09b86199f46b3 100644 --- a/deps/v8/include/cppgc/internal/pointer-policies.h +++ b/deps/v8/include/cppgc/internal/pointer-policies.h @@ -9,12 +9,15 @@ #include #include "cppgc/internal/write-barrier.h" +#include "cppgc/sentinel-pointer.h" #include "cppgc/source-location.h" +#include "cppgc/type-traits.h" #include "v8config.h" // NOLINT(build/include_directory) namespace cppgc { namespace internal { +class HeapBase; class PersistentRegion; class CrossThreadPersistentRegion; @@ -50,11 +53,31 @@ struct NoWriteBarrierPolicy { class V8_EXPORT EnabledCheckingPolicy { protected: - EnabledCheckingPolicy(); - void CheckPointer(const void* ptr); + template + void CheckPointer(const T* ptr) { + if (!ptr || (kSentinelPointer == ptr)) return; + + CheckPointersImplTrampoline::Call(this, ptr); + } private: - void* impl_; + void CheckPointerImpl(const void* ptr, bool points_to_payload); + + template > + struct CheckPointersImplTrampoline { + static void Call(EnabledCheckingPolicy* policy, const T* ptr) { + policy->CheckPointerImpl(ptr, false); + } + }; + + template + struct CheckPointersImplTrampoline { + static void Call(EnabledCheckingPolicy* policy, const T* ptr) { + policy->CheckPointerImpl(ptr, IsGarbageCollectedTypeV); + } + }; + + const HeapBase* heap_ = nullptr; }; class DisabledCheckingPolicy { @@ -63,9 +86,11 @@ class DisabledCheckingPolicy { }; #if V8_ENABLE_CHECKS -using DefaultCheckingPolicy = EnabledCheckingPolicy; +using DefaultMemberCheckingPolicy = EnabledCheckingPolicy; +using DefaultPersistentCheckingPolicy = EnabledCheckingPolicy; #else -using DefaultCheckingPolicy = DisabledCheckingPolicy; +using DefaultMemberCheckingPolicy = DisabledCheckingPolicy; +using DefaultPersistentCheckingPolicy = DisabledCheckingPolicy; #endif class KeepLocationPolicy { @@ -133,10 +158,10 @@ template + typename CheckingPolicy = DefaultPersistentCheckingPolicy> class BasicPersistent; template + typename CheckingPolicy = DefaultMemberCheckingPolicy> class BasicMember; } // namespace internal diff --git a/deps/v8/include/cppgc/member.h b/deps/v8/include/cppgc/member.h index 7b76bc4f7556fa..16aed060226ea3 100644 --- a/deps/v8/include/cppgc/member.h +++ b/deps/v8/include/cppgc/member.h @@ -24,8 +24,11 @@ namespace internal { // BasicMember on casting to the right type as needed. class MemberBase { protected: + struct AtomicInitializerTag {}; + MemberBase() = default; explicit MemberBase(const void* value) : raw_(value) {} + MemberBase(const void* value, AtomicInitializerTag) { SetRawAtomic(value); } const void** GetRawSlot() const { return &raw_; } const void* GetRaw() const { return raw_; } @@ -61,6 +64,20 @@ class BasicMember final : private MemberBase, private CheckingPolicy { this->CheckPointer(Get()); } BasicMember(T& raw) : BasicMember(&raw) {} // NOLINT + // Atomic ctor. Using the AtomicInitializerTag forces BasicMember to + // initialize using atomic assignments. This is required for preventing + // data races with concurrent marking. + using AtomicInitializerTag = MemberBase::AtomicInitializerTag; + BasicMember(std::nullptr_t, AtomicInitializerTag atomic) + : MemberBase(nullptr, atomic) {} + BasicMember(SentinelPointer s, AtomicInitializerTag atomic) + : MemberBase(s, atomic) {} + BasicMember(T* raw, AtomicInitializerTag atomic) : MemberBase(raw, atomic) { + InitializingWriteBarrier(); + this->CheckPointer(Get()); + } + BasicMember(T& raw, AtomicInitializerTag atomic) + : BasicMember(&raw, atomic) {} // Copy ctor. BasicMember(const BasicMember& other) : BasicMember(other.Get()) {} // Allow heterogeneous construction. @@ -79,9 +96,8 @@ class BasicMember final : private MemberBase, private CheckingPolicy { template ::value>> - BasicMember( // NOLINT - BasicMember&& other) noexcept + BasicMember(BasicMember&& other) noexcept : BasicMember(other.Get()) { other.Clear(); } @@ -90,10 +106,9 @@ class BasicMember final : private MemberBase, private CheckingPolicy { typename PersistentLocationPolicy, typename PersistentCheckingPolicy, typename = std::enable_if_t::value>> - BasicMember( // NOLINT - const BasicPersistent& - p) + BasicMember(const BasicPersistent& p) : BasicMember(p.Get()) {} // Copy assignment. @@ -161,7 +176,7 @@ class BasicMember final : private MemberBase, private CheckingPolicy { } explicit operator bool() const { return Get(); } - operator T*() const { return Get(); } // NOLINT + operator T*() const { return Get(); } T* operator->() const { return Get(); } T& operator*() const { return *Get(); } diff --git a/deps/v8/include/cppgc/persistent.h b/deps/v8/include/cppgc/persistent.h index d7aac723c0d24d..22cda7c6e8fcb7 100644 --- a/deps/v8/include/cppgc/persistent.h +++ b/deps/v8/include/cppgc/persistent.h @@ -95,7 +95,7 @@ class BasicPersistent final : public PersistentBase, template ::value>> - BasicPersistent( // NOLINT + BasicPersistent( const BasicPersistent& other, const SourceLocation& loc = SourceLocation::Current()) @@ -118,7 +118,7 @@ class BasicPersistent final : public PersistentBase, template ::value>> - BasicPersistent(internal::BasicMember member, const SourceLocation& loc = SourceLocation::Current()) @@ -181,7 +181,7 @@ class BasicPersistent final : public PersistentBase, } explicit operator bool() const { return Get(); } - operator T*() const { return Get(); } // NOLINT + operator T*() const { return Get(); } T* operator->() const { return Get(); } T& operator*() const { return *Get(); } diff --git a/deps/v8/include/cppgc/sentinel-pointer.h b/deps/v8/include/cppgc/sentinel-pointer.h index f7915834e5ac2c..b049d1a2b34632 100644 --- a/deps/v8/include/cppgc/sentinel-pointer.h +++ b/deps/v8/include/cppgc/sentinel-pointer.h @@ -14,7 +14,7 @@ namespace internal { // sentinel is defined by the embedder. struct SentinelPointer { template - operator T*() const { // NOLINT + operator T*() const { static constexpr intptr_t kSentinelValue = 1; return reinterpret_cast(kSentinelValue); } diff --git a/deps/v8/include/cppgc/type-traits.h b/deps/v8/include/cppgc/type-traits.h index 2b50a2164b2267..56cd55d61e2a5a 100644 --- a/deps/v8/include/cppgc/type-traits.h +++ b/deps/v8/include/cppgc/type-traits.h @@ -7,6 +7,7 @@ // This file should stay with minimal dependencies to allow embedder to check // against Oilpan types without including any other parts. +#include #include namespace cppgc { @@ -164,6 +165,18 @@ struct IsUntracedMemberType : std::false_type {}; template struct IsUntracedMemberType : std::true_type {}; +template +struct IsComplete { + private: + template + static std::true_type IsSizeOfKnown(U*); + static std::false_type IsSizeOfKnown(...); + + public: + static constexpr bool value = + decltype(IsSizeOfKnown(std::declval()))::value; +}; + } // namespace internal /** @@ -223,6 +236,12 @@ constexpr bool IsWeakMemberTypeV = internal::IsWeakMemberType::value; template constexpr bool IsWeakV = internal::IsWeak::value; +/** + * Value is true for types that are complete, and false otherwise. + */ +template +constexpr bool IsCompleteV = internal::IsComplete::value; + } // namespace cppgc #endif // INCLUDE_CPPGC_TYPE_TRAITS_H_ diff --git a/deps/v8/include/js_protocol.pdl b/deps/v8/include/js_protocol.pdl index 666952f27b97f6..9c0483ae7059c2 100644 --- a/deps/v8/include/js_protocol.pdl +++ b/deps/v8/include/js_protocol.pdl @@ -267,7 +267,7 @@ domain Debugger BreakpointId breakpointId # Restarts particular call frame from the beginning. - command restartFrame + deprecated command restartFrame parameters # Call frame identifier to evaluate on. CallFrameId callFrameId @@ -707,6 +707,8 @@ experimental domain HeapProfiler # when the tracking is stopped. optional boolean reportProgress optional boolean treatGlobalObjectsAsRoots + # If true, numerical values are included in the snapshot + optional boolean captureNumericValue command takeHeapSnapshot parameters @@ -714,6 +716,8 @@ experimental domain HeapProfiler optional boolean reportProgress # If true, a raw snapshot without artifical roots will be generated optional boolean treatGlobalObjectsAsRoots + # If true, numerical values are included in the snapshot + optional boolean captureNumericValue event addHeapSnapshotChunk parameters @@ -1563,7 +1567,10 @@ domain Runtime # execution context. If omitted and `executionContextName` is not set, # the binding is exposed to all execution contexts of the target. # This parameter is mutually exclusive with `executionContextName`. - optional ExecutionContextId executionContextId + # Deprecated in favor of `executionContextName` due to an unclear use case + # and bugs in implementation (crbug.com/1169639). `executionContextId` will be + # removed in the future. + deprecated optional ExecutionContextId executionContextId # If specified, the binding is exposed to the executionContext with # matching name, even for contexts created after the binding is added. # See also `ExecutionContext.name` and `worldName` parameter to diff --git a/deps/v8/include/v8-cppgc.h b/deps/v8/include/v8-cppgc.h index fba35f71c9ae07..745fb04347ee4c 100644 --- a/deps/v8/include/v8-cppgc.h +++ b/deps/v8/include/v8-cppgc.h @@ -28,6 +28,8 @@ namespace internal { class CppHeap; } // namespace internal +class CustomSpaceStatisticsReceiver; + /** * Describes how V8 wrapper objects maintain references to garbage-collected C++ * objects. @@ -119,6 +121,16 @@ class V8_EXPORT CppHeap { cppgc::HeapStatistics CollectStatistics( cppgc::HeapStatistics::DetailLevel detail_level); + /** + * Collects statistics for the given spaces and reports them to the receiver. + * + * \param custom_spaces a collection of custom space indicies. + * \param receiver an object that gets the results. + */ + void CollectCustomSpaceStatisticsAtLastGC( + std::vector custom_spaces, + std::unique_ptr receiver); + /** * Enables a detached mode that allows testing garbage collection using * `cppgc::testing` APIs. Once used, the heap cannot be attached to an @@ -277,6 +289,26 @@ class V8_EXPORT JSHeapConsistency final { const TracedReferenceBase& ref); }; +/** + * Provided as input to `CppHeap::CollectCustomSpaceStatisticsAtLastGC()`. + * + * Its method is invoked with the results of the statistic collection. + */ +class CustomSpaceStatisticsReceiver { + public: + virtual ~CustomSpaceStatisticsReceiver() = default; + /** + * Reports the size of a space at the last GC. It is called for each space + * that was requested in `CollectCustomSpaceStatisticsAtLastGC()`. + * + * \param space_index The index of the space. + * \param bytes The total size of live objects in the space at the last GC. + * It is zero if there was no GC yet. + */ + virtual void AllocatedBytes(cppgc::CustomSpaceIndex space_index, + size_t bytes) = 0; +}; + } // namespace v8 namespace cppgc { diff --git a/deps/v8/include/v8-fast-api-calls.h b/deps/v8/include/v8-fast-api-calls.h index f8b5acb093456e..cdf67decf6741c 100644 --- a/deps/v8/include/v8-fast-api-calls.h +++ b/deps/v8/include/v8-fast-api-calls.h @@ -70,8 +70,7 @@ * return GetInternalField(wrapper); * } - * static void FastMethod(v8::ApiObject receiver_obj, int param) { - * v8::Object* v8_object = reinterpret_cast(&api_object); + * static void FastMethod(v8::Local receiver_obj, int param) { * CustomEmbedderType* receiver = static_cast( * receiver_obj->GetAlignedPointerFromInternalField( * kV8EmbedderWrapperObjectIndex)); @@ -190,10 +189,13 @@ #include #include +#include "v8.h" // NOLINT(build/include_directory) #include "v8config.h" // NOLINT(build/include_directory) namespace v8 { +class Isolate; + class CTypeInfo { public: enum class Type : uint8_t { @@ -206,6 +208,8 @@ class CTypeInfo { kFloat32, kFloat64, kV8Value, + kApiObject, // This will be deprecated once all users have + // migrated from v8::ApiObject to v8::Local. }; // kCallbackOptionsType is not part of the Type enum @@ -310,7 +314,7 @@ class V8_EXPORT CFunction { }; }; -struct ApiObject { +struct V8_DEPRECATE_SOON("Use v8::Local instead.") ApiObject { uintptr_t address; }; @@ -321,6 +325,14 @@ struct ApiObject { * \endcode */ struct FastApiCallbackOptions { + /** + * Creates a new instance of FastApiCallbackOptions for testing purpose. The + * returned instance may be filled with mock data. + */ + static FastApiCallbackOptions CreateForTesting(Isolate* isolate) { + return {false, {0}}; + } + /** * If the callback wants to signal an error condition or to perform an * allocation, it must set options.fallback to true and do an early return @@ -336,8 +348,12 @@ struct FastApiCallbackOptions { /** * The `data` passed to the FunctionTemplate constructor, or `undefined`. + * `data_ptr` allows for default constructing FastApiCallbackOptions. */ - const ApiObject data; + union { + uintptr_t data_ptr; + v8::Value data; + }; }; namespace internal { @@ -398,16 +414,22 @@ struct TypeInfoHelper { static constexpr CTypeInfo::Type Type() { return CTypeInfo::Type::Enum; } \ }; -#define BASIC_C_TYPES(V) \ - V(void, kVoid) \ - V(bool, kBool) \ - V(int32_t, kInt32) \ - V(uint32_t, kUint32) \ - V(int64_t, kInt64) \ - V(uint64_t, kUint64) \ - V(float, kFloat32) \ - V(double, kFloat64) \ - V(ApiObject, kV8Value) +#define BASIC_C_TYPES(V) \ + V(void, kVoid) \ + V(bool, kBool) \ + V(int32_t, kInt32) \ + V(uint32_t, kUint32) \ + V(int64_t, kInt64) \ + V(uint64_t, kUint64) \ + V(float, kFloat32) \ + V(double, kFloat64) \ + V(ApiObject, kApiObject) \ + V(v8::Local, kV8Value) \ + V(v8::Local, kV8Value) + +// ApiObject was a temporary solution to wrap the pointer to the v8::Value. +// Please use v8::Local in new code for the arguments and +// v8::Local for the receiver, as ApiObject will be deprecated. BASIC_C_TYPES(SPECIALIZE_GET_TYPE_INFO_HELPER_FOR) diff --git a/deps/v8/include/v8-inspector.h b/deps/v8/include/v8-inspector.h index a55518e45930e1..852b39d7252295 100644 --- a/deps/v8/include/v8-inspector.h +++ b/deps/v8/include/v8-inspector.h @@ -105,8 +105,9 @@ class V8_EXPORT V8StackTrace { virtual StringView topSourceURL() const = 0; virtual int topLineNumber() const = 0; virtual int topColumnNumber() const = 0; - virtual StringView topScriptId() const = 0; - virtual int topScriptIdAsInteger() const = 0; + virtual int topScriptId() const = 0; + V8_DEPRECATE_SOON("Use V8::StackTrace::topScriptId() instead.") + int topScriptIdAsInteger() const { return topScriptId(); } virtual StringView topFunctionName() const = 0; virtual ~V8StackTrace() = default; @@ -130,6 +131,10 @@ class V8_EXPORT V8InspectorSession { virtual v8::Local get(v8::Local) = 0; virtual ~Inspectable() = default; }; + class V8_EXPORT CommandLineAPIScope { + public: + virtual ~CommandLineAPIScope() = default; + }; virtual void addInspectedObject(std::unique_ptr) = 0; // Dispatching protocol messages. @@ -139,6 +144,9 @@ class V8_EXPORT V8InspectorSession { virtual std::vector> supportedDomains() = 0; + virtual std::unique_ptr + initializeCommandLineAPIScope(int executionContextId) = 0; + // Debugger actions. virtual void schedulePauseOnNextStatement(StringView breakReason, StringView breakDetails) = 0; diff --git a/deps/v8/include/v8-internal.h b/deps/v8/include/v8-internal.h index eb18f76504d6fa..f289149d8d06e2 100644 --- a/deps/v8/include/v8-internal.h +++ b/deps/v8/include/v8-internal.h @@ -33,6 +33,7 @@ const int kApiSystemPointerSize = sizeof(void*); const int kApiDoubleSize = sizeof(double); const int kApiInt32Size = sizeof(int32_t); const int kApiInt64Size = sizeof(int64_t); +const int kApiSizetSize = sizeof(size_t); // Tag information for HeapObject. const int kHeapObjectTag = 1; @@ -40,6 +41,13 @@ const int kWeakHeapObjectTag = 3; const int kHeapObjectTagSize = 2; const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; +// Tag information for fowarding pointers stored in object headers. +// 0b00 at the lowest 2 bits in the header indicates that the map word is a +// forwarding pointer. +const int kForwardingTag = 0; +const int kForwardingTagSize = 2; +const intptr_t kForwardingTagMask = (1 << kForwardingTagSize) - 1; + // Tag information for Smi. const int kSmiTag = 0; const int kSmiTagSize = 1; @@ -120,23 +128,28 @@ constexpr bool HeapSandboxIsEnabled() { using ExternalPointer_t = Address; -// If the heap sandbox is enabled, these tag values will be XORed with the +// If the heap sandbox is enabled, these tag values will be ORed with the // external pointers in the external pointer table to prevent use of pointers of -// the wrong type. -enum ExternalPointerTag : Address { - kExternalPointerNullTag = static_cast
(0ULL), - kArrayBufferBackingStoreTag = static_cast
(1ULL << 48), - kTypedArrayExternalPointerTag = static_cast
(2ULL << 48), - kDataViewDataPointerTag = static_cast
(3ULL << 48), - kExternalStringResourceTag = static_cast
(4ULL << 48), - kExternalStringResourceDataTag = static_cast
(5ULL << 48), - kForeignForeignAddressTag = static_cast
(6ULL << 48), - kNativeContextMicrotaskQueueTag = static_cast
(7ULL << 48), - // TODO(v8:10391, saelo): Currently has to be zero so that raw zero values are - // also nullptr - kEmbedderDataSlotPayloadTag = static_cast
(0ULL << 48), +// the wrong type. When a pointer is loaded, it is ANDed with the inverse of the +// expected type's tag. The tags are constructed in a way that guarantees that a +// failed type check will result in one or more of the top bits of the pointer +// to be set, rendering the pointer inacessible. This construction allows +// performing the type check and removing GC marking bits from the pointer at +// the same time. +enum ExternalPointerTag : uint64_t { + kExternalPointerNullTag = 0x0000000000000000, + kArrayBufferBackingStoreTag = 0x00ff000000000000, // 0b000000011111111 + kTypedArrayExternalPointerTag = 0x017f000000000000, // 0b000000101111111 + kDataViewDataPointerTag = 0x01bf000000000000, // 0b000000110111111 + kExternalStringResourceTag = 0x01df000000000000, // 0b000000111011111 + kExternalStringResourceDataTag = 0x01ef000000000000, // 0b000000111101111 + kForeignForeignAddressTag = 0x01f7000000000000, // 0b000000111110111 + kNativeContextMicrotaskQueueTag = 0x01fb000000000000, // 0b000000111111011 + kEmbedderDataSlotPayloadTag = 0x01fd000000000000, // 0b000000111111101 }; +constexpr uint64_t kExternalPointerTagMask = 0xffff000000000000; + #ifdef V8_31BIT_SMIS_ON_64BIT_ARCH using PlatformSmiTagging = SmiTagging; #else @@ -177,6 +190,14 @@ V8_EXPORT bool ShouldThrowOnError(v8::internal::Isolate* isolate); * depend on functions and constants defined here. */ class Internals { +#ifdef V8_MAP_PACKING + V8_INLINE static constexpr internal::Address UnpackMapWord( + internal::Address mapword) { + // TODO(wenyuzhao): Clear header metadata. + return mapword ^ kMapWordXorMask; + } +#endif + public: // These values match non-compiler-dependent values defined within // the implementation of v8. @@ -209,8 +230,12 @@ class Internals { kIsolateFastCCallCallerFpOffset + kApiSystemPointerSize; static const int kIsolateFastApiCallTargetOffset = kIsolateFastCCallCallerPcOffset + kApiSystemPointerSize; - static const int kIsolateStackGuardOffset = + static const int kIsolateCageBaseOffset = kIsolateFastApiCallTargetOffset + kApiSystemPointerSize; + static const int kIsolateLongTaskStatsCounterOffset = + kIsolateCageBaseOffset + kApiSystemPointerSize; + static const int kIsolateStackGuardOffset = + kIsolateLongTaskStatsCounterOffset + kApiSizetSize; static const int kIsolateRootsOffset = kIsolateStackGuardOffset + 7 * kApiSystemPointerSize; @@ -253,6 +278,17 @@ class Internals { // incremental GC once the external memory reaches this limit. static constexpr int kExternalAllocationSoftLimit = 64 * 1024 * 1024; +#ifdef V8_MAP_PACKING + static const uintptr_t kMapWordMetadataMask = 0xffffULL << 48; + // The lowest two bits of mapwords are always `0b10` + static const uintptr_t kMapWordSignature = 0b10; + // XORing a (non-compressed) map with this mask ensures that the two + // low-order bits are 0b10. The 0 at the end makes this look like a Smi, + // although real Smis have all lower 32 bits unset. We only rely on these + // values passing as Smis in very few places. + static const int kMapWordXorMask = 0b11; +#endif + V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate); V8_INLINE static void CheckInitialized(v8::Isolate* isolate) { #ifdef V8_ENABLE_CHECKS @@ -279,6 +315,9 @@ class Internals { V8_INLINE static int GetInstanceType(const internal::Address obj) { typedef internal::Address A; A map = ReadTaggedPointerField(obj, kHeapObjectMapOffset); +#ifdef V8_MAP_PACKING + map = UnpackMapWord(map); +#endif return ReadRawField(map, kMapInstanceTypeOffset); } @@ -329,6 +368,12 @@ class Internals { return *reinterpret_cast(addr); } + V8_INLINE static void IncrementLongTasksStatsCounter(v8::Isolate* isolate) { + internal::Address addr = reinterpret_cast(isolate) + + kIsolateLongTaskStatsCounterOffset; + ++(*reinterpret_cast(addr)); + } + V8_INLINE static internal::Address* GetRoot(v8::Isolate* isolate, int index) { internal::Address addr = reinterpret_cast(isolate) + kIsolateRootsOffset + diff --git a/deps/v8/include/v8-metrics.h b/deps/v8/include/v8-metrics.h index 0217f40d63a629..2404cc0a4c30d4 100644 --- a/deps/v8/include/v8-metrics.h +++ b/deps/v8/include/v8-metrics.h @@ -5,7 +5,8 @@ #ifndef V8_METRICS_H_ #define V8_METRICS_H_ -#include "v8.h" // NOLINT(build/include_directory) +#include "v8-internal.h" // NOLINT(build/include_directory) +#include "v8.h" // NOLINT(build/include_directory) namespace v8 { namespace metrics { @@ -183,6 +184,32 @@ class V8_EXPORT Recorder { static ContextId GetContextId(Local context); }; +/** + * Experimental API intended for the LongTasks UKM (crbug.com/1173527). + * The Reset() method should be called at the start of a potential + * long task. The Get() method returns durations of V8 work that + * happened during the task. + * + * This API is experimental and may be removed/changed in the future. + */ +struct V8_EXPORT LongTaskStats { + /** + * Resets durations of V8 work for the new task. + */ + V8_INLINE static void Reset(Isolate* isolate) { + v8::internal::Internals::IncrementLongTasksStatsCounter(isolate); + } + + /** + * Returns durations of V8 work that happened since the last Reset(). + */ + static LongTaskStats Get(Isolate* isolate); + + int64_t gc_full_atomic_wall_clock_duration_us = 0; + int64_t gc_full_incremental_wall_clock_duration_us = 0; + int64_t gc_young_wall_clock_duration_us = 0; +}; + } // namespace metrics } // namespace v8 diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h index 4c94d7fd392c0c..fc9a357feb66cb 100644 --- a/deps/v8/include/v8-platform.h +++ b/deps/v8/include/v8-platform.h @@ -181,9 +181,8 @@ class JobDelegate { /** * Returns true if the current task is called from the thread currently * running JobHandle::Join(). - * TODO(etiennep): Make pure virtual once custom embedders implement it. */ - virtual bool IsJoiningThread() const { return false; } + virtual bool IsJoiningThread() const = 0; }; /** @@ -220,19 +219,14 @@ class JobHandle { * Forces all existing workers to yield ASAP but doesn’t wait for them. * Warning, this is dangerous if the Job's callback is bound to or has access * to state which may be deleted after this call. - * TODO(etiennep): Cleanup once implemented by all embedders. */ - virtual void CancelAndDetach() { Cancel(); } + virtual void CancelAndDetach() = 0; /** * Returns true if there's any work pending or any worker running. */ virtual bool IsActive() = 0; - // TODO(etiennep): Clean up once all overrides are removed. - V8_DEPRECATED("Use !IsActive() instead.") - virtual bool IsCompleted() { return !IsActive(); } - /** * Returns true if associated with a Job and other methods may be called. * Returns false after Join() or Cancel() was called. This may return true @@ -240,10 +234,6 @@ class JobHandle { */ virtual bool IsValid() = 0; - // TODO(etiennep): Clean up once all overrides are removed. - V8_DEPRECATED("Use IsValid() instead.") - virtual bool IsRunning() { return IsValid(); } - /** * Returns true if job priority can be changed. */ @@ -272,10 +262,6 @@ class JobTask { * it must not call back any JobHandle methods. */ virtual size_t GetMaxConcurrency(size_t worker_count) const = 0; - - // TODO(1114823): Clean up once all overrides are removed. - V8_DEPRECATED("Use the version that takes |worker_count|.") - virtual size_t GetMaxConcurrency() const { return 0; } }; /** diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h index 85d3f8a4821ab1..9a40cfcf307e1d 100644 --- a/deps/v8/include/v8-profiler.h +++ b/deps/v8/include/v8-profiler.h @@ -289,8 +289,8 @@ class V8_EXPORT CpuProfilingOptions { * interval, set via SetSamplingInterval(). If * zero, the sampling interval will be equal to * the profiler's sampling interval. - * \param filter_context Deprecated option to filter by context, currently a - * no-op. + * \param filter_context If specified, profiles will only contain frames + * using this context. Other frames will be elided. */ CpuProfilingOptions( CpuProfilingMode mode = kLeafNodeLineNumbers, @@ -304,9 +304,13 @@ class V8_EXPORT CpuProfilingOptions { private: friend class internal::CpuProfile; + bool has_filter_context() const { return !filter_context_.IsEmpty(); } + void* raw_filter_context() const; + CpuProfilingMode mode_; unsigned max_samples_; int sampling_interval_us_; + CopyablePersistentTraits::CopyablePersistent filter_context_; }; /** @@ -492,7 +496,7 @@ class V8_EXPORT HeapGraphNode { /** * An interface for exporting data from V8, using "push" model. */ -class V8_EXPORT OutputStream { // NOLINT +class V8_EXPORT OutputStream { public: enum WriteResult { kContinue = 0, @@ -519,7 +523,6 @@ class V8_EXPORT OutputStream { // NOLINT } }; - /** * HeapSnapshots record the state of the JS heap at some moment. */ @@ -586,7 +589,7 @@ class V8_EXPORT HeapSnapshot { * An interface for reporting progress and controlling long-running * activities. */ -class V8_EXPORT ActivityControl { // NOLINT +class V8_EXPORT ActivityControl { public: enum ControlOption { kContinue = 0, @@ -600,7 +603,6 @@ class V8_EXPORT ActivityControl { // NOLINT virtual ControlOption ReportProgressValue(int done, int total) = 0; }; - /** * AllocationProfile is a sampled profile of allocations done by the program. * This is structured as a call-graph. @@ -900,7 +902,8 @@ class V8_EXPORT HeapProfiler { const HeapSnapshot* TakeHeapSnapshot( ActivityControl* control = nullptr, ObjectNameResolver* global_object_name_resolver = nullptr, - bool treat_global_objects_as_roots = true); + bool treat_global_objects_as_roots = true, + bool capture_numeric_value = false); /** * Starts tracking of heap objects population statistics. After calling diff --git a/deps/v8/include/v8-util.h b/deps/v8/include/v8-util.h index 89ec4f6a789c03..8e4d66153d1f22 100644 --- a/deps/v8/include/v8-util.h +++ b/deps/v8/include/v8-util.h @@ -43,7 +43,7 @@ class StdMapTraits { static bool Empty(Impl* impl) { return impl->empty(); } static size_t Size(Impl* impl) { return impl->size(); } - static void Swap(Impl& a, Impl& b) { std::swap(a, b); } // NOLINT + static void Swap(Impl& a, Impl& b) { std::swap(a, b); } static Iterator Begin(Impl* impl) { return impl->begin(); } static Iterator End(Impl* impl) { return impl->end(); } static K Key(Iterator it) { return it->first; } diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index 4bdb66b2bf6847..1cf4d7e28448ce 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -9,9 +9,9 @@ // NOTE these macros are used by some of the tool scripts and the build // system so their names cannot be changed without changing the scripts. #define V8_MAJOR_VERSION 9 -#define V8_MINOR_VERSION 1 -#define V8_BUILD_NUMBER 269 -#define V8_PATCH_LEVEL 38 +#define V8_MINOR_VERSION 2 +#define V8_BUILD_NUMBER 230 +#define V8_PATCH_LEVEL 21 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 840dd2c2258b4f..c4720ca6954da2 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -596,7 +596,7 @@ template class PersistentBase { */ V8_INLINE uint16_t WrapperClassId() const; - PersistentBase(const PersistentBase& other) = delete; // NOLINT + PersistentBase(const PersistentBase& other) = delete; void operator=(const PersistentBase&) = delete; private: @@ -708,7 +708,7 @@ template class Persistent : public PersistentBase { return *this; } template - V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT + V8_INLINE Persistent& operator=(const Persistent& that) { Copy(that); return *this; } @@ -723,7 +723,7 @@ template class Persistent : public PersistentBase { // TODO(dcarney): this is pretty useless, fix or remove template - V8_INLINE static Persistent& Cast(const Persistent& that) { // NOLINT + V8_INLINE static Persistent& Cast(const Persistent& that) { #ifdef V8_ENABLE_CHECKS // If we're going to perform the type check then we have to check // that the handle isn't empty before doing the checked cast. @@ -734,7 +734,7 @@ template class Persistent : public PersistentBase { // TODO(dcarney): this is pretty useless, fix or remove template - V8_INLINE Persistent& As() const { // NOLINT + V8_INLINE Persistent& As() const { return Persistent::Cast(*this); } @@ -803,7 +803,7 @@ class Global : public PersistentBase { /** * Pass allows returning uniques from functions, etc. */ - Global Pass() { return static_cast(*this); } // NOLINT + Global Pass() { return static_cast(*this); } /* * For compatibility with Chromium's base::Bind (base::Passed). @@ -905,8 +905,8 @@ class TracedReferenceBase { * The exact semantics are: * - Tracing garbage collections use |v8::EmbedderHeapTracer| or cppgc. * - Non-tracing garbage collections refer to - * |v8::EmbedderHeapTracer::IsRootForNonTracingGC()| whether the handle should - * be treated as root or not. + * |v8::EmbedderRootsHandler::IsRoot()| whether the handle should + * be treated as root or not. * * Note that the base class cannot be instantiated itself. Choose from * - TracedGlobal @@ -1427,9 +1427,7 @@ class ScriptOriginOptions { */ class ScriptOrigin { public: -#if defined(_MSC_VER) && _MSC_VER >= 1910 /* Disable on VS2015 */ V8_DEPRECATE_SOON("Use constructor with primitive C++ types") -#endif V8_INLINE explicit ScriptOrigin( Local resource_name, Local resource_line_offset, Local resource_column_offset, @@ -1440,9 +1438,7 @@ class ScriptOrigin { Local is_wasm = Local(), Local is_module = Local(), Local host_defined_options = Local()); -#if defined(_MSC_VER) && _MSC_VER >= 1910 /* Disable on VS2015 */ V8_DEPRECATE_SOON("Use constructor that takes an isolate") -#endif V8_INLINE explicit ScriptOrigin( Local resource_name, int resource_line_offset = 0, int resource_column_offset = 0, @@ -1495,7 +1491,7 @@ class V8_EXPORT UnboundScript { */ Local