Skip to content

Commit 24e1aa6

Browse files
committed
Add support for raw ArrayBuffer
1 parent 9654953 commit 24e1aa6

File tree

3 files changed

+60
-6
lines changed

3 files changed

+60
-6
lines changed

lib/asbind-instance/bind-function.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,29 @@ function putString(asbindInstance, value, typeName) {
4242
return asbindInstance.exports.__newString(value);
4343
}
4444

45+
function getArrayBuffer(asbindInstance, value, typeName) {
46+
return asbindInstance.exports.__getArrayBuffer(value);
47+
}
48+
49+
function putArrayBuffer(asbindInstance, value, typeName) {
50+
const ptr = asbindInstance.exports.__new(
51+
value.byteLength,
52+
getTypeId(asbindInstance, typeName)
53+
);
54+
new Uint8Array(
55+
asbindInstance.exports.memory.buffer,
56+
ptr,
57+
value.byteLength
58+
).set(new Uint8Array(value));
59+
return ptr;
60+
}
61+
4562
function getArrayBufferView(asbindInstance, value, typeName) {
4663
return asbindInstance.exports[
4764
`__get${normalizeArrayBufferViewTypeName(typeName)}View`
4865
](value);
4966
}
50-
51-
function putArrayBuffer(asbindInstance, value, typeName) {
67+
function putArrayBufferView(asbindInstance, value, typeName) {
5268
return asbindInstance.exports.__newArray(
5369
getTypeId(asbindInstance, typeName),
5470
value
@@ -92,19 +108,23 @@ const converters = new Map([
92108
[/^~lib\/string\/String$/, { ascToJs: getString, jsToAsc: putString }],
93109
[
94110
/^~lib\/typedarray\/(Ui|I)nt(8|16|32)Array$/,
95-
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBuffer }
111+
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBufferView }
96112
],
97113
[
98114
/^~lib\/typedarray\/Big(Ui|I)nt64Array$/,
99-
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBuffer }
115+
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBufferView }
100116
],
101117
[
102118
/^~lib\/typedarray\/Uint8ClampedArray$/,
103-
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBuffer }
119+
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBufferView }
104120
],
105121
[
106122
/^~lib\/typedarray\/Float(32|64)Array$/,
107-
{ ascToJs: getArrayBufferView, jsToAsc: putArrayBuffer }
123+
{ ascToJs: getArrayBuffer, jsToAsc: putArrayBufferView }
124+
],
125+
[
126+
/^~lib\/arraybuffer\/ArrayBuffer$/,
127+
{ ascToJs: getArrayBuffer, jsToAsc: putArrayBuffer }
108128
],
109129
[/^~lib\/array\/Array<.+>$/, { ascToJs: getArray, jsToAsc: putArray }]
110130
]);

test/tests/arraybuffer/asc.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export function swapAndPad(a: ArrayBuffer, b: ArrayBuffer): ArrayBuffer {
2+
const intermediate = Uint8Array.wrap(swappedConcat(a, b));
3+
const result = new Uint8Array(intermediate.length + 2);
4+
result.set(intermediate, 1);
5+
result[0] = 255;
6+
result[result.length - 1] = 255;
7+
return result.buffer;
8+
}
9+
10+
declare function swappedConcat(a: ArrayBuffer, b: ArrayBuffer): ArrayBuffer;

test/tests/arraybuffer/test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
describe("as-bind", function() {
2+
it("should handle ArrayBuffers", async function() {
3+
const instance = await AsBind.instantiate(this.rawModule, {
4+
asc: {
5+
swappedConcat(a, b) {
6+
a = new Uint8Array(a);
7+
b = new Uint8Array(b);
8+
const result = new Uint8Array(a.length + b.length);
9+
result.set(b, 0);
10+
result.set(a, b.length);
11+
return result.buffer;
12+
}
13+
}
14+
});
15+
assert(
16+
new Uint8Array(
17+
instance.exports.swapAndPad(
18+
new Uint8Array([1, 2, 3]).buffer,
19+
new Uint8Array([10, 11, 12]).buffer
20+
)
21+
).join(",") === new Uint8Array([255, 10, 11, 12, 1, 2, 3, 255]).join(",")
22+
);
23+
});
24+
});

0 commit comments

Comments
 (0)