Add Test262 bytecode support gaps#341
Conversation
- Support async tests, spread constructors, and unparenthesized arrows - Expose function name/length as own properties - Add shims and tests for isNaN, isFinite, and spread new expressions
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
✅ Files skipped from review due to trivial changes (4)
📝 WalkthroughWalkthroughAdds Test262 async test support and harness includes; implements spread-in-new-expression support across parser, compiler, and VM; exposes function Changes
Sequence Diagram(s)sequenceDiagram
participant Runner as Runner (scripts/run_test262_suite.py)
participant Harness as Harness (test262_harness)
participant Compiler as Compiler
participant VM as VM
Runner->>Compiler: wrap test body (is_async ? async wrapper + await __donePromise)
Runner->>Harness: ensure includes (`doneprintHandle.js`, `detachArrayBuffer.js`) present
Runner->>VM: execute wrapped test
VM->>Harness: test code calls $DONE(error?)
Harness->>Harness: resolve/reject __donePromise
VM-->>Runner: report pass/fail
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
Benchmark Results386 benchmarks Interpreted: 🟢 241 improved · 🔴 55 regressed · 90 unchanged · avg +3.6% arraybuffer.js — Interp: 🟢 5, 🔴 2, 7 unch. · avg +1.6% · Bytecode: 🟢 14 · avg +38.6%
arrays.js — Interp: 🟢 13, 6 unch. · avg +6.2% · Bytecode: 🟢 19 · avg +43.0%
async-await.js — Interp: 🟢 2, 4 unch. · avg +1.6% · Bytecode: 🟢 6 · avg +43.1%
base64.js — Interp: 🟢 9, 1 unch. · avg +6.7% · Bytecode: 🟢 10 · avg +38.8%
classes.js — Interp: 🟢 8, 🔴 4, 19 unch. · avg +0.3% · Bytecode: 🟢 31 · avg +27.9%
closures.js — Interp: 🟢 11 · avg +5.3% · Bytecode: 🟢 11 · avg +40.8%
collections.js — Interp: 🟢 3, 🔴 3, 6 unch. · avg +0.9% · Bytecode: 🟢 12 · avg +43.5%
csv.js — Interp: 🟢 12, 1 unch. · avg +7.3% · Bytecode: 🟢 13 · avg +39.2%
destructuring.js — Interp: 🟢 20, 2 unch. · avg +6.3% · Bytecode: 🟢 22 · avg +34.4%
fibonacci.js — Interp: 🟢 8 · avg +7.6% · Bytecode: 🟢 8 · avg +42.0%
float16array.js — Interp: 🟢 26, 🔴 4, 2 unch. · avg +2.5% · Bytecode: 🟢 32 · avg +33.3%
for-of.js — Interp: 🟢 5, 2 unch. · avg +4.5% · Bytecode: 🟢 7 · avg +43.1%
helpers/bench-module.js — Interp: 0 · Bytecode: 0
iterators.js — Interp: 🟢 8, 🔴 20, 14 unch. · avg -3.0% · Bytecode: 🟢 42 · avg +38.6%
json.js — Interp: 🟢 20 · avg +8.6% · Bytecode: 🟢 20 · avg +38.5%
jsx.jsx — Interp: 🟢 18, 3 unch. · avg +5.3% · Bytecode: 🟢 21 · avg +34.1%
modules.js — Interp: 🟢 9 · avg +6.6% · Bytecode: 🟢 9 · avg +48.7%
numbers.js — Interp: 🟢 9, 2 unch. · avg +7.2% · Bytecode: 🟢 11 · avg +42.6%
objects.js — Interp: 🟢 7 · avg +11.4% · Bytecode: 🟢 7 · avg +30.3%
promises.js — Interp: 🟢 10, 2 unch. · avg +6.3% · Bytecode: 🟢 12 · avg +32.1%
regexp.js — Interp: 🟢 11 · avg +8.5% · Bytecode: 🟢 11 · avg +33.1%
strings.js — Interp: 🟢 3, 🔴 11, 5 unch. · avg -2.6% · Bytecode: 🟢 15, 🔴 2, 2 unch. · avg +30.8%
tsv.js — Interp: 🟢 9 · avg +12.1% · Bytecode: 🟢 9 · avg +37.1%
typed-arrays.js — Interp: 🟢 8, 🔴 8, 6 unch. · avg -2.5% · Bytecode: 🟢 22 · avg +26.0%
uint8array-encoding.js — Interp: 🟢 7, 🔴 3, 8 unch. · avg +7.3% · Bytecode: 🟢 18 · avg +40.3%
Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context. |
Suite Timing
Measured on ubuntu-latest x64. |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
source/units/Goccia.Values.FunctionBase.pas (1)
136-150:⚠️ Potential issue | 🟠 Major
GetPropertyWithContextsynthesizes properties unconditionally, bypassing user-defined state and breaking configurable semantics.The implementation returns synthetic values for
PROP_LENGTHandPROP_NAMEwithout checking whether the user has previously deleted or redefined these properties. Afterdelete fn.name(removes fromFProperties), the method still synthesizes a value instead of respecting the deletion. Similarly, afterObject.defineProperty(fn, 'name', {value: 'custom'})(stores toFProperties), the method synthesizes instead of checking stored properties first. Since ECMAScript requires both properties to be configurable and fully deletable/redefinable, the implementation violates spec compliance by always returning synthetic values regardless of user state changes.This affects all three methods:
GetPropertyWithContext(lines 136–150),HasOwnProperty(lines 162–168), andGetOwnPropertyDescriptor(lines 170–180) must be coordinated to track and respect property state.Also review line 138 for ES annotation consistency with lines 162–180 per project guidelines.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@source/units/Goccia.Values.FunctionBase.pas` around lines 136 - 150, GetPropertyWithContext currently synthesizes PROP_LENGTH and PROP_NAME unconditionally; modify it to first consult the object's own properties/storage (e.g. check FProperties/HasOwnProperty/GetOwnPropertyDescriptor or call inherited behaviour) and only synthesize these values when there is no own property present (i.e., the property hasn't been deleted or redefined). Likewise ensure HasOwnProperty and GetOwnPropertyDescriptor are coordinated so they reflect user state (return true/descriptor from FProperties if present, otherwise behave as synthetic/configurable defaults). Also align the ES annotation/comment in GetPropertyWithContext with the style used in HasOwnProperty/GetOwnPropertyDescriptor for consistency.
🧹 Nitpick comments (5)
scripts/test262_syntax_filter.py (1)
287-288: Consider extending BigInt literal detection to cover non-decimal bases.The current pattern
\b\d[\d_]*n\bcatches decimal BigInt literals (e.g.,123n,1_000n) but misses hex (0x1ABn), octal (0o777n), and binary (0b101n) forms. Tests using those would pass the filter and fail at runtime instead of being skipped.This is a minor gap since most test262 BigInt tests use decimal literals, and failing for the right reason still produces a correct signal.
♻️ Optional: Broader BigInt literal pattern
("bigint_literal", - re.compile(r"\b\d[\d_]*n\b")), + re.compile(r"\b(?:0[xX][\da-fA-F_]+|0[oO][0-7_]+|0[bB][01_]+|\d[\d_]*)n\b")),🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@scripts/test262_syntax_filter.py` around lines 287 - 288, The bigint_literal regex only matches decimal BigInt forms; update the pattern used in the ("bigint_literal", re.compile(...)) tuple to also match hex (0x...), octal (0o...), and binary (0b...) BigInt literals (e.g. 0x1ABn, 0o777n, 0b101n) by expanding the regular expression to allow an optional 0[xob] prefix with appropriate digit classes as well as the decimal form with underscores, so tests containing non-decimal BigInt literals are correctly detected and filtered.tests/language/expressions/spread/new-expression.js (2)
128-134: Test doesn't use spread syntax.
new Uint8Array(data)passes the array directly to the constructor (which accepts an array-like), not via spread. This tests TypedArray constructor behavior, not the spread feature.If spread is intended:
const data = [1, 2, 3, 4]; const ta = new Uint8Array([...data]); // or use a collector pattern as shown above🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/language/expressions/spread/new-expression.js` around lines 128 - 134, The test "spread with TypedArray constructor" currently constructs the TypedArray by passing the array directly to new Uint8Array(data) which doesn't exercise the spread operator; update the test to construct the TypedArray using spread (e.g. create the same data const data = [1,2,3,4] and instantiate ta with new Uint8Array([...data]) or an equivalent collector pattern) so the test actually verifies spread behavior while keeping the existing assertions on ta.length and element values.
94-105: Tests don't exercise spread syntax.These tests pass an array directly to the constructor (
new Map(entries),new Set(vals)) rather than using spread (new Map(...entries),new Set(...vals)). Since Map/Set constructors accept iterables as their first argument, these tests validate constructor behavior but not spread compilation.Consider either:
- Updating to use spread:
new Map([...entries])or passing spread to a wrapper- Moving to a separate test file for constructor iterable support
🔧 If spread is intended, update to actually use spread syntax
test("spread with Map constructor", () => { - const entries = [["a", 1], ["b", 2]]; - const m = new Map(entries); + class MapWrapper { + constructor(...entries) { + this.map = new Map(entries); + } + } + const entries = [["a", 1], ["b", 2]]; + const w = new MapWrapper(...entries); + expect(w.map.get("a")).toBe(1); + expect(w.map.get("b")).toBe(2); });🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/language/expressions/spread/new-expression.js` around lines 94 - 105, The tests currently pass the arrays directly to constructors (new Map(entries), new Set(vals)) so they don't exercise spread syntax; update the tests to use spread inside an array literal passed to the constructor (e.g., replace new Map(entries) with new Map([...entries]) and replace new Set(vals) with new Set([...vals])) so the spread operator is actually used on the source arrays (variables entries and vals) in the test cases named "spread with Map constructor" and "spread with Set constructor".source/units/Goccia.Values.FunctionBase.pas (1)
162-180: Add ES spec annotations above the new spec-facing overrides.Please annotate these new methods with the standard
// ESYYYY §X.Y.Z SpecMethodName(specParams)format for consistency with project conventions.Based on learnings: Applies to
{**/Goccia.Values.*.pas,**/Goccia.Evaluator.pas,**/Goccia.Runtime.*.pas}: “Annotate each function implementing ECMAScript-specified behavior with// ESYYYY §X.Y.Z SpecMethodName(specParams)immediately above the function body...”🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@source/units/Goccia.Values.FunctionBase.pas` around lines 162 - 180, Add the ES spec annotation comment immediately above the two new overrides: place a single-line comment in the project's standard format (e.g. "// ES2021 §7.3.5 HasOwnProperty(P)" ) above TGocciaFunctionBase.HasOwnProperty and a matching one (e.g. "// ES2021 §7.3.6 GetOwnPropertyDescriptor(P)") above TGocciaFunctionBase.GetOwnPropertyDescriptor; ensure the comment uses the "ESYYYY §X.Y.Z SpecMethodName(specParams)" pattern and replace the year/section with the correct ECMAScript section numbers for the corresponding spec methods.source/units/Goccia.Builtins.Math.pas (1)
110-111: Please run formatter and test commands before merge.PR notes say validations were not run locally; please run
./format.pas --checkand the TestRunner command before merging.As per coding guidelines "
**/*.pas: Execute ./format.pas --check before push or PR to verify code formatting compliance".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@source/units/Goccia.Builtins.Math.pas` around lines 110 - 111, Run the repository formatter and tests before merging: execute ./format.pas --check (or ./format.pas to fix) to ensure Pascal files like the changes adding Members.AddMethod(MathMax, 2, gmkStaticMethod) and Members.AddMethod(MathMin, 2, gmkStaticMethod) comply with formatting guidelines, and then run the TestRunner command used by the project to validate test suites; fix any formatting or test failures and re-run until both checks pass.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@scripts/test262_harness/detachArrayBuffer.js`:
- Around line 6-7: Update the TypeError message in the $262.detachArrayBuffer
implementation so it accurately reflects both accepted types: change the error
thrown in the conditional that checks "buffer instanceof ArrayBuffer" and
"buffer instanceof SharedArrayBuffer" to mention "ArrayBuffer or
SharedArrayBuffer" (refer to the throw inside detachArrayBuffer in
detachArrayBuffer.js) so the message matches the actual type check.
In `@source/units/Goccia.Parser.pas`:
- Around line 2145-2167: The single-parameter arrow branch currently accepts an
identifier followed by a line break and =>; update the condition that detects
the arrow (the Check(gttArrow) path when Left is TGocciaIdentifierExpression) to
reject cases where a LineTerminator appears between the identifier and the =>
token (i.e., require the ECMAScript "[no LineTerminator here]" restriction).
Concretely, before consuming the => (Advance) ensure you call the parser's
existing line-terminator check (or add a small helper used elsewhere for
return/throw checks) and only proceed to build TGocciaArrowFunctionExpression
when no LineTerminator exists; otherwise fall through to normal parsing/error.
Also add a negative parser test to tests/language/functions/arrow-functions.js
that asserts a parse-time error for "ident<newline>=> ..." similar to
tests/language/asi/throw-statement.js.
In `@tests/language/functions/arrow-functions.js`:
- Around line 91-92: Remove the unnecessary async from the Promise executor:
change the new Promise(async resolve => resolve(99)) so the executor is
synchronous (e.g., resolve => resolve(99)) to avoid the async-executor
anti-pattern; update the Promise creation that assigns to p and keep the rest of
the test (expect(await p).toBe(99)) unchanged.
---
Outside diff comments:
In `@source/units/Goccia.Values.FunctionBase.pas`:
- Around line 136-150: GetPropertyWithContext currently synthesizes PROP_LENGTH
and PROP_NAME unconditionally; modify it to first consult the object's own
properties/storage (e.g. check
FProperties/HasOwnProperty/GetOwnPropertyDescriptor or call inherited behaviour)
and only synthesize these values when there is no own property present (i.e.,
the property hasn't been deleted or redefined). Likewise ensure HasOwnProperty
and GetOwnPropertyDescriptor are coordinated so they reflect user state (return
true/descriptor from FProperties if present, otherwise behave as
synthetic/configurable defaults). Also align the ES annotation/comment in
GetPropertyWithContext with the style used in
HasOwnProperty/GetOwnPropertyDescriptor for consistency.
---
Nitpick comments:
In `@scripts/test262_syntax_filter.py`:
- Around line 287-288: The bigint_literal regex only matches decimal BigInt
forms; update the pattern used in the ("bigint_literal", re.compile(...)) tuple
to also match hex (0x...), octal (0o...), and binary (0b...) BigInt literals
(e.g. 0x1ABn, 0o777n, 0b101n) by expanding the regular expression to allow an
optional 0[xob] prefix with appropriate digit classes as well as the decimal
form with underscores, so tests containing non-decimal BigInt literals are
correctly detected and filtered.
In `@source/units/Goccia.Builtins.Math.pas`:
- Around line 110-111: Run the repository formatter and tests before merging:
execute ./format.pas --check (or ./format.pas to fix) to ensure Pascal files
like the changes adding Members.AddMethod(MathMax, 2, gmkStaticMethod) and
Members.AddMethod(MathMin, 2, gmkStaticMethod) comply with formatting
guidelines, and then run the TestRunner command used by the project to validate
test suites; fix any formatting or test failures and re-run until both checks
pass.
In `@source/units/Goccia.Values.FunctionBase.pas`:
- Around line 162-180: Add the ES spec annotation comment immediately above the
two new overrides: place a single-line comment in the project's standard format
(e.g. "// ES2021 §7.3.5 HasOwnProperty(P)" ) above
TGocciaFunctionBase.HasOwnProperty and a matching one (e.g. "// ES2021 §7.3.6
GetOwnPropertyDescriptor(P)") above
TGocciaFunctionBase.GetOwnPropertyDescriptor; ensure the comment uses the
"ESYYYY §X.Y.Z SpecMethodName(specParams)" pattern and replace the year/section
with the correct ECMAScript section numbers for the corresponding spec methods.
In `@tests/language/expressions/spread/new-expression.js`:
- Around line 128-134: The test "spread with TypedArray constructor" currently
constructs the TypedArray by passing the array directly to new Uint8Array(data)
which doesn't exercise the spread operator; update the test to construct the
TypedArray using spread (e.g. create the same data const data = [1,2,3,4] and
instantiate ta with new Uint8Array([...data]) or an equivalent collector
pattern) so the test actually verifies spread behavior while keeping the
existing assertions on ta.length and element values.
- Around line 94-105: The tests currently pass the arrays directly to
constructors (new Map(entries), new Set(vals)) so they don't exercise spread
syntax; update the tests to use spread inside an array literal passed to the
constructor (e.g., replace new Map(entries) with new Map([...entries]) and
replace new Set(vals) with new Set([...vals])) so the spread operator is
actually used on the source arrays (variables entries and vals) in the test
cases named "spread with Map constructor" and "spread with Set constructor".
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: c67e3ba8-5209-406a-afe4-f47978c16c42
📒 Files selected for processing (17)
scripts/run_test262_suite.pyscripts/test262_harness/detachArrayBuffer.jsscripts/test262_harness/doneprintHandle.jsscripts/test262_harness/testTypedArray.jsscripts/test262_syntax_filter.pysource/units/Goccia.Builtins.GlobalObject.passource/units/Goccia.Builtins.Math.passource/units/Goccia.Compiler.Expressions.passource/units/Goccia.Parser.passource/units/Goccia.Shims.passource/units/Goccia.VM.passource/units/Goccia.Values.FunctionBase.pastests/built-ins/function-name-length.jstests/built-ins/isFinite.jstests/built-ins/isNaN.jstests/language/expressions/spread/new-expression.jstests/language/functions/arrow-functions.js
- Fix detachArrayBuffer error message to mention SharedArrayBuffer - Enforce [no LineTerminator here] before => in single-param arrows - Remove async Promise executor anti-pattern from arrow tests - Co-locate name/length tests with their respective builtin test files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
tests/built-ins/Array/prototype/map.js (1)
92-98: Strengthen metadata coverage by assertinglengthdescriptor semantics too.Line 94 checks
lengthvalue, but not property attributes. Addlengthdescriptor checks (configurable,enumerable,writable) and guard descriptor existence for clearer failures.Suggested patch
test("map has correct name and length", () => { expect(Array.prototype.map.name).toBe("map"); expect(Array.prototype.map.length).toBe(1); + expect(Object.prototype.hasOwnProperty.call(Array.prototype.map, "length")).toBe(true); const desc = Object.getOwnPropertyDescriptor(Array.prototype.map, "name"); + const lengthDesc = Object.getOwnPropertyDescriptor(Array.prototype.map, "length"); + expect(desc).toBeDefined(); + expect(lengthDesc).toBeDefined(); expect(desc.configurable).toBe(true); expect(desc.enumerable).toBe(false); + expect(desc.writable).toBe(false); + expect(lengthDesc.configurable).toBe(true); + expect(lengthDesc.enumerable).toBe(false); + expect(lengthDesc.writable).toBe(false); });🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/built-ins/Array/prototype/map.js` around lines 92 - 98, Add assertions that verify the property descriptor for Array.prototype.map.length: retrieve it with Object.getOwnPropertyDescriptor(Array.prototype.map, "length"), assert the descriptor exists, and then assert descriptor.configurable === true (or expected), descriptor.enumerable === false, and descriptor.writable === false (or expected) so the test covers length property semantics in addition to its numeric value; update the test block that references Array.prototype.map to include these checks alongside the existing name and length assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@tests/built-ins/Array/of.js`:
- Around line 49-52: The test currently only checks the values of Array.of.name
and Array.of.length but must assert they are own properties; update the "has
correct name and length" test to also verify ownership by checking
Object.prototype.hasOwnProperty.call(Array.of, "name") and
Object.prototype.hasOwnProperty.call(Array.of, "length") (or use
Object.getOwnPropertyDescriptor(Array.of, "name") / "length" !== undefined) in
addition to the existing value assertions so the test fails if those properties
are inherited rather than own properties.
---
Nitpick comments:
In `@tests/built-ins/Array/prototype/map.js`:
- Around line 92-98: Add assertions that verify the property descriptor for
Array.prototype.map.length: retrieve it with
Object.getOwnPropertyDescriptor(Array.prototype.map, "length"), assert the
descriptor exists, and then assert descriptor.configurable === true (or
expected), descriptor.enumerable === false, and descriptor.writable === false
(or expected) so the test covers length property semantics in addition to its
numeric value; update the test block that references Array.prototype.map to
include these checks alongside the existing name and length assertions.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: c9b55c66-6a8d-4d31-ac87-50f34237d7d7
📒 Files selected for processing (17)
scripts/test262_harness/detachArrayBuffer.jssource/units/Goccia.Parser.pastests/built-ins/Array/from.jstests/built-ins/Array/of.jstests/built-ins/Array/prototype/filter.jstests/built-ins/Array/prototype/forEach.jstests/built-ins/Array/prototype/map.jstests/built-ins/Array/prototype/reduce.jstests/built-ins/Math/abs.jstests/built-ins/Math/max.jstests/built-ins/Math/min.jstests/built-ins/Math/pow.jstests/built-ins/Number/isNaN.jstests/built-ins/Object/assign.jstests/built-ins/String/prototype/includes.jstests/built-ins/String/prototype/slice.jstests/language/functions/arrow-functions.js
✅ Files skipped from review due to trivial changes (12)
- tests/built-ins/String/prototype/slice.js
- tests/built-ins/Array/prototype/forEach.js
- tests/built-ins/String/prototype/includes.js
- tests/built-ins/Array/prototype/filter.js
- tests/built-ins/Array/prototype/reduce.js
- tests/built-ins/Array/from.js
- tests/built-ins/Object/assign.js
- tests/built-ins/Math/pow.js
- tests/built-ins/Math/max.js
- tests/built-ins/Number/isNaN.js
- tests/built-ins/Math/min.js
- tests/built-ins/Math/abs.js
🚧 Files skipped from review as they are similar to previous changes (3)
- tests/language/functions/arrow-functions.js
- scripts/test262_harness/detachArrayBuffer.js
- source/units/Goccia.Parser.pas
- Array.of: verify name/length are own properties via getOwnPropertyDescriptor - Array.prototype.map: add length descriptor checks (configurable, enumerable, writable) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- assert name/length descriptors for several built-ins - cover Math.max, Number.isNaN, Object.assign, and String.prototype.slice
Summary
newexpressions, and additional harness includes.OP_CONSTRUCT.nameandlengthas own properties on built-in functions, and updates built-ins such asObject.assign,Math.max, andMath.minto report spec-correct arity.isNaN,isFinite,Float16Array,arraybuffer-transfer,resizable-arraybuffer, and related Test262 harness pieces.Testing
./build.pas testrunner && ./build/GocciaTestRunner tests --asi./format.pas --check