Standards conformance

Generated by zinc compat (tests/compat/run.mjs) on 2026-09-28 from Zinc ea4ef8c (with uncommitted compiler / runtime changes), darwin-arm64, in 924 s. Do not edit: rerun zinc compat. The raw per-test results are in tests/compat/results/2026-09-28.json.

Zinc runs every test four ways: the sim oracle (JavaScript on Node) and the native host build, each in the gradual profile (any is Dyn) and the strict one (any refused). Node, Deno, Bun and QuickJS run the same tests as reference engines, with the real harnesses (test262 assert.js, WPT testharness.js). Status letters: ✓ pass, ✗ fail (wrong result or crash), R rejected at compile time (a Z or TypeScript diagnostic: the program is outside Zinc’s subset or uses a missing API), U unsupported by the harness for Zinc (reflection helpers, the asynchronous testharness API, sloppy mode), T timeout. Rates are passes over every selected test, so R and U count as losses.

Engines: Zinc sim, Zinc sim strict, Zinc native, Zinc native strict, Node (v24.14.0), Deno (deno 2.9.6 (stable, release, aarch64-apple-darwin)), Bun (1.3.11), QuickJS (QuickJS version 2026-06-04). Suites: test262 7ab7fafa00 (BSD-3-Clause), wpt 375cf2548a (BSD-3-Clause), quickjs 2f0aa72a6b (MIT), plus 19 curated Node API tests (tests/compat/node).

Summary

SuiteTestsZinc simZinc sim strictZinc nativeZinc native strictNodeDenoBunQuickJS
WinterTC APIs exposed as globals7854/7854/7854/7854/7871/7877/7875/783/78
WinterTC WPT files2228/222 (4%)8/222 (4%)4/222 (2%)4/222 (2%)174/222 (78%)191/222 (86%)128/222 (58%)4/222 (2%)
WinterTC WPT subtests39/39 (100%)39/39 (100%)20/20 (100%)20/20 (100%)17368/17758 (97.8%)17445/17916 (97.4%)12751/17673 (72.1%)39/16137 (0.2%)
ECMAScript (test262)2113434/2113 (20.5%)426/2113 (20.2%)401/2113 (19.0%)396/2113 (18.7%)2030/2113 (96.1%)2038/2113 (96.5%)1867/2113 (88.4%)2077/2113 (98.3%)
Node API (curated)190/19 (0%)0/19 (0%)0/19 (0%)0/19 (0%)19/19 (100%)19/19 (100%)18/19 (95%)0/19 (0%)
QuickJS’s own tests905/90 (6%)5/90 (6%)5/90 (6%)5/90 (6%)70/90 (78%)69/90 (77%)65/90 (72%)63/90 (70%)

305 selected test262 tests use features outside Zinc’s design (skipped on every engine, below).

1. WinterTC Minimum Common Web API

The primary axis: the 78 interfaces and globals of Ecma TC55’s Minimum Common Web API (2025 snapshot, ECMA-429), each with the WPT files that test it. Exposed is how the API reaches a Zinc program (a global declared in lib/zinc.d.ts, an import from a zinc: module, or nothing); the reference columns say whether globalThis has it (✓ / ✗) and the share of WPT subtests passed. Zinc cells count WPT files passed per profile (gradual · strict).

APISpecZinc exposedWPT filesZinc simZinc nativeNodeDenoBunQuickJS
AbortControllerDOMglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
AbortSignalDOMglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
EventDOMglobal20/2 · 0/20/2 · 0/2✓ 93%✓ 80%✓ 87%✗ 0%
EventTargetDOMglobal72/7 · 2/70/7 · 0/7✓ 96%✓ 100%✓ 96%✗ 0%
CustomEventHTMLglobal———✓✓✓✗
ErrorEventHTMLglobal———✗✓✓✗
MessageChannelHTMLglobal40/4 · 0/40/4 · 0/4✓ 89%✓ 100%✓ 89%✗ 0%
MessageEventHTMLglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
MessagePortHTMLglobal20/2 · 0/20/2 · 0/2✓ 50%✓ 100%✓ 50%✗ 0%
PromiseRejectionEventHTMLglobal———✗✓✗✗
DOMExceptionWebIDLglobal40/4 · 0/40/4 · 0/4✓ 100%✓ 100%✓ 98%✗ 2%
HeadersFetchglobal100/10 · 0/100/10 · 0/10✓ 60%✓ 60%✓ 56%✗ 0%
RequestFetchglobal81/8 · 1/81/8 · 1/8✓ 19%✓ 76%✓ 12%✗ 0%
ResponseFetchglobal92/9 · 2/91/9 · 1/9✓ 81%✓ 96%✓ 75%✗ 0%
FormDataXHRglobal90/9 · 0/90/9 · 0/9✓ 100%✓ 100%✓ 70%✗ 0%
BlobFile APIglobal81/8 · 1/80/8 · 0/8✓ 95%✓ 100%✓ 84%✗ 0%
FileFile APIglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 62%✗ 0%
CompressionStreamCompression—60/6 · 0/60/6 · 0/6✓ 95%✓ 100%✓ 93%✗ 0%
DecompressionStreamCompression—90/9 · 0/90/9 · 0/9✓ 99%✓ 97%✓ 97%✗ 0%
ByteLengthQueuingStrategyStreams—10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 90%✗ 0%
CountQueuingStrategyStreams—10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
ReadableByteStreamControllerStreams—30/3 · 0/30/3 · 0/3✓ 100%✓ 100%✓ 46%✗ 1%
ReadableStreamStreams—130/13 · 0/130/13 · 0/13✓ 99%✓ 100%✓ 84%✗ 5%
ReadableStreamBYOBReaderStreams—10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 22%✗ 0%
ReadableStreamBYOBRequestStreams—10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
ReadableStreamDefaultControllerStreams————✓✓✓✗
ReadableStreamDefaultReaderStreams—10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 86%✗ 0%
TransformStreamStreams—80/8 · 0/80/8 · 0/8✓ 100%✓ 99%✓ 87%✗ 0%
TransformStreamDefaultControllerStreams————✓✓✓✗
WritableStreamStreams—100/10 · 0/100/10 · 0/10✓ 99%✓ 99%✓ 92%✗ 0%
WritableStreamDefaultControllerStreams————✓✓✓✗
WritableStreamDefaultWriterStreams————✓✓✓✗
TextDecoderEncodingglobal160/16 · 0/160/16 · 0/16✓ 99.7%✓ 99.8%✓ 61.4%✗ 0.0%
TextDecoderStreamEncoding—70/7 · 0/70/7 · 0/7✓ 100%✓ 100%✓ 92%✗ 0%
TextEncoderEncodingglobal40/4 · 0/40/4 · 0/4✓ 100%✓ 100%✓ 74%✗ 0%
TextEncoderStreamEncoding—30/3 · 0/30/3 · 0/3✓ 100%✓ 100%✓ 100%✗ 0%
URLURLglobal81/8 · 1/81/8 · 1/8✓ 99.1%✓ 94.1%✓ 98.3%✗ 0.2%
URLSearchParamsURLglobal131/13 · 1/131/13 · 1/13✓ 100%✓ 99%✓ 98%✗ 0%
URLPatternURL Pattern—30/3 · 0/30/3 · 0/3✓ 99%✓ 98%✓ 99%✗ 0%
CryptoWebCryptoglobal20/2 · 0/20/2 · 0/2✓ 79%✓ 100%✓ 71%✗ 0%
CryptoKeyWebCryptoglobal———✓✓✓✗
SubtleCryptoWebCryptoglobal40/4 · 0/40/4 · 0/4✓ 91%✓ 80%✓ 91%✗ 0%
PerformanceHR-Time—20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 86%
WebAssembly.GlobalWasm JS APIglobal20/2 · 0/20/2 · 0/2✓ 99%✓ 100%✓ 99%✗ 0%
WebAssembly.InstanceWasm JS APIglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 97%✗ 0%
WebAssembly.MemoryWasm JS APIglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.ModuleWasm JS APIglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.TableWasm JS APIglobal20/2 · 0/20/2 · 0/2✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.TagWasm JS APIglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.ExceptionWasm JS APIglobal10/1 · 0/10/1 · 0/1✓ 83%✓ 100%✓ 83%✗ 0%
WebAssembly.CompileErrorWasm JS APIglobal———✓✓✓✗
WebAssembly.LinkErrorWasm JS APIglobal———✓✓✓✗
WebAssembly.RuntimeErrorWasm JS APIglobal———✓✓✓✗
WebAssembly.compile()Wasm JS APIglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.compileStreaming()Wasm JS APIglobal———✓✓✓✗
WebAssembly.instantiate()Wasm JS APIglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
WebAssembly.instantiateStreaming()Wasm JS APIglobal———✓✓✓✗
WebAssembly.JSTagWasm JS APIglobal———✓✓✓✗
WebAssembly.validate()Wasm JS APIglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
globalThisECMA-262rejected (Z1015)———✓✓✓✓
atob()HTMLglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
btoa()HTMLglobal———✓✓✓✗
setTimeout()HTMLglobal30/3 · 0/30/3 · 0/3✓ 100%✓ 100%✓ 100%✗ 0%
clearTimeout()HTMLglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
setInterval()HTMLglobal40/4 · 0/40/4 · 0/4✓ 100%✓ 100%✓ 100%✗ 0%
clearInterval()HTMLglobal10/1 · 0/10/1 · 0/1✓ 100%✓ 100%✓ 100%✗ 0%
queueMicrotask()HTMLglobal20/2 · 0/20/2 · 0/2✓ 83%✓ 100%✓ 100%✗ 0%
structuredClone()HTMLglobal10/1 · 0/10/1 · 0/1✓ 98%✓ 97%✓ 91%✗ 0%
reportError()HTMLglobal10/1 · 0/10/1 · 0/1✗ 20%✓ 0%✓ 0%✗ 20%
navigator.userAgentHTMLglobal———✓✓✓✗
selfHTML————✗✓✓✗
onerrorHTML————✗✓✓✗
onunhandledrejectionHTML————✗✓✗✗
onrejectionhandledHTML————✗✗✗✗
fetch()Fetchglobal———✓✓✓✗
consoleConsoleglobal60/6 · 0/60/6 · 0/6✓ 100%✓ 100%✓ 100%✓ 30%
cryptoWebCryptoglobal———✓✓✓✗
performanceHR-Timeglobal———✓✓✓✓

Why the WPT files do not pass on Zinc (sim, gradual):

FilesReason
82R TS2304 Cannot find name ’…’.
20U harness async_test (asynchronous testharness API)
16R TS2339 Property ’…’ does not exist on type ’…’.
11R TS2693 ’…’ only refers to a type, but is being used as a value here.
11U harness step_func (asynchronous testharness API)
9R TS2554 Expected N arguments, but got N.
8R TS2345 Argument of type ’…’ is not assignable to parameter of type ’…’.
5R TS2488 Type ’…’ must have a ’…’ method that returns an iterator.
4R TS7023 ’…’ implicitly has return type ’…’ because it does not have a return type annotation and is referenced
4R TS7034 Variable ’…’ implicitly has type ’…’ in some locations where its type cannot be determined.
4R TS2552 Cannot find name ’…’. Did you mean ’…’?
3R TS1345 An expression of type ’…’ cannot be tested for truthiness.
3R Z9042 calling ’…’ through a Dyn value is not supported; narrow it first (typeof/instanceof) or convert it (as
3R Z9002 structural conversion from ’…’ to ’…’ is not supported; declare ’…’ or ’…’
3R TS2318 Cannot find global type ’…’.

2. ECMAScript (test262)

A deterministic sample of 2113 tests (every n-th file, tests/compat/manifest.json) from the built-ins Zinc implements and from the language directories. Zinc inputs get the mechanical rewrites zinc check --fix would make (var → let) and the harness passes error constructors by name; test262’s propertyHelper.js and friends need property descriptors and are U on Zinc.

AreaTestsZinc simZinc sim strictZinc nativeZinc native strictNodeDenoBunQuickJS
built-ins/Array2698/269 (3%)7/269 (3%)6/269 (2%)6/269 (2%)260/269 (97%)261/269 (97%)268/269 (100%)269/269 (100%)
built-ins/JSON12822/128 (17%)22/128 (17%)19/128 (15%)19/128 (15%)127/128 (99%)127/128 (99%)127/128 (99%)128/128 (100%)
built-ins/Map751/75 (1%)1/75 (1%)1/75 (1%)1/75 (1%)65/75 (87%)73/75 (97%)72/75 (96%)75/75 (100%)
built-ins/Math13238/132 (29%)38/132 (29%)38/132 (29%)38/132 (29%)127/132 (96%)132/132 (100%)132/132 (100%)132/132 (100%)
built-ins/Number13845/138 (33%)45/138 (33%)44/138 (32%)44/138 (32%)137/138 (99%)137/138 (99%)137/138 (99%)138/138 (100%)
built-ins/Promise1400/140 (0%)0/140 (0%)0/140 (0%)0/140 (0%)121/140 (86%)121/140 (86%)121/140 (86%)121/140 (86%)
built-ins/Set1336/133 (5%)6/133 (5%)5/133 (4%)5/133 (4%)133/133 (100%)133/133 (100%)132/133 (99%)133/133 (100%)
built-ins/String20937/209 (18%)37/209 (18%)33/209 (16%)33/209 (16%)209/209 (100%)209/209 (100%)209/209 (100%)209/209 (100%)
language/expressions46997/469 (21%)97/469 (21%)91/469 (19%)91/469 (19%)458/469 (98%)456/469 (97%)403/469 (86%)469/469 (100%)
language/literals5037/50 (74%)37/50 (74%)37/50 (74%)37/50 (74%)50/50 (100%)50/50 (100%)28/50 (56%)50/50 (100%)
language/statements313119/313 (38%)117/313 (37%)103/313 (33%)103/313 (33%)288/313 (92%)284/313 (91%)188/313 (60%)296/313 (95%)
language/types5724/57 (42%)19/57 (33%)24/57 (42%)19/57 (33%)55/57 (96%)55/57 (96%)50/57 (88%)57/57 (100%)
all2113434/2113 (20.5%)426/2113 (20.2%)401/2113 (19.0%)396/2113 (18.7%)2030/2113 (96.1%)2038/2113 (96.5%)1867/2113 (88.4%)2077/2113 (98.3%)

Zinc outcomes:

EnginePassFailRejectedUnsupportedTimeout
Zinc sim434314042720
Zinc sim strict426214132720
Zinc native4013614042720
Zinc native strict3963214132720
Language, by directory
DirectoryTestsZinc simZinc sim strictZinc nativeZinc native strictNodeDenoBunQuickJS
expressions/addition61/61/61/61/66/66/66/66/6
expressions/array81/81/80/80/88/88/88/88/8
expressions/arrow-function82/82/81/81/88/88/87/88/8
expressions/assignment80/80/80/80/88/87/88/88/8
expressions/assignmenttargettype88/88/88/88/88/88/80/88/8
expressions/async-arrow-function84/84/84/84/88/88/84/88/8
expressions/async-function75/75/75/75/77/77/72/77/7
expressions/async-generator84/84/84/84/88/88/84/88/8
expressions/await82/82/82/82/86/85/83/88/8
expressions/bitwise-and70/70/70/70/77/77/77/77/7
expressions/bitwise-not71/71/71/71/77/77/77/77/7
expressions/bitwise-or70/70/70/70/77/77/77/77/7
expressions/bitwise-xor70/70/70/70/77/77/77/77/7
expressions/call80/80/80/80/88/88/88/88/8
expressions/class82/82/82/82/88/88/86/88/8
expressions/coalesce81/81/81/81/88/88/87/88/8
expressions/comma50/50/50/50/55/55/55/55/5
expressions/compound-assignment82/82/82/82/87/87/87/88/8
expressions/concatenation53/53/52/52/55/55/55/55/5
expressions/conditional70/70/70/70/77/77/77/77/7
expressions/delete80/80/80/80/87/87/87/88/8
expressions/division72/72/72/72/77/77/77/77/7
expressions/does-not-equals70/70/70/70/77/77/77/77/7
expressions/equals60/60/60/60/66/66/66/66/6
expressions/exponentiation72/72/72/72/77/77/76/77/7
expressions/function83/83/83/83/88/88/86/88/8
expressions/generators80/80/80/80/88/88/88/88/8
expressions/greater-than73/73/72/72/77/77/77/77/7
expressions/greater-than-or-equal72/72/72/72/77/77/77/77/7
expressions/grouping80/80/80/80/88/88/88/88/8
expressions/in82/82/82/82/88/88/86/88/8
expressions/instanceof80/80/80/80/88/88/88/88/8
expressions/left-shift72/72/72/72/77/77/77/77/7
expressions/less-than72/72/72/72/77/77/77/77/7
expressions/less-than-or-equal73/73/72/72/77/77/77/77/7
expressions/logical-and80/80/80/80/88/88/88/88/8
expressions/logical-assignment82/82/82/82/88/88/87/88/8
expressions/logical-not81/81/81/81/88/88/88/88/8
expressions/logical-or81/81/80/80/88/88/88/88/8
expressions/member-expression10/10/10/10/11/11/11/11/1
expressions/modulus72/72/72/72/77/77/77/77/7
expressions/multiplication72/72/72/72/77/77/77/77/7
expressions/new70/70/70/70/77/77/77/77/7
expressions/new.target71/71/71/71/76/76/75/77/7
expressions/object61/61/61/61/66/66/64/66/6
expressions/optional-chaining83/83/83/83/87/87/84/88/8
expressions/postfix-decrement82/82/82/82/88/88/85/88/8
expressions/postfix-increment73/73/73/73/77/77/74/77/7
expressions/prefix-decrement83/83/83/83/87/87/84/88/8
expressions/prefix-increment82/82/82/82/87/87/85/88/8
expressions/property-accessors80/80/80/80/88/88/88/88/8
expressions/relational10/10/10/10/11/11/11/11/1
expressions/right-shift71/71/71/71/77/77/77/77/7
expressions/strict-does-not-equals62/62/62/62/66/66/66/66/6
expressions/strict-equals62/62/62/62/66/66/66/66/6
expressions/subtraction71/71/71/71/77/77/77/77/7
expressions/super80/80/80/80/88/88/88/88/8
expressions/tagged-template70/70/70/70/77/77/77/77/7
expressions/template-literal84/84/84/84/88/88/86/88/8
expressions/this61/61/61/61/64/64/63/66/6
expressions/typeof50/50/50/50/54/54/54/55/5
expressions/unary-minus72/72/72/72/77/77/77/77/7
expressions/unary-plus83/83/83/83/88/88/88/88/8
expressions/unsigned-right-shift71/71/71/71/77/77/77/77/7
expressions/void80/80/80/80/88/88/88/88/8
expressions/yield80/80/80/80/88/88/87/88/8
literals/boolean11/11/11/11/11/11/11/11/1
literals/numeric2423/2423/2423/2423/2424/2424/2413/2424/24
literals/regexp156/156/156/156/1515/1515/159/1515/15
literals/string107/107/107/107/1010/1010/105/1010/10
statements/async-function127/127/127/127/1211/1211/124/1211/12
statements/async-generator91/91/91/91/99/99/97/99/9
statements/await-using123/123/123/123/123/123/120/124/12
statements/block119/119/119/119/1111/1111/113/1111/11
statements/break126/126/126/126/1212/1212/127/1212/12
statements/class121/121/121/121/1212/1212/1211/1212/12
statements/const128/128/125/125/1212/1212/129/1212/12
statements/continue1210/1210/1210/1210/1212/1212/126/1212/12
statements/debugger21/21/21/21/22/22/21/22/2
statements/do-while127/127/126/126/1212/1212/125/1212/12
statements/empty21/21/21/21/22/22/22/22/2
statements/expression31/31/31/31/33/33/32/33/3
statements/for126/126/125/125/1212/1212/128/1212/12
statements/for-await-of120/120/120/120/1212/1212/1212/1212/12
statements/for-in124/124/124/124/1212/1212/126/1212/12
statements/for-of121/121/120/120/1212/1212/1212/1212/12
statements/function122/122/120/120/1212/1212/1212/1212/12
statements/generators120/120/120/120/1212/1212/1212/1212/12
statements/if128/128/127/127/1212/1212/125/1212/12
statements/labeled116/116/116/116/1111/1110/114/1111/11
statements/let126/125/122/122/1212/1212/1210/1212/12
statements/return1210/1210/129/129/124/124/124/1212/12
statements/switch128/128/128/128/1212/1212/124/1212/12
statements/throw120/120/120/120/1212/1212/1212/1212/12
statements/try122/121/121/121/1212/1212/1210/1212/12
statements/using122/122/123/123/1212/129/123/124/12
statements/variable125/125/124/124/1212/1212/128/1212/12
statements/while123/123/122/122/1212/1212/127/1212/12
statements/with111/111/111/111/114/114/112/1111/11
types/boolean31/31/31/31/33/33/32/33/3
types/list20/20/20/20/22/22/22/22/2
types/null22/21/22/21/22/22/22/22/2
types/number118/117/118/117/1111/1111/1111/1111/11
types/object100/100/100/100/108/108/108/1010/10
types/reference135/134/135/134/1313/1313/1312/1313/13
types/string126/126/126/126/1212/1212/129/1212/12
types/undefined42/40/42/40/44/44/44/44/4

Skipped test262 features

Outside Zinc by design (docs/guide/02-language.md: no reflection, no regex engine, no symbols beyond Symbol.iterator / Symbol.dispose, no typed arrays yet) or host-specific; skipped on every engine so the rates compare the same tests. Tests carrying several features count once per feature.

Reflect.construct 62 · Symbol 57 · BigInt 45 · Proxy 24 · Symbol.toPrimitive 20 · Symbol.species 17 · regexp-modifiers 13 · Array.fromAsync 10 · WeakMap 10 · cross-realm 9 · import.meta 8 · regexp-named-groups 8 · dynamic-import 7 · Reflect 6 · Symbol.matchAll 6 · Symbol.replace 5 · resizable-arraybuffer 4 · Symbol.match 4 · String.prototype.matchAll 4 · Symbol.unscopables 3 · Symbol.isConcatSpreadable 3 · WeakSet 3 · tail-call-optimization 3 · import-defer 3 · Symbol.asyncIterator 3 · Symbol.toStringTag 2 · Float16Array 2 · Symbol.search 2 · regexp-duplicate-named-groups 1 · Symbol.split 1 · source-phase-imports 1 · top-level-await 1 · module flag (harness runs scripts) 1

3. Node API (curated)

Self-contained tests after Node’s test/parallel for the Node-like APIs (fs, path, os, process, buffer, timers, events, util, crypto), with a trimmed common (mustCall). Zinc has its own modules (zinc:fs, zinc:sys, zinc:events…) but no node:* specifiers, so these measure source compatibility with Node programs.

TestZinc simZinc sim strictZinc nativeZinc native strictNodeDenoBunQuickJS
test-buffer-concat-compare.jsRRRR✓✓✓✗
test-buffer-from-tostring.jsRRRR✓✓✓✗
test-crypto-hash.jsRRRR✓✓✓✗
test-events-emitter.jsRRRR✓✓✓✗
test-events-once-promise.jsRRRR✓✓✓✗
test-fs-mkdir-stat.jsRRRR✓✓✓✗
test-fs-promises.jsRRRR✓✓✓✗
test-fs-write-read.jsRRRR✓✓✓✗
test-os.jsRRRR✓✓✓✗
test-path-basename-dirname-extname.jsRRRR✓✓✓✗
test-path-join-normalize.jsRRRR✓✓✓✗
test-path-parse-format.jsRRRR✓✓✓✗
test-path-resolve-relative.jsRRRR✓✓✓✗
test-process-env-argv.jsRRRR✓✓✗✗
test-process-hrtime.jsRRRR✓✓✓✗
test-process-next-tick.jsRRRR✓✓✓✗
test-timers-interval-immediate.jsRRRR✓✓✓✗
test-timers-ordering.jsRRRR✓✓✓✗
test-util-text-encoding.jsRRRR✓✓✓✗

4. QuickJS’s own tests

quickjs-ng’s tests/, one test per test_*() call (the function plus the declarations it reaches; qjs:os / qjs:std imports removed). The qjs binary here is Bellard’s QuickJS, so its misses on quickjs-ng-only features are expected.

FileTestsZinc simZinc sim strictZinc nativeZinc native strictNodeDenoBunQuickJS
test_bigint.js40/40/40/40/44/44/43/43/4
test_builtin.js300/300/300/300/3011/3012/3014/3013/30
test_closure.js70/70/70/70/77/76/76/77/7
test_language.js280/280/280/280/2827/2827/2821/2823/28
test_loop.js174/174/174/174/1717/1716/1717/1717/17
test_queue_microtask.js41/41/41/41/44/44/44/40/4

5. Zinc failure clusters

Programs Zinc compiled but ran wrongly, grouped by the first error (all suites, all four Zinc runs). Each cluster names one test to reproduce with zinc compat --filter <id>.

RunsEnginesErrorExample
14Zinc native, Zinc native strictfail: C++ build failed: field has incomplete type ’…’test262/language/expressions/array/spread-err-sngl-err-expr-throws.js
9Zinc native, Zinc native strictfail: C++ build failed: no matching function for call to ’…’test262/built-ins/Array/prototype/findIndex/return-abrupt-from-predicate-call.js
6Zinc native, Zinc native strictfail: panic: Uncaught Test262Error: Test262: This statement should not be evaluated.test262/language/statements/do-while/decl-fun.js
5Zinc native, Zinc native strictfail: C++ build failed: use of undeclared identifier ’…’test262/language/statements/const/block-local-closure-get-before-initialization.js
4Zinc native, Zinc native strictfail: panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be truetest262/built-ins/JSON/stringify/value-primitive-top-level.js
4Zinc native, Zinc native strictfail: C++ build failed: variable has incomplete type ’…’test262/built-ins/Set/prototype/clear/clears-an-empty-set.js
4Zinc native, Zinc native strictfail: C++ build failed: expected ’…’ for function-style cast or type constructiontest262/language/expressions/arrow-function/dstr/ary-ptrn-elem-id-init-undef.js
4Zinc native, Zinc native strictfail: C++ build failed: declaration of reference variable ’…’ requires an initializerwpt/FileAPI/blob/Blob-slice-overflow.any.js
2Zinc native, Zinc native strictfail: panic: Uncaught Test262Error: JSON.stringify(”…”) Expected SameValue(«…», «…») to be truetest262/built-ins/JSON/stringify/value-string-escape-unicode.js
2Zinc native, Zinc native strictfail: panic: RangeError: toFixed() digits argument must be between N and Ntest262/built-ins/Number/prototype/toFixed/range.js
2Zinc native, Zinc native strictfail: panic: RangeError: invalid counttest262/built-ins/String/prototype/repeat/count-less-than-zero-throws.js
2Zinc native, Zinc native strictfail: panic: Uncaught Test262Error: Sigma preceded by LATIN CAPITAL LETTER A Expected SameValue(«…», «…») to be truetest262/built-ins/String/prototype/toLowerCase/special_casing_conditional.js
2Zinc native, Zinc native strictfail: panic: Uncaught Errortest262/language/expressions/concatenation/S9.8_A2_T2.js
2Zinc native, Zinc native strictfail: C++ build failed: invalid operands to binary expression (’…’ and ‘zrt::Ref<m_z_test262_language_etest262/language/expressions/greater-than/11.8.2-1.js
2Zinc native, Zinc native strictfail: C++ build failed: invalid operands to binary expression (’…’ and ‘zrt::Ref<m_z_test262_langtest262/language/expressions/less-than-or-equal/11.8.3-1.js
2Zinc native, Zinc native strictfail: C++ build failed: non-pointer operand type ’…’ incompatible with nullptrtest262/language/expressions/logical-or/S11.11.2_A4_T4.js
2Zinc sim, Zinc nativefail: RangeError: Maximum call stack size exceededtest262/language/expressions/tagged-template/chained-application.js
2Zinc sim, Zinc sim strictfail: panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be falsetest262/language/expressions/this/11.1.1-1.js
2Zinc native, Zinc native strictfail: C++ build failed: invalid use of ’…’ outside of a non-static member functiontest262/language/expressions/this/11.1.1-1.js
2Zinc native, Zinc native strictfail: panic: Uncaught Test262Error: Expected a ReferenceError to be thrown but no exception was thrown at alltest262/language/statements/let/global-closure-set-before-initialization.js
2Zinc sim, Zinc sim strictfail: panic: Uncaught SyntaxError: Unexpected reserved wordtest262/language/statements/using/static-init-await-binding-valid.js
2Zinc native, Zinc native strictfail: C++ build failed: no viable conversion from ’…’ to ’…’wpt/dom/events/EventTarget-addEventListener.any.js
2Zinc native, Zinc native strictfail: C++ build failed: expected unqualified-idwpt/fetch/api/response/response-error.any.js
1Zinc nativefail: C++ build failed: redefinition of ’…’ with a different type: ’…’ vs ’…’test262/language/statements/try/early-catch-lex.js

Compile-time rejections (Zinc sim, gradual), by diagnostic:

TestsDiagnosticExample
321TS2339 Property ’…’ does not exist on type ’…’.quickjs/test_builtin.js#test_exception_capture_stack_trace
195TS2304 Cannot find name ’…’.quickjs/test_builtin.js#test_proxy_is_array
175TS2693 ’…’ only refers to a type, but is being used as a value here.quickjs/test_builtin.js#test_enum
132TS2554 Expected N arguments, but got N.quickjs/test_builtin.js#test_set
106TS2345 Argument of type ’…’ is not assignable to parameter of type ’…’.node/test-buffer-concat-compare.js
96TS7009 ’…’ expression, whose target lacks a construct signature, implicitly has an ’…’ type.quickjs/test_language.js#test_constructor
59TS2550 Property ’…’ does not exist on type ’…’. Do you need to change your target library? Try changing the ’…test262/built-ins/Array/from/source-object-iterator-1.js
51TS2351 This expression is not constructable.test262/built-ins/Array/length/S15.4.2.2_A2.2_T3.js
39TS7034 Variable ’…’ implicitly has type ’…’ in some locations where its type cannot be determined.quickjs/test_builtin.js#test_cur_pc
36TS2451 Cannot redeclare block-scoped variable ’…’.test262/built-ins/Promise/race/capability-executor-not-callable.js
35TS2362 The left-hand side of an arithmetic operation must be of type ’…’, ’…’, ’…’ or an enum type.test262/language/expressions/bitwise-and/S11.10.1_A3_T1.3.js
33TS2318 Cannot find global type ’…’.quickjs/test_builtin.js#test_eval
24Z1014 only Error instances (or subclasses) can be thrown (LNG-N)test262/language/expressions/bitwise-and/S11.10.1_A2.4_T2.js
23TS2367 This comparison appears to be unintentional because the types ’…’ and ’…’ have no overlap.quickjs/test_builtin.js#test_function_source_pos
21TS7053 Element implicitly has an ’…’ type because expression of type ’…’ can’…’{}’.quickjs/test_builtin.js#test_symbol
17TS2683 ’…’ implicitly has type ’…’ because it does not have a type annotation.quickjs/test_builtin.js#test_function
16Z9041 a Dyn value cannot be converted to this type (tp); only primitives, arrays, classes and plain interfacestest262/built-ins/JSON/parse/15.12.1.1-g1-1.js
16TS2322 Type ’…’ is not assignable to type ’…’.test262/built-ins/Promise/all/invoke-resolve-error-reject.js
12Z9004 anonymous object type ’…’ is not supported; declare a named interface or typetest262/built-ins/Array/prototype/indexOf/15.4.4.14-5-10.js
11TS2348 Value of type ’…’ is not callable. Did you mean to include ’…’?quickjs/test_builtin.js#test
11TS2552 Cannot find name ’…’. Did you mean ’…’?quickjs/test_builtin.js#test_finalization_registry
11TS2508 No base constructor has the specified number of type arguments.test262/built-ins/Promise/all/ctx-ctor.js
11TS18050 The value ’…’ cannot be used here.test262/language/expressions/addition/S11.6.1_A3.1_T2.4.js
10TS2794 Expected N arguments, but got N. Did you forget to include ’…’ in your type argument to ’…’?test262/built-ins/Promise/all/resolve-ignores-late-rejection-deferred.js
9Z9001 type ’…’ is not supported yettest262/built-ins/Array/isArray/15.4.3.2-1-11.js

Sim / native divergences

The sim is the oracle: a program must behave the same natively. 39 test(s) differ:

TestSim (gradual · strict)Native (gradual · strict)
test262/built-ins/Array/prototype/findIndex/return-abrupt-from-predicate-call.js✓ · ✓✗ C++ build failed: no matching function for call to ’…’ · ✗ C++ build failed: no matching function for call to ’…’
test262/built-ins/Array/prototype/some/15.4.4.17-7-c-ii-10.js✓ · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)✗ C++ build failed: no matching function for call to ’…’ · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)
test262/built-ins/JSON/stringify/value-function.js✓ · ✓✗ C++ build failed: no matching function for call to ’…’ · ✗ C++ build failed: no matching function for call to ’…’
test262/built-ins/JSON/stringify/value-primitive-top-level.js✓ · ✓✗ panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be true · ✗ panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be true
test262/built-ins/JSON/stringify/value-string-escape-unicode.js✓ · ✓✗ panic: Uncaught Test262Error: JSON.stringify(”…”) Expected SameValue(« · ✗ panic: Uncaught Test262Error: JSON.stringify(”…”) Expected SameValue(«
test262/built-ins/Number/prototype/toFixed/range.js✓ · ✓✗ panic: RangeError: toFixed() digits argument must be between N and N · ✗ panic: RangeError: toFixed() digits argument must be between N and N
test262/built-ins/Set/prototype/clear/clears-an-empty-set.js✓ · ✓✗ C++ build failed: variable has incomplete type ’…’ · ✗ C++ build failed: variable has incomplete type ’…’
test262/built-ins/String/S15.5.1.1_A1_T1.js✓ · ✓✗ C++ build failed: no matching function for call to ’…’ · ✗ C++ build failed: no matching function for call to ’…’
test262/built-ins/String/prototype/padEnd/normal-operation.js✓ · ✓✗ panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be true · ✗ panic: Uncaught Test262Error: Expected SameValue(«…», «…») to be true
test262/built-ins/String/prototype/repeat/count-less-than-zero-throws.js✓ · ✓✗ panic: RangeError: invalid count · ✗ panic: RangeError: invalid count
test262/built-ins/String/prototype/toLowerCase/special_casing_conditional.js✓ · ✓✗ panic: Uncaught Test262Error: Sigma preceded by LATIN CAPITAL LETTER A · ✗ panic: Uncaught Test262Error: Sigma preceded by LATIN CAPITAL LETTER A
test262/language/expressions/array/spread-err-sngl-err-expr-throws.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/expressions/arrow-function/dstr/ary-ptrn-elem-id-init-undef.js✓ · ✓✗ C++ build failed: expected ’…’ for function-style cast or type constru · ✗ C++ build failed: expected ’…’ for function-style cast or type constru
test262/language/expressions/concatenation/S9.8_A2_T2.js✓ · ✓✗ panic: Uncaught Error · ✗ panic: Uncaught Error
test262/language/expressions/greater-than/11.8.2-1.js✓ · ✓✗ C++ build failed: invalid operands to binary expression (’…’ and ‘zrt: · ✗ C++ build failed: invalid operands to binary expression (’…’ and ‘zrt:
test262/language/expressions/less-than-or-equal/11.8.3-1.js✓ · ✓✗ C++ build failed: invalid operands to binary expression (’…’ and ‘zrt: · ✗ C++ build failed: invalid operands to binary expression (’…’ and ‘zrt:
test262/language/expressions/logical-or/S11.11.2_A4_T4.js✓ · ✓✗ C++ build failed: non-pointer operand type ’…’ incompatible with nullp · ✗ C++ build failed: non-pointer operand type ’…’ incompatible with nullp
test262/language/statements/const/block-local-closure-get-before-initialization.js✓ · ✓✗ C++ build failed: use of undeclared identifier ’…’ · ✗ C++ build failed: use of undeclared identifier ’…’
test262/language/statements/const/dstr/ary-ptrn-elem-ary-elision-init.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/statements/const/function-local-closure-get-before-initialization.js✓ · ✓✗ C++ build failed: use of undeclared identifier ’…’ · ✗ C++ build failed: use of undeclared identifier ’…’
test262/language/statements/do-while/decl-fun.js✓ · ✓✗ panic: Uncaught Test262Error: Test262: This statement should not be ev · ✗ panic: Uncaught Test262Error: Test262: This statement should not be ev
test262/language/statements/for-of/generator-next-error.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/statements/for/decl-async-fun.js✓ · ✓✗ panic: Uncaught Test262Error: Test262: This statement should not be ev · ✗ panic: Uncaught Test262Error: Test262: This statement should not be ev
test262/language/statements/function/dstr/ary-ptrn-elem-obj-id-init.js✓ · ✓✗ C++ build failed: variable has incomplete type ’…’ · ✗ C++ build failed: variable has incomplete type ’…’
test262/language/statements/function/dstr/dflt-ary-ptrn-elem-ary-empty-init.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/statements/if/if-fun-no-else-strict.js✓ · ✓✗ panic: Uncaught Test262Error: Test262: This statement should not be ev · ✗ panic: Uncaught Test262Error: Test262: This statement should not be ev
test262/language/statements/let/block-local-closure-get-before-initialization.js✓ · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)✗ C++ build failed: use of undeclared identifier ’…’ · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)
test262/language/statements/let/dstr/ary-ptrn-elem-ary-elision-init.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/statements/let/dstr/ary-ptrn-elem-obj-id-init.js✓ · ✓✗ C++ build failed: expected ’…’ for function-style cast or type constru · ✗ C++ build failed: expected ’…’ for function-style cast or type constru
test262/language/statements/let/global-closure-set-before-initialization.js✓ · ✓✗ panic: Uncaught Test262Error: Expected a ReferenceError to be thrown b · ✗ panic: Uncaught Test262Error: Expected a ReferenceError to be thrown b
test262/language/statements/return/line-terminators.js✓ · ✓✗ C++ build failed: no matching function for call to ’…’ · ✗ C++ build failed: no matching function for call to ’…’
test262/language/statements/try/early-catch-lex.js✓ · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)✗ C++ build failed: redefinition of ’…’ with a different type: ’…’ vs ’… · R Z1006 ’…’ is not allowed in the strict typing profile (DYN-N)
test262/language/statements/using/static-init-await-binding-valid.js✗ panic: Uncaught SyntaxError: Unexpected reserved word · ✗ panic: Uncaught SyntaxError: Unexpected reserved word✓ · ✓
test262/language/statements/variable/dstr/ary-ptrn-elision.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
test262/language/statements/while/decl-gen.js✓ · ✓✗ C++ build failed: field has incomplete type ’…’ · ✗ C++ build failed: field has incomplete type ’…’
wpt/FileAPI/blob/Blob-slice-overflow.any.js✓ · ✓✗ C++ build failed: declaration of reference variable ’…’ requires an in · ✗ C++ build failed: declaration of reference variable ’…’ requires an in
wpt/dom/events/AddEventListenerOptions-once.any.js✓ · ✓✗ C++ build failed: declaration of reference variable ’…’ requires an in · ✗ C++ build failed: declaration of reference variable ’…’ requires an in
wpt/dom/events/EventTarget-addEventListener.any.js✓ · ✓✗ C++ build failed: no viable conversion from ’…’ to ’…’ · ✗ C++ build failed: no viable conversion from ’…’ to ’…’
wpt/fetch/api/response/response-error.any.js✓ · ✓✗ C++ build failed: expected unqualified-id · ✗ C++ build failed: expected unqualified-id

6. WinterTC compliance

What a claim needs (ECMA-429 §Conformance): every interface and global of section 1 exposed on globalThis with the behaviour of its W3C / WHATWG definition, conformance to ECMA-262, the global error / unhandledrejection / rejectionhandled events (on an EventTarget global or an equivalent mechanism), a navigator.userAgent token, and written documentation of every deviation with its impact.

Where Zinc stands. Zinc cannot claim WinterTC conformance, and running WPT verbatim is not how it could get there:

  • Programs are typed ahead of time. WPT (and test262) files are dynamic JavaScript: untyped callbacks, mixed-type arrays, instanceof on constructors passed as values, property enumeration. Zinc’s strict subset rejects nearly all of them at compile time (the R column), whatever the API behind them does. A WinterTC profile for Zinc would be measured with typed ports of the WPT files, one per API, kept next to these runs.
  • Web APIs are modules, not globals. globalThis is refused by design (Z1015) and there is no self; the Web APIs being written for Zinc (zinc:web: TextEncoder / TextDecoder, atob / btoa, URL / URLSearchParams, Event / EventTarget / CustomEvent, AbortController / AbortSignal, crypto) are imports. A conformance claim needs them as ambient globals (a lib/web.d.ts plus auto-import in the compiler).
  • Typed arrays and ArrayBuffer are missing (Zinc uses u8[]). Almost every binary API depends on them: TextEncoder, crypto.getRandomValues, Blob / File, streams chunks, fetch bodies, compression, WebAssembly.
  • No reflection. WebIDL behaviour (property descriptors, length / name of methods, prototype chains, Symbol.toStringTag) is checked by most WPT files and by test262’s propertyHelper.js.

Gaps, by effort (S: days, M: 1-3 weeks, L: a quarter or more, one engineer):

GapAPIs it unlocksEffort
Web APIs as ambient globals (lib/web.d.ts, compiler auto-import) and selfeverything in zinc:webS
Typed ports of the WPT files for each API Zinc implements, run on sim and nativea measured WinterTC profileM
Uint8Array / ArrayBuffer / DataView backed by the runtime’s byte arraysTextEncoder, crypto, Blob, streams, fetch bodiesM
DOMException with its legacy codes; ErrorEvent, PromiseRejectionEvent, global error eventsHTML error reporting, reportErrorS
Headers / Request / Response with WHATWG shapes (today zinc:net has its own) and fetch as a globalFetchM
structuredClone for plain data (objects, arrays, Map / Set, Date)HTMLS
Blob / File / FormData over byte arraysFile API, XHR FormDataM
WHATWG Streams (readable, writable, transform, byte streams, queuing strategies)Streams, TextEncoderStream, CompressionStream, fetch bodiesL
CompressionStream / DecompressionStream (deflate / gzip; brotli optional)CompressionM (after streams)
MessageChannel / MessagePort / MessageEvent on the event loopHTML messagingM
URLPattern (needs a regex engine, refused by design today: Z1008)URL PatternL
crypto.subtle beyond SHA digests (HMAC, AES-GCM, ECDSA / Ed25519…)WebCryptoL
WebAssembly (an interpreter or AOT of wasm modules)Wasm JS APIL, likely out of scope

7. Fixes made with this harness

The first run of this harness found these; each has a regression program in tests/conformance (sim and native print the same bytes, checked against Node too). Together they move the test262 sample from 16.7% to 20.5% on the sim and from 14.4% to 19.0% natively, and cut the sim / native divergences from 51 tests to 35.

FixBeforeProgram
Generic static methods infer their type arguments; a type parameter bound to two number kinds is numberC++ build failure (Check.same(xs.length, 2.5))generic_static.ts
Array literals inside unannotated object literals (fixed on main at the same time; regression program added)compiler crash (stack overflow in Sema.contextual)literal_member_arrays.ts
The sim runs the native backend’s checksprograms refused natively (Z9042, Z1013, Z9001) ran on the sim(compat divergence table)
-0 literals keep their sign natively1 / -0 was Infinitystring_number_edges.ts
toFixed: exact ties round up, abs(x) >= 1e21 / NaN / Infinity print like ToString, (-0).toFixed(), digits outside 0-100(2.5).toFixed(0) “2”, (1e21).toFixed(2) 22 digits, “nan”string_number_edges.ts
parseInt reads 0x without a radix, radix outside 2-36 is NaN; parseFloat is decimal onlyparseInt('0x1F') 0, parseFloat('0x10') 16, parseFloat('inf') Infinitystring_number_edges.ts, conversions.ts
trim / trimStart / trimEnd remove JS white space (U+00A0, U+FEFF, U+2000-U+200A, U+2028, U+3000…)ASCII only nativelystring_number_edges.ts
String(x), Number(x), Boolean(x); Number.MAX_VALUE, MIN_VALUE, NaN, POSITIVE_INFINITY, NEGATIVE_INFINITY, MIN_SAFE_INTEGER, isSafeInteger, parseFloat, parseIntZ9019 / TS2339conversions.ts
charAt, concat, trimStart, trimEnd, the position argument of includes / startsWith / endsWithTS2339 / TS2554string_number_edges.ts
replace / replaceAll substitutions ($$ $& $\ $‘), replaceAll` with an empty patternliteral $&, ''.replaceAll('', 'x') ""conversions.ts
undefined for an optional library parameter means absent'abc'.padEnd(5, undefined) “abc”, s.slice(1, undefined) ""conversions.ts
Arrays: indexOf / includes from an index, lastIndexOf, findLast, findLastIndex, reduceRight, fill(v, start, end); includes is SameValueZeroTS errors; [NaN].includes(NaN) false nativelyarray_search.ts
Math.min / Math.max take any number of valuesTS2554string_number_edges.ts
JSON.parse of invalid text throws a SyntaxErrora plain Error (sim and native)conversions.ts
Unary + / - on a string or a boolean is ToNumber+'0x1F' stayed a string natively (C++ build failure)conversions.ts
An unannotated const a = [] whose elements nothing types is Z9001 on every targetran on the sim, Array<void> C++ build failure natively (5 test262 exponentiation tests move from a sim-only pass to a rejection)(compat)

8. Larger gaps found (ECMAScript)

Ordered by the number of selected tests they cost (see the clusters above). Effort as in section 6.

GapWhere it showsEffort
No reflection: X.prototype, property descriptors, Function.prototype.call / length / name, Object.getPrototypeOftest262 propertyHelper.js (U), String.prototype.x.call(...) (TS2339 on prototype)design (no)
No Object global: Object.keys / entries / assign / freeze / is / defineProperty~140 test262 files (TS2693)M for the non-reflective part (keys, values, entries, assign, is)
eval, with, arguments, sloppy mode, new String() wrappersTS2304 eval, U sloppy tests, TS2351design (no)
Promise beyond then(onFulfilled): catch, finally, then(_, onRejected), race, any, allSettledbuilt-ins/Promise 0%M (sim and native event loops)
Library errors are catchable on the sim but panic natively ('x'.repeat(-1), toFixed(101), invalid array length)sim / native divergencesM (throw a RangeError / TypeError through the status-return path, ADR 0006)
Accepted programs whose C++ does not build: void results stored in variables or fields, this at top level, < on objects, unary - on a string, JSON.stringify of a function“C++ build failed” clustersS-M (refuse them with a Z code, or give them their JS meaning)
UTF-8 strings cannot hold lone surrogates'abc'.padEnd(6, '💩'), JSON.stringify('\uD834')L (design: WTF-8 storage)
string | null stores null like '': JSON.stringify(['x', null]) prints "" nativelyJSONM (a null tag for strings)
Math: asin, acos, atan, sinh…, cbrt, log2, log10, expm1, log1p, sumPrecisebuilt-ins/MathM (an fdlibm port, so sim and native stay bit-identical)
Number.prototype.toString(radix), toPrecision, toExponentialbuilt-ins/NumberS-M
String.fromCodePoint, codePointAt, normalize, localeCompare, String.raw, split(sep, limit)built-ins/StringS-M each
Arrays: Array.from / of, keys / values / entries, flat / flatMap, toSorted / toReversed / with, copyWithin, holesbuilt-ins/ArrayM
Unicode case mapping outside Latin / Greek / Cyrillic, final sigma, İtoLowerCase special casingS-M (tables)
typeof narrowing on a type parameter is refused natively (Z1013)generic helpersS-M
Labeled statements (Z9011), rest elements in destructuring (Z9016), destructured parameters of async functions (Z9007)language/statementsS each
Node API: no node:* modules (fs, path, os, process, buffer, events, timers, util, crypto)section 3L (a node: layer over zinc:fs / zinc:sys / zinc:os / zinc:events / zinc:web)

The Web API branch. zinc compat --zinc <checkout> measured a snapshot of the parity branch (zinc:web, commit e0f0e8c): 2 of the 222 WPT files pass on the sim (url-tojson, urlsearchparams-stringifier); the others are rejected for the reasons of section 6 (globals, typed arrays, dynamic test code), and two crashed the compiler with the stack overflow fixed here.

How to run

zinc compat                                  # all suites, 4 jobs; writes tests/compat/results/<date>.json and this page
zinc compat --suite wpt --engines zinc-sim,node
zinc compat --filter built-ins/String/prototype/trim   # a slice (recorded in tests/compat/cache/last.json only)
zinc compat --zinc path/to/other/checkout    # measure another Zinc tree (a branch), same tests
zinc compat --check                          # exit 1 if a Zinc pass recorded in tests/compat/baseline.json regressed
zinc compat --update-baseline                # after an intended change
zinc compat --report tests/compat/results/<date>.json   # regenerate this page

The harness is tests/compat/run.mjs (selection, engines, classification) and report.mjs (this page); the pins and the WinterTC API list are in tests/compat/manifest.json, the Zinc harness shims in tests/compat/shims, the Node API tests in tests/compat/node, and these notes in tests/compat/notes.md.

Edit this page on GitHub ↗