Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
9ad040b
Add the JSX Pack PRD
dnnsjsk Oct 13, 2026
357458e
Plan module resolution in the JSX Pack PRD
dnnsjsk Oct 13, 2026
9322a3a
Avoid SplObjectStorage methods deprecated in PHP 8.5
dnnsjsk Oct 13, 2026
7609d0f
Add JSX syntax: lexer mode, AST, Preserve mode and lowering (Phases 1-2)
dnnsjsk Oct 13, 2026
7927103
Resolve imports like a bundler, run CommonJS, prune barrels (Phases 3-4)
dnnsjsk Oct 13, 2026
cb708b2
Fix two core engine bugs found by running real React in Phasis
dnnsjsk Oct 13, 2026
f9f135c
Render React 19.3 natively in PHP (Phases 5-6)
dnnsjsk Oct 13, 2026
ae84ba5
Add the general HTML profile: phasis and phasis/jsx-runtime (Phase 7)
dnnsjsk Oct 13, 2026
362a99d
Precompile static JSX into string templates (Phase 8)
dnnsjsk Oct 13, 2026
f227e22
Add the SSR bench, an opcache.preload script and a parse cache (Phase 9)
dnnsjsk Oct 13, 2026
e9d7cd4
Document the JSX Pack and record the PRD deviations (Phase 10)
dnnsjsk Oct 13, 2026
4496c62
Regenerate the test262 compatibility snapshot: 50,506 / 50,506
dnnsjsk Oct 13, 2026
8e63dd7
Correct the precompile speed claim and mark the PRD implemented
dnnsjsk Oct 13, 2026
f240364
Add WebAssembly.Memory and reject shared chunks in compression streams
dnnsjsk Oct 14, 2026
8957e70
Load side-effect-free package modules on first use (opt-in)
dnnsjsk Oct 14, 2026
5ccb8b8
Speed up precompiled attributes and time precompile in paired runs
dnnsjsk Oct 14, 2026
54c4895
Regenerate the test262 compatibility snapshot: 50,506 / 50,506
dnnsjsk Oct 14, 2026
458e63e
Merge main (v0.5.0) into feat/jsx-pack
dnnsjsk Oct 15, 2026
178f393
Regenerate the test262 compatibility snapshot: 50,506 / 50,506
dnnsjsk Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@
/bin/* export-ignore
/bin/phasis -export-ignore
/bin/test262 -export-ignore

# JSX fixtures that test CRLF handling must keep their line endings.
/tests/Jsx/**/*crlf* -text
15 changes: 15 additions & 0 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,21 @@ jobs:
- name: Run benchmark
run: ./bin/bench-report --runs ${{ github.event.inputs.runs || '5' }}

# bench/ssr.jsx rendered five ways (native React, precompile, real
# React in Phasis, the HTML profile, the components-only floor), with
# Phasis preloaded the way a production server would run it. Exits
# non-zero when the PRD's ratio targets are missed.
- name: Run SSR benchmark
run: |
php -d opcache.preload="$PWD/preload.php" bench/ssr.php ${{ github.event.inputs.runs || '5' }} | tee ssr-bench.txt
{
echo "## SSR Benchmark"
echo ""
echo '```'
cat ssr-bench.txt
echo '```'
} >> $GITHUB_STEP_SUMMARY

- name: Show summary
if: always()
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs-content.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ jobs:
with:
node-version: 22
- name: Check portable documentation
run: node scripts/check-docs-content.mjs --root docs --expected-docs 25 --expected-nav 4
run: node scripts/check-docs-content.mjs --root docs --expected-docs 28 --expected-nav 4
91 changes: 91 additions & 0 deletions .github/workflows/jsx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: JSX Pack

# Runs the JSX Pack suites: the committed oracle outputs (parse, lowering,
# resolution, package smoke, React render, three-way, HTML, precompile,
# Goals examples) through PHPUnit, then the hydration check, which needs
# Node at test time: React 19.3's client hydrates the HTML Phasis renders
# for every React fixture in jsdom, production and development builds.

on:
push:
branches: [main]
paths:
- 'src/**'
- 'tests/Jsx/**'
- 'phpunit.xml.dist'
- 'composer.json'
- 'composer.lock'
- '.github/workflows/jsx.yml'
pull_request:
branches: [main]
paths:
- 'src/**'
- 'tests/Jsx/**'
- 'phpunit.xml.dist'
- 'composer.json'
- 'composer.lock'
- '.github/workflows/jsx.yml'
workflow_dispatch:

concurrency:
group: jsx-${{ github.ref }}
cancel-in-progress: true

jobs:
jsx:
runs-on: ubuntu-latest
timeout-minutes: 30

steps:
- uses: actions/checkout@v5
with:
submodules: false

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.5'
extensions: mbstring, bcmath, intl, curl
ini-values: opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M
coverage: none

- name: Cache Composer dependencies
uses: actions/cache@v5
with:
path: vendor
key: composer-${{ runner.os }}-php8.5-${{ hashFiles('composer.lock') }}
restore-keys: |
composer-${{ runner.os }}-php8.5-

- name: Install dependencies
run: |
for i in 1 2 3; do
composer install --no-interaction --prefer-dist && break
echo "composer install attempt $i failed; sleeping 10s..."
sleep 10
done
if [ ! -f vendor/autoload.php ]; then
echo "vendor/autoload.php missing after 3 install attempts; failing"
exit 1
fi

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '22'
cache: npm
cache-dependency-path: tests/Jsx/oracle/package-lock.json

- name: Install the pinned oracle toolchain
working-directory: tests/Jsx/oracle
run: npm ci --no-audit --no-fund

# The package smoke and Goals tests load packages from the pinned
# toolchain's node_modules, so install it first.
- name: Run JSX suites
run: php -d memory_limit=1G vendor/bin/phpunit --testsuite jsx

- name: Hydrate every React fixture
env:
TZ: UTC
run: node tests/Jsx/oracle/hydrate.mjs
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,8 @@ package-lock.json
# Claude Code internal state
.claude/
tests/Wpt/upstream/

# JSX Pack oracle toolchain: lockfile is committed, dependencies are not.
tests/Jsx/oracle/node_modules/
!tests/Jsx/oracle/package-lock.json
tests/Jsx/oracle/.out/
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## [0.6.0] - 2026-10-15

### Added
- JSX Pack: render JSX components to HTML from PHP with no build step
- JSX syntax in `.jsx` modules (`Phasis\Parser\Jsx\JsxOptions`, `JsxMode`), lowered at parse time exactly like esbuild's automatic and classic runtimes, with `@jsx*` pragmas. `JsxMode::Preserve` keeps JSX nodes (`Phasis\Ast\Jsx\*`) for tooling and `EstreeSerializer` exports them as ESTree JSX
- `Engine::render()` and `Engine::renderSource()` render a component module with PHP props, choosing the profile from the JSX import source or a `Phasis\RenderProfile`
- Native React 19.3: `react`, `react/jsx-runtime`, `react-dom`, `react-dom/server` and `react-dom/static` are built-in modules implemented in PHP, a port of React's Fizz server renderer. Output is byte-identical to `react-dom@19.3.0` (`renderToString`, `renderToStaticMarkup`, `prerender`) and hydrates with React 19.3's client
- The general HTML profile: `phasis` and `phasis/jsx-runtime`, byte-identical to preact-render-to-string 6.8.0, with `raw()` and `renderToStringAsync()`
- `JsxMode::Precompile`: static markup compiled to string templates, byte-identical output
- Bundler-style module resolution: import maps (`Engine::setImportMap()`), extension and `index` probing, `jsconfig`/`tsconfig` path aliases, `package.json` `exports`/`imports`/`module`/`main` with conditions (`Phasis\Module\ModuleOptions`), CommonJS packages with bundler interop, `process.env.NODE_ENV`, empty style imports, asset and CSS-module resolvers (`setAssetResolver()`, `setCssModuleResolver()`), and barrel pruning for `sideEffects: false` packages
- `Engine::getExport()` returns one export of a module converted to PHP
- `preload.php` for `opcache.preload`, and `ModuleOptions::$parseCacheDir`, an on-disk cache of parsed modules
- `ModuleOptions::$deferSideEffectFreeModules` (opt-in): modules from packages that declare `"sideEffects": false` load when one of their bindings is first read. Importing one `lucide-react` icon then loads 4 modules instead of 13
- `bin/phasis --render <file.jsx> --props '<json>'`
- `WebAssembly.Memory`, including shared memories, and the `WebAssembly.CompileError`, `LinkError` and `RuntimeError` constructors. Phasis still can't compile or run WebAssembly modules, so `compile`, `instantiate`, `Module` and the other module APIs stay absent
- Docs: JSX, React and Modules pages

### Changed
- `Engine::execFile()` runs `.mjs` and JSX files through the module loader and returns `null` for them. The docs claimed this for any file with top-level `import`; `.js` files are, and stay, classic scripts
- `bin/phasis` runs `.mjs` and `.jsx` files as modules, and `--ast` keeps JSX for `.jsx` files

### Fixed
- `CompressionStream` and `DecompressionStream` accepted chunks backed by a `SharedArrayBuffer`; `BufferSource` excludes shared buffers, so the write now rejects with a `TypeError`
- In strict code, `try { return f(); } catch (e) { ... }` treated the call as a tail call, so an exception from `f` skipped the `catch`
- `Reflect.construct` did not initialize class fields of base classes, or of derived classes with an implicit constructor
- PHP 8.5 deprecation notices from `SplObjectStorage` in `JSON` and `DisposableStack`

## [0.5.0] - 2026-10-14

### Added
Expand Down
48 changes: 24 additions & 24 deletions COMPAT.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
Generated from a completed `test262` pass. Do not edit by hand.

- Refresh: `./bin/compat-report`
- Snapshot time: `2026-10-14T17:39:02+00:00`
- Chunk size: `25`
- Snapshot time: `2026-10-15T06:21:36+00:00`
- Chunk size: `250`
- Timeout: `300s`
- Jobs: `4`
- Jobs: `8`
- Groups: `159`
- Test files: `50506`
- Git: `main` @ `b9cd1c8` (dirty)
- Git: `feat/jsx-pack` @ `458e63e` (dirty)

## Summary

Expand Down Expand Up @@ -196,26 +196,26 @@ Generated from a completed `test262` pass. Do not edit by hand.

| Group | Kind | Duration | Files | Sample |
|---|---|---:|---:|---|
| staging/sm | NORMAL | 70.569s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-7-of-8.js` |
| staging/sm | NORMAL | 68.679s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-8-of-8.js` |
| staging/sm | NORMAL | 67.809s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-2-of-8.js` |
| staging/sm | NORMAL | 67.306s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-4-of-8.js` |
| staging/sm | NORMAL | 67.103s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-3-of-8.js` |
| built-ins/decodeURIComponent | NORMAL | 66.091s | 1 | `test262/test/built-ins/decodeURIComponent/S15.1.3.2_A2.5_T1.js` |
| staging/sm | NORMAL | 60.140s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-5-of-8.js` |
| staging/sm | NORMAL | 56.933s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-6-of-8.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 55.316s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 54.950s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 54.799s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 54.679s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 54.550s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js` |
| built-ins/decodeURIComponent | NORMAL | 54.235s | 25 | `test262/test/built-ins/decodeURIComponent/S15.1.3.2_A1.11_T2.js`<br>`test262/test/built-ins/decodeURIComponent/S15.1.3.2_A1.12_T1.js`<br>...<br>`test262/test/built-ins/decodeURIComponent/S15.1.3.2_A1.8_T1.js`<br>`test262/test/built-ins/decodeURIComponent/S15.1.3.2_A1.8_T2.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 53.996s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 53.276s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js` |
| staging/sm | NORMAL | 53.097s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-1-of-8.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 51.391s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 51.103s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 51.097s | 5 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khitan_Small_Script.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 249.218s | 125 | `test262/test/built-ins/RegExp/property-escapes/generated/ASCII.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js`<br>...<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 244.438s | 125 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js`<br>...<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yezidi.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 204.415s | 104 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js`<br>...<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nag_Mundari.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js` |
| built-ins/RegExp/property-escapes/generated | NORMAL | 151.806s | 105 | `test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js`<br>...<br>`test262/test/built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-u.js`<br>`test262/test/built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence.js` |
| staging/sm | NORMAL | 46.146s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-7-of-8.js` |
| staging/sm | NORMAL | 45.935s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-2-of-8.js` |
| staging/sm | NORMAL | 45.499s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-5-of-8.js` |
| staging/sm | NORMAL | 44.407s | 250 | `test262/test/staging/sm/Proxy/regress-bug1062349.js`<br>`test262/test/staging/sm/Proxy/regress-bug950407.js`<br>...<br>`test262/test/staging/sm/TypedArray/object-defineproperty.js`<br>`test262/test/staging/sm/TypedArray/of.js` |
| staging/sm | NORMAL | 43.700s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-8-of-8.js` |
| staging/sm | NORMAL | 43.384s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-3-of-8.js` |
| staging/sm | NORMAL | 40.998s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-4-of-8.js` |
| staging/sm | NORMAL | 39.099s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-6-of-8.js` |
| intl402 | NORMAL | 39.069s | 22 | `test262/test/intl402/constructors-string-and-single-element-array.js`<br>`test262/test/intl402/constructors-taint-Object-prototype-2.js`<br>...<br>`test262/test/intl402/supportedLocalesOf-throws-if-element-not-string-or-object.js`<br>`test262/test/intl402/supportedLocalesOf-unicode-extensions-ignored.js` |
| staging/sm | NORMAL | 36.203s | 1 | `test262/test/staging/sm/Date/dst-offset-caching-1-of-8.js` |
| staging/sm | NORMAL | 34.240s | 250 | `test262/test/staging/sm/TypedArray/prototype-constructor-identity.js`<br>`test262/test/staging/sm/TypedArray/seal-and-freeze.js`<br>...<br>`test262/test/staging/sm/extensions/extension-methods-reject-null-undefined-this.js`<br>`test262/test/staging/sm/extensions/for-loop-with-lexical-declaration-and-nested-function-statement.js` |
| staging/sm | NORMAL | 33.876s | 250 | `test262/test/staging/sm/extensions/function-caller-skips-eval-frames.js`<br>`test262/test/staging/sm/extensions/function-properties.js`<br>...<br>`test262/test/staging/sm/regress/regress-554955-6.js`<br>`test262/test/staging/sm/regress/regress-559402-1.js` |
| language/literals | NORMAL | 27.326s | 250 | `test262/test/language/literals/bigint/binary-invalid-digit.js`<br>`test262/test/language/literals/bigint/exponent-part.js`<br>...<br>`test262/test/language/literals/regexp/S7.8.5_A2.2_T2.js`<br>`test262/test/language/literals/regexp/S7.8.5_A2.3_T1.js` |
| staging/sm | NORMAL | 25.231s | 1 | `test262/test/staging/sm/TypedArray/sort_large_countingsort.js` |
| staging/sm | NORMAL | 21.972s | 1 | `test262/test/staging/sm/TypedArray/element-setting-converts-using-ToNumber.js` |
| built-ins/decodeURIComponent | NORMAL | 21.224s | 1 | `test262/test/built-ins/decodeURIComponent/S15.1.3.2_A2.5_T1.js` |

## Runner Caveats

Expand Down
Loading
Loading