This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Refactor the two uses of SHIFT{16,32} not followed by DO_BO_UNPACK().
authorNicholas Clark <nick@ccl4.org>
Tue, 7 May 2013 08:08:53 +0000 (10:08 +0200)
committerNicholas Clark <nick@ccl4.org>
Mon, 20 May 2013 19:19:43 +0000 (21:19 +0200)
There is one place where SHIFT16() is not immediately followed by
DO_BO_UNPACK() ('n!' and 'v!'), and one place where SHIFT32() is not
immediately followed by DO_BO_UNPACK() ('N!' and 'V!'). Every other use of
either macro is followed by DO_BO_UNPACK(). For the two locations that don't
have DO_BO_UNPACK(), the modifiers '<' and '>' are illegal, hence
DO_BO_UNPACK() will always be a no-op. Hence add DO_BO_UNPACK() to both
(which permits refactoring to simplify things), and add assert()s that the
assumptions are true.

pp_pack.c

index fbda44c..4062832 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -1417,6 +1417,9 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
                ai16 = 0;
 # endif
                SHIFT16(utf8, s, strend, &ai16, datumtype);
+                DO_BO_UNPACK(ai16);
+                /* There should never be any byte-swapping here.  */
+                assert(!TYPE_ENDIANNESS(datumtype));
                if (datumtype == ('n' | TYPE_IS_SHRIEKING))
                    ai16 = (I16) PerlSock_ntohs((U16) ai16);
                if (datumtype == ('v' | TYPE_IS_SHRIEKING))
@@ -1566,6 +1569,9 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
                ai32 = 0;
 #endif
                SHIFT32(utf8, s, strend, &ai32, datumtype);
+                DO_BO_UNPACK(ai32);
+                /* There should never be any byte swapping here.  */
+                assert(!TYPE_ENDIANNESS(datumtype));
                if (datumtype == ('N' | TYPE_IS_SHRIEKING))
                    ai32 = (I32)PerlSock_ntohl((U32)ai32);
                if (datumtype == ('V' | TYPE_IS_SHRIEKING))