- From: Mattias Buelens <notifications@github.com>
- Date: Wed, 08 Oct 2025 14:35:25 -0700
- To: whatwg/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/webidl/pull/1529@github.com>
Previously, many `BufferSource` algorithms were using internal slots such as `[[ByteOffset]]` and `[[ByteLength]]` directly. However, with the addition of `SharedArrayBuffer` (#353, #1311) and `[AllowResizable]` (#982), this comes with extra caveats:
* To get the byte length of a `SharedArrayBuffer`, we need to use [`ArrayBufferByteLength`](https://tc39.es/ecma262/multipage/structured-data.html#sec-arraybufferbytelength) to match [`SharedArrayBuffer.prototype.byteLength`](https://tc39.es/ecma262/multipage/structured-data.html#sec-get-sharedarraybuffer.prototype.bytelength).
* To get the byte length of a ["length-tracking" typed array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray#behavior_when_viewing_a_resizable_buffer), we need to use [`TypedArrayByteLength`](https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-typedarraybytelength). Similarly, for a length-tracking `DataView`, we need to use [`GetViewByteLength`](https://tc39.es/ecma262/multipage/structured-data.html#sec-getviewbytelength).
* To get the byte offset of a typed array or `DataView`, we first need to check if the view is still inbounds using [`IsArrayBufferViewOutOfBounds`](https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-isarraybufferviewoutofbounds).
Transferring an `ArrayBuffer` must also take into account whether it should remain resizable or not. Fortunately, we can use the new [`ArrayBufferCopyAndDetach`](https://tc39.es/ecma262/multipage/structured-data.html#sec-arraybuffercopyanddetach) operation for that.
* I added an optional `preserveResizability` parameter to "transfer an `ArrayBuffer`", so specifications can choose whether to preserve resizability or not. By default, this is not preserved. (Most specs aren't using `[AllowResizable]` yet anyway.)
* I removed the `realm` parameter of that algorithm, since `ArrayBufferCopyAndDetach` doesn't accept such a parameter. [According to WebDex](https://dontcallmedom.github.io/webdex/t.html#transfer%40%40ArrayBuffer%40dfn), no specs were actually using that parameter anyway.
Open questions:
* [ ] When dealing with views backed by a `SharedArrayBuffer`, what memory ordering should we use? ECMAScript seems to use `SEQ-CST` pretty much everywhere (e.g. [`%TypedArray%.prototype.byteLength`](https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%typedarray%.prototype.bytelength)), but ["get a copy of the bytes"](https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy) uses `UNORDERED` for `GetValueFromBuffer`.
Fixes #1312.
Fixes #1385.
- [ ] At least two implementers are interested (and none opposed):
* …
* …
- [ ] [Tests](https://github.com/web-platform-tests/wpt) are written and can be reviewed and commented upon at:
* … <!-- If these tests are tentative, link a PR to make them non-tentative. -->
- [ ] [Implementation bugs](https://github.com/whatwg/meta/blob/main/MAINTAINERS.md#handling-pull-requests) are filed:
* Chromium: …
* Gecko: …
* WebKit: …
* Deno: …
* Node.js: …
* webidl2.js: …
* widlparser: …
- [ ] [MDN issue](https://github.com/whatwg/meta/blob/main/MAINTAINERS.md#handling-pull-requests) is filed: …
- [ ] The top of this comment includes a [clear commit message](https://github.com/whatwg/meta/blob/main/COMMITTING.md) to use. <!-- If you created this PR from a single commit, Github copied its message. Otherwise, you need to add a commit message yourself. -->
(See [WHATWG Working Mode: Changes](https://whatwg.org/working-mode#changes) for more details.)
<!--
This comment and the below content is programmatically generated.
You may add a comma-separated list of anchors you'd like a
direct link to below (e.g. #idl-serializers, #idl-sequence):
Don't remove this comment or modify anything below this line.
If you don't want a preview generated for this pull request,
just replace the whole of this comment's content by "no preview"
and remove what's below.
-->
***
<a href="https://whatpr.org/webidl/1529.html" title="Last updated on Oct 8, 2025, 9:35 PM UTC (4a52a2f)">Preview</a> | <a href="https://whatpr.org/webidl/1529/a79e69e...4a52a2f.html" title="Last updated on Oct 8, 2025, 9:35 PM UTC (4a52a2f)">Diff</a>
You can view, comment on, or merge this pull request online at:
https://github.com/whatwg/webidl/pull/1529
-- Commit Summary --
* Fix buffer source's byte length
* Add byte offset to ArrayBufferView
* Fix writing bytes into an ArrayBufferView backed by a SharedArrayBuffer
* Simplify writing into an ArrayBufferView
* Move assert before conversion
* Fix detached check
* Use ArrayBufferCopyAndDetach to transfer an ArrayBuffer
* Rework "get a copy of the bytes held"
* Use IsArrayBufferViewOutOfBounds instead
* Use SEQ-CST ordering to match ECMAScript
-- File Changes --
M index.bs (85)
-- Patch Links --
https://github.com/whatwg/webidl/pull/1529.patch
https://github.com/whatwg/webidl/pull/1529.diff
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/webidl/pull/1529
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/webidl/pull/1529@github.com>
Received on Wednesday, 8 October 2025 21:35:29 UTC