dotnet/runtime · error · Error

value out of range

Error message

value out of range

What it means

autoThrowI52 throws 'value out of range' when the native routine returns I52_ERROR_OUT_OF_RANGE: the value is outside the i52 range [-2^53+1, 2^53-1] or the u52 range [0, 2^53-1]. Reached via setI52/setU52 (and getI52/getU52 if the heap slot holds an out-of-range int64).

Source

Thrown at src/mono/browser/runtime/memory.ts:154

    receiveWorkerHeapViews();
    Module.HEAP32[<any>offset >>> 2] = value;
}

export function setI32 (offset: MemOffset, value: number): void {
    assert_int_in_range(<any>value, -0x8000_0000, 0x7FFF_FFFF);
    receiveWorkerHeapViews();
    Module.HEAP32[<any>offset >>> 2] = value;
}

function autoThrowI52 (error: I52Error) {
    if (error === I52Error.NONE)
        return;

    switch (error) {
        case I52Error.NON_INTEGRAL:
            throw new Error("value was not an integer");
        case I52Error.OUT_OF_RANGE:
            throw new Error("value out of range");
        default:
            throw new Error("unknown internal error");
    }
}

/**
 * Throws for values which are not 52 bit integer. See Number.isSafeInteger()
 */
export function setI52 (offset: MemOffset, value: number): void {
    mono_check(Number.isSafeInteger(value), () => `Value is not a safe integer: ${value} (${typeof (value)})`);
    receiveWorkerHeapViews();
    const error = cwraps.mono_wasm_f64_to_i52(<any>offset, value);
    autoThrowI52(error);
}

/**
 * Throws for values which are not 52 bit integer or are negative. See Number.isSafeInteger().
 */

View on GitHub (pinned to 290d5ab72c)

Solutions

  1. Range-check before calling: i52 requires Number.isSafeInteger(value); u52 additionally requires value >= 0.
  2. For values beyond 2^53-1, marshal as bigint via setI64Big, or as two 32-bit halves (setU32).
  3. For u52, ensure the value is non-negative.

Example fix

// before
Module.setHeapI52(offset, 9.9e15); // > 2^53-1, throws
// after
Module.setHeapI64Big(offset, 9900000000000000n);
Defensive patterns

Strategy: validation

Validate before calling

if (!Number.isSafeInteger(value)) throw new RangeError(`Value ${value} is outside the safe-integer (i52) range.`);
// for u52 additionally:
if (isU52 && value < 0) throw new RangeError('u52 requires a non-negative value.');

Type guard

function isSafeIntegerNumber(v: unknown): v is number { return typeof v === 'number' && Number.isSafeInteger(v); }

Prevention

When it happens

Trigger: Passing a Number larger than 9007199254740991 (2^53-1) or below -9007199254740991 to setI52, or a negative/>2^53-1 value to setU52.

Common situations: Marshaling large 64-bit-ish magnitudes as Number beyond the safe-integer range; passing a raw pointer or hash that exceeds 2^53; u52 path getting a negative value.

Related errors


AI-assisted analysis of dotnet/runtime@290d5ab72c (2026-08-06). Data as JSON: /api/errors/392f5e70a2dbeeda. Report an issue: GitHub.