X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/cfd0369c40b647df9444518ec26b924a57e14ac8..8c56068e9474ff1eb28abd58496550d54581dd25:/regcomp.c diff --git a/regcomp.c b/regcomp.c index 02cece8..dd2188f 100644 --- a/regcomp.c +++ b/regcomp.c @@ -55,7 +55,6 @@ # define PERL_NO_GET_CONTEXT #endif -/*SUPPRESS 112*/ /* * pregcomp and pregexec -- regsub and regerror are not used in perl * @@ -426,7 +425,7 @@ static const scan_data_t zero_scan_data = MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n", \ __LINE__, (node), (byte))); \ if((node) < 0) { \ - Perl_croak(aTHX_ "value of node is %d in Offset macro", node); \ + Perl_croak(aTHX_ "value of node is %d in Offset macro", (int)(node)); \ } else { \ RExC_offsets[2*(node)-1] = (byte); \ } \ @@ -440,9 +439,9 @@ static const scan_data_t zero_scan_data = #define Set_Node_Length_To_R(node,len) STMT_START { \ if (! SIZE_ONLY) { \ MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n", \ - __LINE__, (node), (len))); \ + __LINE__, (int)(node), (int)(len))); \ if((node) < 0) { \ - Perl_croak(aTHX_ "value of node is %d in Length macro", node); \ + Perl_croak(aTHX_ "value of node is %d in Length macro", (int)(node)); \ } else { \ RExC_offsets[2*(node)] = (len); \ } \ @@ -766,7 +765,7 @@ and would end up looking like: DEBUG_TRIE_COMPILE_r({ \ SV *tmp; \ if ( UTF ) { \ - tmp = newSVpv( "", 0 ); \ + tmp = newSVpvn( "", 0 ); \ pv_uni_display( tmp, uc, len, 60, UNI_DISPLAY_REGEX ); \ } else { \ tmp = Perl_newSVpvf_nocontext( "%c", (int)uvc ); \ @@ -815,7 +814,7 @@ and would end up looking like: } STMT_END #define TRIE_LIST_NEW(state) STMT_START { \ - Newz( 1023, trie->states[ state ].trans.list, \ + Newxz( trie->states[ state ].trans.list, \ 4, reg_trie_trans_le ); \ TRIE_LIST_CUR( state ) = 1; \ TRIE_LIST_LEN( state ) = 4; \ @@ -847,10 +846,10 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs GET_RE_DEBUG_FLAGS_DECL; - Newz( 848200, trie, 1, reg_trie_data ); + Newxz( trie, 1, reg_trie_data ); trie->refcount = 1; RExC_rx->data->data[ data_slot ] = (void*)trie; - Newz( 848201, trie->charmap, 256, U16 ); + Newxz( trie->charmap, 256, U16 ); DEBUG_r({ trie->words = newAV(); trie->revcharmap = newAV(); @@ -969,7 +968,7 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs STRLEN transcount = 1; - Newz( 848204, trie->states, trie->charcount + 2, reg_trie_state ); + Newxz( trie->states, trie->charcount + 2, reg_trie_state ); TRIE_LIST_NEW(1); next_alloc = 2; @@ -1079,7 +1078,7 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs PerlIO_printf( Perl_debug_log, "\n\n" ); }); - Newz( 848203, trie->trans, transcount ,reg_trie_trans ); + Newxz( trie->trans, transcount ,reg_trie_trans ); { U32 state; U32 tp = 0; @@ -1186,9 +1185,9 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs */ - Newz( 848203, trie->trans, ( trie->charcount + 1 ) * trie->uniquecharcount + 1, + Newxz( trie->trans, ( trie->charcount + 1 ) * trie->uniquecharcount + 1, reg_trie_trans ); - Newz( 848204, trie->states, trie->charcount + 2, reg_trie_state ); + Newxz( trie->states, trie->charcount + 2, reg_trie_state ); next_alloc = trie->uniquecharcount + 1; for ( cur = first ; cur < last ; cur = regnext( cur ) ) { @@ -1541,7 +1540,8 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *firs STATIC I32 -S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags, U32 depth) +S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, + regnode *last, scan_data_t *data, U32 flags, U32 depth) /* scanp: Start here (read-write). */ /* deltap: Write maxlen-minlen here. */ /* last: Stop before this one. */ @@ -1889,8 +1889,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, reg /* dont use tail as the end marker for this traverse */ for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) { - regnode *noper = NEXTOPER( cur ); - regnode *noper_next = regnext( noper ); + regnode * const noper = NEXTOPER( cur ); + regnode * const noper_next = regnext( noper ); DEBUG_OPTIMISE_r({ regprop( mysv, cur); @@ -2002,7 +2002,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, reg } sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan)); { - SV * sv = data->last_found; + SV * const sv = data->last_found; MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL; if (mg && mg->mg_len >= 0) @@ -2203,12 +2203,12 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, reg } if (!scan) /* It was not CURLYX, but CURLY. */ scan = next; - if (ckWARN(WARN_REGEXP) - /* ? quantifier ok, except for (?{ ... }) */ - && (next_is_eval || !(mincount == 0 && maxcount == 1)) + if ( /* ? quantifier ok, except for (?{ ... }) */ + (next_is_eval || !(mincount == 0 && maxcount == 1)) && (minnext == 0) && (deltanext == 0) && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR)) - && maxcount <= REG_INFTY/3) /* Complement check for big count */ + && maxcount <= REG_INFTY/3 /* Complement check for big count */ + && ckWARN(WARN_REGEXP)) { vWARN(RExC_parse, "Quantifier unexpected on zero-length expression"); @@ -2758,9 +2758,9 @@ S_add_data(pTHX_ RExC_state_t *pRExC_state, I32 n, const char *s) RExC_rx->data->count += n; } else { - Newc(1207, RExC_rx->data, sizeof(*RExC_rx->data) + sizeof(void*) * (n - 1), + Newxc(RExC_rx->data, sizeof(*RExC_rx->data) + sizeof(void*) * (n - 1), char, struct reg_data); - New(1208, RExC_rx->data->what, n, U8); + Newx(RExC_rx->data->what, n, U8); RExC_rx->data->count = n; } Copy(s, RExC_rx->data->what + RExC_rx->data->count - n, n, U8); @@ -2873,7 +2873,7 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) RExC_whilem_seen = 15; /* Allocate space and initialize. */ - Newc(1001, r, sizeof(regexp) + (unsigned)RExC_size * sizeof(regnode), + Newxc(r, sizeof(regexp) + (unsigned)RExC_size * sizeof(regnode), char, regexp); if (r == NULL) FAIL("Regexp out of space"); @@ -2896,7 +2896,7 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) r->startp = 0; /* Useful during FAIL. */ r->endp = 0; /* Useful during FAIL. */ - Newz(1304, r->offsets, 2*RExC_size+1, U32); /* MJD 20001228 */ + Newxz(r->offsets, 2*RExC_size+1, U32); /* MJD 20001228 */ if (r->offsets) { r->offsets[0] = RExC_size; } @@ -2935,7 +2935,7 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) /* XXXX To minimize changes to RE engine we always allocate 3-units-long substrs field. */ - Newz(1004, r->substrs, 1, struct reg_substr_data); + Newxz(r->substrs, 1, struct reg_substr_data); StructCopy(&zero_scan_data, &data, scan_data_t); /* XXXX Should not we check for something else? Usually it is OPEN1... */ @@ -3114,7 +3114,7 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) { const I32 n = add_data(pRExC_state, 1, "f"); - New(1006, RExC_rx->data->data[n], 1, + Newx(RExC_rx->data->data[n], 1, struct regnode_charclass_class); StructCopy(data.start_class, (struct regnode_charclass_class*)RExC_rx->data->data[n], @@ -3170,7 +3170,7 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) { const I32 n = add_data(pRExC_state, 1, "f"); - New(1006, RExC_rx->data->data[n], 1, + Newx(RExC_rx->data->data[n], 1, struct regnode_charclass_class); StructCopy(data.start_class, (struct regnode_charclass_class*)RExC_rx->data->data[n], @@ -3194,8 +3194,8 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) r->reganch |= ROPT_EVAL_SEEN; if (RExC_seen & REG_SEEN_CANY) r->reganch |= ROPT_CANY_SEEN; - Newz(1002, r->startp, RExC_npar, I32); - Newz(1002, r->endp, RExC_npar, I32); + Newxz(r->startp, RExC_npar, I32); + Newxz(r->endp, RExC_npar, I32); PL_regdata = r->data; /* for regprop() */ DEBUG_COMPILE_r(regdump(r)); return(r); @@ -3839,7 +3839,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp) goto do_curly; } nest_check: - if (ckWARN(WARN_REGEXP) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) { + if (!SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3 && ckWARN(WARN_REGEXP)) { vWARN3(RExC_parse, "%.*s matches null string many times", RExC_parse - origparse, @@ -4276,7 +4276,7 @@ tryagain: FAIL("Trailing \\"); /* FALL THROUGH */ default: - if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(*p)) + if (!SIZE_ONLY&& isALPHA(*p) && ckWARN(WARN_REGEXP)) vWARN2(p + 1, "Unrecognized escape \\%c passed through", UCHARAT(p)); goto normal_default; } @@ -4819,7 +4819,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state) break; } default: - if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value)) + if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP)) vWARN2(RExC_parse, "Unrecognized escape \\%c in character class passed through", (int)value); @@ -5779,12 +5779,12 @@ Perl_regprop(pTHX_ SV *sv, const regnode *o) k = PL_regkind[(U8)OP(o)]; if (k == EXACT) { - SV *dsv = sv_2mortal(newSVpvn("", 0)); + SV * const dsv = sv_2mortal(newSVpvn("", 0)); /* Using is_utf8_string() is a crude hack but it may * be the best for now since we have no flag "this EXACTish * node was UTF-8" --jhi */ const bool do_utf8 = is_utf8_string((U8*)STRING(o), STR_LEN(o)); - const char *s = do_utf8 ? + const char * const s = do_utf8 ? pv_uni_display(dsv, (U8*)STRING(o), STR_LEN(o), 60, UNI_DISPLAY_REGEX) : STRING(o); @@ -5819,7 +5819,7 @@ Perl_regprop(pTHX_ SV *sv, const regnode *o) Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* 2: embedded, otherwise 1 */ else if (k == ANYOF) { int i, rangestart = -1; - U8 flags = ANYOF_FLAGS(o); + const U8 flags = ANYOF_FLAGS(o); const char * const anyofs[] = { /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */ "\\w", @@ -5890,7 +5890,7 @@ Perl_regprop(pTHX_ SV *sv, const regnode *o) { SV *lv; - SV *sw = regclass_swash(o, FALSE, &lv, 0); + SV * const sw = regclass_swash(o, FALSE, &lv, 0); if (lv) { if (sw) { @@ -5903,20 +5903,21 @@ Perl_regprop(pTHX_ SV *sv, const regnode *o) if (rangestart == -1) rangestart = i; } else if (rangestart != -1) { - U8 *p; - if (i <= rangestart + 3) for (; rangestart < i; rangestart++) { - U8 *e; - for(e = uvchr_to_utf8(s, rangestart), p = s; p < e; p++) + const U8 * const e = uvchr_to_utf8(s,rangestart); + U8 *p; + for(p = s; p < e; p++) put_byte(sv, *p); } else { - U8 *e; - for (e = uvchr_to_utf8(s, rangestart), p = s; p < e; p++) + const U8 *e = uvchr_to_utf8(s,rangestart); + U8 *p; + for (p = s; p < e; p++) put_byte(sv, *p); - sv_catpv(sv, "-"); - for (e = uvchr_to_utf8(s, i - 1), p = s; p < e; p++) + sv_catpvn(sv, "-", 1); + e = uvchr_to_utf8(s, i-1); + for (p = s; p < e; p++) put_byte(sv, *p); } rangestart = -1; @@ -5933,7 +5934,7 @@ Perl_regprop(pTHX_ SV *sv, const regnode *o) while(*s && *s != '\n') s++; if (*s == '\n') { - const char *t = ++s; + const char * const t = ++s; while (*s) { if (*s == '\n') @@ -5964,7 +5965,7 @@ Perl_re_intuit_string(pTHX_ regexp *prog) GET_RE_DEBUG_FLAGS_DECL; DEBUG_COMPILE_r( { - const char *s = SvPV_nolen_const(prog->check_substr + const char * const s = SvPV_nolen_const(prog->check_substr ? prog->check_substr : prog->check_utf8); if (!PL_colorset) reginitcolors(); @@ -6008,10 +6009,10 @@ Perl_pregfree(pTHX_ struct regexp *r) len > 60 ? "..." : ""); }); - if (r->precomp) - Safefree(r->precomp); - if (r->offsets) /* 20010421 MJD */ - Safefree(r->offsets); + /* gcov results gave these as non-null 100% of the time, so there's no + optimisation in checking them before calling Safefree */ + Safefree(r->precomp); + Safefree(r->offsets); /* 20010421 MJD */ RX_MATCH_COPY_FREE(r); #ifdef PERL_OLD_COPY_ON_WRITE if (r->saved_copy) @@ -6071,17 +6072,14 @@ Perl_pregfree(pTHX_ struct regexp *r) reg_trie_data *trie=(reg_trie_data*)r->data->data[n]; U32 refcount; OP_REFCNT_LOCK; - refcount = trie->refcount--; + refcount = --trie->refcount; OP_REFCNT_UNLOCK; if ( !refcount ) { - if (trie->charmap) - Safefree(trie->charmap); + Safefree(trie->charmap); if (trie->widecharmap) SvREFCNT_dec((SV*)trie->widecharmap); - if (trie->states) - Safefree(trie->states); - if (trie->trans) - Safefree(trie->trans); + Safefree(trie->states); + Safefree(trie->trans); #ifdef DEBUGGING if (trie->words) SvREFCNT_dec((SV*)trie->words); @@ -6220,8 +6218,8 @@ Perl_save_re_context(pTHX) for (i = 1; i <= rx->nparens; i++) { GV *mgv; char digits[TYPE_CHARS(long)]; - sprintf(digits, "%lu", (long)i); - if ((mgv = gv_fetchpv(digits, FALSE, SVt_PV))) + const STRLEN len = my_sprintf(digits, "%lu", (long)i); + if ((mgv = gv_fetchpvn_flags(digits, len, FALSE, SVt_PV))) save_scalar(mgv); } }