Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-120389: Add PyLong_FromInt64() and PyLong_AsInt64() #120390

Merged
merged 12 commits into from
Aug 28, 2024

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Jun 12, 2024

Add new functions to convert C <stdint.h> numbers from/to Python int:

  • PyLong_FromInt32()
  • PyLong_FromUInt32()
  • PyLong_FromInt64()
  • PyLong_FromUInt64()
  • PyLong_AsInt32()
  • PyLong_AsUInt32()
  • PyLong_AsInt64()
  • PyLong_AsUInt64()

@vstinner
Copy link
Member Author

Draft PR to see how #120389 can be implemented. I will complete the PR once we agree on #120389 design.

@vstinner vstinner changed the title gh-120389: Add PyLong_FromInt64() and PyLong_AsInt64() gh-120389: Add PyLong_FromInt64() and PyLong_ToInt64() Jun 17, 2024
@vstinner vstinner force-pushed the stdint branch 4 times, most recently from 93e27a1 to 684360e Compare June 19, 2024 15:29
Add new functions to convert C <stdint.h> numbers from/to Python int:

* PyLong_FromInt32()
* PyLong_FromUInt32()
* PyLong_FromInt64()
* PyLong_FromUInt64()
* PyLong_ToInt32()
* PyLong_ToUInt32()
* PyLong_ToInt64()
* PyLong_ToUInt64()
@vstinner vstinner marked this pull request as ready for review June 19, 2024 16:36
@vstinner vstinner requested review from a team and encukou as code owners June 19, 2024 16:36
@vstinner
Copy link
Member Author

This PR is now ready for review.

Objects/longobject.c Outdated Show resolved Hide resolved
PyLong_ToUInt32() and PyLong_ToUInt64() can now use the __index__()
method if the object has the method.
Doc/c-api/long.rst Outdated Show resolved Hide resolved
Copy link
Member

@zooba zooba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Would like it if we don't have to have docs like "like this other function", but if that's the best we can do then I'll survive.

@vstinner
Copy link
Member Author

Would like it if we don't have to have docs like "like this other function", but if that's the best we can do then I'll survive.

I grouped functions by pairs in the documentation.

@zooba
Copy link
Member

zooba commented Jun 20, 2024

The formatting in the docs preview looks good 👍

image
image

@serhiy-storchaka
Copy link
Member

Calling __index__ can release the GIL and make values saved in C variables (borrowed references, the size of a list, etc) invalid. Existing code can rely on atomicity of PyLong_AsUnsignedLong(), so calling __index__ in it is an unsafe change.

@vstinner
Copy link
Member Author

Existing code can rely on atomicity of PyLong_AsUnsignedLong(), so calling index in it is an unsafe change.

This PR doesn't change PyLong_AsUnsignedLong(). Are you referring to code replacing PyLong_AsUnsignedLong() with one of these functions?

Calling index can release the GIL and make values saved in C variables (borrowed references, the size of a list, etc) invalid.

For me, it's strange that signed and unsigned integers are treated diffferently. I would like to treat them the same.

The GIL issue can be mentioned in the doc? For example:

This function can release the GIL temporarily indirectly while calling an __index__() method.

@vstinner
Copy link
Member Author

I created capi-workgroup/decisions#32 "Add PyLong_FromInt64() and PyLong_ToInt64()" in the C API WG Decisions project.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

Modules/_testlimitedcapi/long.c Show resolved Hide resolved
Comment on lines +4050 to +4055
PyModule_AddObject(m, "INT32_MIN", PyLong_FromInt32(INT32_MIN));
PyModule_AddObject(m, "INT32_MAX", PyLong_FromInt32(INT32_MAX));
PyModule_AddObject(m, "UINT32_MAX", PyLong_FromUInt32(UINT32_MAX));
PyModule_AddObject(m, "INT64_MIN", PyLong_FromInt64(INT64_MIN));
PyModule_AddObject(m, "INT64_MAX", PyLong_FromInt64(INT64_MAX));
PyModule_AddObject(m, "UINT64_MAX", PyLong_FromUInt64(UINT64_MAX));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not needed. You can define them in the Python code as INT32_MAX = 2**31 - 1 etc.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer to reuse <limits.h> C constants to avoid any typo.

Lib/test/test_capi/test_long.py Outdated Show resolved Hide resolved
Doc/c-api/long.rst Outdated Show resolved Hide resolved
Doc/c-api/long.rst Outdated Show resolved Hide resolved
Objects/longobject.c Outdated Show resolved Hide resolved
Objects/longobject.c Show resolved Hide resolved
@vstinner vstinner changed the title gh-120389: Add PyLong_FromInt64() and PyLong_ToInt64() gh-120389: Add PyLong_FromInt64() and PyLong_AsInt64() Aug 27, 2024
@vstinner
Copy link
Member Author

@serhiy-storchaka @zooba @encukou: Would you mind to review the updated PR? I updated the PR to the API approved the C API WG. It now uses the __index__() method and functions are called "As" (instead of "To").

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but check_long_asunsignedint is now superseded by check_long_asint.

Lib/test/test_capi/test_long.py Outdated Show resolved Hide resolved
@vstinner
Copy link
Member Author

but check_long_asunsignedint is now superseded by check_long_asint.

I removed check_long_asunsignedint() to reuse check_long_asint().

Doc/c-api/long.rst Outdated Show resolved Hide resolved
Doc/c-api/long.rst Outdated Show resolved Hide resolved
vstinner and others added 2 commits August 28, 2024 11:51
Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Petr Viktorin <encukou@gmail.com>
@vstinner vstinner enabled auto-merge (squash) August 28, 2024 09:52
@vstinner vstinner merged commit 4c6dca8 into python:main Aug 28, 2024
37 checks passed
@vstinner vstinner deleted the stdint branch August 28, 2024 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants