In perl.git, the branch blead has been updated <https://perl5.git.perl.org/perl.git/commitdiff/8e48a48cc5006a06110dd20994b419be393e42ce?hp=dd0510590a1124f91ef2c615a64cd9bfbb245dd6>
- Log ----------------------------------------------------------------- commit 8e48a48cc5006a06110dd20994b419be393e42ce Author: Karl Williamson <[email protected]> Date: Wed Mar 27 21:20:58 2019 -0600 regcomp.c: Use new inRANGE macro commit f85b645f3c47de3813732fdb9510ff559350c7ee Author: Karl Williamson <[email protected]> Date: Wed Mar 27 21:19:04 2019 -0600 numeric.c: use new inRANGE macro This commit halves the number of conditionals needed in this hot code. commit 182c4ace227d6751caa6a919ff6fd33c5e008e01 Author: Karl Williamson <[email protected]> Date: Wed Mar 27 21:12:53 2019 -0600 handy.h: Convert some macros to use inRANGE the latter is faster, having only one conditional. commit 26c1d9d861d5f70afa8cfb94e7f5a9fbe432a70d Author: Karl Williamson <[email protected]> Date: Wed Mar 27 21:09:14 2019 -0600 handy.h: Comments, remove extraneous parens ----------------------------------------------------------------------- Summary of changes: handy.h | 39 ++++++++++++++++++++------------------- numeric.c | 20 ++++++++++---------- regcomp.c | 8 ++++---- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/handy.h b/handy.h index 3ce0b1bca7..cb6da9fd84 100644 --- a/handy.h +++ b/handy.h @@ -1254,6 +1254,8 @@ END_EXTERN_C && ((PL_charclass[(U8) (c)] & _CC_mask_A(classnum)) \ == _CC_mask_A(classnum))) +/* On ASCII platforms certain classes form a single range. It's faster to + * special case these. isDIGIT is a single range on all platforms */ # ifdef EBCDIC # define isALPHA_A(c) _generic_isCC_A(c, _CC_ALPHA) # define isGRAPH_A(c) _generic_isCC_A(c, _CC_GRAPH) @@ -1261,8 +1263,9 @@ END_EXTERN_C # define isPRINT_A(c) _generic_isCC_A(c, _CC_PRINT) # define isUPPER_A(c) _generic_isCC_A(c, _CC_UPPER) # else + /* By folding the upper and lowercase, we can use a single range */ # define isALPHA_A(c) inRANGE((~('A' ^ 'a') & (c)), 'A', 'Z') -# define isGRAPH_A(c) inRANGE((c), ' ' + 1, 0x7e) +# define isGRAPH_A(c) inRANGE(c, ' ' + 1, 0x7e) # define isLOWER_A(c) inRANGE(c, 'a', 'z') # define isPRINT_A(c) inRANGE(c, ' ', 0x7e) # define isUPPER_A(c) inRANGE(c, 'A', 'Z') @@ -1318,7 +1321,7 @@ END_EXTERN_C * hard-code various macro definitions that wouldn't otherwise be available * to it. Most are coded based on first principles. These are written to * avoid EBCDIC vs. ASCII #ifdef's as much as possible. */ -# define isDIGIT_A(c) ((c) <= '9' && (c) >= '0') +# define isDIGIT_A(c) inRANGE(c, '0', '9') # define isBLANK_A(c) ((c) == ' ' || (c) == '\t') # define isSPACE_A(c) (isBLANK_A(c) \ || (c) == '\n' \ @@ -1329,21 +1332,19 @@ END_EXTERN_C * uppercase. The tests for those aren't necessary on ASCII, but hurt only * performance (if optimization isn't on), and allow the same code to be * used for both platform types */ -# define isLOWER_A(c) ((c) >= 'a' && (c) <= 'z' \ - && ( (c) <= 'i' \ - || ((c) >= 'j' && (c) <= 'r') \ - || (c) >= 's')) -# define isUPPER_A(c) ((c) >= 'A' && (c) <= 'Z' \ - && ( (c) <= 'I' \ - || ((c) >= 'J' && (c) <= 'R') \ - || (c) >= 'S')) +# define isLOWER_A(c) inRANGE((c), 'a', 'i') \ + || inRANGE((c), 'j', 'r') \ + || inRANGE((c), 's', 'z') +# define isUPPER_A(c) inRANGE((c), 'A', 'I') \ + || inRANGE((c), 'J', 'R') \ + || inRANGE((c), 'S', 'Z') # define isALPHA_A(c) (isUPPER_A(c) || isLOWER_A(c)) # define isALPHANUMERIC_A(c) (isALPHA_A(c) || isDIGIT_A(c)) # define isWORDCHAR_A(c) (isALPHANUMERIC_A(c) || (c) == '_') # define isIDFIRST_A(c) (isALPHA_A(c) || (c) == '_') -# define isXDIGIT_A(c) (isDIGIT_A(c) \ - || ((c) >= 'a' && (c) <= 'f') \ - || ((c) <= 'F' && (c) >= 'A')) +# define isXDIGIT_A(c) ( isDIGIT_A(c) \ + || inRANGE((c), 'a', 'f') \ + || inRANGE((c), 'A', 'F') # define isPUNCT_A(c) ((c) == '-' || (c) == '!' || (c) == '"' \ || (c) == '#' || (c) == '$' || (c) == '%' \ || (c) == '&' || (c) == '\'' || (c) == '(' \ @@ -1365,13 +1366,13 @@ END_EXTERN_C # define isCNTRL_A(c) ((c) == '\0' || (c) == '\a' || (c) == '\b' \ || (c) == '\f' || (c) == '\n' || (c) == '\r' \ || (c) == '\t' || (c) == '\v' \ - || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */ \ + || inRANGE((c), 1, 3) /* SOH, STX, ETX */ \ || (c) == 7 /* U+7F DEL */ \ - || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */ \ - /* DLE, DC[1-3] */ \ + || inRANGE((c), 0x0E, 0x13) /* SO SI DLE \ + DC[1-3] */ \ || (c) == 0x18 /* U+18 CAN */ \ || (c) == 0x19 /* U+19 EOM */ \ - || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */ \ + || inRANGE((c), 0x1C, 0x1F) /* [FGRU]S */ \ || (c) == 0x26 /* U+17 ETB */ \ || (c) == 0x27 /* U+1B ESC */ \ || (c) == 0x2D /* U+05 ENQ */ \ @@ -1426,8 +1427,8 @@ END_EXTERN_C || NATIVE_TO_LATIN1((U8) c) == 0xA0))) # define isUPPER_L1(c) (isUPPER_A(c) \ || (FITS_IN_8_BITS(c) \ - && ( NATIVE_TO_LATIN1((U8) c) >= 0xC0 \ - && NATIVE_TO_LATIN1((U8) c) <= 0xDE \ + && ( IN_RANGE(NATIVE_TO_LATIN1((U8) c), \ + 0xC0, 0xDE) \ && NATIVE_TO_LATIN1((U8) c) != 0xD7))) # define isWORDCHAR_L1(c) (isIDFIRST_L1(c) || isDIGIT_A(c)) # define isIDFIRST_L1(c) (isALPHA_L1(c) || NATIVE_TO_LATIN1(c) == '_') diff --git a/numeric.c b/numeric.c index 9804a9b341..710653053f 100644 --- a/numeric.c +++ b/numeric.c @@ -899,41 +899,41 @@ Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags) before checking for overflow. */ if (++s < send) { int digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; - if (digit >= 0 && digit <= 9) { + if (inRANGE(digit, 0, 9)) { value = value * 10 + digit; if (++s < send) { /* Now got 9 digits, so need to check each time for overflow. */ digit = *s - '0'; - while (digit >= 0 && digit <= 9 + while ( inRANGE(digit, 0, 9) && (value < uv_max_div_10 || (value == uv_max_div_10 && digit <= uv_max_mod_10))) { @@ -943,7 +943,7 @@ Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags) else break; } - if (digit >= 0 && digit <= 9 + if (inRANGE(digit, 0, 9) && (s < send)) { /* value overflowed. skip the remaining digits, don't diff --git a/regcomp.c b/regcomp.c index d98ad1a838..f040a35210 100644 --- a/regcomp.c +++ b/regcomp.c @@ -11587,14 +11587,14 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth) goto gen_recurse_regop; /* NOTREACHED */ case '+': - if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) { + if (! inRANGE(RExC_parse[0], '1', '9')) { RExC_parse++; vFAIL("Illegal pattern"); } goto parse_recursion; /* NOTREACHED*/ case '-': /* (?-1) */ - if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) { + if (! inRANGE(RExC_parse[0], '1', '9')) { RExC_parse--; /* rewind to let it be handled later */ goto parse_flags; } @@ -11863,7 +11863,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth) parno = 1; RExC_parse++; } - else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) { + else if (inRANGE(RExC_parse[0], '1', '9')) { UV uv; endptr = RExC_end; if (grok_atoUV(RExC_parse, &uv, &endptr) @@ -11884,7 +11884,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth) ret = reganode(pRExC_state, INSUBP, parno); goto insert_if_check_paren; } - else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) { + else if (inRANGE(RExC_parse[0], '1', '9')) { /* (?(1)...) */ char c; UV uv; -- Perl5 Master Repository
