-
Notifications
You must be signed in to change notification settings - Fork 825
Fix float/double pack/unpack on s390x #6700
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
Conversation
The pack_float, pack_double, unpack_float, and unpack_double functions accessed float/double bytes via a union with uint8_t array, assuming bytes[0] is always the LSB. This is only true on little-endian hosts. Fix by using the same bit-shift approach as the integer pack functions (pack_quad, unpack_quad, etc). Reinterpret float/double as uint32/uint64 and use shifts to extract/assemble bytes in an endian-independent way. Fixes: mruby#6698 (s390x test failures)
Summary of ChangesHello @khasinski, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request addresses and resolves critical endianness issues in the Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request correctly fixes an endianness bug in the float and double packing/unpacking functions. The previous implementation relied on union-based type punning that was dependent on host byte order, causing failures on big-endian systems like s390x. The new implementation uses bit-shifting to construct and deconstruct floating-point numbers, making the process endian-independent. This approach is consistent with how integer types are handled elsewhere in this file. The changes are clear, correct, and effectively resolve the issue.
|
Tested this patch in Fedora Copr and the tests passed: https://copr.fedorainfracloud.org/coprs/mkoncek/mruby/build/10000135/ |
The
pack_float,pack_double,unpack_float, andunpack_doublefunctions accessed float/double bytes via a union withuint8_t array, assumingbytes[0]is always the LSB. This is only true on little-endian hosts.Fix by using the same bit-shift approach as the integer pack functions (like
pack_quad,unpack_quad). Reinterpret float/double asuint32/uint64and use shifts to extract/assemble bytes in an endian-independent way.Tested with QEMU, I do not have a mainframe at home 😅
Fixes: #6698 (s390x test failures)