Skip to content

Copy bytes in increasing order in TypedArray slice - #1601

Merged
saghul merged 2 commits into
quickjs-ng:masterfrom
littledivy:fix/typedarray-slice-overlap-copy
Jul 25, 2026
Merged

saghul merged 2 commits into
quickjs-ng:masterfrom
littledivy:fix/typedarray-slice-overlap-copy

Conversation

@littledivy

@littledivy littledivy commented Jul 25, 2026 •

Copy link
Copy Markdown
Contributor

When source and target element types match, %TypedArray%.prototype.slice copies byte by byte in increasing order (step 14.g). This is observable when the species constructor returns a view over the same buffer that overlaps the source ahead of it: bytes that were already copied are read back as source values. quickjs used memmove, which preserves the original source bytes.

For ta = [10, 20, 30, 40, 50, 60] and a species constructor returning new TA(ta.buffer, 2 * TA.BYTES_PER_ELEMENT), the result of ta.slice(1, 4):

before after (spec, matches V8)
20,30,40,60 20,20,20,60

The overlapping slice case in test_builtin.js encoded the memmove behavior and is updated to the byte by byte result.

The PR also bumps test262. With the copy order fixed the run reaches the immutable ArrayBuffer variant of this test, which the newer revision excludes, so the two tracked entries for it are gone. The bump surfaces three new tracked failures in using/await-using initializer-disposed-at-end-of-imported-module tests, which are pre-existing and unrelated to this change.

Disclaimer: This is an AI-assisted patch from the v8x project.

@littledivy
littledivy force-pushed the fix/typedarray-slice-overlap-copy branch from e9eab06 to 64fb374 Compare July 25, 2026 05:45
@saghul

saghul commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Can you bump test262 as part of the PR?

%TypedArray%.prototype.slice copies with a byte by byte loop in
increasing order when source and target have the same element type
(step 14.g). This is observable when the species constructor returns a
view over the same buffer that overlaps the source ahead of it: bytes
that were already copied are read back as source values. quickjs used
memmove, which preserves the original source bytes instead.

Use a forward byte copy when the target range overlaps the source
ahead of it, and keep memmove otherwise. The overlapping slice case in
test_builtin.js encoded the memmove behavior; V8 matches the byte by
byte result.
@littledivy
littledivy force-pushed the fix/typedarray-slice-overlap-copy branch from 234a17c to 25f45bc Compare July 25, 2026 16:07
@littledivy

Copy link
Copy Markdown
Contributor Author

Yep, done

@saghul
saghul merged commit 4493db7 into quickjs-ng:master Jul 25, 2026
128 checks passed
social4hyq pushed a commit to social4hyq/homebrew-core that referenced this pull request Sep 20, 2026
quickjs-ng 0.16.0

Created-by: HarmonybrewBot
Commit-by: HarmonybrewBot
Merged-by: HarmonybrewBot
Description: Created by `brew bump`

---

Created with `brew bump-formula-pr`.<details>
  <summary>release notes</summary>
  <pre>## What's Changed
* Add new project by @qr243vbi in quickjs-ng/quickjs#1529
* Disable standalone executable support under WASM / Emscripten by @saghul in quickjs-ng/quickjs#1528
* Only export API symbols for shared builds by @dannote in quickjs-ng/quickjs#1525
* Update CI configuration to use Visual Studio 18 by @saghul in quickjs-ng/quickjs#1533
* Update test262 by @saghul in quickjs-ng/quickjs#1539
* Fix -Wmaybe-uninitialized warning in js_binary_logic_slow by @sdrsdr in quickjs-ng/quickjs#1530
* Implement Error.prototype.stack accessor proposal by @saghul in quickjs-ng/quickjs#1536
* Enforce immutability on TypedArray write paths by @saghul in quickjs-ng/quickjs#1537
* Fix ArrayBuffer immutable-method semantics by @saghul in quickjs-ng/quickjs#1538
* Implement nonextensible-applies-to-private proposal by @saghul in quickjs-ng/quickjs#1540
* Bump actions/checkout from 6 to 7 by @dependabot[bot] in quickjs-ng/quickjs#1542
* Default to release builds in Meson by @saghul in quickjs-ng/quickjs#1544
* JS_Free*: public vararg macros by @vitawrap in quickjs-ng/quickjs#1535
* Build release binaries with static mimalloc by @saghul in quickjs-ng/quickjs#1545
* Add Unicode license to libunicode-table.h by @bnoordhuis in quickjs-ng/quickjs#1547
* Port Bellard's register-based regexp engine by @saghul in quickjs-ng/quickjs#1548
* Fix build with strict C compilers on x86-32 by @trufae in quickjs-ng/quickjs#1550
* Inline mixed int/float arithmetic and fast-array reads in the interpreter by @saghul in quickjs-ng/quickjs#1549
* Add arena allocator by @saghul in quickjs-ng/quickjs#1551
* Fix `set Iterator.prototype.constructor` for non-object values by @saghul in quickjs-ng/quickjs#1553
* Fix reference leak in `Iterator.prototype.filter` by @saghul in quickjs-ng/quickjs#1561
* Fix Iterator Helper close when the source iterator has no `return` by @saghul in quickjs-ng/quickjs#1558
* Set module internal promise rejection as handled when appropriate by @xim in quickjs-ng/quickjs#1554
* Add a GC-stress CI job by @saghul in quickjs-ng/quickjs#1568
* Fix memory leak in Set.prototype.union / symmetricDifference by @saghul in quickjs-ng/quickjs#1567
* Fix use-after-free in DisposableStack disposal by @saghul in quickjs-ng/quickjs#1566
* Fix type confusion in RegExp.escape with rope strings by @saghul in quickjs-ng/quickjs#1574
* Fix use-after-free from Array `.length` grow + `push` by @saghul in quickjs-ng/quickjs#1563
* Fix reference leak in Iterator.prototype.find by @saghul in quickjs-ng/quickjs#1573
* Fix BigInt.asUintN of negatives when width is limb-aligned by @littledivy in quickjs-ng/quickjs#1575
* Fix missing module exports for array destructuring by @littledivy in quickjs-ng/quickjs#1576
* Fix double free of a detached ArrayBuffer's backing store by @littledivy in quickjs-ng/quickjs#1578
* Fix for-await-of calling return() on normal completion by @littledivy in quickjs-ng/quickjs#1577
* Await async iterator return() when a for-await loop breaks by @littledivy in quickjs-ng/quickjs#1580
* Make Array.fromAsync elements enumerable by @littledivy in quickjs-ng/quickjs#1581
* Report the correct column number for syntax errors by @littledivy in quickjs-ng/quickjs#1582
* Implement CallSite.prototype.isConstructor() by @littledivy in quickjs-ng/quickjs#1584
* Fix crash on cyclic re-export of an imported binding by @littledivy in quickjs-ng/quickjs#1583
* Name the re-exported module when a re-export is missing by @littledivy in quickjs-ng/quickjs#1586
* Report the correct column for an undefined global reference by @littledivy in quickjs-ng/quickjs#1585
* docs: add RongJS to projects by @butterflyfish in quickjs-ng/quickjs#1589
* Limit named group scopes to 256 by @saghul in quickjs-ng/quickjs#1592
* Bump actions/setup-node from 6 to 7 by @dependabot[bot] in quickjs-ng/quickjs#1593
* Harden against hash collisions by @bnoordhuis in quickjs-ng/quickjs#1590
* Add man pages by @suve in quickjs-ng/quickjs#1595
* Return null from CallSite position getters for native frames by @littledivy in quickjs-ng/quickjs#1597
* Fix subarray species constructor arguments by @littledivy in quickjs-ng/quickjs#1600
* Continue the TypedArray lastIndexOf scan after a shrink by @littledivy in quickjs-ng/quickjs#1602
* Copy bytes in increasing order in TypedArray slice by @littledivy in quickjs-ng/quickjs#1601
* Key module identity by specifier and import attributes by @littledivy in quickjs-ng/quickjs#1603
* Add JS_PromiseMarkAsHandled by @littledivy in quickjs-ng/quickjs#1604
* Do not coerce the value on a TypedArray out-of-bounds write with a foreign receiver by @littledivy in quickjs-ng/quickjs#1599
* Add JS_PromiseThen by @littledivy in quickjs-ng/quickjs#1605
* Fix UAF of a suspended coroutine referenced only via a closure by @saghul in quickjs-ng/quickjs#1569
* Fix double free of a CallSite when the backtrace array insertion fails by @saghul in quickjs-ng/quickjs#1614
* Fix use-after-free when creating the promise resolving functions OOMs by @saghul in quickjs-ng/quickjs#1613
* Fix leak in JSON.stringify() when space is a rope by @saghul in quickjs-ng/quickjs#1612
* Fix integer overflow in the TypedArray sort index array allocation by @saghul in quickjs-ng/quickjs#1611
* Fix reference leak in Atomics.store() on an invalidated buffer by @saghul in quickjs-ng/quickjs#1610
* Fix integer overflow in the Proxy ownKeys() property enumeration by @saghul in quickjs-ng/quickjs#1609
* Fix integer multiplication result cast to unsigned long in js_realloc_array() by @Nidrax in quickjs-ng/quickjs#1608
* Drop js_realloc2 and its allocation-slack feedback by @saghul in quickjs-ng/quickjs#1616
* lre: Do not patch a jump offset that could not be emitted by @saghul in quickjs-ng/quickjs#1615
* Reject out-of-range limits in Iterator.prototype.take/drop by @saghul in quickjs-ng/quickjs#1618
* Implement the Iterator.prototype.join() proposal by @saghul in quickjs-ng/quickjs#1620
* Implement the iterator includes proposal by @saghul in quickjs-ng/quickjs#1619
* Support resizable externally managed ArrayBuffers by @saghul in quickjs-ng/quickjs#1594
* Implement the iterator chunking proposal by @saghul in quickjs-ng/quickjs#1621
* Iterator helper fixes by @saghul in quickjs-ng/quickjs#1622
* Iterator.contact fixes by @saghul in quickjs-ng/quickjs#1623

## New Contributors
* @dannote made their first contribution in quickjs-ng/quickjs#1525
* @sdrsdr made their first contribution in quickjs-ng/quickjs#1530
* @vitawrap made their first contribution in quickjs-ng/quickjs#1535
* @xim made their first contribution in quickjs-ng/quickjs#1554
* @butterflyfish made their first contribution in quickjs-ng/quickjs#1589
* @suve made their first contribution in quickjs-ng/quickjs#1595
* @Nidrax made their first contribution in quickjs-ng/quickjs#1608

**Full Changelog**: https://github.com/quickjs-ng/quickjs/compare/v0.15.1...v0.16.0</pre>
  <p>View the full release notes at <a href="https://github.com/quickjs-ng/quickjs/releases/tag/v0.16.0">https://github.com/quickjs-ng/quickjs/releases/tag/v0.16.0</a>.</p>
</details>
<hr>

See merge request: Harmonybrew/homebrew-core!15602
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants