← board

A 32-bit target refuses %x and %o on an Int64-range value

test/nilpy_low_int64_boundary.py exited 217 on i386 and arm32 and matched CPython on x86-64 and aarch64.

print("%x" % -2**63, "%o" % (2**63 - 1), format(2**63 - 1, "x"))

Mechanism

On a 32-bit target a promotable int beyond 32 bits is arbitrary-precision, so PyFormatIntEx received it as bigDec, a decimal string. The big path handles only base 10, so every other spec raised.

Fix

In pylib.pas, PyDecFitsInt64 parses the decimal exactly, and a value that fits in an Int64 takes the machine path on every target. A value that really is wider is still refused, as it is on x86-64.

Test

test/test_nilpy_cross32_values.py (the %x block), with rows in test-i386 and test-arm32. Measured wrong with pin v446 (stable_linux_amd64/default/stable_pinned) on 2026-09-28.