Skip to content

gh-154568: Fix array._array_reconstructor() ignoring requested byte order for float16 - #154569

Merged
vstinner merged 5 commits into
python:mainfrom
PhysicistJohn:gh-154568-float16-reconstructor-endian-fix
Aug 11, 2026
Merged

gh-154568: Fix array._array_reconstructor() ignoring requested byte order for float16#154569
vstinner merged 5 commits into
python:mainfrom
PhysicistJohn:gh-154568-float16-reconstructor-endian-fix

Conversation

@PhysicistJohn

Copy link
Copy Markdown
Contributor

The slow-path decoder for IEEE_754_FLOAT16_LE/BE compared mformat_code
against IEEE_754_FLOAT_LE (the 32-bit float constant) instead of
IEEE_754_FLOAT16_LE, so it always decoded as big-endian regardless of
what was requested. Fixes gh-154568.

Adds a regression test. A real 'e'-typecode array only exercises the
slow/converting path when the requested mformat disagrees with the
machine's native float16 format, so which direction (LE/BE) actually
exercises the buggy branch depends on the test machine's endianness --
and the other direction happens to come out "correct" by coincidence,
since the bug unconditionally decodes as big-endian. The test uses a
typecode ('d') whose native format can never match the float16 codes,
which forces the slow path deterministically on any machine so both
directions are actually exercised.

…byte order for float16

The slow-path decoder for IEEE_754_FLOAT16_LE/BE computed the
byte-order flag by comparing mformat_code against IEEE_754_FLOAT_LE
(the 32-bit float constant) instead of IEEE_754_FLOAT16_LE. Since the
float16 mformat codes are never equal to that constant, the comparison
was always false, so the decoder always treated input as big-endian
regardless of what was requested.

Adds a regression test. A real 'e'-typecode array only exercises the
slow/converting path when the requested mformat disagrees with the
machine's native float16 format, so which direction (LE/BE) exercises
the buggy branch depends on the test machine's endianness, and the
other direction happens to come out "correct" by coincidence since the
bug unconditionally decodes as big-endian. The test uses a typecode
('d') whose native format can never match the float16 codes, forcing
the slow path deterministically on any machine.
@python-cla-bot

This comment was marked as resolved.

…ction

array._array_reconstructor is internal/private and has no Sphinx docs
entry, so the :func: cross-reference role can't resolve and trips the
docs CI's new-NEWS-nit check.
@skirpichev
skirpichev self-requested a review July 24, 2026 03:12
skirpichev

This comment was marked as outdated.

Comment thread Lib/test/test_array.py Outdated
@skirpichev
skirpichev requested a review from vstinner July 24, 2026 05:49
@skirpichev skirpichev added the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Jul 24, 2026
@skirpichev

Copy link
Copy Markdown
Member

CC @vstinner

…lify NEWS wording

Per skirpichev's review on pythonGH-154569:
- Add a float16 (LE/BE) case to ArrayReconstructorTest.test_numbers()
  for basic functional coverage alongside the other numeric types,
  complementing the existing dedicated test_float16_endianness (which
  he confirmed is fine to keep for deterministically forcing the
  buggy slow path regardless of test-machine endianness).
- Simplify the NEWS entry wording per his suggested rewrite.
@PhysicistJohn

Copy link
Copy Markdown
Contributor Author

Thanks for the review! Pushed both changes: added a half-floats case to
test_numbers() alongside the other numeric types, and simplified the
NEWS wording per your suggestion.

@PhysicistJohn

Copy link
Copy Markdown
Contributor Author

Good catch, fixed the gh-issue placeholder in the test comment. That
was the one part of your suggestions I missed applying earlier.

gilhomeroofing-spec

This comment was marked as spam.

Comment thread Modules/arraymodule.c
Comment thread Modules/arraymodule.c
gilhomeroofing-spec

This comment was marked as spam.

@python python locked as spam and limited conversation to collaborators Jul 30, 2026

@skirpichev skirpichev left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Spammer reported. Meanwhile, I locked pr to collaborators, sorry.

@python python unlocked this conversation Aug 7, 2026
@vstinner

vstinner commented Aug 7, 2026

Copy link
Copy Markdown
Member

Spammer reported. Meanwhile, I locked pr to collaborators, sorry.

Sadly, I cannot comment the PR because of that. So I unlocked the conversation.

Comment thread Lib/test/test_array.py Outdated
Comment thread Lib/test/test_array.py Outdated
@PhysicistJohn

Copy link
Copy Markdown
Contributor Author

Thanks — shortened the NEWS entry and test comment, and switched the test value to 1.5 as suggested.

@vstinner vstinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@vstinner
vstinner merged commit f3be08a into python:main Aug 11, 2026
57 checks passed
@miss-islington-app

Copy link
Copy Markdown

Thanks @PhysicistJohn for the PR, and @vstinner for merging it 🌮🎉.. I'm working now to backport this PR to: 3.15.
🐍🍒⛏🤖

@bedevere-app

bedevere-app Bot commented Aug 11, 2026

Copy link
Copy Markdown

GH-155557 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Aug 11, 2026
@vstinner

Copy link
Copy Markdown
Member

Merged, thanks for the fix.

hugovk pushed a commit that referenced this pull request Aug 12, 2026
…54569) (#155557)

Co-authored-by: PhysicistJohn <54456354+PhysicistJohn@users.noreply.github.com>
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.

array._array_reconstructor() ignores requested byte order for float16 (IEEE_754_FLOAT16_LE/BE)

4 participants