onnxruntime
67 строк · 2.1 Кб
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4import { getInstance } from './wasm-factory';
5
6export const allocWasmString = (data: string, allocs: number[]): number => {
7const wasm = getInstance();
8
9const dataLength = wasm.lengthBytesUTF8(data) + 1;
10const dataOffset = wasm._malloc(dataLength);
11wasm.stringToUTF8(data, dataOffset, dataLength);
12allocs.push(dataOffset);
13
14return dataOffset;
15};
16
17interface ExtraOptionsHandler {
18(name: string, value: string): void;
19}
20
21export const iterateExtraOptions = (
22options: Record<string, unknown>,
23prefix: string,
24seen: WeakSet<Record<string, unknown>>,
25handler: ExtraOptionsHandler,
26): void => {
27if (typeof options == 'object' && options !== null) {
28if (seen.has(options)) {
29throw new Error('Circular reference in options');
30} else {
31seen.add(options);
32}
33}
34
35Object.entries(options).forEach(([key, value]) => {
36const name = prefix ? prefix + key : key;
37if (typeof value === 'object') {
38iterateExtraOptions(value as Record<string, unknown>, name + '.', seen, handler);
39} else if (typeof value === 'string' || typeof value === 'number') {
40handler(name, value.toString());
41} else if (typeof value === 'boolean') {
42handler(name, value ? '1' : '0');
43} else {
44throw new Error(`Can't handle extra config type: ${typeof value}`);
45}
46});
47};
48
49/**
50* check web assembly API's last error and throw error if any error occurred.
51* @param message a message used when an error occurred.
52*/
53export const checkLastError = (message: string): void => {
54const wasm = getInstance();
55
56const stack = wasm.stackSave();
57try {
58const paramsOffset = wasm.stackAlloc(8);
59wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);
60const errorCode = wasm.HEAP32[paramsOffset / 4];
61const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];
62const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';
63throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);
64} finally {
65wasm.stackRestore(stack);
66}
67};
68