#1472

Test262 survey (static-adapted-v5): per-chapter results on main vs integration branch

Opencramforceopened 23d ago

Summary

This is a full run of the pinned Test262 snapshot through the scriptc Test262 runner (tests/test262, profile static-adapted-v5). It covers main and an integration branch that combines main with the currently open PRs. Every admitted variant was compiled and executed on both. These are adapted-profile results, not whole-suite ECMAScript conformance. Pass counts describe the selected adapted profile only. Exclusions are runner capabilities, not scriptc implementation classifications.

Headline numbers for main:

  • 37.5% of admitted variants pass (28,066 of 74,793), which is 27.3% of all 102,956 variants in the snapshot.
  • 5,131 wrong results (6.9% of admitted): assertion failures and unexpected exceptions that are not refusals, plus 6 crashes. This is the real spec-divergence figure.
  • 41,367 refusals (55.3% of admitted): explicit compile, runtime and harness refusals, plus 5,168 runner fail results that are refusals underneath (see "Runner issues" below).
  • 229 other outcomes: 220 internal compiler errors, 7 build errors, 2 timeouts.

The runner reports 10,293 fail + 6 crash. About half of those fail results are refusals rather than wrong results; the classification is explained under Methodology.

On the integration branch, passes rise by 189 to 37.8%, but wrong results rise by 729 to 5,860. The extra wrong results come mostly from built-in members that main refuses with SC2020 and that now compile but read as undefined (details below).

Methodology

  • Test262: tc39/test262 at 7ab7fafa0003f73fc85c1b95d88094d33f7eb8bd, fetched with pnpm test:test262:fetch (snapshot digest verified). 53,597 test files, which expand to 102,956 variants: sloppy and strict for scripts without a flag, plus module and raw variants.
  • scriptc:
    • main at ab70d3d36 (2026-10-19).
    • The integration branch is main at bf2afee9f plus the open PRs. It lacks only main's most recent commit (#1432).
    • Both trees were built fresh, including the LLVM helper and the runtime pack.
  • Runner: pnpm test:test262 --root <snapshot>, profile static-adapted-v5, default backend policy. The actual backend was LLVM for every variant that produced a binary (48,689 on main, 55,618 on the integration branch). No sanitizers.
  • Timeouts: runner defaults, 120 s per compile and 10 s per program.
  • Host: Linux x86_64, 8 vCPU / 16 GB, Node 24.15, LLVM 22.1.8.
  • Execution:
    • Variants were split 20 ways with SCRIPTC_TEST_SHARD=i/20, using --workers 8 and --journal.
    • Some shards were interrupted by dropped remote sessions. Their remaining variants were rerun individually with the unmodified runSource/matchesParseNegative logic, so the union covers every admitted variant exactly once on both trees.
    • Nothing was sampled.
  • Exclusions (28,163 variants, 27.4%) come from the runner's capability checks. They are the same on both trees:
    • harness-includes (15,338): the test includes a harness file other than compareArray.js/propertyHelper.js. The largest are temporalHelpers.js 5,618, testTypedArray.js 4,128, isConstructor.js 1,288, regExpUtils.js 1,172 and asyncHelpers.js 756.
    • harness:assert-surface 3,780.
    • host:eval 2,183, host:script-environment 1,548, host:Function 1,372 and host:arguments 1,268.
    • harness:propertyHelper-surface 643, execution:module 596, host:$262 540 and harness:Test262Error-surface 387.
    • Negative parse tests in module or raw variants 227; runtime negatives 66 and resolution negatives 34.
    • host:globalThis 144, host:agents 18, and smaller reasons.
  • Outcome classification:
    • The runner's own categories (pass, compile refusal, runtime refusal, harness refusal, fail, build error, internal compiler error, crash, timeout) are reported unchanged.
    • The runner's fail category mixes real divergences with refusals. To separate them, every non-refusal-shaped fail was rerun with a scratch copy of the host harness that prints the error caught by assert.throws, the reason passed to $DONE, and the values compared by assert.sameValue/notSameValue. Runner semantics were otherwise unchanged; the rerun outcomes matched the original runs.
    • A fail counts as a refusal in three cases:
      1. Its stderr is an unlocated scriptc refusal (… is not supported yet, [SCnnnn] without a source location).
      2. The error caught by assert.throws or passed to $DONE is a scriptc refusal.
      3. It is ReferenceError: Temporal is not defined. On the integration branch, this replaces main's compile refusal "Cannot find name 'Temporal'".
    • Everything else in fail, plus crashes, is a wrong result.

Totals

outcomemainintegration branch
variants (total)102,956102,956
excluded28,16328,163
admitted74,79374,793
pass28,066 (37.5% adm. / 27.3% total)28,255 (37.8% / 27.4%)
compile refusal18,66011,731
runtime refusal (located fence)15,15415,249
harness refusal (reference assertion)2,3852,427
runner fail10,29316,890
— of which refusal: unlocated fence1,9182,112
— of which refusal: caught by assert.throws / $DONE3,2503,188
— of which refusal: Temporal is not defined05,736
— of which wrong result5,1255,854
crash66
wrong results (fail-wrong + crash)5,131 (6.9%)5,860 (7.8%)
internal compiler error220220
build error77
timeout28

Per-chapter results: requested chapters

Columns are variant counts. "Refused" covers all refusal kinds above; "wrong" is wrong results.

chaptertotalexcludedadmittedpass mainpass integrationrefused mainrefused integrationwrong mainwrong integrationpass % adm. mainpass % total main
built-ins/Array61179285189283728411861185048349054.7%46.4%
built-ins/String244334221018708701093107713815441.4%35.6%
built-ins/JSON330602701341349898363649.6%40.6%
built-ins/Promise1458443101514815073064413721514.6%10.2%
built-ins/Object680210785724272027302421224758374747.5%40.0%
built-ins/Map40561344119123209163165834.6%29.4%
built-ins/Set7646569918919350245685027.0%24.7%
built-ins/Math65482572420420141413813873.4%64.2%
built-ins/Number6806461634834812812814014056.5%51.2%
built-ins/RegExp3756142523319349461273111912426640.1%24.9%
built-ins/Date11883008881462167085103416216.4%12.3%
built-ins/Symbol1925413820207878404014.5%10.4%
built-ins/Function8937131804040117117232322.2%4.5%
built-ins/Error18684102222272728821.6%11.8%
built-ins/TypedArray2890285832223030006.3%0.1%
built-ins/TypedArrayConstructors1446130614078784848141455.7%5.4%
built-ins/Reflect306822244040156156282817.9%13.1%
built-ins/Proxy607141466150150298298181832.2%24.7%
language/expressions2128629261836082088218889888841159116344.7%38.6%
language/statements1801522491576661826184836583471101111739.2%34.3%
language/types2113018113213245474272.9%62.6%
language/literals10415398893993949490095.0%90.2%
language/function-code2811021791361362626171776.0%48.4%
language/arguments-object4609536528129984660077.0%61.1%
language/block-scope28722851301301551550045.6%45.3%
language/computed-property-names96492323260600034.8%33.3%
language/destructuring372353030114485.7%81.1%
language/rest-parameters22022121210100054.5%54.5%

Per-chapter results: all top-level chapters with at least 100 admitted variants

chaptertotaladmittedpass mainpass integrationΔ passrefused mainrefused integrationwrong mainwrong integrationΔ wrong
all1029567479328066 (37.5%)28255 (37.8%)+189413674044351315860+729
language444973760117260 (45.9%)17290 (46.0%)+30178341778622942312+18
built-ins473373141510373 (33.0%)10511 (33.5%)+138184581765325743235+661
intl4026730349416 (0.5%)16 (0.5%)03438343840400
staging27831587337 (21.2%)358 (22.6%)+2110991048145175+30
annexB137767468 (10.1%)68 (10.1%)05305107696+20
harness2322212 (54.5%)12 (54.5%)088220
language/expressions21286183608208 (44.7%)8218 (44.8%)+108898888411591163+4
language/statements18015157666182 (39.2%)6184 (39.2%)+28365834711011117+16
built-ins/Object680257242720 (47.5%)2730 (47.7%)+1024212247583747+164
built-ins/Temporal921056020 (0.0%)0 (0.0%)056025602000
built-ins/Array611751892837 (54.7%)2841 (54.8%)+418611850483490+7
built-ins/RegExp37562331934 (40.1%)946 (40.6%)+1212731119124266+142
built-ins/String24432101870 (41.4%)870 (41.4%)010931077138154+16
intl402/Temporal405814280 (0.0%)0 (0.0%)014281428000
built-ins/Promise14581015148 (14.6%)150 (14.8%)+2730644137215+78
language/literals1041988939 (95.0%)939 (95.0%)04949000
built-ins/Iterator1308966108 (11.2%)108 (11.2%)07327321261260
built-ins/Date1188888146 (16.4%)216 (24.3%)+7070851034162+128
built-ins/DataView1122730246 (33.7%)246 (33.7%)03723721121120
built-ins/Set764699189 (27.0%)193 (27.6%)+4502456850+42
built-ins/Number680616348 (56.5%)348 (56.5%)01281281401400
built-ins/Math654572420 (73.4%)420 (73.4%)014141381380
language/identifiers535535503 (94.0%)503 (94.0%)03232000
built-ins/Proxy607466150 (32.2%)150 (32.2%)029829818180
intl402/DateTimeFormat4904060 (0.0%)0 (0.0%)0404404220
intl402/NumberFormat5023660 (0.0%)0 (0.0%)0360360660
language/arguments-object460365281 (77.0%)299 (81.9%)+188466000
built-ins/ArrayBuffer44235684 (23.6%)84 (23.6%)017817894940
built-ins/Map405344119 (34.6%)123 (35.8%)+42091631658+42
intl402/Locale3463360 (0.0%)0 (0.0%)0336336000
language/block-scope287285130 (45.6%)130 (45.6%)0155155000
built-ins/JSON330270134 (49.6%)134 (49.6%)0989836360
built-ins/WeakMap28124552 (21.2%)76 (31.0%)+241631153054+24
built-ins/Atomics77823026 (11.3%)26 (11.3%)016216242420
built-ins/Reflect30622440 (17.9%)40 (17.9%)015615628280
language/asi204204182 (89.2%)182 (89.2%)02222000
built-ins/SharedArrayBuffer20818642 (22.6%)42 (22.6%)0138138660
language/types211181132 (72.9%)132 (72.9%)0454742-2
built-ins/Function89318040 (22.2%)40 (22.2%)011711723230
language/function-code281179136 (76.0%)136 (76.0%)0262617170
built-ins/DisposableStack18616256 (34.6%)56 (34.6%)09898880
built-ins/NativeErrors18814824 (16.2%)24 (16.2%)010010024240
built-ins/WeakSet17014834 (23.0%)38 (25.7%)+496741836+18
intl402/RelativeTimeFormat1601480 (0.0%)0 (0.0%)0148148000
built-ins/TypedArrayConstructors144614078 (55.7%)78 (55.7%)0484814140
built-ins/Symbol19213820 (14.5%)20 (14.5%)0787840400
intl402/ListFormat1621380 (0.0%)0 (0.0%)0138138000
intl402/DurationFormat2201360 (0.0%)0 (0.0%)0134134220
intl402/Segmenter1581328 (6.1%)8 (6.1%)0122122220
built-ins/AsyncDisposableStack2081302 (1.5%)2 (1.5%)0122122660
built-ins/BigInt15412444 (35.5%)44 (35.5%)0181862620
built-ins/Uint8Array1401120 (0.0%)0 (0.0%)0767636360
built-ins/Error18610222 (21.6%)22 (21.6%)07272880
language/white-space134102102 (100.0%)102 (100.0%)000000
built-ins/parseFloat10810082 (82.0%)82 (82.0%)01818000

The full per-chapter and second-level tables, with every outcome column, were generated with this survey (tables.md per branch, available on request). Second-level chapters with the most wrong results on main:

  • language/statements/class 502 and language/expressions/class 456
  • language/statements/for-await-of 202
  • language/expressions/object 194
  • built-ins/Object/getOwnPropertyDescriptor 172
  • staging/sm 141
  • language/statements/for-of 134
  • language/expressions/async-generator 132
  • language/expressions/compound-assignment 116
  • built-ins/RegExp (top level) 106
  • built-ins/Number/prototype/toString 84
  • built-ins/Array/prototype/slice 80

Top wrong-result clusters (main), by root cause

These were grouped heuristically from test paths and diagnostic stderr. Counts are variants (sloppy and strict counted separately).

#root causevariantsmain chaptersexamples
1Function/class name inference (SetFunctionName) in binding initializers and destructuring defaults: anonymous classes get name '' instead of the binding name, and named function/generator expressions are renamed to the binding name instead of keeping their own name.940language/statements (498), language/expressions (442)language/expressions/arrow-function/dstr/dflt-ary-ptrn-elem-id-init-fn-name-fn.js#sloppy
language/expressions/arrow-function/dstr/dflt-obj-ptrn-id-init-fn-name-gen.js#sloppy
2Values crossing a typed boundary throw scriptc's own TypeError ('expected number at $, got undefined/object', 'not representable in a … slot') where the spec performs ToNumber/ToIndex/ToBoolean coercion (valueOf objects, undefined arguments, Number.prototype as receiver, booleans in arithmetic).730language/expressions (140), language/statements (108), built-ins/DataView (96)built-ins/BigInt/asUintN/order-of-steps.js#strict
built-ins/DataView/prototype/getFloat16/to-boolean-littleendian.js#strict
3Destructuring null/undefined (mostly generator, async-generator and class-method parameters with defaults) does not throw TypeError, or throws a plain Error instead.502language/expressions (278), language/statements (212), built-ins/String (6)language/expressions/async-generator/dstr/ary-ptrn-elem-obj-val-null.js#strict
language/expressions/async-generator/dstr/dflt-ary-ptrn-elem-ary-val-null.js#strict
4Own-property layout of functions: 'name'/'prototype' are not own properties of built-in functions (e.g. Math.*, escape) or classes, 'length' is not ordered before 'name', private method names wrong.424built-ins/Math (88), built-ins/Symbol (36), built-ins/Atomics (28)annexB/built-ins/escape/name.js#sloppy
built-ins/Array/isArray/descriptor.js#sloppy
5Property descriptors of built-in members read as undefined (Object.getOwnPropertyDescriptor / verifyProperty on built-in prototypes and accessors), so the test throws 'Cannot convert undefined or null to object' or reads '.writable' of undefined.380built-ins/Object (114), built-ins/Iterator (46), annexB (44)annexB/built-ins/String/prototype/link/prop-desc.js#strict
annexB/built-ins/RegExp/legacy-accessors/rightContext/prop-desc.js#strict
6Properties assigned onto arrays/functions (arr.getClass = Object.prototype.toString; f.reduce = Array.prototype.reduce) are not observable when read back ('… is not a function').348built-ins/Array (260), built-ins/Object (46), built-ins/String (32)built-ins/Array/prototype/every/15.4.4.16-8-2.js#sloppy
built-ins/Array/prototype/filter/15.4.4.20-6-3.js#strict
7Unimplemented built-in members read as undefined instead of being refused (e.g. Array.prototype[Symbol.unscopables], ArrayBuffer.prototype.resize/transfer, Iterator.prototype.chunks/windows), and the test then fails with a TypeError.205built-ins/ArrayBuffer (50), built-ins/Iterator (48), built-ins/Array (34)built-ins/Array/prototype/Symbol.unscopables/value.js#strict
built-ins/Array/prototype/forEach/15.4.4.18-7-c-ii-13.js#strict
8Object.create/defineProperties/defineProperty reject non-plain descriptor objects (functions, arrays, arguments, Date, Error, …) with 'Property description must be an object' / 'called on non-object', or apply attributes differently.196built-ins/Object (196)built-ins/Object/create/15.2.3.5-4-113.js#strict
built-ins/Object/create/15.2.3.5-4-159.js#strict
9Array destructuring ignores a user-replaced Array.prototype[Symbol.iterator] (actual 3, expected 42) and some iterator-protocol steps.166language/statements (98), language/expressions (68)language/expressions/class/dstr/meth-ary-ptrn-elem-id-iter-val-array-prototype.js#sloppy
language/expressions/class/dstr/meth-dflt-ary-ptrn-elem-id-iter-val-array-prototype.js#sloppy
10RegExp patterns with invalid class ranges built at runtime (new RegExp with class escapes as range endpoints, S15.10.2.15_A1_*) do not throw SyntaxError.94built-ins/RegExp (94)built-ins/RegExp/S15.10.2.15_A1_T18.js#sloppy
built-ins/RegExp/S15.10.2.15_A1_T39.js#sloppy
11An expected exception is not thrown (assorted: species on non-extensible arrays, Map/Set constructor iterator items that are not objects, Proxy invariants).90built-ins/Array (20), language/statements (20), staging (10)built-ins/Array/prototype/concat/create-species-non-extensible.js#sloppy
built-ins/Map/iterator-items-are-not-object.js#strict
12Integrity levels report wrong results: Object.isFrozen/isSealed/isExtensible and Reflect.preventExtensions.81built-ins/Object (77), built-ins/Reflect (4)built-ins/Object/isFrozen/15.2.3.12-3-15.js#sloppy
built-ins/Reflect/preventExtensions/preventExtensions.js#sloppy

Unclassified long tail: 802 of 5131 wrong results.

The integration branch has the same clusters with similar counts. Two clusters grow: "missing member reads as undefined" goes from 205 to 596 and "built-in property descriptors read as undefined" goes from 380 to 582. Both trace to the change described in the next section.

Integration branch vs main

Per-variant transitions (coarse categories):

transitionvariants
refusal -> wrong769
refusal -> pass169
wrong -> pass34
wrong -> refusal16
pass -> wrong10
refusal -> other6
pass -> refusal4
  • Refusal → wrong (769 variants).
    • On main, these variants hit the SC2020 fence "'X' is part of the standard library types but has no scriptc lowering yet". The most common subjects are Object.getOwnPropertyDescriptor (174), Date.prototype (134), RegExp.prototype (54), Map.prototype (30), Object.defineProperty (26), Set.prototype, WeakMap.prototype, WeakSet.prototype, Object.isExtensible/isSealed/isFrozen and Promise.prototype.
    • On the integration branch these compile, but the value reads as undefined. Tests then fail with "Cannot convert undefined or null to object" or "Cannot read properties of undefined".
    • Examples: annexB/built-ins/Date/prototype/getYear/B.2.4.js, built-ins/Map/prototype/size/length.js, built-ins/Map/properties-of-the-map-prototype-object.js.
    • In these cases an explicit refusal has become a silent divergence.
  • Refusal → pass (169) and wrong → pass (34). These are concentrated in built-ins/Date (+70 passes), built-ins/WeakMap (+24), language/arguments-object (+18), staging (+21) and built-ins/RegExp (+12). Examples: built-ins/Date/name.js, built-ins/Date/parse/without-utc-offset.js, built-ins/Array/prototype/exotic-array.js.
  • Pass → wrong (10). Examples: built-ins/Promise/resolve/S25.4.4.5_A1.1_T1.js and built-ins/RegExp/escape/is-function.js.
  • Pass → refusal (4). built-ins/Array/from/source-object-iterator-2.js and built-ins/Array/from/source-object-missing.js now hit an unlocated refusal.
  • Reclassified refusals.
    • 5,736 Temporal variants move from compile refusal ("Cannot find name 'Temporal'") to a runtime ReferenceError.
    • 1,166 variants move from compile refusal to a located runtime fence.

Top refusal messages (main)

#messagevariantsreported asmost common subjectsexample
1SC0001: Cannot find name '…'.11411compile 11411Temporal 7166, $DONOTEVALUATE 1199, x 769, w 736annexB/language/function-code/block-decl-func-existing-block-fn-no-init.js#sloppy
2'…' is part of the standard library types but has no scriptc lowering yet [SC2020]7985fence 7108, caught by assert.throws/$DONE 877Object.defineProperty 627, new String 564, Object.getOwnPropertyDescriptor 324, new Number 316annexB/built-ins/Date/prototype/getYear/B.2.4.js#sloppy
3harness: reference-assertion2385harness 2385annexB/built-ins/RegExp/RegExp-control-escape-russian-letter.js#sloppy
4method calls like '…' is not supported yet [SC1090]1565caught by assert.throws/$DONE 74, fence 1491C.method 1236, Iterator.concat 40, Iterator.zipKeyed 32, C.$ 32built-ins/Function/prototype/bind/15.3.4.5-2-7.js#sloppy
5class prototype reflection and accessor replacement (named prototype data and methods compile) is not supported yet [SC1090]980fence 914, caught by assert.throws/$DONE 66built-ins/Error/prototype/S15.11.4_A1.js#sloppy
6assignment to non-variables are not supported yet [SC1090]947fence 941, caught by assert.throws/$DONE 6built-ins/Array/prototype/every/15.4.4.16-1-10.js#sloppy
7values of type '…' cannot be compiled yet (supported: number, string, boolean, arrays, Maps, Sets, RegExp, read-only Date values, functions, classes, records, unions of t908fence 842, caught by assert.throws/$DONE 66() => Generator<never, number, unknown> 428, () => AsyncGenerator<never, number, unknown> 148, (string: string) => string 50, void 46annexB/built-ins/escape/argument_bigint.js#sloppy
8SC0001: Type '…' must have a '…' method that returns an async iterator.892compile 892never 24, { readonly [Symbol.iterator]: void; readonly [Symb 24, { readonly [Symbol.iterator]: void; [Symbol.asyncI 24, { readonly [Symbol.iterator]: void; [Symbol.asyncI 24language/expressions/async-generator/named-yield-star-expr-abrupt.js#sloppy
9Function.prototype.call on a function whose signature cannot cross the checked-value boundary (call '…' directly) is not supported yet [SC1090]649fence 281, caught by assert.throws/$DONE 368Promise.allSettled(...) 38, Promise.all(...) 28, Promise.any(...) 24, RegExp.prototype[Symbol.split](...) 22annexB/built-ins/String/prototype/anchor/B.2.3.2.js#sloppy
10Object.defineProperty on an array index or length is not supported yet645caught by assert.throws/$DONE 100, unlocated fence 545built-ins/Array/length/define-own-prop-length-error.js#sloppy

More detail on the largest refusals:

  • "Cannot find name" (11,411). Mostly Temporal (7,166). It also covers 1,199 negative parse tests where $DONOTEVALUATE is reported because the expected early error was not raised, and tests that deliberately reference undeclared identifiers (x, w, unresolvableReference, …).
  • SC2020 (7,985). Led by Object.defineProperty (627), new String (564), Object.getOwnPropertyDescriptor (324), new Number (316), new Intl.NumberFormat (286) and new Boolean (261).

Runner issues found

  1. fail results whose stderr is a refusal (1,918 on main, 2,112 on the integration branch).
    • The runner recognizes a runtime refusal only when stderr is exactly Uncaught Error: … [SCnnnn at <file>:<line>].
    • Unlocated fences are classified as fail. Examples: Object.defineProperty on an array index or length is not supported yet, Object.getPrototypeOf on this value is not supported yet, … [SC2020] without a location, and TypeError: scriptc: Object.prototype reflection and mutation are not supported yet.
    • These should be classified as runtime refusals.
  2. Refusals caught by assert.throws become assertion failures (2,057 variants on main).
    • When the callback hits a scriptc refusal, the host assert.throws sees an Error whose constructor differs from the expected one. It then reports "Expected exception".
    • The host harness should detect refusal errors and exit with a refusal status, as it already does for reference assertions.
  3. The async-completion cluster is mostly refusals, not a harness artifact.
    • "SCRIPTC_TEST262_HARNESS: async completion failed" accounts for 1,750 variants on main.
    • 1,193 (68%) are refusals passed to $DONE as the rejection reason, 1,187 of them located SC fences. Examples: yield* in async generators (SC1071), for await over unsupported sources (SC1070), and Promise.all over unsupported argument shapes (SC2020).
    • The remaining 557 are real assertion failures inside async tests, largely the same function-name and destructuring root causes listed above.
    • No double $DONE calls were observed.
    • $DONE should print the reason and classify refusal-shaped reasons as runtime refusals.
  4. Missed early errors are reported as compile refusals.
    • About 1,199 admitted negative parse tests fail with "Cannot find name '$DONOTEVALUATE'". scriptc did not report the expected early error, and the type checker then flagged the harness sentinel.
    • These are accepted invalid programs, closer to wrong results than refusals. They deserve their own outcome.
  5. The caught error is not reported.
    • assert.throws failures print only "Expected exception", and $DONE failures print only "async completion failed". The actual error or rejection reason is dropped.
    • Printing it would make fail triage possible without a diagnostic rerun.

🤖 Generated with Claude Code

Activity

0

No activity yet.