Skip to content
Advertisement

Odd “Uncaught (in promise) TypeError: can’t convert 50057 to BigInt” error with WebAssembly

I am trying to interface with WebAssembly and am getting a weird error. Firefox DevTools shows it as follows:
Uncaught (in promise) TypeError: can't convert 50057 to BigInt
The code that runs right before this error occurs:

static read_int(descriptor: number): number {
        console.log("read_int")
        if (descriptor < 0) {
            return -1;
        }
        let value = Wasm.readStdValue(descriptor);
        if (typeof value === 'number') {
            if (Number.isInteger(value)) {
                return value;
            }
            return Math.floor(value);
        }
        if (typeof value === 'boolean') {
            return value ? 1 : 0;
        }
        if (typeof value === 'string') {
            return parseInt(value);
        }
        return -1;
    }

The WebAssembly files being used here were originally being used in a system interfacing with Swift and a library called WasmInterpreter, so the descriptor is just a number which is a key in a map. The number being read at the let value = Wasm.readStdValue(descriptor); line is 50057 and it is a number. It doesn’t seem right to me that it would fail to convert such a small number to a larger number type but idk.

Thanks in advance!

Advertisement

Answer

I guess you’re calling a Wasm function that takes an i64 parameter. When Wasm expects an i64, then JavaScript needs to provide a BigInt. Not even 0 will be converted to 0n implicitly. You can use the BigInt constructor as a conversion function, e.g. if (typeof value === 'number') { return BigInt(value); }.

IOW, calling a Wasm function that takes an i64 has the same requirements as writing an element into a BigInt64Array: Using a BigInt works, strings and even booleans will be converted implicitly (so those parts of your helper function are unnecessary), passing a Number throws a TypeError.

(Personally I agree that this is silly, but the spec is what it is.)

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement