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
- Range-check before calling: i52 requires Number.isSafeInteger(value); u52 additionally requires value >= 0.
- For values beyond 2^53-1, marshal as bigint via setI64Big, or as two 32-bit halves (setU32).
- 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
- Use Number.isSafeInteger to guard i52, and additionally require >= 0 for u52.
- For magnitudes beyond 2^53-1, use bigint via setI64Big or split into two setU32 halves.
- Do not pass raw pointers/hashes as Number if they may exceed 2^53-1.
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
- value was not an integer
- ${function_name} must be a Function but was ${typeof fn}
- .NET runtime has failed to start, because too much memory wa
- NotImplementedException: bigint
- NotImplementedException: TypedArray
AI-assisted analysis of dotnet/runtime@290d5ab72c (2026-08-06).
Data as JSON: /api/errors/392f5e70a2dbeeda.
Report an issue: GitHub.