- From: Timothy Gu <notifications@github.com>
- Date: Fri, 25 Jun 2021 10:44:28 -0700
- To: heycam/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <heycam/webidl/pull/987/review/692328488@github.com>
@TimothyGu approved this pull request.
> On the others, it occured to me that we have two directions here: super-polymorphism, where everything is defined on BufferSources, or something more true to the model where ArrayBuffers are special. I was curious for your thoughts.
Here's an alternative: super-polymorphism for read-like operations (byte length, is detached, get a copy), ArrayBuffers are special for write-like operations (create, write, detach, transfer). The name "BufferSource" is fairly explicit about being the _source_, so I don't think it's worthwhile to make write operations work for any BufferSource.
Come to think of it, this layout is what you have already!
> + 1. Let |esArrayBuffer| be be the result of [=converted to an ECMAScript value|converting=]
+ |arrayBuffer| to an ECMAScript value.
+ 1. Assert: |bytes|'s [=byte sequence/length=] ≤ |esArrayBuffer|.\[[ArrayBufferByteLength]]
+ − |startingOffset|.
+ 1. For |i| in [=the range=] |startingOffset| to |startingOffset| + |bytes|'s [=byte
+ sequence/length=] − 1, inclusive, perform [=!=] [$SetValueInBuffer$](|esArrayBuffer|,
+ |i|, Uint8, |bytes|[|i| - |startingOffset|], true, Unordered).
+</div>
+
+<div algorithm="ArrayBufferView/write">
+ To <dfn export for="ArrayBufferView">write</dfn> a [=byte sequence=] |bytes| into an
+ {{ArrayBufferView}} |view|, optionally given a
+ <dfn export for="ArrayBufferView/write">|startingOffset|</dfn> (default 0):
+
+ 1. Let |esView| be be the result of [=converted to an ECMAScript value|converting=]
+ |arrayBuffer| to an ECMAScript value.
```suggestion
|view| to an ECMAScript value.
```
> @@ -76,6 +76,11 @@ urlPrefix: https://w3c.github.io/mediacapture-main/; spec: MEDIACAPTURE-STREAMS
urlPrefix: http://www.unicode.org/glossary/; spec: UNICODE
type: dfn
text: Unicode scalar value; url: unicode_scalar_value
+urlPrefix: https://webassembly.github.io/spec/js-api/; spec: WASM-JS-API-1
+ type: interface
+ text: Memory; url: #memory
The reference is unfortunately quite generic… Is it possible to specify `text: WebAssembly.Memory` instead? Or add a `for: WebAssembly` to line 79.
> + To <dfn id="dfn-detach" for="ArrayBuffer" export>detach</dfn> an {{ArrayBuffer}} |arrayBuffer|:
+
+ 1. Let |esArrayBuffer| be be the result of [=converted to an ECMAScript value|converting=]
+ |arrayBuffer| to an ECMAScript value.
+ 1. Assert: [=!=] [$IsSharedArrayBuffer$](|esArrayBuffer|) is false.
+ 1. Perform [=?=] [$DetachArrayBuffer$](|esArrayBuffer|).
+
+ <p class="note">This will throw an exception if |esArrayBuffer| has an \[[ArrayBufferDetachKey]]
+ that is not undefined, such as is the case with the value of {{Memory|WebAssembly.Memory}}'s
+ {{Memory/buffer}} attribute. [[WASM-JS-API-1]]
+
+ <p class="note">Detaching a buffer that is already detached is a no-op.
+</div>
+
+<div algorithm>
+ A {{BufferSource}} |bufferSource| <dfn for="BufferSource" export>is detached</dfn> if the
```suggestion
A {{BufferSource}} |bufferSource| is <dfn for="BufferSource" export>detached</dfn> if the
```
> </div>
+<div algorithm>
+ To <dfn id="dfn-detach" for="ArrayBuffer" export>detach</dfn> an {{ArrayBuffer}} |arrayBuffer|:
+
+ 1. Let |esArrayBuffer| be be the result of [=converted to an ECMAScript value|converting=]
+ |arrayBuffer| to an ECMAScript value.
+ 1. Assert: [=!=] [$IsSharedArrayBuffer$](|esArrayBuffer|) is false.
+ 1. Perform [=?=] [$DetachArrayBuffer$](|esArrayBuffer|).
+
+ <p class="note">This will throw an exception if |esArrayBuffer| has an \[[ArrayBufferDetachKey]]
+ that is not undefined, such as is the case with the value of {{Memory|WebAssembly.Memory}}'s
+ {{Memory/buffer}} attribute. [[WASM-JS-API-1]]
+
+ <p class="note">Detaching a buffer that is already detached is a no-op.
```suggestion
<p class="note">Detaching a buffer that is already [=BufferSource/detached=] is a no-op.
```
> + <dfn export for="ArrayBufferView/write">|startingOffset|</dfn> (default 0):
+
+ 1. Assert: |bytes|'s [=byte sequence/length=] ≤ |view|.\[[ByteLength]] −
+ |startingOffset|.
+ 1. Assert: if |view| is not a {{DataView}}, then |bytes|'s [=byte sequence/length=] [=modulo=]
+ the [=element size=] of |view|'s type is 0.
+ 1. [=ArrayBuffer/Write=] |bytes| into |view|.\[[ViewedArrayBuffer]] with
+ <i>[=ArrayBuffer/write/startingOffset=]</i> set to |view|.\[[ByteOffset]] +
+ |startingOffset|.
+</div>
+
+<p class="advisement">Extreme care must be taken when writing specification text that
+[=ArrayBuffer/writes=] into an {{ArrayBuffer}} or {{ArrayBufferView}}, as the underlying data can
+easily be changed by the script author or other APIs at unpredictable times. This is especially true
+if the [{{AllowShared}}] [=extended attribute=] is involved. For the non-shared cases, it is
+recommended to [=ArrayBuffer/transfer=] the {{ArrayBuffer}} first if possible, to ensure the writes
Looks good!
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/heycam/webidl/pull/987#pullrequestreview-692328488
Received on Friday, 25 June 2021 17:44:50 UTC