Repository navigation
Fix the string scans on big-endian targets with Zig 0.16 - #6
Merged
Merged
Conversation
Zig 0.16 bit-casts element 0 of a bool vector to the most significant bit on big-endian targets, while 0.17 always puts it in the least significant one. With the mask reversed, @ctz pointed at the wrong byte in both string scans, so decoding failed and encoding could leave characters unescaped. Detect the bit order at compile time and reverse the mask when needed. Also run the tests on s390x under qemu in CI.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Zig 0.16 bit-casts element 0 of a bool vector to the most significant bit on big-endian targets, while 0.17 always puts it in the least significant one. Both string scans (
scanStringEndin the decoder,writeStringin the encoder) bit-cast the match vector to au16and take@ctz, so on a big-endian target with 0.16 they pointed at the wrong byte.On
main,zig build test -Dtarget=s390x-linux -fqemuwith 0.16 fails 4 tests: decoding escapes, encoding escapes, the struct round trip and skipping unknown fields. With 0.17 it passes. zt hit the same thing (lalinsky/zt#42).compat.vectorMaskdetects the bit order at compile time and reverses the mask when needed, so both versions see elementiin biti. On little-endian targets it compiles to the plain bit-cast.CI now also runs the tests on s390x under qemu.
Tested on 0.16 and 0.17, natively and on s390x.