From 150c6a4bb680dc44205133d7b8e97cbafed0c629 Mon Sep 17 00:00:00 2001 From: Karl Williamson Date: Sun, 18 Jul 2021 12:52:35 -0600 Subject: [PATCH] doop.c: Refactor do_vecset() By converting to a switch statement with fall through, some redundancies can be removed and conditionals avoided. --- doop.c | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/doop.c b/doop.c index 9c4565bfaadf..a27d69a39040 100644 --- a/doop.c +++ b/doop.c @@ -962,33 +962,28 @@ Perl_do_vecset(pTHX_ SV *sv) s[offset] &= ~(mask << bitoffs); s[offset] |= lval << bitoffs; } - else { - if (size == 8) - s[offset ] = (U8) (lval ); - else if (size == 16) { - s[offset ] = (U8) (lval >> 8); - s[offset+1] = (U8) (lval ); - } - else if (size == 32) { - s[offset ] = (U8) (lval >> 24); - s[offset+1] = (U8) (lval >> 16); - s[offset+2] = (U8) (lval >> 8); - s[offset+3] = (U8) (lval ); - } + else switch (size) { + #ifdef UV_IS_QUAD - else if (size == 64) { - Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE), - "Bit vector size > 32 non-portable"); - s[offset ] = (U8) (lval >> 56); - s[offset+1] = (U8) (lval >> 48); - s[offset+2] = (U8) (lval >> 40); - s[offset+3] = (U8) (lval >> 32); - s[offset+4] = (U8) (lval >> 24); - s[offset+5] = (U8) (lval >> 16); - s[offset+6] = (U8) (lval >> 8); - s[offset+7] = (U8) (lval ); - } + + case 64: + Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE), + "Bit vector size > 32 non-portable"); + s[offset+7] = (U8)( lval ); /* = size - 64 */ + s[offset+6] = (U8)( lval >> 8); /* = size - 56 */ + s[offset+5] = (U8)( lval >> 16); /* = size - 48 */ + s[offset+4] = (U8)( lval >> 24); /* = size - 40 */ #endif + /* FALLTHROUGH */ + case 32: + s[offset+3] = (U8)( lval >> (size - 32)); + s[offset+2] = (U8)( lval >> (size - 24)); + /* FALLTHROUGH */ + case 16: + s[offset+1] = (U8)( lval >> (size - 16)); + /* FALLTHROUGH */ + case 8: + s[offset ] = (U8)( lval >> (size - 8)); } SvSETMAGIC(targ); }