Skip to content

[mypyc] Add primitive for chr - #22407

Open
Jahongir-Qurbonov wants to merge 2 commits into
python:masterfrom
Jahongir-Qurbonov:mypyc-chr
Open

Jahongir-Qurbonov wants to merge 2 commits into
python:masterfrom
Jahongir-Qurbonov:mypyc-chr

Conversation

@Jahongir-Qurbonov

Copy link
Copy Markdown
Contributor

Add a primitive for chr(int). Short ints in the valid range call PyUnicode_FromOrdinal directly, instead of looking up builtins.chr and calling it through vectorcall with a boxed argument.

Out-of-range arguments raise the same exceptions as CPython. These differ between Python versions: 3.13+ always raises ValueError, while 3.12 and earlier raise OverflowError for values that don't fit in a C int.

Tests compare the results against CPython for every code point and for a range of out-of-range values, including ints that don't fit in a short tagged int. They pass on Python 3.10, 3.12, 3.13 and 3.14.

Micro-benchmark (~2M calls, chr(i) for i in range(32, 1024), the same module compiled before and after this change, Python 3.13): 0.065s -> 0.019s.

This covers the chr part of #15937, which has been inactive since 2024. ord(str) has since been added separately.

Part of mypyc/mypyc#644.

Call PyUnicode_FromOrdinal directly for short ints in the valid range.
Out-of-range values raise the same exceptions as CPython, which differ
between Python versions: 3.13+ always raises ValueError, while older
versions raise OverflowError for values that don't fit in a C int.

Part of mypyc/mypyc#644.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant