Skip to content

Commit 068cdd0

Browse files
authored
Merge pull request #66 from sutoiku/master
Add support for typed arrays
2 parents 34635b4 + 2e8f33d commit 068cdd0

File tree

6 files changed

+459
-12
lines changed

6 files changed

+459
-12
lines changed

lib/asbind-instance/supported-ref-types.js

Lines changed: 246 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,19 +201,253 @@ export const SUPPORTED_REF_TYPES = {
201201
responseRef
202202
);
203203
}
204+
},
205+
BIGINT64ARRAY: {
206+
isTypeFromArgument: arg => {
207+
return arg instanceof BigInt64Array;
208+
},
209+
isTypeFromReference: (wasmExports, ref) => {
210+
return wasmExports.__instanceof(ref, wasmExports.__asbind_Int64Array_ID);
211+
},
212+
getRef: (wasmExports, arg) => {
213+
return wasmExports.__pin(
214+
wasmExports.__newArray(wasmExports.__asbind_Int64Array_ID, arg)
215+
);
216+
},
217+
getValueFromRef: (wasmExports, responseRef) => {
218+
return wasmExports.__getInt64Array(responseRef);
219+
},
220+
getUnsafeValueFromRef: (wasmExports, responseRef) => {
221+
return getUnsafeResponse(
222+
wasmExports.__getInt64ArrayView(responseRef),
223+
responseRef
224+
);
225+
}
226+
},
227+
BIGUINT64ARRAY: {
228+
isTypeFromArgument: arg => {
229+
return arg instanceof BigUint64Array;
230+
},
231+
isTypeFromReference: (wasmExports, ref) => {
232+
return wasmExports.__instanceof(ref, wasmExports.__asbind_Uint64Array_ID);
233+
},
234+
getRef: (wasmExports, arg) => {
235+
return wasmExports.__pin(
236+
wasmExports.__newArray(wasmExports.__asbind_Uint64Array_ID, arg)
237+
);
238+
},
239+
getValueFromRef: (wasmExports, responseRef) => {
240+
return wasmExports.__getInt64Array(responseRef);
241+
},
242+
getUnsafeValueFromRef: (wasmExports, responseRef) => {
243+
return getUnsafeResponse(
244+
wasmExports.__getInt64ArrayView(responseRef),
245+
responseRef
246+
);
247+
}
248+
},
249+
I32ARRAY: {
250+
isTypeFromArgument: arg => {
251+
return Array.isArray(arg) && Number.isInteger(arg[0]);
252+
},
253+
isTypeFromReference: (wasmExports, ref) => {
254+
return wasmExports.__instanceof(ref, wasmExports.__asbind_I32Array_ID);
255+
},
256+
getRef: (wasmExports, arg) => {
257+
return wasmExports.__pin(
258+
wasmExports.__newArray(wasmExports.__asbind_I32Array_ID, arg)
259+
);
260+
},
261+
getValueFromRef: (wasmExports, responseRef) => {
262+
return wasmExports.__getArray(responseRef);
263+
}
264+
},
265+
I64ARRAY: {
266+
isTypeFromArgument: arg => {
267+
return Array.isArray(arg) && typeof arg[0] === "bigint";
268+
},
269+
isTypeFromReference: (wasmExports, ref) => {
270+
return wasmExports.__instanceof(ref, wasmExports.__asbind_I64Array_ID);
271+
},
272+
getRef: (wasmExports, arg) => {
273+
return wasmExports.__pin(
274+
wasmExports.__newArray(wasmExports.__asbind_I64Array_ID, arg)
275+
);
276+
},
277+
getValueFromRef: (wasmExports, responseRef) => {
278+
return wasmExports.__getArray(responseRef);
279+
}
280+
},
281+
STRINGARRAY: {
282+
isTypeFromArgument: arg => {
283+
return Array.isArray(arg) && typeof arg[0] === "string";
284+
},
285+
isTypeFromReference: (wasmExports, ref) => {
286+
return wasmExports.__instanceof(ref, wasmExports.__asbind_StringArray_ID);
287+
},
288+
getRef: (wasmExports, arg) => {
289+
const refs = arg.map(value =>
290+
wasmExports.__pin(wasmExports.__newString(value))
291+
);
292+
return wasmExports.__pin(
293+
wasmExports.__newArray(wasmExports.__asbind_StringArray_ID, refs)
294+
);
295+
},
296+
getValueFromRef: (wasmExports, responseRef) => {
297+
return wasmExports
298+
.__getArray(responseRef)
299+
.map(value => wasmExports.__getString(value));
300+
}
301+
},
302+
BOOLARRAY: {
303+
isTypeFromArgument: arg => {
304+
return Array.isArray(arg) && typeof arg[0] === "boolean";
305+
},
306+
isTypeFromReference: (wasmExports, ref) => {
307+
return wasmExports.__instanceof(ref, wasmExports.__asbind_BoolArray_ID);
308+
},
309+
getRef: (wasmExports, arg) => {
310+
return wasmExports.__pin(
311+
wasmExports.__newArray(wasmExports.__asbind_BoolArray_ID, arg)
312+
);
313+
},
314+
getValueFromRef: (wasmExports, responseRef) => {
315+
return wasmExports.__getArray(responseRef).map(value => !!value);
316+
}
317+
},
318+
I32ARRAYARRAY: {
319+
isTypeFromArgument: arg => {
320+
return (
321+
Array.isArray(arg) &&
322+
Array.isArray(arg[0]) &&
323+
Number.isInteger(arg[0][0])
324+
);
325+
},
326+
isTypeFromReference: (wasmExports, ref) => {
327+
return wasmExports.__instanceof(
328+
ref,
329+
wasmExports.__asbind_I32ArrayArray_ID
330+
);
331+
},
332+
getRef: (wasmExports, arg) => {
333+
const refs = arg.map(value =>
334+
wasmExports.__pin(
335+
wasmExports.__newArray(wasmExports.__asbind_I32Array_ID, value)
336+
)
337+
);
338+
return wasmExports.__pin(
339+
wasmExports.__newArray(wasmExports.__asbind_I32ArrayArray_ID, refs)
340+
);
341+
},
342+
getValueFromRef: (wasmExports, responseRef) => {
343+
return wasmExports
344+
.__getArray(responseRef)
345+
.map(value => wasmExports.__getArray(value));
346+
}
347+
},
348+
I64ARRAYARRAY: {
349+
isTypeFromArgument: arg => {
350+
return (
351+
Array.isArray(arg) &&
352+
Array.isArray(arg[0]) &&
353+
typeof arg[0][0] === "bigint"
354+
);
355+
},
356+
isTypeFromReference: (wasmExports, ref) => {
357+
return wasmExports.__instanceof(
358+
ref,
359+
wasmExports.__asbind_I64ArrayArray_ID
360+
);
361+
},
362+
getRef: (wasmExports, arg) => {
363+
const refs = arg.map(value =>
364+
wasmExports.__pin(
365+
wasmExports.__newArray(wasmExports.__asbind_I64Array_ID, value)
366+
)
367+
);
368+
return wasmExports.__pin(
369+
wasmExports.__newArray(wasmExports.__asbind_I64ArrayArray_ID, refs)
370+
);
371+
},
372+
getValueFromRef: (wasmExports, responseRef) => {
373+
return wasmExports
374+
.__getArray(responseRef)
375+
.map(value => wasmExports.__getArray(value));
376+
}
377+
},
378+
STRINGARRAYARRAY: {
379+
isTypeFromArgument: arg => {
380+
return (
381+
Array.isArray(arg) &&
382+
Array.isArray(arg[0]) &&
383+
typeof arg[0][0] === "string"
384+
);
385+
},
386+
isTypeFromReference: (wasmExports, ref) => {
387+
return wasmExports.__instanceof(
388+
ref,
389+
wasmExports.__asbind_StringArrayArray_ID
390+
);
391+
},
392+
getRef: (wasmExports, arg) => {
393+
const refs = arg.map(value => {
394+
const stringRefs = value.map(v =>
395+
wasmExports.__pin(wasmExports.__newString(v))
396+
);
397+
return wasmExports.__pin(
398+
wasmExports.__newArray(
399+
wasmExports.__asbind_StringArray_ID,
400+
stringRefs
401+
)
402+
);
403+
});
404+
return wasmExports.__pin(
405+
wasmExports.__newArray(wasmExports.__asbind_StringArrayArray_ID, refs)
406+
);
407+
},
408+
getValueFromRef: (wasmExports, responseRef) => {
409+
return wasmExports
410+
.__getArray(responseRef)
411+
.map(value =>
412+
wasmExports.__getArray(value).map(v => wasmExports.__getString(v))
413+
);
414+
}
415+
},
416+
BOOLARRAYARRAY: {
417+
isTypeFromArgument: arg => {
418+
return (
419+
Array.isArray(arg) &&
420+
Array.isArray(arg[0]) &&
421+
typeof arg[0][0] === "boolean"
422+
);
423+
},
424+
isTypeFromReference: (wasmExports, ref) => {
425+
return wasmExports.__instanceof(
426+
ref,
427+
wasmExports.__asbind_BoolArrayArray_ID
428+
);
429+
},
430+
getRef: (wasmExports, arg) => {
431+
const refs = arg.map(value =>
432+
wasmExports.__pin(
433+
wasmExports.__newArray(wasmExports.__asbind_BoolArray_ID, value)
434+
)
435+
);
436+
return wasmExports.__pin(
437+
wasmExports.__newArray(wasmExports.__asbind_BoolArrayArray_ID, refs)
438+
);
439+
},
440+
getValueFromRef: (wasmExports, responseRef) => {
441+
return wasmExports
442+
.__getArray(responseRef)
443+
.map(value => wasmExports.__getArray(value).map(v => !!v));
444+
}
204445
}
205446
};
206447

207448
// Our return type constant
208-
export const RETURN_TYPES = {
209-
NUMBER: "NUMBER",
210-
STRING: "STRING",
211-
INT8ARRAY: "INT8ARRAY",
212-
UINT8ARRAY: "UINT8ARRAY",
213-
INT16ARRAY: "INT16ARRAY",
214-
UINT16ARRAY: "UINT16ARRAY",
215-
INT32ARRAY: "INT32ARRAY",
216-
UINT32ARRAY: "UINT32ARRAY",
217-
FLOAT32ARRAY: "FLOAT32ARRAY",
218-
FLOAT64ARRAY: "FLOAT64ARRAY"
219-
};
449+
export const RETURN_TYPES = { NUMBER: "NUMBER" };
450+
451+
for (const refType of Object.keys(SUPPORTED_REF_TYPES)) {
452+
RETURN_TYPES[refType] = refType;
453+
}

lib/assembly/as-bind.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,15 @@ export const __asbind_Int32Array_ID = idof<Int32Array>();
2020
export const __asbind_Uint32Array_ID = idof<Uint32Array>();
2121
export const __asbind_Float32Array_ID = idof<Float32Array>();
2222
export const __asbind_Float64Array_ID = idof<Float64Array>();
23+
export const __asbind_Int64Array_ID = idof<Int64Array>();
24+
export const __asbind_Uint64Array_ID = idof<Uint64Array>();
25+
26+
// Arrays
27+
export const __asbind_I32Array_ID = idof<Array<i32>>();
28+
export const __asbind_I64Array_ID = idof<Array<i64>>();
29+
export const __asbind_StringArray_ID = idof<Array<string>>();
30+
export const __asbind_BoolArray_ID = idof<Array<bool>>();
31+
export const __asbind_I32ArrayArray_ID = idof<Array<Array<i32>>>();
32+
export const __asbind_I64ArrayArray_ID = idof<Array<Array<i64>>>();
33+
export const __asbind_StringArrayArray_ID = idof<Array<Array<string>>>();
34+
export const __asbind_BoolArrayArray_ID = idof<Array<Array<bool>>>();

test/assembly/test-no-entry.wasm

11.1 KB
Binary file not shown.

test/assembly/test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,58 @@ export function mapFloat64Array(array: Float64Array): Float64Array {
7777
return array.map((value: f64) => value * 2);
7878
}
7979

80+
export function mapBigInt64Array(array: Int64Array): Int64Array {
81+
return array.map((value: i64) => value * 2);
82+
}
83+
84+
export function mapBigUint64Array(array: Uint64Array): Uint64Array {
85+
return array.map((value: u64) => value * 2);
86+
}
87+
88+
export function mapI32Array(array: Array<i32>): Array<i32> {
89+
return array.map<i32>((value: i32) => value * 2);
90+
}
91+
92+
export function mapI64Array(array: Array<i64>): Array<i64> {
93+
return array.map<i64>((value: i64) => value * 2);
94+
}
95+
96+
export function mapStringArray(array: Array<string>): Array<string> {
97+
return array.map<string>((value: string) => "#" + value);
98+
}
99+
100+
export function mapBoolArray(array: Array<bool>): Array<bool> {
101+
return array.map<bool>((value: bool) => !value);
102+
}
103+
104+
export function mapI32ArrayArray(array: Array<Array<i32>>): Array<Array<i32>> {
105+
return array.map<Array<i32>>((value: Array<i32>) =>
106+
value.map<i32>((v: i32) => v * 2)
107+
);
108+
}
109+
110+
export function mapI64ArrayArray(array: Array<Array<i64>>): Array<Array<i64>> {
111+
return array.map<Array<i64>>((value: Array<i64>) =>
112+
value.map<i64>((v: i64) => v * 2)
113+
);
114+
}
115+
116+
export function mapStringArrayArray(
117+
array: Array<Array<string>>
118+
): Array<Array<string>> {
119+
return array.map<Array<string>>((value: Array<string>) =>
120+
value.map<string>((v: string) => "#" + v)
121+
);
122+
}
123+
124+
export function mapBoolArrayArray(
125+
array: Array<Array<bool>>
126+
): Array<Array<bool>> {
127+
return array.map<Array<bool>>((value: Array<bool>) =>
128+
value.map<bool>((v: bool) => !v)
129+
);
130+
}
131+
80132
declare function testImportString(value: string): void;
81133
export function callTestImportString(value: string): void {
82134
testImportString(value);

test/assembly/test.wasm

11.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)