mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-01 03:45:06 +00:00
[js/common] allows polyfill for bigint (#14921)
### Description This change delays the execution of checking whether bigint is available in the context. This allows polyfill for `BigInt64Array`/`BigUint64Array` (if there is any)
This commit is contained in:
parent
8844474083
commit
3c4efd2e77
1 changed files with 23 additions and 11 deletions
|
|
@ -11,9 +11,6 @@ type SupportedTypedArrayConstructors = Float32ArrayConstructor|Uint8ArrayConstru
|
|||
Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor;
|
||||
type SupportedTypedArray = InstanceType<SupportedTypedArrayConstructors>;
|
||||
|
||||
const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && typeof BigInt64Array.from === 'function';
|
||||
const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && typeof BigUint64Array.from === 'function';
|
||||
|
||||
// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.
|
||||
const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map<string, SupportedTypedArrayConstructors>([
|
||||
['float32', Float32Array],
|
||||
|
|
@ -39,14 +36,27 @@ const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map<SupportedTypedArrayConstru
|
|||
[Uint32Array, 'uint32'],
|
||||
]);
|
||||
|
||||
if (isBigInt64ArrayAvailable) {
|
||||
NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);
|
||||
NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');
|
||||
}
|
||||
if (isBigUint64ArrayAvailable) {
|
||||
NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);
|
||||
NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');
|
||||
}
|
||||
// the following code allows delaying execution of BigInt checking. This allows lazy initialization for
|
||||
// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt polyfill
|
||||
// if available.
|
||||
let isBigIntChecked = false;
|
||||
const checkBigInt = () => {
|
||||
if (!isBigIntChecked) {
|
||||
isBigIntChecked = true;
|
||||
const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && typeof BigInt64Array.from === 'function';
|
||||
const isBigUint64ArrayAvailable =
|
||||
typeof BigUint64Array !== 'undefined' && typeof BigUint64Array.from === 'function';
|
||||
|
||||
if (isBigInt64ArrayAvailable) {
|
||||
NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);
|
||||
NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');
|
||||
}
|
||||
if (isBigUint64ArrayAvailable) {
|
||||
NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);
|
||||
NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* calculate size from dims.
|
||||
|
|
@ -75,6 +85,8 @@ export class Tensor implements TensorInterface {
|
|||
constructor(
|
||||
arg0: TensorType|TensorDataType|readonly boolean[], arg1?: TensorDataType|readonly number[]|readonly boolean[],
|
||||
arg2?: readonly number[]) {
|
||||
checkBigInt();
|
||||
|
||||
let type: TensorType;
|
||||
let data: TensorDataType;
|
||||
let dims: typeof arg1|typeof arg2;
|
||||
|
|
|
|||
Loading…
Reference in a new issue