Skip to content

Commit

Permalink
Encoding: use Wasm to get a SharedArrayBuffer instance
Browse files Browse the repository at this point in the history
For #22358.
  • Loading branch information
annevk authored Mar 24, 2020
1 parent ea0533f commit 4e83bff
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 25 deletions.
13 changes: 13 additions & 0 deletions common/sab.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const createBuffer = (() => {
// See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
const sabConstructor = new WebAssembly.Memory({ shared:true, initial:0, maximum:0 }).buffer.constructor;
return (type, length) => {
if (type === "ArrayBuffer") {
return new ArrayBuffer(length);
} else if (type === "SharedArrayBuffer") {
return new sabConstructor(length);
} else {
throw new Error("type has to be ArrayBuffer or SharedArrayBuffer");
}
}
})();
27 changes: 14 additions & 13 deletions encoding/encodeInto.any.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// META: global=window,worker
// META: script=/common/sab.js

[
{
"input": "Hi",
Expand Down Expand Up @@ -77,15 +80,15 @@
["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => {
test(() => {
// Setup
const bufferLength = testData.destinationLength + destinationData.bufferIncrease,
destinationOffset = destinationData.destinationOffset,
destinationLength = testData.destinationLength,
destinationFiller = destinationData.filler,
encoder = new TextEncoder(),
buffer = new self[arrayBufferOrSharedArrayBuffer](bufferLength),
view = new Uint8Array(buffer, destinationOffset, destinationLength),
fullView = new Uint8Array(buffer),
control = new Array(bufferLength);
const bufferLength = testData.destinationLength + destinationData.bufferIncrease;
const destinationOffset = destinationData.destinationOffset;
const destinationLength = testData.destinationLength;
const destinationFiller = destinationData.filler;
const encoder = new TextEncoder();
const buffer = createBuffer(arrayBufferOrSharedArrayBuffer, bufferLength);
const view = new Uint8Array(buffer, destinationOffset, destinationLength);
const fullView = new Uint8Array(buffer);
const control = new Array(bufferLength);
let byte = destinationFiller;
for (let i = 0; i < bufferLength; i++) {
if (destinationFiller === "random") {
Expand Down Expand Up @@ -128,19 +131,17 @@
Float64Array].forEach(view => {
["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
test(() => {
assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", new view(new self[arrayBufferOrSharedArrayBuffer](0))));
assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", new view(createBuffer(arrayBufferOrSharedArrayBuffer, 0))));
}, "Invalid encodeInto() destination: " + view.name + ", backed by: " + arrayBufferOrSharedArrayBuffer);
});
});

["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
test(() => {
assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", new self[arrayBufferOrSharedArrayBuffer](10)));
assert_throws_js(TypeError, () => new TextEncoder().encodeInto("", createBuffer(arrayBufferOrSharedArrayBuffer, 10)));
}, "Invalid encodeInto() destination: " + arrayBufferOrSharedArrayBuffer);
});



test(() => {
const buffer = new ArrayBuffer(10),
view = new Uint8Array(buffer);
Expand Down
11 changes: 5 additions & 6 deletions encoding/streams/decode-utf8.any.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
// META: global=worker
// META: global=window,worker
// META: script=resources/readable-stream-from-array.js
// META: script=resources/readable-stream-to-array.js

// META: script=/common/sab.js
'use strict';

["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
const inputChunkData = [73, 32, 240, 159, 146, 153, 32, 115, 116,
114, 101, 97, 109, 115]
const inputChunkData = [73, 32, 240, 159, 146, 153, 32, 115, 116, 114, 101, 97, 109, 115];

const emptyChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](0));
const inputChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](inputChunkData.length));
const emptyChunk = new Uint8Array(createBuffer(arrayBufferOrSharedArrayBuffer, 0));
const inputChunk = new Uint8Array(createBuffer(arrayBufferOrSharedArrayBuffer, inputChunkData.length));

inputChunk.set(inputChunkData);

Expand Down
13 changes: 8 additions & 5 deletions encoding/textdecoder-copy.any.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
// META: global=window,worker
// META: script=/common/sab.js

["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => {
test(() => {
const buf = new self[arrayBufferOrSharedArrayBuffer](2),
view = new Uint8Array(buf),
buf2 = new self[arrayBufferOrSharedArrayBuffer](2),
view2 = new Uint8Array(buf2),
decoder = new TextDecoder("utf-8");
const buf = createBuffer(arrayBufferOrSharedArrayBuffer, 2);
const view = new Uint8Array(buf);
const buf2 = createBuffer(arrayBufferOrSharedArrayBuffer, 2);
const view2 = new Uint8Array(buf2);
const decoder = new TextDecoder("utf-8");
view[0] = 0xEF;
view[1] = 0xBB;
view2[0] = 0xBF;
Expand Down
4 changes: 3 additions & 1 deletion encoding/textdecoder-streaming.any.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// META: title=Encoding API: Streaming decode
// META: global=window,worker
// META: script=resources/encodings.js
// META: script=/common/sab.js

var string = '\x00123ABCabc\x80\xFF\u0100\u1000\uFFFD\uD800\uDC00\uDBFF\uDFFF';
var octets = {
Expand Down Expand Up @@ -28,7 +30,7 @@ var octets = {
var sub = [];
for (var j = i; j < encoded.length && j < i + len; ++j)
sub.push(encoded[j]);
var uintArray = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](sub.length));
var uintArray = new Uint8Array(createBuffer(arrayBufferOrSharedArrayBuffer, sub.length));
uintArray.set(sub);
out += decoder.decode(uintArray, {stream: true});
}
Expand Down

0 comments on commit 4e83bff

Please sign in to comment.