Skip to content

json.loads ignores sys.int_max_str_digits (decodes an over-long int instead of raising ValueError) #8051

Closed

Description

@myers

Feature

json.loads should honor the interpreter's integer string-conversion limit (sys.set_int_max_str_digits, PEP 651). RustPython's native _json scanner (the Rust-implemented accelerated module, RustPython's analog of CPython's C _json) decodes an over-long integer literal instead of raising ValueError. The pure-Python decoder already honors the limit (its int conversion goes through int(str)); only the native _json scanner diverges.

Surfaced by running CPython's own stdlib test suite under RustPython — test_json.test_decode::TestCDecode.test_limit_int fails. The minimal standalone reproduction:

Reproduction

import sys, json
sys.set_int_max_str_digits(5000)
json.loads('1' * 5001)

CPython 3.14:

ValueError: Exceeds the limit (5000 digits) for integer string conversion: value has 5001 digits

RustPython:

(returns the 5001-digit integer — no error)

Python Documentation or reference to CPython source code

Suggested fix

Route the integer construction through rustpython_common::int::bytes_to_int with the live vm.state.int_max_str_digits (the same path the int() builtin uses), so the limit is read per-call and sys.set_int_max_str_digits / adjust_int_max_str_digits take effect. Float parsing is unaffected. This also unblocks test_json.test_decode::TestCDecode.test_limit_int.


Investigated and drafted with AI assistance (Claude Code), reviewed by a human before filing, per RustPython's AI policy.

Activity

  1. added
    C-compatA discrepancy between RustPython and CPython
    on Jun 5, 2026
  2. youknowone commented on Oct 7, 2026

    @youknowone
    Member

    The native _json scanner now honors sys.set_int_max_str_digits.

    On current main, with _json.make_scanner (<class '_json.Scanner'>):

    sys.set_int_max_str_digits(5000)
    json.loads('1' * 5000)   # succeeds
    json.loads('1' * 5001)   # ValueError: Exceeds the limit (5000 digits) for integer string conversion

    That is the reproduction from this issue. Closing as resolved.

    — commented by Grok 4.6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-compatA discrepancy between RustPython and CPython

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions