Skip to content

Commit 76ae0cc

Browse files
authored
Merge branch 'main' into fix/issue-62952
2 parents 4d70d0a + 41afbd3 commit 76ae0cc

416 files changed

Lines changed: 10043 additions & 9646 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/nix-changes.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ jobs:
7878
7979
- name: Compute requisites before change
8080
shell: bash # See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference, we want the pipefail option.
81-
# TODO(panva): add `// import ./tools/nix/pkcs11.nix {}` once landed
8281
run: |
8382
git reset HEAD^ --hard
8483
nix-store --query --references "$(
@@ -88,6 +87,7 @@ jobs:
8887
++ builtins.attrValues (
8988
{ inherit (import <nixpkgs> {}) nixfmt-tree sccache; }
9089
// import ./tools/nix/openssl-matrix.nix {}
90+
// import ./tools/nix/pkcs11.nix {}
9191
)")" \
9292
| xargs nix-store --realise \
9393
| xargs nix-store --query --requisites \

.github/workflows/tools.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ on:
3535
- nghttp2
3636
- nghttp3
3737
- ngtcp2
38+
- perfetto
3839
- postject
3940
- root-certificates
4041
- simdjson
@@ -237,6 +238,14 @@ jobs:
237238
cat temp-output
238239
tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true
239240
rm temp-output
241+
- id: perfetto
242+
subsystem: deps
243+
label: dependencies
244+
run: |
245+
./tools/dep_updaters/update-perfetto.sh > temp-output
246+
cat temp-output
247+
tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true
248+
rm temp-output
240249
- id: postject
241250
subsystem: deps,test
242251
label: test
@@ -336,7 +345,7 @@ jobs:
336345
# no-op if the base branch is already up-to-date.
337346
with:
338347
token: ${{ secrets.GH_USER_TOKEN }}
339-
branch: actions/${{ github.ref_name == 'main' || format('{0}/', github.ref_name) }}tools-update-${{ matrix.id }} # Custom branch *just* for this Action.
348+
branch: actions/${{ github.ref_name != 'main' && format('{0}/', github.ref_name) || '' }}tools-update-${{ matrix.id }} # Custom branch *just* for this Action.
340349
delete-branch: true
341350
commit-message: ${{ env.COMMIT_MSG }}
342351
labels: ${{ matrix.label }}

benchmark/ffi/invoke-function.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
'use strict';
2+
3+
const assert = require('node:assert');
4+
const common = require('../common.js');
5+
const { libraryPath, ensureFixtureLibrary } = require('./common.js');
6+
7+
// Measure the invocation (call) path for signatures that bypass V8 Fast API
8+
// and use libffi through FFIFunction::Invoke(). On x86-64 System V with
9+
// libffi >= 3.7, Invoke() reuses a precomputed call plan that avoids repeating
10+
// argument-placement work on every call. This benchmark quantifies the
11+
// per-call benefit.
12+
//
13+
// Signatures chosen to bypass both V8 Fast API and keep native work minimal:
14+
// - call_int_callback (null): 'function' type forces the generic path; null
15+
// pointer triggers the early return in C so native computation is negligible.
16+
// From libffi's perspective this is a register-only plan (2 pointer-sized
17+
// args both fit in GP registers on x86-64 System V).
18+
// - sum_8_i32: 8 GP args exceed the x86-64 Fast API register cap (6), forcing
19+
// the generic path. From libffi's perspective 6 args go in registers and 2
20+
// spill to the stack, exercising a stack-spilled plan.
21+
22+
const bench = common.createBenchmark(main, {
23+
n: [1e7],
24+
symbol: ['call_int_callback', 'sum_8_i32'],
25+
}, {
26+
flags: ['--experimental-ffi', '--no-warnings'],
27+
});
28+
29+
ensureFixtureLibrary();
30+
31+
function main({ n, symbol }) {
32+
const ffi = require('node:ffi');
33+
34+
if (symbol === 'call_int_callback') {
35+
// 'function' type bypasses Fast API (IsFastCallEligible rejects it).
36+
// Pass 0n (null function pointer) so the native function returns -1
37+
// immediately without invoking any callback, keeping per-call overhead
38+
// dominated by the FFI call machinery itself.
39+
const { lib, functions } = ffi.dlopen(libraryPath, {
40+
call_int_callback: { return: 'i32', arguments: ['function', 'i32'] },
41+
});
42+
43+
try {
44+
// Verify the null-pointer early return.
45+
assert.strictEqual(functions.call_int_callback(0n, 7), -1);
46+
47+
bench.start();
48+
for (let i = 0; i < n; ++i)
49+
functions.call_int_callback(0n, 21);
50+
bench.end(n);
51+
} finally {
52+
lib.close();
53+
}
54+
} else {
55+
// 8 integer args exceed the x86-64 SysV GP register cap (6), which makes
56+
// CreateFastFFIMetadata reject the signature. Calls go through the
57+
// SharedBuffer or generic invoker into FFIFunction::Invoke().
58+
const { lib, functions } = ffi.dlopen(libraryPath, {
59+
sum_8_i32: {
60+
return: 'i32',
61+
arguments: [
62+
'i32', 'i32', 'i32', 'i32',
63+
'i32', 'i32', 'i32', 'i32',
64+
],
65+
},
66+
});
67+
68+
const fn = functions.sum_8_i32;
69+
70+
assert.strictEqual(fn(1, 2, 3, 4, 5, 6, 7, 8), 36);
71+
72+
bench.start();
73+
for (let i = 0; i < n; ++i)
74+
fn(1, 2, 3, 4, 5, 6, 7, 14);
75+
bench.end(n);
76+
77+
lib.close();
78+
}
79+
}

deps/acorn/acorn/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
## 8.18.0 (2026-07-28)
2+
3+
### New features
4+
5+
The new `startLocation` option can now be used to tell the parser the line and column the parse starts at (mostly useful with `parseExpressionAt`).
6+
7+
### Bug fixes
8+
9+
Reject uses of `**` with a non-parenthesized arrow function as left-hand side.
10+
11+
Avoid computing the start line in `parseExpressionAt` when locations aren't used.
12+
113
## 8.17.0 (2026-06-11)
214

315
### New features

deps/acorn/acorn/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ required):
137137
one-based line and zero-based column numbers in `{line, column}`
138138
form. Default is `false`.
139139

140+
- **startLocation**: An optional `{line, column}` object to use for
141+
the start of the parse. This is mostly useful when using
142+
`parseExpressionAt` with `locations: true`, to prevent the parser
143+
from having to determine the line position at the start position.
144+
140145
- **onToken**: If a function is passed for this option, each found
141146
token will be passed in same format as tokens returned from
142147
`tokenizer().getToken()`.

deps/acorn/acorn/dist/acorn.d.mts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,14 @@ export interface Options {
693693
*/
694694
locations?: boolean
695695

696+
/**
697+
* Pass an optional `{line, column}` object to use for the start of
698+
* the parse. This is mostly useful when using `parseExpressionAt`
699+
* with `locations: true`, to prevent the parser from having to
700+
* determine the line position at the start position.
701+
*/
702+
startLocation?: {line: number, column: number}
703+
696704
/**
697705
* a callback that will cause Acorn to call that export function with object in the same
698706
* format as tokens returned from `tokenizer().getToken()`. Note

deps/acorn/acorn/dist/acorn.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,14 @@ export interface Options {
693693
*/
694694
locations?: boolean
695695

696+
/**
697+
* Pass an optional `{line, column}` object to use for the start of
698+
* the parse. This is mostly useful when using `parseExpressionAt`
699+
* with `locations: true`, to prevent the parser from having to
700+
* determine the line position at the start position.
701+
*/
702+
startLocation?: {line: number, column: number}
703+
696704
/**
697705
* a callback that will cause Acorn to call that export function with object in the same
698706
* format as tokens returned from `tokenizer().getToken()`. Note

deps/acorn/acorn/dist/acorn.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,11 @@
386386
// line being 1-based and column 0-based) will be attached to the
387387
// nodes.
388388
locations: false,
389+
// Pass an optional `{line, column}` object to use for the start of
390+
// the parse. This is mostly useful when using `parseExpressionAt`
391+
// with `locations: true`, to prevent the parser from having to
392+
// determine the line position at the start position.
393+
startLocation: null,
389394
// A function can be passed as `onToken` option, which will
390395
// cause Acorn to call that function with object in the same
391396
// format as tokens returned from `tokenizer().getToken()`. Note
@@ -539,13 +544,17 @@
539544
// Set up token state
540545

541546
// The current position of the tokenizer in the input.
542-
if (startPos) {
543-
this.pos = startPos;
547+
this.pos = startPos || 0;
548+
this.curLine = 1;
549+
if (options.startLocation) {
550+
this.lineStart = this.pos - options.startLocation.column;
551+
this.curLine = options.startLocation.line;
552+
} else if (startPos) {
544553
this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1;
545-
this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;
554+
if (this.options.locations)
555+
{ this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; }
546556
} else {
547-
this.pos = this.lineStart = 0;
548-
this.curLine = 1;
557+
this.lineStart = 0;
549558
}
550559

551560
// Properties of the current token:
@@ -2888,7 +2897,7 @@
28882897
}
28892898
}
28902899

2891-
if (!incDec && this.eat(types$1.starstar)) {
2900+
if (!incDec && !(expr.type === "ArrowFunctionExpression" && expr.start === startPos) && this.eat(types$1.starstar)) {
28922901
if (sawUnary)
28932902
{ this.unexpected(this.lastTokStart); }
28942903
else
@@ -6258,7 +6267,7 @@
62586267
// [ghbt]: https://github.com/acornjs/acorn/issues
62596268

62606269

6261-
var version = "8.17.0";
6270+
var version = "8.18.0";
62626271

62636272
Parser.acorn = {
62646273
Parser: Parser,

deps/acorn/acorn/dist/acorn.mjs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,11 @@ var defaultOptions = {
380380
// line being 1-based and column 0-based) will be attached to the
381381
// nodes.
382382
locations: false,
383+
// Pass an optional `{line, column}` object to use for the start of
384+
// the parse. This is mostly useful when using `parseExpressionAt`
385+
// with `locations: true`, to prevent the parser from having to
386+
// determine the line position at the start position.
387+
startLocation: null,
383388
// A function can be passed as `onToken` option, which will
384389
// cause Acorn to call that function with object in the same
385390
// format as tokens returned from `tokenizer().getToken()`. Note
@@ -533,13 +538,17 @@ var Parser = function Parser(options, input, startPos) {
533538
// Set up token state
534539

535540
// The current position of the tokenizer in the input.
536-
if (startPos) {
537-
this.pos = startPos;
541+
this.pos = startPos || 0;
542+
this.curLine = 1;
543+
if (options.startLocation) {
544+
this.lineStart = this.pos - options.startLocation.column;
545+
this.curLine = options.startLocation.line;
546+
} else if (startPos) {
538547
this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1;
539-
this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;
548+
if (this.options.locations)
549+
{ this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; }
540550
} else {
541-
this.pos = this.lineStart = 0;
542-
this.curLine = 1;
551+
this.lineStart = 0;
543552
}
544553

545554
// Properties of the current token:
@@ -2882,7 +2891,7 @@ pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forIni
28822891
}
28832892
}
28842893

2885-
if (!incDec && this.eat(types$1.starstar)) {
2894+
if (!incDec && !(expr.type === "ArrowFunctionExpression" && expr.start === startPos) && this.eat(types$1.starstar)) {
28862895
if (sawUnary)
28872896
{ this.unexpected(this.lastTokStart); }
28882897
else
@@ -6252,7 +6261,7 @@ pp.readWord = function() {
62526261
// [ghbt]: https://github.com/acornjs/acorn/issues
62536262

62546263

6255-
var version = "8.17.0";
6264+
var version = "8.18.0";
62566265

62576266
Parser.acorn = {
62586267
Parser: Parser,

deps/acorn/acorn/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
],
1717
"./package.json": "./package.json"
1818
},
19-
"version": "8.17.0",
19+
"version": "8.18.0",
2020
"engines": {
2121
"node": ">=0.4.0"
2222
},

0 commit comments

Comments
 (0)