Skip to content

ci(verify-baseline): parse //@ JSC flags, skip v128 wasm fixtures on x64, re-enable --jit-stress on WebKit changes - #34877

Open
robobun wants to merge 4 commits into
mainfrom
farm/3cec3838/verify-baseline-jit-stress-env
Open

ci(verify-baseline): parse //@ JSC flags, skip v128 wasm fixtures on x64, re-enable --jit-stress on WebKit changes#34877
robobun wants to merge 4 commits into
mainfrom
farm/3cec3838/verify-baseline-jit-stress-env

Conversation

@robobun

@robobun robobun commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

What

hasWebKitChanges() in .buildkite/ci.mjs was still checking for cmake/targets/SetupWebKit.cmake, a file removed when the build moved off cmake (#27973), so verify-baseline --jit-stress has not run since. Re-pointing it at scripts/build/deps/webkit.ts surfaces two problems in the --jit-stress phase (seen on build 76600 while #34782 briefly re-enabled it):

CompileError: WebAssembly.Module doesn't parse at byte 19: can't get 1th argument Type
CompileError: WebAssembly.Module doesn't parse at byte 3: can't get Function local's type in group 0

Root cause

bbq-osr-with-exceptions.js and omg-tail-call-clobber-scratch-register.js encode v128 (0x7B) types in their wasm modules. Under Nehalem emulation (no AVX), JSC's recomputeDependentOptions() does:

if (isX86_64() && !isX86_64_AVX())
    Options::useWasmSIMD() = false;

which makes v128 an invalid wasm type and the module fails to parse. aarch64 is unaffected (NEON is always available), which is why only the Linux x64 lanes failed.

Separately, verify-baseline.ts spawned fixtures with the bare process env, so each fixture's //@ runDefault(...) / runFTLNoCJIT(...) / runDefaultWasm(...) directive (jitPolicyScale, useJSPI, useDollarVM, createPreHeaders, ...) was ignored and the bunEnv test-harness knobs (BUN_DEBUG_QUIET_LOGS, BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING) were not set, unlike jsc-stress.test.ts.

Fix

  • Extract parseJSCFlags to test/js/bun/jsc-stress/jsc-flags.ts and import it from both jsc-stress.test.ts and scripts/verify-baseline.ts. runTest() now spawns with a bunEnv-equivalent base env plus the parsed //@ flags.
  • Skip the two v128-using wasm fixtures on x64. A real baseline CPU can never reach the wasm-SIMD JIT path, so there is nothing to verify there. aarch64 keeps running them.
  • Point hasWebKitChanges() at scripts/build/deps/webkit.ts so --jit-stress actually runs on WebKit bumps again.
  • Skip --jit-stress on the Windows SDE lane: Pin instrumentation costs ~45s per process (measured on build 76600), so 80+ serial fixtures would take roughly an hour against the 30-minute step timeout. qemu-Nehalem on Linux verifies the same x64-no-AVX JIT output at ~1s/fixture.

Tests

test/js/bun/jsc-stress/jsc-flags.test.ts unit-tests parseJSCFlags and, more importantly, runs every wasm fixture under BUN_JSC_useWasmSIMD=false to assert wasmSIMDFixtures lists exactly the ones that fail to parse without SIMD. If a new fixture starts (or an existing one stops) requiring v128, this test fails before the verify-baseline lane does.

This is a CI-tooling change (no src/ edits); the fail-before-fix gate that stashes src/ is not meaningful here.


[stamp-90s] gate passed · iteration 0 · 5 files touched

passes on PR (with fix)
Test-only change.

Debug/ASAN (expected pass):
$ bun bd test 'test/js/bun/jsc-stress/jsc-flags.test.ts' 'test/js/bun/jsc-stress/jsc-stress.test.ts'
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test test/js/bun/jsc-stress/jsc-flags.test.ts test/js/bun/jsc-stress/jsc-stress.test.ts
info: syncing channel updates for nightly-2026-05-06-x86_64-unknown-linux-gnu
info: latest update on 2026-05-06 for version 1.97.0-nightly (e95e73209 2026-05-05)
info: component rust-src is up to date
info: checking for self-update (current version: 1.29.0)
bun test v1.4.0 (326d4983b)

test/js/bun/jsc-stress/jsc-stress.test.ts:
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-arithsin.js [482.23ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-arithcos.js [460.46ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-arithsqrt.js [461.42ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-arithtan.js [469.88ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-string-equality.js [481.88ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-string-strict-equality.js [473.77ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-library-substring.js [463.96ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-string-ident-equality.js [479.16ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-regexp-test.js [495.93ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-regexp-exec.js [589.75ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-getmyargumentslength.js [458.03ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-getmyargumentslength-inline.js [454.64ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-get-my-argument-by-val.js [482.34ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-get-my-argument-by-val-inlined.js [496.93ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-get-my-argument-by-val-inlined-and-not-inlined.js [521.50ms]
(pass) JSC JIT Stress Tests > JS (Baseline/DFG/FTL) > ftl-call-exception-no-catch.js [491.98ms]
(pass) JSC JIT Stress Tests > 
... (truncated)
Exit: 0
diff hotspot
.buildkite/ci.mjs                         | 14 +++--
 scripts/verify-baseline.ts                | 42 ++++++++++++---
 test/js/bun/jsc-stress/jsc-flags.test.ts  | 89 +++++++++++++++++++++++++++++++
 test/js/bun/jsc-stress/jsc-flags.ts       | 48 +++++++++++++++++
 test/js/bun/jsc-stress/jsc-stress.test.ts | 41 +-------------
 5 files changed, 184 insertions(+), 50 deletions(-)

gate history · 3 passed · 0 rejected · iteration 0

evidence per changed file
file                                       reads  edits  tests
.buildkite/ci.mjs                              2      6      0
scripts/verify-baseline.ts                     3      8      0
test/js/bun/jsc-stress/jsc-flags.test.ts       1      6      0
test/js/bun/jsc-stress/jsc-flags.ts            1      2      0
test/js/bun/jsc-stress/jsc-stress.test.ts      1      1      0

…x64, re-enable --jit-stress on WebKit changes

hasWebKitChanges() was still checking for cmake/targets/SetupWebKit.cmake, a
file removed when the build moved off cmake, so verify-baseline --jit-stress
has not run since. Pointing it at scripts/build/deps/webkit.ts surfaces two
issues in the --jit-stress path:

  * Fixtures were spawned with the bare process env, so //@ runDefault /
    runFTLNoCJIT / runDefaultWasm directives (jitPolicyScale, useJSPI,
    useDollarVM, createPreHeaders, ...) and the bunEnv test-harness knobs
    (BUN_DEBUG_QUIET_LOGS, BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING, etc.) were
    not applied. jsc-stress.test.ts already did both; factor parseJSCFlags
    out to test/js/bun/jsc-stress/jsc-flags.ts and use it from both places.

  * bbq-osr-with-exceptions.js and omg-tail-call-clobber-scratch-register.js
    declare v128 (0x7B) types. On Nehalem (no AVX), JSC's
    recomputeDependentOptions() force-disables useWasmSIMD, which makes v128
    an invalid type and the module fails to parse with
    "WebAssembly.Module doesn't parse ... can't get ... Type". Skip those
    two on x64: a real Nehalem CPU never runs the wasm-SIMD JIT path anyway,
    so there is nothing to verify. aarch64 keeps running them.

jsc-flags.test.ts runs every wasm fixture under BUN_JSC_useWasmSIMD=false so
the skip list drifts into a test failure if a new fixture starts (or an
existing one stops) requiring wasm SIMD.
@robobun

robobun commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author
Updated 11:20 PM PT - Jul 20th, 2026

@robobun, your commit 326d498 has 2 failures in Build #76646 (All Failures):


🧪   To try this PR locally:

bunx bun-pr 34877

That installs a local version of the PR into your bun-34877 executable, so you can run:

bun-34877 --bun

@robobun

robobun commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator Author

Status: ready for review. CI build 76646 is green on everything this diff touches (jsc-flags.test.ts, jsc-stress.test.ts, verify-baseline).

Remaining red on 76646 is unrelated to this diff:

Reproduced locally by forcing BUN_JSC_useWasmSIMD=false (what JSC does on Nehalem):

$ BUN_JSC_useWasmSIMD=false bun --preload ../../preload.js ./bbq-osr-with-exceptions.js
CompileError: WebAssembly.Module doesn't parse at byte 19: can't get 1th argument Type

$ BUN_JSC_useWasmSIMD=false bun --preload ../../preload.js ./omg-tail-call-clobber-scratch-register.js
CompileError: WebAssembly.Module doesn't parse at byte 3: can't get Function local's type in group 0

End-to-end verify-baseline.ts --jit-stress with a pass-through emulator: 82 pass, 2 skip, 0 fail.

bun bd test test/js/bun/jsc-stress/jsc-flags.test.ts: 27 pass.

No src/ edits; the fail-before-fix gate that stashes src/ is not meaningful here.

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Changes

The pull request centralizes JSC fixture flag parsing, adds wasm SIMD classification and tests, applies per-fixture environments during baseline verification, skips unsupported fixtures, and refines WebKit-triggered CI JIT-stress gating.

Baseline verification

Layer / File(s) Summary
Fixture flags and coverage
test/js/bun/jsc-stress/jsc-flags.ts, test/js/bun/jsc-stress/jsc-flags.test.ts, test/js/bun/jsc-stress/jsc-stress.test.ts
JSC directive parsing and wasm SIMD fixture tracking are shared, tested, and imported by the stress tests.
Baseline fixture execution
scripts/verify-baseline.ts
Baseline runs merge fixture environments, apply parsed JSC flags, skip listed wasm SIMD fixtures on non-aarch64 platforms, and report skipped fixtures.
CI baseline gating
.buildkite/ci.mjs
WebKit detection now uses scripts/build/deps/webkit.ts; JIT-stress and the longer timeout apply only when the target is neither Windows nor Android.

Possibly related PRs

  • oven-sh/bun#34009: Changes the WebKit dependency file used by the updated CI detection.
  • oven-sh/bun#34138: Updates the same WebKit dependency file referenced by CI detection.
  • oven-sh/bun#34782: Changes related baseline verification conditions in .buildkite/ci.mjs.

Suggested reviewers: dylan-conway

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the main CI change: parsing JSC flags, skipping v128 wasm fixtures on x64, and re-enabling jit-stress for WebKit changes.
Description check ✅ Passed The PR description covers the changes and verification evidence, though it doesn't follow the exact template headings.

Comment @coderabbitai help to get the list of available commands.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — CI-tooling only, no src/ changes.

What was reviewed:

  • parseJSCFlags extraction to jsc-flags.ts is byte-identical to the removed copy in jsc-stress.test.ts; verified the four unit-test assertions match the actual //@ directives in the referenced fixtures.
  • hasWebKitChanges() now checks paths that exist (scripts/build/deps/webkit.ts, vendor/WebKit/); confirmed both are real repo paths referenced elsewhere.
  • verify-baseline.ts's new env plumbing also affects the Phase 1 SIMD test run — the added bunEnv-style knobs (BUN_DEBUG_QUIET_LOGS, NO_COLOR, etc.) are harmless there.
  • New jsc-flags.test.ts follows harness conventions (concurrent, drains all pipes, bunEnv spread) and keeps the wasmSIMDFixtures skip list self-syncing.
Extended reasoning...

Overview

This PR fixes the verify-baseline --jit-stress CI phase, which has been silently disabled since the cmake→build.ts migration removed SetupWebKit.cmake. It touches five files, none in src/:

  • .buildkite/ci.mjs: one-line fix to hasWebKitChanges() — replace the stale SetupWebKit.cmake check with scripts/build/deps/webkit.ts / vendor/WebKit/.
  • test/js/bun/jsc-stress/jsc-flags.ts: new file — parseJSCFlags extracted verbatim from jsc-stress.test.ts, plus a wasmSIMDFixtures set naming the two v128-using fixtures.
  • test/js/bun/jsc-stress/jsc-stress.test.ts: pure deletion of the local parseJSCFlags in favor of the shared import. No behavioral change.
  • scripts/verify-baseline.ts: import the shared helper; pass a bunEnv-equivalent base env plus the parsed //@ flags to each fixture spawn; skip the two v128 wasm fixtures on x64 (Nehalem emulation force-disables useWasmSIMD, so the modules can never parse there).
  • test/js/bun/jsc-stress/jsc-flags.test.ts: new — unit tests for parseJSCFlags and a concurrent describe that runs every wasm fixture under BUN_JSC_useWasmSIMD=false to assert wasmSIMDFixtures lists exactly the ones that fail to parse without SIMD.

Security risks

None. This is CI/test tooling. No user input parsing, no auth/crypto, no network. The changedFiles predicate in ci.mjs only gates whether an extra CI phase runs; a false positive just means more testing.

Level of scrutiny

Low-to-medium. No shipped-binary code changes. The riskiest effect is re-enabling a CI phase that hasn't run in a while, but that phase only fires on PRs touching WebKit paths, and the two known-failing fixtures under Nehalem are now skipped with a documented rationale (JSC's recomputeDependentOptions() disables wasm SIMD on x86_64 without AVX, so v128 modules can't parse — nothing to verify there).

Other factors

  • The parseJSCFlags move is a textbook "one implementation, in the right place" refactor per REVIEW.md — both consumers now share the same parser.
  • I checked the fixture headers on disk against the four parseJSCFlags unit-test expectations; all match (including the multi-directive case in omg-tail-call-clobber-scratch-register.js where a non-matching //@ skip if ... line correctly falls through to continue).
  • The new test file follows harness conventions: describe.concurrent, {...bunEnv, ...} spread, Promise.all on stdout/stderr/exited, and the same isDebug ? 180_000 : undefined timeout pattern as jsc-stress.test.ts. It adds ~22 concurrent subprocess spawns per CI run, which is acceptable given the debug-timeout headroom.
  • The self-syncing test ("every listed fixture exists" + per-fixture SIMD-off run) means the skip list can't drift silently — a nice touch that addresses the "never silently weaken a test" rule.
  • The fixtureBaseEnv in verify-baseline.ts now applies to all runTest calls (including the Phase 1 SIMD test), not just the jit-stress fixtures. The added vars are the standard test-harness knobs and are benign for bun test.
  • No CODEOWNERS entries cover the touched paths.

…g fixture names in test

Intel SDE's Pin instrumentation costs ~45s per process (build 76600:
dfg-ai-fold-bigint.js 46.0s, dfg-call-class-constructor.js 44.9s, ...), so
80+ serial fixtures would take roughly an hour against a 30-minute step
timeout. qemu-Nehalem on Linux verifies the same x64-no-AVX JIT output at
~1s/fixture, so Windows keeps only the static scan and the SIMD test.

Also replace the per-fixture expect(bool).toBe(true) existence check with a
single .toEqual([]) so a stale wasmSIMDFixtures entry prints its name in the
failure diff.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — well-reasoned CI-tooling fix with a guard test that keeps the skip list honest. The inline nit about vendor/WebKit/ is cosmetic; the live webkit.ts clause is what actually fires on WebKit bumps.

What was reviewed:

  • parseJSCFlags extraction is byte-for-byte identical to what was in jsc-stress.test.ts; verified the parser handles multi-line //@ headers (e.g. skip if ... before runDefault(...)) correctly against the actual fixture files.
  • wasmSIMDFixtures skip is gated on !isAarch64, matching needsBaselineVerification (Linux aarch64 still runs the v128 fixtures under Cortex-A53).
  • Windows --jit-stress opt-out is a coverage reduction, but the justification (SDE ~45s/fixture vs 30min step timeout, same x64-no-AVX codegen already covered by qemu-Nehalem on Linux) holds.
  • Checked that the new jsc-flags.test.ts under debug/ASAN was examined for the ASAN_OPTIONS / wasm-fault-handler concern — ruled out.
Extended reasoning...

Overview

This PR touches only CI tooling and test-harness code — no src/ edits. It (1) re-points hasWebKitChanges() in .buildkite/ci.mjs from a since-deleted cmake file to scripts/build/deps/webkit.ts, so verify-baseline --jit-stress actually runs again on WebKit bumps; (2) extracts parseJSCFlags from jsc-stress.test.ts into a shared test/js/bun/jsc-stress/jsc-flags.ts and wires it into scripts/verify-baseline.ts so fixtures get their //@ directive flags plus a bunEnv-equivalent base env; (3) skips two v128-typed wasm fixtures on x64 baseline emulation (JSC force-disables useWasmSIMD without AVX, so they can't parse); (4) disables --jit-stress on the Windows SDE lane because Pin startup makes it ~1h vs a 30min timeout; and (5) adds jsc-flags.test.ts which unit-tests the parser and, more usefully, runs every wasm fixture under BUN_JSC_useWasmSIMD=false to assert wasmSIMDFixtures is exactly the set that fails to parse — so a new v128 fixture breaks this test before it breaks the verify-baseline lane.

Security risks

None. This is CI pipeline configuration and a test-harness helper. No untrusted input parsing, no auth/crypto/permissions, no changes to shipped code.

Level of scrutiny

Moderate — CI tooling that gates what runs on WebKit-bump PRs. The riskiest part is re-enabling a lane that hasn't run since the cmake removal, but the PR was written because that lane was exercised on build 76600 and the two failure modes it found are exactly what this PR fixes. The Windows --jit-stress opt-out reduces coverage, but the rationale (identical x64-no-AVX JIT output already verified under qemu-Nehalem at ~1s/fixture) is sound and documented inline.

Other factors

  • parseJSCFlags is a verbatim move; I diffed the removed block against the new file and cross-checked the parser against the real //@ headers in the fixture directory (multi-line headers like //@ skip if ... followed by //@ runDefault(...) are handled — the startsWith("//@") guard keeps iterating and only the run* regex extracts flags).
  • The !isAarch64 gate on the skip matches the emulation matrix: only Linux x64-baseline and Windows x64-baseline emulate Nehalem; Linux aarch64 emulates Cortex-A53 where NEON is always present, so the v128 fixtures still run there.
  • Verified scripts/build/deps/webkit.ts exists and vendor/ is gitignored (.gitignore:156), confirming the inline nit that the vendor/WebKit/ clause is dead but harmless.
  • The bug-hunting system also examined whether jsc-flags.test.ts needs the ASAN_OPTIONS=allow_user_segv_handler=1 override that jsc-stress.test.ts applies for debug-ASAN wasm fixtures, and ruled it out.
  • The one reported finding is a nit (dead || clause) that doesn't affect behavior; the live clause covers WebKit version bumps.

Comment thread .buildkite/ci.mjs Outdated
vendor/ is gitignored (.gitignore:156); changedFiles comes from GitHub's
PR-files API which only returns tracked paths, so the clause can never match.
WebKit version bumps land in scripts/build/deps/webkit.ts, which the remaining
clause covers.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.buildkite/ci.mjs:
- Around line 763-765: Update the Windows SDE comment in the CI configuration to
remove the changeable timing and fixture-count measurements. Preserve only the
durable rationale that Windows SDE is too slow for the serial JIT-stress suite,
while noting that Linux qemu-Nehalem covers the same x64-no-AVX JIT output and
Windows retains the static scan and SIMD test.
- Around line 766-767: Update the wantJitStress calculation in the CI target
setup to exclude Android targets that use --skip-emulation, so WebKit changes
alone do not enable the no-op --jit-stress flag or the longer timeout. Apply the
same condition to the corresponding logic near the later Android target
handling, while preserving JIT stress for non-Android and Android targets
without --skip-emulation.
- Around line 749-750: Update the changedFiles check in the WebKit dependency
detection logic to compare each entry exactly with the root-relative path
"scripts/build/deps/webkit.ts" rather than using substring matching. Preserve
the existing some-based behavior so the suite is enabled only when that exact
file changes.

In `@scripts/verify-baseline.ts`:
- Around line 101-107: Update the fixtureBaseEnv definition to explicitly remove
the inherited JSC_useJIT environment variable, matching bunEnv’s handling and
the test harness behavior. Preserve the remaining inherited environment
variables and fixture-specific settings unchanged.

In `@test/js/bun/jsc-stress/jsc-flags.ts`:
- Around line 6-14: Condense the comments to three lines or fewer without
changing behavior: shorten the API documentation and SIMD rationale in
test/js/bun/jsc-stress/jsc-flags.ts (lines 6-14 and 45-52), the file-level test
and skip-list rationales in test/js/bun/jsc-stress/jsc-flags.test.ts (lines 1-5
and 46-50), and the Nehalem skip rationale in scripts/verify-baseline.ts (lines
272-275).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 90af2833-5ffa-430f-aa4f-f915b019ac66

📥 Commits

Reviewing files that changed from the base of the PR and between 602db99 and 503fea4.

📒 Files selected for processing (5)
  • .buildkite/ci.mjs
  • scripts/verify-baseline.ts
  • test/js/bun/jsc-stress/jsc-flags.test.ts
  • test/js/bun/jsc-stress/jsc-flags.ts
  • test/js/bun/jsc-stress/jsc-stress.test.ts

Comment thread .buildkite/ci.mjs Outdated
Comment thread .buildkite/ci.mjs
Comment thread .buildkite/ci.mjs Outdated
Comment thread scripts/verify-baseline.ts Outdated
Comment thread test/js/bun/jsc-stress/jsc-flags.ts

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — CI-tooling only, no src/ changes; all prior feedback (dead vendor/WebKit/ clause, exact-path match, JSC_useJIT strip, Android --skip-emulation gating, comment length) is addressed and resolved.

What was reviewed:

  • hasWebKitChanges now points at scripts/build/deps/webkit.ts (verified to exist) with exact match; wantJitStress correctly excludes Windows SDE and Android --skip-emulation lanes, and the 30-min timeout keys off it.
  • parseJSCFlags is a byte-for-byte move from jsc-stress.test.ts; spot-checked its output against the four fixture headers used in the new unit tests.
  • verify-baseline.ts's fixtureBaseEnv mirrors bunEnv (including the JSC_useJIT strip), and the v128 skip is guarded by jsc-flags.test.ts so the list can't drift.
  • Ruled out: the missing ASAN_OPTIONS override in jsc-flags.test.tsbunEnv already sets it for the CI ASAN binary.
Extended reasoning...

Overview

This PR fixes the verify-baseline --jit-stress CI lane, which has been silently disabled since the cmake→build.ts migration removed SetupWebKit.cmake. Five files touched, none under src/:

  • .buildkite/ci.mjs: repoints hasWebKitChanges to scripts/build/deps/webkit.ts (exact match), gates --jit-stress off Windows SDE (Pin startup cost) and Android (--skip-emulation), and keys the 30-min timeout on the actual wantJitStress decision instead of the raw predicate.
  • scripts/verify-baseline.ts: spawns fixtures with a bunEnv-equivalent base env plus each fixture's parsed //@ JSC flags; skips the two v128-typed wasm fixtures on x64 (JSC force-disables useWasmSIMD without AVX, so the modules cannot parse under Nehalem).
  • test/js/bun/jsc-stress/jsc-flags.ts: extracted parseJSCFlags (moved verbatim) plus the wasmSIMDFixtures set.
  • test/js/bun/jsc-stress/jsc-flags.test.ts: unit tests for parseJSCFlags and a guard that runs every wasm fixture under BUN_JSC_useWasmSIMD=false to prove wasmSIMDFixtures lists exactly the ones that fail without SIMD.
  • test/js/bun/jsc-stress/jsc-stress.test.ts: now imports parseJSCFlags instead of defining it inline (no behavioral change).

Security risks

None. This is CI pipeline configuration and test infrastructure. No auth, crypto, permissions, or user-facing surface. The only external effect is which CI steps run on WebKit-bump PRs.

Level of scrutiny

Medium-low. .buildkite/ci.mjs is load-bearing for the whole pipeline, but the edit is confined to getVerifyBaselineStep and its helper — the rest of the pipeline is untouched. The verify-baseline lane it re-enables only runs on PRs that touch scripts/build/deps/webkit.ts, and its failure mode is a red CI step, not a shipped-binary regression. verify-baseline.ts is a diagnostic script, not runtime code. The jsc-stress.test.ts change is a pure refactor (function extraction).

Other factors

  • I verified scripts/build/deps/webkit.ts exists on disk and that the four fixtures referenced in the new parseJSCFlags unit tests have the exact //@ headers the assertions expect (including the intervening //@ skip if line in omg-tail-call-clobber-scratch-register.js, which the parser correctly steps past via continue).
  • The wasmSIMDFixtures guard test is the right shape: it fails if a new v128 fixture is added without updating the list and if a listed fixture stops needing SIMD, so the skip list is self-maintaining.
  • My earlier review flagged a dead vendor/WebKit/ clause; that was dropped in 503fea4. CodeRabbit's follow-ups (exact-path match, Android gating, JSC_useJIT strip, comment length) were all applied in 326d498 and every thread is resolved. The one CodeRabbit suggestion the author declined (dropping the measured Pin timings from the comment) was reasonably pushed back on and withdrawn.
  • Finder agents raised whether jsc-flags.test.ts needs the same ASAN_OPTIONS fallback as jsc-stress.test.ts; verifiers refuted it — bunEnv already sets ASAN_OPTIONS when the binary name contains asan, which covers the CI release-ASAN lane. The extra override in the sibling file exists only for the local bun-debug case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant