X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/0eb30aebe20a48d634d4e484bc9e6005dffc1420..9863976f6583b7475498d326ddb6659771bfa96b:/regexec.c diff --git a/regexec.c b/regexec.c index 1860909..bc38839 100644 --- a/regexec.c +++ b/regexec.c @@ -141,7 +141,6 @@ static const char* const non_utf8_target_but_utf8_required #define LOAD_UTF8_CHARCLASS(swash_ptr, property_name) STMT_START { \ if (!swash_ptr) { \ U8 flags = _CORE_SWASH_INIT_ACCEPT_INVLIST; \ - ENTER; save_re_context(); \ swash_ptr = _core_swash_init("utf8", property_name, &PL_sv_undef, \ 1, 0, NULL, &flags); \ assert(swash_ptr); \ @@ -491,7 +490,9 @@ S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8* character) swash_property_names[classnum], &PL_sv_undef, 1, 0, NULL, &flags); } - return swash_fetch(PL_utf8_swash_ptrs[classnum], (U8 *) character, TRUE); + return cBOOL(swash_fetch(PL_utf8_swash_ptrs[classnum], (U8 *) + character, + TRUE /* is UTF */ )); } switch ((_char_class_number) classnum) { @@ -1225,8 +1226,8 @@ Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV *sv, char *strpos, ? (utf8_target ? trie_utf8 : trie_plain) \ : (utf8_target ? trie_utf8_fold : trie_latin_utf8_fold)) -#define REXEC_TRIE_READ_CHAR(trie_type, trie, widecharmap, uc, uscan, len, \ -uvc, charid, foldlen, foldbuf, uniflags) STMT_START { \ +#define REXEC_TRIE_READ_CHAR(trie_type, trie, widecharmap, uc, uscan, len, uvc, charid, foldlen, foldbuf, uniflags) \ +STMT_START { \ STRLEN skiplen; \ switch (trie_type) { \ case trie_utf8_fold: \ @@ -4304,13 +4305,13 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) * UTF8_IS_INVARIANT works even on non-UTF-8 strings, or else * wouldn't be invariant) */ if (UTF8_IS_INVARIANT(nextchr) || ! utf8_target) { - if (! (to_complement ^ cBOOL(isFOO_lc(FLAGS(scan), nextchr)))) { + if (! (to_complement ^ cBOOL(isFOO_lc(FLAGS(scan), (U8) nextchr)))) { sayNO; } } else if (UTF8_IS_DOWNGRADEABLE_START(nextchr)) { if (! (to_complement ^ cBOOL(isFOO_lc(FLAGS(scan), - TWO_BYTE_UTF8_TO_UNI(nextchr, + (U8) TWO_BYTE_UTF8_TO_UNI(nextchr, *(locinput + 1)))))) { sayNO; @@ -4877,8 +4878,6 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) */ Copy(&PL_reg_state, &saved_state, 1, struct re_save_state); - PL_reg_state.re_reparsing = FALSE; - if (!caller_cv) caller_cv = find_runcv(NULL); @@ -4912,12 +4911,13 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) * points to newcv's pad. */ if (newcv != last_pushed_cv || PL_comppad != last_pad) { - I32 depth = (newcv == caller_cv) ? 0 : 1; + U8 flags = (CXp_SUB_RE | + ((newcv == caller_cv) ? CXp_SUB_RE_FAKE : 0)); if (last_pushed_cv) { - CHANGE_MULTICALL_WITHDEPTH(newcv, depth); + CHANGE_MULTICALL_FLAGS(newcv, flags); } else { - PUSH_MULTICALL_WITHDEPTH(newcv, depth); + PUSH_MULTICALL_FLAGS(newcv, flags); } last_pushed_cv = newcv; }