Skip to content

Commit

Permalink
Merge pull request #66 from sutoiku/master
Browse files Browse the repository at this point in the history
Add support for typed arrays
  • Loading branch information
torch2424 committed Feb 18, 2021
2 parents 34635b4 + 2e8f33d commit 068cdd0
Show file tree
Hide file tree
Showing 6 changed files with 459 additions and 12 deletions.
258 changes: 246 additions & 12 deletions lib/asbind-instance/supported-ref-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -201,19 +201,253 @@ export const SUPPORTED_REF_TYPES = {
responseRef
);
}
},
BIGINT64ARRAY: {
isTypeFromArgument: arg => {
return arg instanceof BigInt64Array;
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_Int64Array_ID);
},
getRef: (wasmExports, arg) => {
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_Int64Array_ID, arg)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports.__getInt64Array(responseRef);
},
getUnsafeValueFromRef: (wasmExports, responseRef) => {
return getUnsafeResponse(
wasmExports.__getInt64ArrayView(responseRef),
responseRef
);
}
},
BIGUINT64ARRAY: {
isTypeFromArgument: arg => {
return arg instanceof BigUint64Array;
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_Uint64Array_ID);
},
getRef: (wasmExports, arg) => {
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_Uint64Array_ID, arg)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports.__getInt64Array(responseRef);
},
getUnsafeValueFromRef: (wasmExports, responseRef) => {
return getUnsafeResponse(
wasmExports.__getInt64ArrayView(responseRef),
responseRef
);
}
},
I32ARRAY: {
isTypeFromArgument: arg => {
return Array.isArray(arg) && Number.isInteger(arg[0]);
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_I32Array_ID);
},
getRef: (wasmExports, arg) => {
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I32Array_ID, arg)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports.__getArray(responseRef);
}
},
I64ARRAY: {
isTypeFromArgument: arg => {
return Array.isArray(arg) && typeof arg[0] === "bigint";
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_I64Array_ID);
},
getRef: (wasmExports, arg) => {
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I64Array_ID, arg)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports.__getArray(responseRef);
}
},
STRINGARRAY: {
isTypeFromArgument: arg => {
return Array.isArray(arg) && typeof arg[0] === "string";
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_StringArray_ID);
},
getRef: (wasmExports, arg) => {
const refs = arg.map(value =>
wasmExports.__pin(wasmExports.__newString(value))
);
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_StringArray_ID, refs)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports
.__getArray(responseRef)
.map(value => wasmExports.__getString(value));
}
},
BOOLARRAY: {
isTypeFromArgument: arg => {
return Array.isArray(arg) && typeof arg[0] === "boolean";
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(ref, wasmExports.__asbind_BoolArray_ID);
},
getRef: (wasmExports, arg) => {
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_BoolArray_ID, arg)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports.__getArray(responseRef).map(value => !!value);
}
},
I32ARRAYARRAY: {
isTypeFromArgument: arg => {
return (
Array.isArray(arg) &&
Array.isArray(arg[0]) &&
Number.isInteger(arg[0][0])
);
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(
ref,
wasmExports.__asbind_I32ArrayArray_ID
);
},
getRef: (wasmExports, arg) => {
const refs = arg.map(value =>
wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I32Array_ID, value)
)
);
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I32ArrayArray_ID, refs)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports
.__getArray(responseRef)
.map(value => wasmExports.__getArray(value));
}
},
I64ARRAYARRAY: {
isTypeFromArgument: arg => {
return (
Array.isArray(arg) &&
Array.isArray(arg[0]) &&
typeof arg[0][0] === "bigint"
);
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(
ref,
wasmExports.__asbind_I64ArrayArray_ID
);
},
getRef: (wasmExports, arg) => {
const refs = arg.map(value =>
wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I64Array_ID, value)
)
);
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_I64ArrayArray_ID, refs)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports
.__getArray(responseRef)
.map(value => wasmExports.__getArray(value));
}
},
STRINGARRAYARRAY: {
isTypeFromArgument: arg => {
return (
Array.isArray(arg) &&
Array.isArray(arg[0]) &&
typeof arg[0][0] === "string"
);
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(
ref,
wasmExports.__asbind_StringArrayArray_ID
);
},
getRef: (wasmExports, arg) => {
const refs = arg.map(value => {
const stringRefs = value.map(v =>
wasmExports.__pin(wasmExports.__newString(v))
);
return wasmExports.__pin(
wasmExports.__newArray(
wasmExports.__asbind_StringArray_ID,
stringRefs
)
);
});
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_StringArrayArray_ID, refs)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports
.__getArray(responseRef)
.map(value =>
wasmExports.__getArray(value).map(v => wasmExports.__getString(v))
);
}
},
BOOLARRAYARRAY: {
isTypeFromArgument: arg => {
return (
Array.isArray(arg) &&
Array.isArray(arg[0]) &&
typeof arg[0][0] === "boolean"
);
},
isTypeFromReference: (wasmExports, ref) => {
return wasmExports.__instanceof(
ref,
wasmExports.__asbind_BoolArrayArray_ID
);
},
getRef: (wasmExports, arg) => {
const refs = arg.map(value =>
wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_BoolArray_ID, value)
)
);
return wasmExports.__pin(
wasmExports.__newArray(wasmExports.__asbind_BoolArrayArray_ID, refs)
);
},
getValueFromRef: (wasmExports, responseRef) => {
return wasmExports
.__getArray(responseRef)
.map(value => wasmExports.__getArray(value).map(v => !!v));
}
}
};

// Our return type constant
export const RETURN_TYPES = {
NUMBER: "NUMBER",
STRING: "STRING",
INT8ARRAY: "INT8ARRAY",
UINT8ARRAY: "UINT8ARRAY",
INT16ARRAY: "INT16ARRAY",
UINT16ARRAY: "UINT16ARRAY",
INT32ARRAY: "INT32ARRAY",
UINT32ARRAY: "UINT32ARRAY",
FLOAT32ARRAY: "FLOAT32ARRAY",
FLOAT64ARRAY: "FLOAT64ARRAY"
};
export const RETURN_TYPES = { NUMBER: "NUMBER" };

for (const refType of Object.keys(SUPPORTED_REF_TYPES)) {
RETURN_TYPES[refType] = refType;
}
12 changes: 12 additions & 0 deletions lib/assembly/as-bind.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,15 @@ export const __asbind_Int32Array_ID = idof<Int32Array>();
export const __asbind_Uint32Array_ID = idof<Uint32Array>();
export const __asbind_Float32Array_ID = idof<Float32Array>();
export const __asbind_Float64Array_ID = idof<Float64Array>();
export const __asbind_Int64Array_ID = idof<Int64Array>();
export const __asbind_Uint64Array_ID = idof<Uint64Array>();

// Arrays
export const __asbind_I32Array_ID = idof<Array<i32>>();
export const __asbind_I64Array_ID = idof<Array<i64>>();
export const __asbind_StringArray_ID = idof<Array<string>>();
export const __asbind_BoolArray_ID = idof<Array<bool>>();
export const __asbind_I32ArrayArray_ID = idof<Array<Array<i32>>>();
export const __asbind_I64ArrayArray_ID = idof<Array<Array<i64>>>();
export const __asbind_StringArrayArray_ID = idof<Array<Array<string>>>();
export const __asbind_BoolArrayArray_ID = idof<Array<Array<bool>>>();
Binary file modified test/assembly/test-no-entry.wasm
Binary file not shown.
52 changes: 52 additions & 0 deletions test/assembly/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,58 @@ export function mapFloat64Array(array: Float64Array): Float64Array {
return array.map((value: f64) => value * 2);
}

export function mapBigInt64Array(array: Int64Array): Int64Array {
return array.map((value: i64) => value * 2);
}

export function mapBigUint64Array(array: Uint64Array): Uint64Array {
return array.map((value: u64) => value * 2);
}

export function mapI32Array(array: Array<i32>): Array<i32> {
return array.map<i32>((value: i32) => value * 2);
}

export function mapI64Array(array: Array<i64>): Array<i64> {
return array.map<i64>((value: i64) => value * 2);
}

export function mapStringArray(array: Array<string>): Array<string> {
return array.map<string>((value: string) => "#" + value);
}

export function mapBoolArray(array: Array<bool>): Array<bool> {
return array.map<bool>((value: bool) => !value);
}

export function mapI32ArrayArray(array: Array<Array<i32>>): Array<Array<i32>> {
return array.map<Array<i32>>((value: Array<i32>) =>
value.map<i32>((v: i32) => v * 2)
);
}

export function mapI64ArrayArray(array: Array<Array<i64>>): Array<Array<i64>> {
return array.map<Array<i64>>((value: Array<i64>) =>
value.map<i64>((v: i64) => v * 2)
);
}

export function mapStringArrayArray(
array: Array<Array<string>>
): Array<Array<string>> {
return array.map<Array<string>>((value: Array<string>) =>
value.map<string>((v: string) => "#" + v)
);
}

export function mapBoolArrayArray(
array: Array<Array<bool>>
): Array<Array<bool>> {
return array.map<Array<bool>>((value: Array<bool>) =>
value.map<bool>((v: bool) => !v)
);
}

declare function testImportString(value: string): void;
export function callTestImportString(value: string): void {
testImportString(value);
Expand Down
Binary file modified test/assembly/test.wasm
Binary file not shown.

0 comments on commit 068cdd0

Please sign in to comment.