This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
dist/Storable/t/code.t: Fixes to run under EBCDIC
[perl5.git] / regcomp.c
1 /*    regcomp.c
2  */
3
4 /*
5  * 'A fair jaw-cracker dwarf-language must be.'            --Samwise Gamgee
6  *
7  *     [p.285 of _The Lord of the Rings_, II/iii: "The Ring Goes South"]
8  */
9
10 /* This file contains functions for compiling a regular expression.  See
11  * also regexec.c which funnily enough, contains functions for executing
12  * a regular expression.
13  *
14  * This file is also copied at build time to ext/re/re_comp.c, where
15  * it's built with -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT.
16  * This causes the main functions to be compiled under new names and with
17  * debugging support added, which makes "use re 'debug'" work.
18  */
19
20 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
21  * confused with the original package (see point 3 below).  Thanks, Henry!
22  */
23
24 /* Additional note: this code is very heavily munged from Henry's version
25  * in places.  In some spots I've traded clarity for efficiency, so don't
26  * blame Henry for some of the lack of readability.
27  */
28
29 /* The names of the functions have been changed from regcomp and
30  * regexec to pregcomp and pregexec in order to avoid conflicts
31  * with the POSIX routines of the same names.
32 */
33
34 #ifdef PERL_EXT_RE_BUILD
35 #include "re_top.h"
36 #endif
37
38 /*
39  * pregcomp and pregexec -- regsub and regerror are not used in perl
40  *
41  *      Copyright (c) 1986 by University of Toronto.
42  *      Written by Henry Spencer.  Not derived from licensed software.
43  *
44  *      Permission is granted to anyone to use this software for any
45  *      purpose on any computer system, and to redistribute it freely,
46  *      subject to the following restrictions:
47  *
48  *      1. The author is not responsible for the consequences of use of
49  *              this software, no matter how awful, even if they arise
50  *              from defects in it.
51  *
52  *      2. The origin of this software must not be misrepresented, either
53  *              by explicit claim or by omission.
54  *
55  *      3. Altered versions must be plainly marked as such, and must not
56  *              be misrepresented as being the original software.
57  *
58  *
59  ****    Alterations to Henry's code are...
60  ****
61  ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
62  ****    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
63  ****    by Larry Wall and others
64  ****
65  ****    You may distribute under the terms of either the GNU General Public
66  ****    License or the Artistic License, as specified in the README file.
67
68  *
69  * Beware that some of this code is subtly aware of the way operator
70  * precedence is structured in regular expressions.  Serious changes in
71  * regular-expression syntax might require a total rethink.
72  */
73 #include "EXTERN.h"
74 #define PERL_IN_REGCOMP_C
75 #include "perl.h"
76
77 #ifndef PERL_IN_XSUB_RE
78 #  include "INTERN.h"
79 #endif
80
81 #define REG_COMP_C
82 #ifdef PERL_IN_XSUB_RE
83 #  include "re_comp.h"
84 EXTERN_C const struct regexp_engine my_reg_engine;
85 #else
86 #  include "regcomp.h"
87 #endif
88
89 #include "dquote_static.c"
90 #include "inline_invlist.c"
91 #include "unicode_constants.h"
92
93 #define HAS_NONLATIN1_FOLD_CLOSURE(i) \
94  _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)
95 #define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(i) \
96  _HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)
97 #define IS_NON_FINAL_FOLD(c) _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
98 #define IS_IN_SOME_FOLD_L1(c) _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
99
100 #ifndef STATIC
101 #define STATIC  static
102 #endif
103
104 #ifndef MIN
105 #define MIN(a,b) ((a) < (b) ? (a) : (b))
106 #endif
107
108 /* this is a chain of data about sub patterns we are processing that
109    need to be handled separately/specially in study_chunk. Its so
110    we can simulate recursion without losing state.  */
111 struct scan_frame;
112 typedef struct scan_frame {
113     regnode *last_regnode;      /* last node to process in this frame */
114     regnode *next_regnode;      /* next node to process when last is reached */
115     U32 prev_recursed_depth;
116     I32 stopparen;              /* what stopparen do we use */
117     U32 is_top_frame;           /* what flags do we use? */
118
119     struct scan_frame *this_prev_frame; /* this previous frame */
120     struct scan_frame *prev_frame;      /* previous frame */
121     struct scan_frame *next_frame;      /* next frame */
122 } scan_frame;
123
124 /* Certain characters are output as a sequence with the first being a
125  * backslash. */
126 #define isBACKSLASHED_PUNCT(c)                                              \
127                     ((c) == '-' || (c) == ']' || (c) == '\\' || (c) == '^')
128
129
130 struct RExC_state_t {
131     U32         flags;                  /* RXf_* are we folding, multilining? */
132     U32         pm_flags;               /* PMf_* stuff from the calling PMOP */
133     char        *precomp;               /* uncompiled string. */
134     REGEXP      *rx_sv;                 /* The SV that is the regexp. */
135     regexp      *rx;                    /* perl core regexp structure */
136     regexp_internal     *rxi;           /* internal data for regexp object
137                                            pprivate field */
138     char        *start;                 /* Start of input for compile */
139     char        *end;                   /* End of input for compile */
140     char        *parse;                 /* Input-scan pointer. */
141     SSize_t     whilem_seen;            /* number of WHILEM in this expr */
142     regnode     *emit_start;            /* Start of emitted-code area */
143     regnode     *emit_bound;            /* First regnode outside of the
144                                            allocated space */
145     regnode     *emit;                  /* Code-emit pointer; if = &emit_dummy,
146                                            implies compiling, so don't emit */
147     regnode_ssc emit_dummy;             /* placeholder for emit to point to;
148                                            large enough for the largest
149                                            non-EXACTish node, so can use it as
150                                            scratch in pass1 */
151     I32         naughty;                /* How bad is this pattern? */
152     I32         sawback;                /* Did we see \1, ...? */
153     U32         seen;
154     SSize_t     size;                   /* Code size. */
155     I32                npar;            /* Capture buffer count, (OPEN) plus
156                                            one. ("par" 0 is the whole
157                                            pattern)*/
158     I32         nestroot;               /* root parens we are in - used by
159                                            accept */
160     I32         extralen;
161     I32         seen_zerolen;
162     regnode     **open_parens;          /* pointers to open parens */
163     regnode     **close_parens;         /* pointers to close parens */
164     regnode     *opend;                 /* END node in program */
165     I32         utf8;           /* whether the pattern is utf8 or not */
166     I32         orig_utf8;      /* whether the pattern was originally in utf8 */
167                                 /* XXX use this for future optimisation of case
168                                  * where pattern must be upgraded to utf8. */
169     I32         uni_semantics;  /* If a d charset modifier should use unicode
170                                    rules, even if the pattern is not in
171                                    utf8 */
172     HV          *paren_names;           /* Paren names */
173
174     regnode     **recurse;              /* Recurse regops */
175     I32         recurse_count;          /* Number of recurse regops */
176     U8          *study_chunk_recursed;  /* bitmap of which subs we have moved
177                                            through */
178     U32         study_chunk_recursed_bytes;  /* bytes in bitmap */
179     I32         in_lookbehind;
180     I32         contains_locale;
181     I32         contains_i;
182     I32         override_recoding;
183     I32         in_multi_char_class;
184     struct reg_code_block *code_blocks; /* positions of literal (?{})
185                                             within pattern */
186     int         num_code_blocks;        /* size of code_blocks[] */
187     int         code_index;             /* next code_blocks[] slot */
188     SSize_t     maxlen;                        /* mininum possible number of chars in string to match */
189     scan_frame *frame_head;
190     scan_frame *frame_last;
191     U32         frame_count;
192     U32         strict;
193 #ifdef ADD_TO_REGEXEC
194     char        *starttry;              /* -Dr: where regtry was called. */
195 #define RExC_starttry   (pRExC_state->starttry)
196 #endif
197     SV          *runtime_code_qr;       /* qr with the runtime code blocks */
198 #ifdef DEBUGGING
199     const char  *lastparse;
200     I32         lastnum;
201     AV          *paren_name_list;       /* idx -> name */
202     U32         study_chunk_recursed_count;
203     SV          *mysv1;
204     SV          *mysv2;
205 #define RExC_lastparse  (pRExC_state->lastparse)
206 #define RExC_lastnum    (pRExC_state->lastnum)
207 #define RExC_paren_name_list    (pRExC_state->paren_name_list)
208 #define RExC_study_chunk_recursed_count    (pRExC_state->study_chunk_recursed_count)
209 #define RExC_mysv       (pRExC_state->mysv1)
210 #define RExC_mysv1      (pRExC_state->mysv1)
211 #define RExC_mysv2      (pRExC_state->mysv2)
212
213 #endif
214 };
215
216 #define RExC_flags      (pRExC_state->flags)
217 #define RExC_pm_flags   (pRExC_state->pm_flags)
218 #define RExC_precomp    (pRExC_state->precomp)
219 #define RExC_rx_sv      (pRExC_state->rx_sv)
220 #define RExC_rx         (pRExC_state->rx)
221 #define RExC_rxi        (pRExC_state->rxi)
222 #define RExC_start      (pRExC_state->start)
223 #define RExC_end        (pRExC_state->end)
224 #define RExC_parse      (pRExC_state->parse)
225 #define RExC_whilem_seen        (pRExC_state->whilem_seen)
226 #ifdef RE_TRACK_PATTERN_OFFSETS
227 #define RExC_offsets    (pRExC_state->rxi->u.offsets) /* I am not like the
228                                                          others */
229 #endif
230 #define RExC_emit       (pRExC_state->emit)
231 #define RExC_emit_dummy (pRExC_state->emit_dummy)
232 #define RExC_emit_start (pRExC_state->emit_start)
233 #define RExC_emit_bound (pRExC_state->emit_bound)
234 #define RExC_sawback    (pRExC_state->sawback)
235 #define RExC_seen       (pRExC_state->seen)
236 #define RExC_size       (pRExC_state->size)
237 #define RExC_maxlen        (pRExC_state->maxlen)
238 #define RExC_npar       (pRExC_state->npar)
239 #define RExC_nestroot   (pRExC_state->nestroot)
240 #define RExC_extralen   (pRExC_state->extralen)
241 #define RExC_seen_zerolen       (pRExC_state->seen_zerolen)
242 #define RExC_utf8       (pRExC_state->utf8)
243 #define RExC_uni_semantics      (pRExC_state->uni_semantics)
244 #define RExC_orig_utf8  (pRExC_state->orig_utf8)
245 #define RExC_open_parens        (pRExC_state->open_parens)
246 #define RExC_close_parens       (pRExC_state->close_parens)
247 #define RExC_opend      (pRExC_state->opend)
248 #define RExC_paren_names        (pRExC_state->paren_names)
249 #define RExC_recurse    (pRExC_state->recurse)
250 #define RExC_recurse_count      (pRExC_state->recurse_count)
251 #define RExC_study_chunk_recursed        (pRExC_state->study_chunk_recursed)
252 #define RExC_study_chunk_recursed_bytes  \
253                                    (pRExC_state->study_chunk_recursed_bytes)
254 #define RExC_in_lookbehind      (pRExC_state->in_lookbehind)
255 #define RExC_contains_locale    (pRExC_state->contains_locale)
256 #define RExC_contains_i (pRExC_state->contains_i)
257 #define RExC_override_recoding (pRExC_state->override_recoding)
258 #define RExC_in_multi_char_class (pRExC_state->in_multi_char_class)
259 #define RExC_frame_head (pRExC_state->frame_head)
260 #define RExC_frame_last (pRExC_state->frame_last)
261 #define RExC_frame_count (pRExC_state->frame_count)
262 #define RExC_strict (pRExC_state->strict)
263
264 /* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set
265  * a flag to disable back-off on the fixed/floating substrings - if it's
266  * a high complexity pattern we assume the benefit of avoiding a full match
267  * is worth the cost of checking for the substrings even if they rarely help.
268  */
269 #define RExC_naughty    (pRExC_state->naughty)
270 #define TOO_NAUGHTY (10)
271 #define MARK_NAUGHTY(add) \
272     if (RExC_naughty < TOO_NAUGHTY) \
273         RExC_naughty += (add)
274 #define MARK_NAUGHTY_EXP(exp, add) \
275     if (RExC_naughty < TOO_NAUGHTY) \
276         RExC_naughty += RExC_naughty / (exp) + (add)
277
278 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
279 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
280         ((*s) == '{' && regcurly(s)))
281
282 /*
283  * Flags to be passed up and down.
284  */
285 #define WORST           0       /* Worst case. */
286 #define HASWIDTH        0x01    /* Known to match non-null strings. */
287
288 /* Simple enough to be STAR/PLUS operand; in an EXACTish node must be a single
289  * character.  (There needs to be a case: in the switch statement in regexec.c
290  * for any node marked SIMPLE.)  Note that this is not the same thing as
291  * REGNODE_SIMPLE */
292 #define SIMPLE          0x02
293 #define SPSTART         0x04    /* Starts with * or + */
294 #define POSTPONED       0x08    /* (?1),(?&name), (??{...}) or similar */
295 #define TRYAGAIN        0x10    /* Weeded out a declaration. */
296 #define RESTART_UTF8    0x20    /* Restart, need to calcuate sizes as UTF-8 */
297
298 #define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1)
299
300 /* whether trie related optimizations are enabled */
301 #if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
302 #define TRIE_STUDY_OPT
303 #define FULL_TRIE_STUDY
304 #define TRIE_STCLASS
305 #endif
306
307
308
309 #define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3]
310 #define PBITVAL(paren) (1 << ((paren) & 7))
311 #define PAREN_TEST(u8str,paren) ( PBYTE(u8str,paren) & PBITVAL(paren))
312 #define PAREN_SET(u8str,paren) PBYTE(u8str,paren) |= PBITVAL(paren)
313 #define PAREN_UNSET(u8str,paren) PBYTE(u8str,paren) &= (~PBITVAL(paren))
314
315 #define REQUIRE_UTF8    STMT_START {                                       \
316                                      if (!UTF) {                           \
317                                          *flagp = RESTART_UTF8;            \
318                                          return NULL;                      \
319                                      }                                     \
320                         } STMT_END
321
322 /* This converts the named class defined in regcomp.h to its equivalent class
323  * number defined in handy.h. */
324 #define namedclass_to_classnum(class)  ((int) ((class) / 2))
325 #define classnum_to_namedclass(classnum)  ((classnum) * 2)
326
327 #define _invlist_union_complement_2nd(a, b, output) \
328                         _invlist_union_maybe_complement_2nd(a, b, TRUE, output)
329 #define _invlist_intersection_complement_2nd(a, b, output) \
330                  _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output)
331
332 /* About scan_data_t.
333
334   During optimisation we recurse through the regexp program performing
335   various inplace (keyhole style) optimisations. In addition study_chunk
336   and scan_commit populate this data structure with information about
337   what strings MUST appear in the pattern. We look for the longest
338   string that must appear at a fixed location, and we look for the
339   longest string that may appear at a floating location. So for instance
340   in the pattern:
341
342     /FOO[xX]A.*B[xX]BAR/
343
344   Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating
345   strings (because they follow a .* construct). study_chunk will identify
346   both FOO and BAR as being the longest fixed and floating strings respectively.
347
348   The strings can be composites, for instance
349
350      /(f)(o)(o)/
351
352   will result in a composite fixed substring 'foo'.
353
354   For each string some basic information is maintained:
355
356   - offset or min_offset
357     This is the position the string must appear at, or not before.
358     It also implicitly (when combined with minlenp) tells us how many
359     characters must match before the string we are searching for.
360     Likewise when combined with minlenp and the length of the string it
361     tells us how many characters must appear after the string we have
362     found.
363
364   - max_offset
365     Only used for floating strings. This is the rightmost point that
366     the string can appear at. If set to SSize_t_MAX it indicates that the
367     string can occur infinitely far to the right.
368
369   - minlenp
370     A pointer to the minimum number of characters of the pattern that the
371     string was found inside. This is important as in the case of positive
372     lookahead or positive lookbehind we can have multiple patterns
373     involved. Consider
374
375     /(?=FOO).*F/
376
377     The minimum length of the pattern overall is 3, the minimum length
378     of the lookahead part is 3, but the minimum length of the part that
379     will actually match is 1. So 'FOO's minimum length is 3, but the
380     minimum length for the F is 1. This is important as the minimum length
381     is used to determine offsets in front of and behind the string being
382     looked for.  Since strings can be composites this is the length of the
383     pattern at the time it was committed with a scan_commit. Note that
384     the length is calculated by study_chunk, so that the minimum lengths
385     are not known until the full pattern has been compiled, thus the
386     pointer to the value.
387
388   - lookbehind
389
390     In the case of lookbehind the string being searched for can be
391     offset past the start point of the final matching string.
392     If this value was just blithely removed from the min_offset it would
393     invalidate some of the calculations for how many chars must match
394     before or after (as they are derived from min_offset and minlen and
395     the length of the string being searched for).
396     When the final pattern is compiled and the data is moved from the
397     scan_data_t structure into the regexp structure the information
398     about lookbehind is factored in, with the information that would
399     have been lost precalculated in the end_shift field for the
400     associated string.
401
402   The fields pos_min and pos_delta are used to store the minimum offset
403   and the delta to the maximum offset at the current point in the pattern.
404
405 */
406
407 typedef struct scan_data_t {
408     /*I32 len_min;      unused */
409     /*I32 len_delta;    unused */
410     SSize_t pos_min;
411     SSize_t pos_delta;
412     SV *last_found;
413     SSize_t last_end;       /* min value, <0 unless valid. */
414     SSize_t last_start_min;
415     SSize_t last_start_max;
416     SV **longest;           /* Either &l_fixed, or &l_float. */
417     SV *longest_fixed;      /* longest fixed string found in pattern */
418     SSize_t offset_fixed;   /* offset where it starts */
419     SSize_t *minlen_fixed;  /* pointer to the minlen relevant to the string */
420     I32 lookbehind_fixed;   /* is the position of the string modfied by LB */
421     SV *longest_float;      /* longest floating string found in pattern */
422     SSize_t offset_float_min; /* earliest point in string it can appear */
423     SSize_t offset_float_max; /* latest point in string it can appear */
424     SSize_t *minlen_float;  /* pointer to the minlen relevant to the string */
425     SSize_t lookbehind_float; /* is the pos of the string modified by LB */
426     I32 flags;
427     I32 whilem_c;
428     SSize_t *last_closep;
429     regnode_ssc *start_class;
430 } scan_data_t;
431
432 /*
433  * Forward declarations for pregcomp()'s friends.
434  */
435
436 static const scan_data_t zero_scan_data =
437   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
438
439 #define SF_BEFORE_EOL           (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
440 #define SF_BEFORE_SEOL          0x0001
441 #define SF_BEFORE_MEOL          0x0002
442 #define SF_FIX_BEFORE_EOL       (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
443 #define SF_FL_BEFORE_EOL        (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
444
445 #define SF_FIX_SHIFT_EOL        (+2)
446 #define SF_FL_SHIFT_EOL         (+4)
447
448 #define SF_FIX_BEFORE_SEOL      (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
449 #define SF_FIX_BEFORE_MEOL      (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
450
451 #define SF_FL_BEFORE_SEOL       (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
452 #define SF_FL_BEFORE_MEOL       (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
453 #define SF_IS_INF               0x0040
454 #define SF_HAS_PAR              0x0080
455 #define SF_IN_PAR               0x0100
456 #define SF_HAS_EVAL             0x0200
457 #define SCF_DO_SUBSTR           0x0400
458 #define SCF_DO_STCLASS_AND      0x0800
459 #define SCF_DO_STCLASS_OR       0x1000
460 #define SCF_DO_STCLASS          (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
461 #define SCF_WHILEM_VISITED_POS  0x2000
462
463 #define SCF_TRIE_RESTUDY        0x4000 /* Do restudy? */
464 #define SCF_SEEN_ACCEPT         0x8000
465 #define SCF_TRIE_DOING_RESTUDY 0x10000
466 #define SCF_IN_DEFINE          0x20000
467
468
469
470
471 #define UTF cBOOL(RExC_utf8)
472
473 /* The enums for all these are ordered so things work out correctly */
474 #define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET)
475 #define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags)                    \
476                                                      == REGEX_DEPENDS_CHARSET)
477 #define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET)
478 #define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags)                \
479                                                      >= REGEX_UNICODE_CHARSET)
480 #define ASCII_RESTRICTED (get_regex_charset(RExC_flags)                      \
481                                             == REGEX_ASCII_RESTRICTED_CHARSET)
482 #define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags)             \
483                                             >= REGEX_ASCII_RESTRICTED_CHARSET)
484 #define ASCII_FOLD_RESTRICTED (get_regex_charset(RExC_flags)                 \
485                                         == REGEX_ASCII_MORE_RESTRICTED_CHARSET)
486
487 #define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD)
488
489 /* For programs that want to be strictly Unicode compatible by dying if any
490  * attempt is made to match a non-Unicode code point against a Unicode
491  * property.  */
492 #define ALWAYS_WARN_SUPER  ckDEAD(packWARN(WARN_NON_UNICODE))
493
494 #define OOB_NAMEDCLASS          -1
495
496 /* There is no code point that is out-of-bounds, so this is problematic.  But
497  * its only current use is to initialize a variable that is always set before
498  * looked at. */
499 #define OOB_UNICODE             0xDEADBEEF
500
501 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
502 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
503
504
505 /* length of regex to show in messages that don't mark a position within */
506 #define RegexLengthToShowInErrorMessages 127
507
508 /*
509  * If MARKER[12] are adjusted, be sure to adjust the constants at the top
510  * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
511  * op/pragma/warn/regcomp.
512  */
513 #define MARKER1 "<-- HERE"    /* marker as it appears in the description */
514 #define MARKER2 " <-- HERE "  /* marker as it appears within the regex */
515
516 #define REPORT_LOCATION " in regex; marked by " MARKER1    \
517                         " in m/%"UTF8f MARKER2 "%"UTF8f"/"
518
519 #define REPORT_LOCATION_ARGS(offset)            \
520                 UTF8fARG(UTF, offset, RExC_precomp), \
521                 UTF8fARG(UTF, RExC_end - RExC_precomp - offset, RExC_precomp + offset)
522
523 /* Used to point after bad bytes for an error message, but avoid skipping
524  * past a nul byte. */
525 #define SKIP_IF_CHAR(s) (!*(s) ? 0 : UTF ? UTF8SKIP(s) : 1)
526
527 /*
528  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
529  * arg. Show regex, up to a maximum length. If it's too long, chop and add
530  * "...".
531  */
532 #define _FAIL(code) STMT_START {                                        \
533     const char *ellipses = "";                                          \
534     IV len = RExC_end - RExC_precomp;                                   \
535                                                                         \
536     if (!SIZE_ONLY)                                                     \
537         SAVEFREESV(RExC_rx_sv);                                         \
538     if (len > RegexLengthToShowInErrorMessages) {                       \
539         /* chop 10 shorter than the max, to ensure meaning of "..." */  \
540         len = RegexLengthToShowInErrorMessages - 10;                    \
541         ellipses = "...";                                               \
542     }                                                                   \
543     code;                                                               \
544 } STMT_END
545
546 #define FAIL(msg) _FAIL(                            \
547     Perl_croak(aTHX_ "%s in regex m/%"UTF8f"%s/",           \
548             msg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
549
550 #define FAIL2(msg,arg) _FAIL(                       \
551     Perl_croak(aTHX_ msg " in regex m/%"UTF8f"%s/",         \
552             arg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
553
554 /*
555  * Simple_vFAIL -- like FAIL, but marks the current location in the scan
556  */
557 #define Simple_vFAIL(m) STMT_START {                                    \
558     const IV offset =                                                   \
559         (RExC_parse > RExC_end ? RExC_end : RExC_parse) - RExC_precomp; \
560     Perl_croak(aTHX_ "%s" REPORT_LOCATION,                              \
561             m, REPORT_LOCATION_ARGS(offset));   \
562 } STMT_END
563
564 /*
565  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
566  */
567 #define vFAIL(m) STMT_START {                           \
568     if (!SIZE_ONLY)                                     \
569         SAVEFREESV(RExC_rx_sv);                         \
570     Simple_vFAIL(m);                                    \
571 } STMT_END
572
573 /*
574  * Like Simple_vFAIL(), but accepts two arguments.
575  */
576 #define Simple_vFAIL2(m,a1) STMT_START {                        \
577     const IV offset = RExC_parse - RExC_precomp;                        \
578     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1,                      \
579                       REPORT_LOCATION_ARGS(offset));    \
580 } STMT_END
581
582 /*
583  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
584  */
585 #define vFAIL2(m,a1) STMT_START {                       \
586     if (!SIZE_ONLY)                                     \
587         SAVEFREESV(RExC_rx_sv);                         \
588     Simple_vFAIL2(m, a1);                               \
589 } STMT_END
590
591
592 /*
593  * Like Simple_vFAIL(), but accepts three arguments.
594  */
595 #define Simple_vFAIL3(m, a1, a2) STMT_START {                   \
596     const IV offset = RExC_parse - RExC_precomp;                \
597     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, a2,          \
598             REPORT_LOCATION_ARGS(offset));      \
599 } STMT_END
600
601 /*
602  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
603  */
604 #define vFAIL3(m,a1,a2) STMT_START {                    \
605     if (!SIZE_ONLY)                                     \
606         SAVEFREESV(RExC_rx_sv);                         \
607     Simple_vFAIL3(m, a1, a2);                           \
608 } STMT_END
609
610 /*
611  * Like Simple_vFAIL(), but accepts four arguments.
612  */
613 #define Simple_vFAIL4(m, a1, a2, a3) STMT_START {               \
614     const IV offset = RExC_parse - RExC_precomp;                \
615     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, a2, a3,              \
616             REPORT_LOCATION_ARGS(offset));      \
617 } STMT_END
618
619 #define vFAIL4(m,a1,a2,a3) STMT_START {                 \
620     if (!SIZE_ONLY)                                     \
621         SAVEFREESV(RExC_rx_sv);                         \
622     Simple_vFAIL4(m, a1, a2, a3);                       \
623 } STMT_END
624
625 /* A specialized version of vFAIL2 that works with UTF8f */
626 #define vFAIL2utf8f(m, a1) STMT_START { \
627     const IV offset = RExC_parse - RExC_precomp;   \
628     if (!SIZE_ONLY)                                \
629         SAVEFREESV(RExC_rx_sv);                    \
630     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, \
631             REPORT_LOCATION_ARGS(offset));         \
632 } STMT_END
633
634 /* These have asserts in them because of [perl #122671] Many warnings in
635  * regcomp.c can occur twice.  If they get output in pass1 and later in that
636  * pass, the pattern has to be converted to UTF-8 and the pass restarted, they
637  * would get output again.  So they should be output in pass2, and these
638  * asserts make sure new warnings follow that paradigm. */
639
640 /* m is not necessarily a "literal string", in this macro */
641 #define reg_warn_non_literal_string(loc, m) STMT_START {                \
642     const IV offset = loc - RExC_precomp;                               \
643     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s" REPORT_LOCATION,      \
644             m, REPORT_LOCATION_ARGS(offset));       \
645 } STMT_END
646
647 #define ckWARNreg(loc,m) STMT_START {                                   \
648     const IV offset = loc - RExC_precomp;                               \
649     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
650             REPORT_LOCATION_ARGS(offset));              \
651 } STMT_END
652
653 #define vWARN(loc, m) STMT_START {                                      \
654     const IV offset = loc - RExC_precomp;                               \
655     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,        \
656             REPORT_LOCATION_ARGS(offset));              \
657 } STMT_END
658
659 #define vWARN_dep(loc, m) STMT_START {                                  \
660     const IV offset = loc - RExC_precomp;                               \
661     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), m REPORT_LOCATION,    \
662             REPORT_LOCATION_ARGS(offset));              \
663 } STMT_END
664
665 #define ckWARNdep(loc,m) STMT_START {                                   \
666     const IV offset = loc - RExC_precomp;                               \
667     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),                  \
668             m REPORT_LOCATION,                                          \
669             REPORT_LOCATION_ARGS(offset));              \
670 } STMT_END
671
672 #define ckWARNregdep(loc,m) STMT_START {                                \
673     const IV offset = loc - RExC_precomp;                               \
674     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP),    \
675             m REPORT_LOCATION,                                          \
676             REPORT_LOCATION_ARGS(offset));              \
677 } STMT_END
678
679 #define ckWARN2reg_d(loc,m, a1) STMT_START {                            \
680     const IV offset = loc - RExC_precomp;                               \
681     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN(WARN_REGEXP),                      \
682             m REPORT_LOCATION,                                          \
683             a1, REPORT_LOCATION_ARGS(offset));  \
684 } STMT_END
685
686 #define ckWARN2reg(loc, m, a1) STMT_START {                             \
687     const IV offset = loc - RExC_precomp;                               \
688     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
689             a1, REPORT_LOCATION_ARGS(offset));  \
690 } STMT_END
691
692 #define vWARN3(loc, m, a1, a2) STMT_START {                             \
693     const IV offset = loc - RExC_precomp;                               \
694     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
695             a1, a2, REPORT_LOCATION_ARGS(offset));      \
696 } STMT_END
697
698 #define ckWARN3reg(loc, m, a1, a2) STMT_START {                         \
699     const IV offset = loc - RExC_precomp;                               \
700     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
701             a1, a2, REPORT_LOCATION_ARGS(offset));      \
702 } STMT_END
703
704 #define vWARN4(loc, m, a1, a2, a3) STMT_START {                         \
705     const IV offset = loc - RExC_precomp;                               \
706     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
707             a1, a2, a3, REPORT_LOCATION_ARGS(offset)); \
708 } STMT_END
709
710 #define ckWARN4reg(loc, m, a1, a2, a3) STMT_START {                     \
711     const IV offset = loc - RExC_precomp;                               \
712     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
713             a1, a2, a3, REPORT_LOCATION_ARGS(offset)); \
714 } STMT_END
715
716 #define vWARN5(loc, m, a1, a2, a3, a4) STMT_START {                     \
717     const IV offset = loc - RExC_precomp;                               \
718     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
719             a1, a2, a3, a4, REPORT_LOCATION_ARGS(offset)); \
720 } STMT_END
721
722 /* Macros for recording node offsets.   20001227 mjd@plover.com
723  * Nodes are numbered 1, 2, 3, 4.  Node #n's position is recorded in
724  * element 2*n-1 of the array.  Element #2n holds the byte length node #n.
725  * Element 0 holds the number n.
726  * Position is 1 indexed.
727  */
728 #ifndef RE_TRACK_PATTERN_OFFSETS
729 #define Set_Node_Offset_To_R(node,byte)
730 #define Set_Node_Offset(node,byte)
731 #define Set_Cur_Node_Offset
732 #define Set_Node_Length_To_R(node,len)
733 #define Set_Node_Length(node,len)
734 #define Set_Node_Cur_Length(node,start)
735 #define Node_Offset(n)
736 #define Node_Length(n)
737 #define Set_Node_Offset_Length(node,offset,len)
738 #define ProgLen(ri) ri->u.proglen
739 #define SetProgLen(ri,x) ri->u.proglen = x
740 #else
741 #define ProgLen(ri) ri->u.offsets[0]
742 #define SetProgLen(ri,x) ri->u.offsets[0] = x
743 #define Set_Node_Offset_To_R(node,byte) STMT_START {                    \
744     if (! SIZE_ONLY) {                                                  \
745         MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n",         \
746                     __LINE__, (int)(node), (int)(byte)));               \
747         if((node) < 0) {                                                \
748             Perl_croak(aTHX_ "value of node is %d in Offset macro",     \
749                                          (int)(node));                  \
750         } else {                                                        \
751             RExC_offsets[2*(node)-1] = (byte);                          \
752         }                                                               \
753     }                                                                   \
754 } STMT_END
755
756 #define Set_Node_Offset(node,byte) \
757     Set_Node_Offset_To_R((node)-RExC_emit_start, (byte)-RExC_start)
758 #define Set_Cur_Node_Offset Set_Node_Offset(RExC_emit, RExC_parse)
759
760 #define Set_Node_Length_To_R(node,len) STMT_START {                     \
761     if (! SIZE_ONLY) {                                                  \
762         MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n",           \
763                 __LINE__, (int)(node), (int)(len)));                    \
764         if((node) < 0) {                                                \
765             Perl_croak(aTHX_ "value of node is %d in Length macro",     \
766                                          (int)(node));                  \
767         } else {                                                        \
768             RExC_offsets[2*(node)] = (len);                             \
769         }                                                               \
770     }                                                                   \
771 } STMT_END
772
773 #define Set_Node_Length(node,len) \
774     Set_Node_Length_To_R((node)-RExC_emit_start, len)
775 #define Set_Node_Cur_Length(node, start)                \
776     Set_Node_Length(node, RExC_parse - start)
777
778 /* Get offsets and lengths */
779 #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1])
780 #define Node_Length(n) (RExC_offsets[2*((n)-RExC_emit_start)])
781
782 #define Set_Node_Offset_Length(node,offset,len) STMT_START {    \
783     Set_Node_Offset_To_R((node)-RExC_emit_start, (offset));     \
784     Set_Node_Length_To_R((node)-RExC_emit_start, (len));        \
785 } STMT_END
786 #endif
787
788 #if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
789 #define EXPERIMENTAL_INPLACESCAN
790 #endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/
791
792 #define DEBUG_RExC_seen() \
793         DEBUG_OPTIMISE_MORE_r({                                             \
794             PerlIO_printf(Perl_debug_log,"RExC_seen: ");                    \
795                                                                             \
796             if (RExC_seen & REG_ZERO_LEN_SEEN)                              \
797                 PerlIO_printf(Perl_debug_log,"REG_ZERO_LEN_SEEN ");         \
798                                                                             \
799             if (RExC_seen & REG_LOOKBEHIND_SEEN)                            \
800                 PerlIO_printf(Perl_debug_log,"REG_LOOKBEHIND_SEEN ");       \
801                                                                             \
802             if (RExC_seen & REG_GPOS_SEEN)                                  \
803                 PerlIO_printf(Perl_debug_log,"REG_GPOS_SEEN ");             \
804                                                                             \
805             if (RExC_seen & REG_CANY_SEEN)                                  \
806                 PerlIO_printf(Perl_debug_log,"REG_CANY_SEEN ");             \
807                                                                             \
808             if (RExC_seen & REG_RECURSE_SEEN)                               \
809                 PerlIO_printf(Perl_debug_log,"REG_RECURSE_SEEN ");          \
810                                                                             \
811             if (RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)                         \
812                 PerlIO_printf(Perl_debug_log,"REG_TOP_LEVEL_BRANCHES_SEEN ");    \
813                                                                             \
814             if (RExC_seen & REG_VERBARG_SEEN)                               \
815                 PerlIO_printf(Perl_debug_log,"REG_VERBARG_SEEN ");          \
816                                                                             \
817             if (RExC_seen & REG_CUTGROUP_SEEN)                              \
818                 PerlIO_printf(Perl_debug_log,"REG_CUTGROUP_SEEN ");         \
819                                                                             \
820             if (RExC_seen & REG_RUN_ON_COMMENT_SEEN)                        \
821                 PerlIO_printf(Perl_debug_log,"REG_RUN_ON_COMMENT_SEEN ");   \
822                                                                             \
823             if (RExC_seen & REG_UNFOLDED_MULTI_SEEN)                        \
824                 PerlIO_printf(Perl_debug_log,"REG_UNFOLDED_MULTI_SEEN ");   \
825                                                                             \
826             if (RExC_seen & REG_GOSTART_SEEN)                               \
827                 PerlIO_printf(Perl_debug_log,"REG_GOSTART_SEEN ");          \
828                                                                             \
829             if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)                               \
830                 PerlIO_printf(Perl_debug_log,"REG_UNBOUNDED_QUANTIFIER_SEEN ");          \
831                                                                             \
832             PerlIO_printf(Perl_debug_log,"\n");                             \
833         });
834
835 #define DEBUG_SHOW_STUDY_FLAG(flags,flag) \
836   if ((flags) & flag) PerlIO_printf(Perl_debug_log, "%s ", #flag)
837
838 #define DEBUG_SHOW_STUDY_FLAGS(flags,open_str,close_str)                    \
839     if ( ( flags ) ) {                                                      \
840         PerlIO_printf(Perl_debug_log, "%s", open_str);                      \
841         DEBUG_SHOW_STUDY_FLAG(flags,SF_FL_BEFORE_SEOL);                     \
842         DEBUG_SHOW_STUDY_FLAG(flags,SF_FL_BEFORE_MEOL);                     \
843         DEBUG_SHOW_STUDY_FLAG(flags,SF_IS_INF);                             \
844         DEBUG_SHOW_STUDY_FLAG(flags,SF_HAS_PAR);                            \
845         DEBUG_SHOW_STUDY_FLAG(flags,SF_IN_PAR);                             \
846         DEBUG_SHOW_STUDY_FLAG(flags,SF_HAS_EVAL);                           \
847         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_SUBSTR);                         \
848         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS_AND);                    \
849         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS_OR);                     \
850         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS);                        \
851         DEBUG_SHOW_STUDY_FLAG(flags,SCF_WHILEM_VISITED_POS);                \
852         DEBUG_SHOW_STUDY_FLAG(flags,SCF_TRIE_RESTUDY);                      \
853         DEBUG_SHOW_STUDY_FLAG(flags,SCF_SEEN_ACCEPT);                       \
854         DEBUG_SHOW_STUDY_FLAG(flags,SCF_TRIE_DOING_RESTUDY);                \
855         DEBUG_SHOW_STUDY_FLAG(flags,SCF_IN_DEFINE);                         \
856         PerlIO_printf(Perl_debug_log, "%s", close_str);                     \
857     }
858
859
860 #define DEBUG_STUDYDATA(str,data,depth)                              \
861 DEBUG_OPTIMISE_MORE_r(if(data){                                      \
862     PerlIO_printf(Perl_debug_log,                                    \
863         "%*s" str "Pos:%"IVdf"/%"IVdf                                \
864         " Flags: 0x%"UVXf,                                           \
865         (int)(depth)*2, "",                                          \
866         (IV)((data)->pos_min),                                       \
867         (IV)((data)->pos_delta),                                     \
868         (UV)((data)->flags)                                          \
869     );                                                               \
870     DEBUG_SHOW_STUDY_FLAGS((data)->flags," [ ","]");                 \
871     PerlIO_printf(Perl_debug_log,                                    \
872         " Whilem_c: %"IVdf" Lcp: %"IVdf" %s",                        \
873         (IV)((data)->whilem_c),                                      \
874         (IV)((data)->last_closep ? *((data)->last_closep) : -1),     \
875         is_inf ? "INF " : ""                                         \
876     );                                                               \
877     if ((data)->last_found)                                          \
878         PerlIO_printf(Perl_debug_log,                                \
879             "Last:'%s' %"IVdf":%"IVdf"/%"IVdf" %sFixed:'%s' @ %"IVdf \
880             " %sFloat: '%s' @ %"IVdf"/%"IVdf"",                      \
881             SvPVX_const((data)->last_found),                         \
882             (IV)((data)->last_end),                                  \
883             (IV)((data)->last_start_min),                            \
884             (IV)((data)->last_start_max),                            \
885             ((data)->longest &&                                      \
886              (data)->longest==&((data)->longest_fixed)) ? "*" : "",  \
887             SvPVX_const((data)->longest_fixed),                      \
888             (IV)((data)->offset_fixed),                              \
889             ((data)->longest &&                                      \
890              (data)->longest==&((data)->longest_float)) ? "*" : "",  \
891             SvPVX_const((data)->longest_float),                      \
892             (IV)((data)->offset_float_min),                          \
893             (IV)((data)->offset_float_max)                           \
894         );                                                           \
895     PerlIO_printf(Perl_debug_log,"\n");                              \
896 });
897
898 /* is c a control character for which we have a mnemonic? */
899 #define isMNEMONIC_CNTRL(c) _IS_MNEMONIC_CNTRL_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
900
901 STATIC const char *
902 S_cntrl_to_mnemonic(const U8 c)
903 {
904     /* Returns the mnemonic string that represents character 'c', if one
905      * exists; NULL otherwise.  The only ones that exist for the purposes of
906      * this routine are a few control characters */
907
908     switch (c) {
909         case '\a':       return "\\a";
910         case '\b':       return "\\b";
911         case ESC_NATIVE: return "\\e";
912         case '\f':       return "\\f";
913         case '\n':       return "\\n";
914         case '\r':       return "\\r";
915         case '\t':       return "\\t";
916     }
917
918     return NULL;
919 }
920
921 /* Mark that we cannot extend a found fixed substring at this point.
922    Update the longest found anchored substring and the longest found
923    floating substrings if needed. */
924
925 STATIC void
926 S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data,
927                     SSize_t *minlenp, int is_inf)
928 {
929     const STRLEN l = CHR_SVLEN(data->last_found);
930     const STRLEN old_l = CHR_SVLEN(*data->longest);
931     GET_RE_DEBUG_FLAGS_DECL;
932
933     PERL_ARGS_ASSERT_SCAN_COMMIT;
934
935     if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
936         SvSetMagicSV(*data->longest, data->last_found);
937         if (*data->longest == data->longest_fixed) {
938             data->offset_fixed = l ? data->last_start_min : data->pos_min;
939             if (data->flags & SF_BEFORE_EOL)
940                 data->flags
941                     |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
942             else
943                 data->flags &= ~SF_FIX_BEFORE_EOL;
944             data->minlen_fixed=minlenp;
945             data->lookbehind_fixed=0;
946         }
947         else { /* *data->longest == data->longest_float */
948             data->offset_float_min = l ? data->last_start_min : data->pos_min;
949             data->offset_float_max = (l
950                           ? data->last_start_max
951                           : (data->pos_delta > SSize_t_MAX - data->pos_min
952                                          ? SSize_t_MAX
953                                          : data->pos_min + data->pos_delta));
954             if (is_inf
955                  || (STRLEN)data->offset_float_max > (STRLEN)SSize_t_MAX)
956                 data->offset_float_max = SSize_t_MAX;
957             if (data->flags & SF_BEFORE_EOL)
958                 data->flags
959                     |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
960             else
961                 data->flags &= ~SF_FL_BEFORE_EOL;
962             data->minlen_float=minlenp;
963             data->lookbehind_float=0;
964         }
965     }
966     SvCUR_set(data->last_found, 0);
967     {
968         SV * const sv = data->last_found;
969         if (SvUTF8(sv) && SvMAGICAL(sv)) {
970             MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8);
971             if (mg)
972                 mg->mg_len = 0;
973         }
974     }
975     data->last_end = -1;
976     data->flags &= ~SF_BEFORE_EOL;
977     DEBUG_STUDYDATA("commit: ",data,0);
978 }
979
980 /* An SSC is just a regnode_charclass_posix with an extra field: the inversion
981  * list that describes which code points it matches */
982
983 STATIC void
984 S_ssc_anything(pTHX_ regnode_ssc *ssc)
985 {
986     /* Set the SSC 'ssc' to match an empty string or any code point */
987
988     PERL_ARGS_ASSERT_SSC_ANYTHING;
989
990     assert(is_ANYOF_SYNTHETIC(ssc));
991
992     ssc->invlist = sv_2mortal(_new_invlist(2)); /* mortalize so won't leak */
993     _append_range_to_invlist(ssc->invlist, 0, UV_MAX);
994     ANYOF_FLAGS(ssc) |= SSC_MATCHES_EMPTY_STRING;  /* Plus matches empty */
995 }
996
997 STATIC int
998 S_ssc_is_anything(const regnode_ssc *ssc)
999 {
1000     /* Returns TRUE if the SSC 'ssc' can match the empty string and any code
1001      * point; FALSE otherwise.  Thus, this is used to see if using 'ssc' buys
1002      * us anything: if the function returns TRUE, 'ssc' hasn't been restricted
1003      * in any way, so there's no point in using it */
1004
1005     UV start, end;
1006     bool ret;
1007
1008     PERL_ARGS_ASSERT_SSC_IS_ANYTHING;
1009
1010     assert(is_ANYOF_SYNTHETIC(ssc));
1011
1012     if (! (ANYOF_FLAGS(ssc) & SSC_MATCHES_EMPTY_STRING)) {
1013         return FALSE;
1014     }
1015
1016     /* See if the list consists solely of the range 0 - Infinity */
1017     invlist_iterinit(ssc->invlist);
1018     ret = invlist_iternext(ssc->invlist, &start, &end)
1019           && start == 0
1020           && end == UV_MAX;
1021
1022     invlist_iterfinish(ssc->invlist);
1023
1024     if (ret) {
1025         return TRUE;
1026     }
1027
1028     /* If e.g., both \w and \W are set, matches everything */
1029     if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1030         int i;
1031         for (i = 0; i < ANYOF_POSIXL_MAX; i += 2) {
1032             if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i+1)) {
1033                 return TRUE;
1034             }
1035         }
1036     }
1037
1038     return FALSE;
1039 }
1040
1041 STATIC void
1042 S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc)
1043 {
1044     /* Initializes the SSC 'ssc'.  This includes setting it to match an empty
1045      * string, any code point, or any posix class under locale */
1046
1047     PERL_ARGS_ASSERT_SSC_INIT;
1048
1049     Zero(ssc, 1, regnode_ssc);
1050     set_ANYOF_SYNTHETIC(ssc);
1051     ARG_SET(ssc, ANYOF_ONLY_HAS_BITMAP);
1052     ssc_anything(ssc);
1053
1054     /* If any portion of the regex is to operate under locale rules that aren't
1055      * fully known at compile time, initialization includes it.  The reason
1056      * this isn't done for all regexes is that the optimizer was written under
1057      * the assumption that locale was all-or-nothing.  Given the complexity and
1058      * lack of documentation in the optimizer, and that there are inadequate
1059      * test cases for locale, many parts of it may not work properly, it is
1060      * safest to avoid locale unless necessary. */
1061     if (RExC_contains_locale) {
1062         ANYOF_POSIXL_SETALL(ssc);
1063     }
1064     else {
1065         ANYOF_POSIXL_ZERO(ssc);
1066     }
1067 }
1068
1069 STATIC int
1070 S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state,
1071                         const regnode_ssc *ssc)
1072 {
1073     /* Returns TRUE if the SSC 'ssc' is in its initial state with regard only
1074      * to the list of code points matched, and locale posix classes; hence does
1075      * not check its flags) */
1076
1077     UV start, end;
1078     bool ret;
1079
1080     PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT;
1081
1082     assert(is_ANYOF_SYNTHETIC(ssc));
1083
1084     invlist_iterinit(ssc->invlist);
1085     ret = invlist_iternext(ssc->invlist, &start, &end)
1086           && start == 0
1087           && end == UV_MAX;
1088
1089     invlist_iterfinish(ssc->invlist);
1090
1091     if (! ret) {
1092         return FALSE;
1093     }
1094
1095     if (RExC_contains_locale && ! ANYOF_POSIXL_SSC_TEST_ALL_SET(ssc)) {
1096         return FALSE;
1097     }
1098
1099     return TRUE;
1100 }
1101
1102 STATIC SV*
1103 S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
1104                                const regnode_charclass* const node)
1105 {
1106     /* Returns a mortal inversion list defining which code points are matched
1107      * by 'node', which is of type ANYOF.  Handles complementing the result if
1108      * appropriate.  If some code points aren't knowable at this time, the
1109      * returned list must, and will, contain every code point that is a
1110      * possibility. */
1111
1112     SV* invlist = sv_2mortal(_new_invlist(0));
1113     SV* only_utf8_locale_invlist = NULL;
1114     unsigned int i;
1115     const U32 n = ARG(node);
1116     bool new_node_has_latin1 = FALSE;
1117
1118     PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC;
1119
1120     /* Look at the data structure created by S_set_ANYOF_arg() */
1121     if (n != ANYOF_ONLY_HAS_BITMAP) {
1122         SV * const rv = MUTABLE_SV(RExC_rxi->data->data[n]);
1123         AV * const av = MUTABLE_AV(SvRV(rv));
1124         SV **const ary = AvARRAY(av);
1125         assert(RExC_rxi->data->what[n] == 's');
1126
1127         if (ary[1] && ary[1] != &PL_sv_undef) { /* Has compile-time swash */
1128             invlist = sv_2mortal(invlist_clone(_get_swash_invlist(ary[1])));
1129         }
1130         else if (ary[0] && ary[0] != &PL_sv_undef) {
1131
1132             /* Here, no compile-time swash, and there are things that won't be
1133              * known until runtime -- we have to assume it could be anything */
1134             return _add_range_to_invlist(invlist, 0, UV_MAX);
1135         }
1136         else if (ary[3] && ary[3] != &PL_sv_undef) {
1137
1138             /* Here no compile-time swash, and no run-time only data.  Use the
1139              * node's inversion list */
1140             invlist = sv_2mortal(invlist_clone(ary[3]));
1141         }
1142
1143         /* Get the code points valid only under UTF-8 locales */
1144         if ((ANYOF_FLAGS(node) & ANYOF_LOC_FOLD)
1145             && ary[2] && ary[2] != &PL_sv_undef)
1146         {
1147             only_utf8_locale_invlist = ary[2];
1148         }
1149     }
1150
1151     /* An ANYOF node contains a bitmap for the first NUM_ANYOF_CODE_POINTS
1152      * code points, and an inversion list for the others, but if there are code
1153      * points that should match only conditionally on the target string being
1154      * UTF-8, those are placed in the inversion list, and not the bitmap.
1155      * Since there are circumstances under which they could match, they are
1156      * included in the SSC.  But if the ANYOF node is to be inverted, we have
1157      * to exclude them here, so that when we invert below, the end result
1158      * actually does include them.  (Think about "\xe0" =~ /[^\xc0]/di;).  We
1159      * have to do this here before we add the unconditionally matched code
1160      * points */
1161     if (ANYOF_FLAGS(node) & ANYOF_INVERT) {
1162         _invlist_intersection_complement_2nd(invlist,
1163                                              PL_UpperLatin1,
1164                                              &invlist);
1165     }
1166
1167     /* Add in the points from the bit map */
1168     for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
1169         if (ANYOF_BITMAP_TEST(node, i)) {
1170             invlist = add_cp_to_invlist(invlist, i);
1171             new_node_has_latin1 = TRUE;
1172         }
1173     }
1174
1175     /* If this can match all upper Latin1 code points, have to add them
1176      * as well */
1177     if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII) {
1178         _invlist_union(invlist, PL_UpperLatin1, &invlist);
1179     }
1180
1181     /* Similarly for these */
1182     if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
1183         _invlist_union_complement_2nd(invlist, PL_InBitmap, &invlist);
1184     }
1185
1186     if (ANYOF_FLAGS(node) & ANYOF_INVERT) {
1187         _invlist_invert(invlist);
1188     }
1189     else if (new_node_has_latin1 && ANYOF_FLAGS(node) & ANYOF_LOC_FOLD) {
1190
1191         /* Under /li, any 0-255 could fold to any other 0-255, depending on the
1192          * locale.  We can skip this if there are no 0-255 at all. */
1193         _invlist_union(invlist, PL_Latin1, &invlist);
1194     }
1195
1196     /* Similarly add the UTF-8 locale possible matches.  These have to be
1197      * deferred until after the non-UTF-8 locale ones are taken care of just
1198      * above, or it leads to wrong results under ANYOF_INVERT */
1199     if (only_utf8_locale_invlist) {
1200         _invlist_union_maybe_complement_2nd(invlist,
1201                                             only_utf8_locale_invlist,
1202                                             ANYOF_FLAGS(node) & ANYOF_INVERT,
1203                                             &invlist);
1204     }
1205
1206     return invlist;
1207 }
1208
1209 /* These two functions currently do the exact same thing */
1210 #define ssc_init_zero           ssc_init
1211
1212 #define ssc_add_cp(ssc, cp)   ssc_add_range((ssc), (cp), (cp))
1213 #define ssc_match_all_cp(ssc) ssc_add_range(ssc, 0, UV_MAX)
1214
1215 /* 'AND' a given class with another one.  Can create false positives.  'ssc'
1216  * should not be inverted.  'and_with->flags & ANYOF_MATCHES_POSIXL' should be
1217  * 0 if 'and_with' is a regnode_charclass instead of a regnode_ssc. */
1218
1219 STATIC void
1220 S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
1221                 const regnode_charclass *and_with)
1222 {
1223     /* Accumulate into SSC 'ssc' its 'AND' with 'and_with', which is either
1224      * another SSC or a regular ANYOF class.  Can create false positives. */
1225
1226     SV* anded_cp_list;
1227     U8  anded_flags;
1228
1229     PERL_ARGS_ASSERT_SSC_AND;
1230
1231     assert(is_ANYOF_SYNTHETIC(ssc));
1232
1233     /* 'and_with' is used as-is if it too is an SSC; otherwise have to extract
1234      * the code point inversion list and just the relevant flags */
1235     if (is_ANYOF_SYNTHETIC(and_with)) {
1236         anded_cp_list = ((regnode_ssc *)and_with)->invlist;
1237         anded_flags = ANYOF_FLAGS(and_with);
1238
1239         /* XXX This is a kludge around what appears to be deficiencies in the
1240          * optimizer.  If we make S_ssc_anything() add in the WARN_SUPER flag,
1241          * there are paths through the optimizer where it doesn't get weeded
1242          * out when it should.  And if we don't make some extra provision for
1243          * it like the code just below, it doesn't get added when it should.
1244          * This solution is to add it only when AND'ing, which is here, and
1245          * only when what is being AND'ed is the pristine, original node
1246          * matching anything.  Thus it is like adding it to ssc_anything() but
1247          * only when the result is to be AND'ed.  Probably the same solution
1248          * could be adopted for the same problem we have with /l matching,
1249          * which is solved differently in S_ssc_init(), and that would lead to
1250          * fewer false positives than that solution has.  But if this solution
1251          * creates bugs, the consequences are only that a warning isn't raised
1252          * that should be; while the consequences for having /l bugs is
1253          * incorrect matches */
1254         if (ssc_is_anything((regnode_ssc *)and_with)) {
1255             anded_flags |= ANYOF_WARN_SUPER;
1256         }
1257     }
1258     else {
1259         anded_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, and_with);
1260         anded_flags = ANYOF_FLAGS(and_with) & ANYOF_COMMON_FLAGS;
1261     }
1262
1263     ANYOF_FLAGS(ssc) &= anded_flags;
1264
1265     /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
1266      * C2 is the list of code points in 'and-with'; P2, its posix classes.
1267      * 'and_with' may be inverted.  When not inverted, we have the situation of
1268      * computing:
1269      *  (C1 | P1) & (C2 | P2)
1270      *                     =  (C1 & (C2 | P2)) | (P1 & (C2 | P2))
1271      *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
1272      *                    <=  ((C1 & C2) |       P2)) | ( P1       | (P1 & P2))
1273      *                    <=  ((C1 & C2) | P1 | P2)
1274      * Alternatively, the last few steps could be:
1275      *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
1276      *                    <=  ((C1 & C2) |  C1      ) | (      C2  | (P1 & P2))
1277      *                    <=  (C1 | C2 | (P1 & P2))
1278      * We favor the second approach if either P1 or P2 is non-empty.  This is
1279      * because these components are a barrier to doing optimizations, as what
1280      * they match cannot be known until the moment of matching as they are
1281      * dependent on the current locale, 'AND"ing them likely will reduce or
1282      * eliminate them.
1283      * But we can do better if we know that C1,P1 are in their initial state (a
1284      * frequent occurrence), each matching everything:
1285      *  (<everything>) & (C2 | P2) =  C2 | P2
1286      * Similarly, if C2,P2 are in their initial state (again a frequent
1287      * occurrence), the result is a no-op
1288      *  (C1 | P1) & (<everything>) =  C1 | P1
1289      *
1290      * Inverted, we have
1291      *  (C1 | P1) & ~(C2 | P2)  =  (C1 | P1) & (~C2 & ~P2)
1292      *                          =  (C1 & (~C2 & ~P2)) | (P1 & (~C2 & ~P2))
1293      *                         <=  (C1 & ~C2) | (P1 & ~P2)
1294      * */
1295
1296     if ((ANYOF_FLAGS(and_with) & ANYOF_INVERT)
1297         && ! is_ANYOF_SYNTHETIC(and_with))
1298     {
1299         unsigned int i;
1300
1301         ssc_intersection(ssc,
1302                          anded_cp_list,
1303                          FALSE /* Has already been inverted */
1304                          );
1305
1306         /* If either P1 or P2 is empty, the intersection will be also; can skip
1307          * the loop */
1308         if (! (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL)) {
1309             ANYOF_POSIXL_ZERO(ssc);
1310         }
1311         else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1312
1313             /* Note that the Posix class component P from 'and_with' actually
1314              * looks like:
1315              *      P = Pa | Pb | ... | Pn
1316              * where each component is one posix class, such as in [\w\s].
1317              * Thus
1318              *      ~P = ~(Pa | Pb | ... | Pn)
1319              *         = ~Pa & ~Pb & ... & ~Pn
1320              *        <= ~Pa | ~Pb | ... | ~Pn
1321              * The last is something we can easily calculate, but unfortunately
1322              * is likely to have many false positives.  We could do better
1323              * in some (but certainly not all) instances if two classes in
1324              * P have known relationships.  For example
1325              *      :lower: <= :alpha: <= :alnum: <= \w <= :graph: <= :print:
1326              * So
1327              *      :lower: & :print: = :lower:
1328              * And similarly for classes that must be disjoint.  For example,
1329              * since \s and \w can have no elements in common based on rules in
1330              * the POSIX standard,
1331              *      \w & ^\S = nothing
1332              * Unfortunately, some vendor locales do not meet the Posix
1333              * standard, in particular almost everything by Microsoft.
1334              * The loop below just changes e.g., \w into \W and vice versa */
1335
1336             regnode_charclass_posixl temp;
1337             int add = 1;    /* To calculate the index of the complement */
1338
1339             ANYOF_POSIXL_ZERO(&temp);
1340             for (i = 0; i < ANYOF_MAX; i++) {
1341                 assert(i % 2 != 0
1342                        || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)
1343                        || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i + 1));
1344
1345                 if (ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)) {
1346                     ANYOF_POSIXL_SET(&temp, i + add);
1347                 }
1348                 add = 0 - add; /* 1 goes to -1; -1 goes to 1 */
1349             }
1350             ANYOF_POSIXL_AND(&temp, ssc);
1351
1352         } /* else ssc already has no posixes */
1353     } /* else: Not inverted.  This routine is a no-op if 'and_with' is an SSC
1354          in its initial state */
1355     else if (! is_ANYOF_SYNTHETIC(and_with)
1356              || ! ssc_is_cp_posixl_init(pRExC_state, (regnode_ssc *)and_with))
1357     {
1358         /* But if 'ssc' is in its initial state, the result is just 'and_with';
1359          * copy it over 'ssc' */
1360         if (ssc_is_cp_posixl_init(pRExC_state, ssc)) {
1361             if (is_ANYOF_SYNTHETIC(and_with)) {
1362                 StructCopy(and_with, ssc, regnode_ssc);
1363             }
1364             else {
1365                 ssc->invlist = anded_cp_list;
1366                 ANYOF_POSIXL_ZERO(ssc);
1367                 if (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL) {
1368                     ANYOF_POSIXL_OR((regnode_charclass_posixl*) and_with, ssc);
1369                 }
1370             }
1371         }
1372         else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)
1373                  || (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL))
1374         {
1375             /* One or the other of P1, P2 is non-empty. */
1376             if (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL) {
1377                 ANYOF_POSIXL_AND((regnode_charclass_posixl*) and_with, ssc);
1378             }
1379             ssc_union(ssc, anded_cp_list, FALSE);
1380         }
1381         else { /* P1 = P2 = empty */
1382             ssc_intersection(ssc, anded_cp_list, FALSE);
1383         }
1384     }
1385 }
1386
1387 STATIC void
1388 S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
1389                const regnode_charclass *or_with)
1390 {
1391     /* Accumulate into SSC 'ssc' its 'OR' with 'or_with', which is either
1392      * another SSC or a regular ANYOF class.  Can create false positives if
1393      * 'or_with' is to be inverted. */
1394
1395     SV* ored_cp_list;
1396     U8 ored_flags;
1397
1398     PERL_ARGS_ASSERT_SSC_OR;
1399
1400     assert(is_ANYOF_SYNTHETIC(ssc));
1401
1402     /* 'or_with' is used as-is if it too is an SSC; otherwise have to extract
1403      * the code point inversion list and just the relevant flags */
1404     if (is_ANYOF_SYNTHETIC(or_with)) {
1405         ored_cp_list = ((regnode_ssc*) or_with)->invlist;
1406         ored_flags = ANYOF_FLAGS(or_with);
1407     }
1408     else {
1409         ored_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, or_with);
1410         ored_flags = ANYOF_FLAGS(or_with) & ANYOF_COMMON_FLAGS;
1411     }
1412
1413     ANYOF_FLAGS(ssc) |= ored_flags;
1414
1415     /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
1416      * C2 is the list of code points in 'or-with'; P2, its posix classes.
1417      * 'or_with' may be inverted.  When not inverted, we have the simple
1418      * situation of computing:
1419      *  (C1 | P1) | (C2 | P2)  =  (C1 | C2) | (P1 | P2)
1420      * If P1|P2 yields a situation with both a class and its complement are
1421      * set, like having both \w and \W, this matches all code points, and we
1422      * can delete these from the P component of the ssc going forward.  XXX We
1423      * might be able to delete all the P components, but I (khw) am not certain
1424      * about this, and it is better to be safe.
1425      *
1426      * Inverted, we have
1427      *  (C1 | P1) | ~(C2 | P2)  =  (C1 | P1) | (~C2 & ~P2)
1428      *                         <=  (C1 | P1) | ~C2
1429      *                         <=  (C1 | ~C2) | P1
1430      * (which results in actually simpler code than the non-inverted case)
1431      * */
1432
1433     if ((ANYOF_FLAGS(or_with) & ANYOF_INVERT)
1434         && ! is_ANYOF_SYNTHETIC(or_with))
1435     {
1436         /* We ignore P2, leaving P1 going forward */
1437     }   /* else  Not inverted */
1438     else if (ANYOF_FLAGS(or_with) & ANYOF_MATCHES_POSIXL) {
1439         ANYOF_POSIXL_OR((regnode_charclass_posixl*)or_with, ssc);
1440         if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1441             unsigned int i;
1442             for (i = 0; i < ANYOF_MAX; i += 2) {
1443                 if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i + 1))
1444                 {
1445                     ssc_match_all_cp(ssc);
1446                     ANYOF_POSIXL_CLEAR(ssc, i);
1447                     ANYOF_POSIXL_CLEAR(ssc, i+1);
1448                 }
1449             }
1450         }
1451     }
1452
1453     ssc_union(ssc,
1454               ored_cp_list,
1455               FALSE /* Already has been inverted */
1456               );
1457 }
1458
1459 PERL_STATIC_INLINE void
1460 S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert2nd)
1461 {
1462     PERL_ARGS_ASSERT_SSC_UNION;
1463
1464     assert(is_ANYOF_SYNTHETIC(ssc));
1465
1466     _invlist_union_maybe_complement_2nd(ssc->invlist,
1467                                         invlist,
1468                                         invert2nd,
1469                                         &ssc->invlist);
1470 }
1471
1472 PERL_STATIC_INLINE void
1473 S_ssc_intersection(pTHX_ regnode_ssc *ssc,
1474                          SV* const invlist,
1475                          const bool invert2nd)
1476 {
1477     PERL_ARGS_ASSERT_SSC_INTERSECTION;
1478
1479     assert(is_ANYOF_SYNTHETIC(ssc));
1480
1481     _invlist_intersection_maybe_complement_2nd(ssc->invlist,
1482                                                invlist,
1483                                                invert2nd,
1484                                                &ssc->invlist);
1485 }
1486
1487 PERL_STATIC_INLINE void
1488 S_ssc_add_range(pTHX_ regnode_ssc *ssc, const UV start, const UV end)
1489 {
1490     PERL_ARGS_ASSERT_SSC_ADD_RANGE;
1491
1492     assert(is_ANYOF_SYNTHETIC(ssc));
1493
1494     ssc->invlist = _add_range_to_invlist(ssc->invlist, start, end);
1495 }
1496
1497 PERL_STATIC_INLINE void
1498 S_ssc_cp_and(pTHX_ regnode_ssc *ssc, const UV cp)
1499 {
1500     /* AND just the single code point 'cp' into the SSC 'ssc' */
1501
1502     SV* cp_list = _new_invlist(2);
1503
1504     PERL_ARGS_ASSERT_SSC_CP_AND;
1505
1506     assert(is_ANYOF_SYNTHETIC(ssc));
1507
1508     cp_list = add_cp_to_invlist(cp_list, cp);
1509     ssc_intersection(ssc, cp_list,
1510                      FALSE /* Not inverted */
1511                      );
1512     SvREFCNT_dec_NN(cp_list);
1513 }
1514
1515 PERL_STATIC_INLINE void
1516 S_ssc_clear_locale(regnode_ssc *ssc)
1517 {
1518     /* Set the SSC 'ssc' to not match any locale things */
1519     PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE;
1520
1521     assert(is_ANYOF_SYNTHETIC(ssc));
1522
1523     ANYOF_POSIXL_ZERO(ssc);
1524     ANYOF_FLAGS(ssc) &= ~ANYOF_LOCALE_FLAGS;
1525 }
1526
1527 #define NON_OTHER_COUNT   NON_OTHER_COUNT_FOR_USE_ONLY_BY_REGCOMP_DOT_C
1528
1529 STATIC bool
1530 S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc)
1531 {
1532     /* The synthetic start class is used to hopefully quickly winnow down
1533      * places where a pattern could start a match in the target string.  If it
1534      * doesn't really narrow things down that much, there isn't much point to
1535      * having the overhead of using it.  This function uses some very crude
1536      * heuristics to decide if to use the ssc or not.
1537      *
1538      * It returns TRUE if 'ssc' rules out more than half what it considers to
1539      * be the "likely" possible matches, but of course it doesn't know what the
1540      * actual things being matched are going to be; these are only guesses
1541      *
1542      * For /l matches, it assumes that the only likely matches are going to be
1543      *      in the 0-255 range, uniformly distributed, so half of that is 127
1544      * For /a and /d matches, it assumes that the likely matches will be just
1545      *      the ASCII range, so half of that is 63
1546      * For /u and there isn't anything matching above the Latin1 range, it
1547      *      assumes that that is the only range likely to be matched, and uses
1548      *      half that as the cut-off: 127.  If anything matches above Latin1,
1549      *      it assumes that all of Unicode could match (uniformly), except for
1550      *      non-Unicode code points and things in the General Category "Other"
1551      *      (unassigned, private use, surrogates, controls and formats).  This
1552      *      is a much large number. */
1553
1554     const U32 max_match = (LOC)
1555                           ? 127
1556                           : (! UNI_SEMANTICS)
1557                             ? 63
1558                             : (invlist_highest(ssc->invlist) < 256)
1559                               ? 127
1560                               : ((NON_OTHER_COUNT + 1) / 2) - 1;
1561     U32 count = 0;      /* Running total of number of code points matched by
1562                            'ssc' */
1563     UV start, end;      /* Start and end points of current range in inversion
1564                            list */
1565
1566     PERL_ARGS_ASSERT_IS_SSC_WORTH_IT;
1567
1568     invlist_iterinit(ssc->invlist);
1569     while (invlist_iternext(ssc->invlist, &start, &end)) {
1570
1571         /* /u is the only thing that we expect to match above 255; so if not /u
1572          * and even if there are matches above 255, ignore them.  This catches
1573          * things like \d under /d which does match the digits above 255, but
1574          * since the pattern is /d, it is not likely to be expecting them */
1575         if (! UNI_SEMANTICS) {
1576             if (start > 255) {
1577                 break;
1578             }
1579             end = MIN(end, 255);
1580         }
1581         count += end - start + 1;
1582         if (count > max_match) {
1583             invlist_iterfinish(ssc->invlist);
1584             return FALSE;
1585         }
1586     }
1587
1588     return TRUE;
1589 }
1590
1591
1592 STATIC void
1593 S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc)
1594 {
1595     /* The inversion list in the SSC is marked mortal; now we need a more
1596      * permanent copy, which is stored the same way that is done in a regular
1597      * ANYOF node, with the first NUM_ANYOF_CODE_POINTS code points in a bit
1598      * map */
1599
1600     SV* invlist = invlist_clone(ssc->invlist);
1601
1602     PERL_ARGS_ASSERT_SSC_FINALIZE;
1603
1604     assert(is_ANYOF_SYNTHETIC(ssc));
1605
1606     /* The code in this file assumes that all but these flags aren't relevant
1607      * to the SSC, except SSC_MATCHES_EMPTY_STRING, which should be cleared
1608      * by the time we reach here */
1609     assert(! (ANYOF_FLAGS(ssc) & ~ANYOF_COMMON_FLAGS));
1610
1611     populate_ANYOF_from_invlist( (regnode *) ssc, &invlist);
1612
1613     set_ANYOF_arg(pRExC_state, (regnode *) ssc, invlist,
1614                                 NULL, NULL, NULL, FALSE);
1615
1616     /* Make sure is clone-safe */
1617     ssc->invlist = NULL;
1618
1619     if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1620         ANYOF_FLAGS(ssc) |= ANYOF_MATCHES_POSIXL;
1621     }
1622
1623     assert(! (ANYOF_FLAGS(ssc) & ANYOF_LOCALE_FLAGS) || RExC_contains_locale);
1624 }
1625
1626 #define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ]
1627 #define TRIE_LIST_CUR(state)  ( TRIE_LIST_ITEM( state, 0 ).forid )
1628 #define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate )
1629 #define TRIE_LIST_USED(idx)  ( trie->states[state].trans.list         \
1630                                ? (TRIE_LIST_CUR( idx ) - 1)           \
1631                                : 0 )
1632
1633
1634 #ifdef DEBUGGING
1635 /*
1636    dump_trie(trie,widecharmap,revcharmap)
1637    dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc)
1638    dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc)
1639
1640    These routines dump out a trie in a somewhat readable format.
1641    The _interim_ variants are used for debugging the interim
1642    tables that are used to generate the final compressed
1643    representation which is what dump_trie expects.
1644
1645    Part of the reason for their existence is to provide a form
1646    of documentation as to how the different representations function.
1647
1648 */
1649
1650 /*
1651   Dumps the final compressed table form of the trie to Perl_debug_log.
1652   Used for debugging make_trie().
1653 */
1654
1655 STATIC void
1656 S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap,
1657             AV *revcharmap, U32 depth)
1658 {
1659     U32 state;
1660     SV *sv=sv_newmortal();
1661     int colwidth= widecharmap ? 6 : 4;
1662     U16 word;
1663     GET_RE_DEBUG_FLAGS_DECL;
1664
1665     PERL_ARGS_ASSERT_DUMP_TRIE;
1666
1667     PerlIO_printf( Perl_debug_log, "%*sChar : %-6s%-6s%-4s ",
1668         (int)depth * 2 + 2,"",
1669         "Match","Base","Ofs" );
1670
1671     for( state = 0 ; state < trie->uniquecharcount ; state++ ) {
1672         SV ** const tmp = av_fetch( revcharmap, state, 0);
1673         if ( tmp ) {
1674             PerlIO_printf( Perl_debug_log, "%*s",
1675                 colwidth,
1676                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1677                             PL_colors[0], PL_colors[1],
1678                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1679                             PERL_PV_ESCAPE_FIRSTCHAR
1680                 )
1681             );
1682         }
1683     }
1684     PerlIO_printf( Perl_debug_log, "\n%*sState|-----------------------",
1685         (int)depth * 2 + 2,"");
1686
1687     for( state = 0 ; state < trie->uniquecharcount ; state++ )
1688         PerlIO_printf( Perl_debug_log, "%.*s", colwidth, "--------");
1689     PerlIO_printf( Perl_debug_log, "\n");
1690
1691     for( state = 1 ; state < trie->statecount ; state++ ) {
1692         const U32 base = trie->states[ state ].trans.base;
1693
1694         PerlIO_printf( Perl_debug_log, "%*s#%4"UVXf"|",
1695                                        (int)depth * 2 + 2,"", (UV)state);
1696
1697         if ( trie->states[ state ].wordnum ) {
1698             PerlIO_printf( Perl_debug_log, " W%4X",
1699                                            trie->states[ state ].wordnum );
1700         } else {
1701             PerlIO_printf( Perl_debug_log, "%6s", "" );
1702         }
1703
1704         PerlIO_printf( Perl_debug_log, " @%4"UVXf" ", (UV)base );
1705
1706         if ( base ) {
1707             U32 ofs = 0;
1708
1709             while( ( base + ofs  < trie->uniquecharcount ) ||
1710                    ( base + ofs - trie->uniquecharcount < trie->lasttrans
1711                      && trie->trans[ base + ofs - trie->uniquecharcount ].check
1712                                                                     != state))
1713                     ofs++;
1714
1715             PerlIO_printf( Perl_debug_log, "+%2"UVXf"[ ", (UV)ofs);
1716
1717             for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
1718                 if ( ( base + ofs >= trie->uniquecharcount )
1719                         && ( base + ofs - trie->uniquecharcount
1720                                                         < trie->lasttrans )
1721                         && trie->trans[ base + ofs
1722                                     - trie->uniquecharcount ].check == state )
1723                 {
1724                    PerlIO_printf( Perl_debug_log, "%*"UVXf,
1725                     colwidth,
1726                     (UV)trie->trans[ base + ofs
1727                                              - trie->uniquecharcount ].next );
1728                 } else {
1729                     PerlIO_printf( Perl_debug_log, "%*s",colwidth,"   ." );
1730                 }
1731             }
1732
1733             PerlIO_printf( Perl_debug_log, "]");
1734
1735         }
1736         PerlIO_printf( Perl_debug_log, "\n" );
1737     }
1738     PerlIO_printf(Perl_debug_log, "%*sword_info N:(prev,len)=",
1739                                 (int)depth*2, "");
1740     for (word=1; word <= trie->wordcount; word++) {
1741         PerlIO_printf(Perl_debug_log, " %d:(%d,%d)",
1742             (int)word, (int)(trie->wordinfo[word].prev),
1743             (int)(trie->wordinfo[word].len));
1744     }
1745     PerlIO_printf(Perl_debug_log, "\n" );
1746 }
1747 /*
1748   Dumps a fully constructed but uncompressed trie in list form.
1749   List tries normally only are used for construction when the number of
1750   possible chars (trie->uniquecharcount) is very high.
1751   Used for debugging make_trie().
1752 */
1753 STATIC void
1754 S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie,
1755                          HV *widecharmap, AV *revcharmap, U32 next_alloc,
1756                          U32 depth)
1757 {
1758     U32 state;
1759     SV *sv=sv_newmortal();
1760     int colwidth= widecharmap ? 6 : 4;
1761     GET_RE_DEBUG_FLAGS_DECL;
1762
1763     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST;
1764
1765     /* print out the table precompression.  */
1766     PerlIO_printf( Perl_debug_log, "%*sState :Word | Transition Data\n%*s%s",
1767         (int)depth * 2 + 2,"", (int)depth * 2 + 2,"",
1768         "------:-----+-----------------\n" );
1769
1770     for( state=1 ; state < next_alloc ; state ++ ) {
1771         U16 charid;
1772
1773         PerlIO_printf( Perl_debug_log, "%*s %4"UVXf" :",
1774             (int)depth * 2 + 2,"", (UV)state  );
1775         if ( ! trie->states[ state ].wordnum ) {
1776             PerlIO_printf( Perl_debug_log, "%5s| ","");
1777         } else {
1778             PerlIO_printf( Perl_debug_log, "W%4x| ",
1779                 trie->states[ state ].wordnum
1780             );
1781         }
1782         for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) {
1783             SV ** const tmp = av_fetch( revcharmap,
1784                                         TRIE_LIST_ITEM(state,charid).forid, 0);
1785             if ( tmp ) {
1786                 PerlIO_printf( Perl_debug_log, "%*s:%3X=%4"UVXf" | ",
1787                     colwidth,
1788                     pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp),
1789                               colwidth,
1790                               PL_colors[0], PL_colors[1],
1791                               (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0)
1792                               | PERL_PV_ESCAPE_FIRSTCHAR
1793                     ) ,
1794                     TRIE_LIST_ITEM(state,charid).forid,
1795                     (UV)TRIE_LIST_ITEM(state,charid).newstate
1796                 );
1797                 if (!(charid % 10))
1798                     PerlIO_printf(Perl_debug_log, "\n%*s| ",
1799                         (int)((depth * 2) + 14), "");
1800             }
1801         }
1802         PerlIO_printf( Perl_debug_log, "\n");
1803     }
1804 }
1805
1806 /*
1807   Dumps a fully constructed but uncompressed trie in table form.
1808   This is the normal DFA style state transition table, with a few
1809   twists to facilitate compression later.
1810   Used for debugging make_trie().
1811 */
1812 STATIC void
1813 S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie,
1814                           HV *widecharmap, AV *revcharmap, U32 next_alloc,
1815                           U32 depth)
1816 {
1817     U32 state;
1818     U16 charid;
1819     SV *sv=sv_newmortal();
1820     int colwidth= widecharmap ? 6 : 4;
1821     GET_RE_DEBUG_FLAGS_DECL;
1822
1823     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE;
1824
1825     /*
1826        print out the table precompression so that we can do a visual check
1827        that they are identical.
1828      */
1829
1830     PerlIO_printf( Perl_debug_log, "%*sChar : ",(int)depth * 2 + 2,"" );
1831
1832     for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1833         SV ** const tmp = av_fetch( revcharmap, charid, 0);
1834         if ( tmp ) {
1835             PerlIO_printf( Perl_debug_log, "%*s",
1836                 colwidth,
1837                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1838                             PL_colors[0], PL_colors[1],
1839                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1840                             PERL_PV_ESCAPE_FIRSTCHAR
1841                 )
1842             );
1843         }
1844     }
1845
1846     PerlIO_printf( Perl_debug_log, "\n%*sState+-",(int)depth * 2 + 2,"" );
1847
1848     for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) {
1849         PerlIO_printf( Perl_debug_log, "%.*s", colwidth,"--------");
1850     }
1851
1852     PerlIO_printf( Perl_debug_log, "\n" );
1853
1854     for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) {
1855
1856         PerlIO_printf( Perl_debug_log, "%*s%4"UVXf" : ",
1857             (int)depth * 2 + 2,"",
1858             (UV)TRIE_NODENUM( state ) );
1859
1860         for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1861             UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next );
1862             if (v)
1863                 PerlIO_printf( Perl_debug_log, "%*"UVXf, colwidth, v );
1864             else
1865                 PerlIO_printf( Perl_debug_log, "%*s", colwidth, "." );
1866         }
1867         if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) {
1868             PerlIO_printf( Perl_debug_log, " (%4"UVXf")\n",
1869                                             (UV)trie->trans[ state ].check );
1870         } else {
1871             PerlIO_printf( Perl_debug_log, " (%4"UVXf") W%4X\n",
1872                                             (UV)trie->trans[ state ].check,
1873             trie->states[ TRIE_NODENUM( state ) ].wordnum );
1874         }
1875     }
1876 }
1877
1878 #endif
1879
1880
1881 /* make_trie(startbranch,first,last,tail,word_count,flags,depth)
1882   startbranch: the first branch in the whole branch sequence
1883   first      : start branch of sequence of branch-exact nodes.
1884                May be the same as startbranch
1885   last       : Thing following the last branch.
1886                May be the same as tail.
1887   tail       : item following the branch sequence
1888   count      : words in the sequence
1889   flags      : currently the OP() type we will be building one of /EXACT(|F|FA|FU|FU_SS|L|FLU8)/
1890   depth      : indent depth
1891
1892 Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node.
1893
1894 A trie is an N'ary tree where the branches are determined by digital
1895 decomposition of the key. IE, at the root node you look up the 1st character and
1896 follow that branch repeat until you find the end of the branches. Nodes can be
1897 marked as "accepting" meaning they represent a complete word. Eg:
1898
1899   /he|she|his|hers/
1900
1901 would convert into the following structure. Numbers represent states, letters
1902 following numbers represent valid transitions on the letter from that state, if
1903 the number is in square brackets it represents an accepting state, otherwise it
1904 will be in parenthesis.
1905
1906       +-h->+-e->[3]-+-r->(8)-+-s->[9]
1907       |    |
1908       |   (2)
1909       |    |
1910      (1)   +-i->(6)-+-s->[7]
1911       |
1912       +-s->(3)-+-h->(4)-+-e->[5]
1913
1914       Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers)
1915
1916 This shows that when matching against the string 'hers' we will begin at state 1
1917 read 'h' and move to state 2, read 'e' and move to state 3 which is accepting,
1918 then read 'r' and go to state 8 followed by 's' which takes us to state 9 which
1919 is also accepting. Thus we know that we can match both 'he' and 'hers' with a
1920 single traverse. We store a mapping from accepting to state to which word was
1921 matched, and then when we have multiple possibilities we try to complete the
1922 rest of the regex in the order in which they occurred in the alternation.
1923
1924 The only prior NFA like behaviour that would be changed by the TRIE support is
1925 the silent ignoring of duplicate alternations which are of the form:
1926
1927  / (DUPE|DUPE) X? (?{ ... }) Y /x
1928
1929 Thus EVAL blocks following a trie may be called a different number of times with
1930 and without the optimisation. With the optimisations dupes will be silently
1931 ignored. This inconsistent behaviour of EVAL type nodes is well established as
1932 the following demonstrates:
1933
1934  'words'=~/(word|word|word)(?{ print $1 })[xyz]/
1935
1936 which prints out 'word' three times, but
1937
1938  'words'=~/(word|word|word)(?{ print $1 })S/
1939
1940 which doesnt print it out at all. This is due to other optimisations kicking in.
1941
1942 Example of what happens on a structural level:
1943
1944 The regexp /(ac|ad|ab)+/ will produce the following debug output:
1945
1946    1: CURLYM[1] {1,32767}(18)
1947    5:   BRANCH(8)
1948    6:     EXACT <ac>(16)
1949    8:   BRANCH(11)
1950    9:     EXACT <ad>(16)
1951   11:   BRANCH(14)
1952   12:     EXACT <ab>(16)
1953   16:   SUCCEED(0)
1954   17:   NOTHING(18)
1955   18: END(0)
1956
1957 This would be optimizable with startbranch=5, first=5, last=16, tail=16
1958 and should turn into:
1959
1960    1: CURLYM[1] {1,32767}(18)
1961    5:   TRIE(16)
1962         [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1]
1963           <ac>
1964           <ad>
1965           <ab>
1966   16:   SUCCEED(0)
1967   17:   NOTHING(18)
1968   18: END(0)
1969
1970 Cases where tail != last would be like /(?foo|bar)baz/:
1971
1972    1: BRANCH(4)
1973    2:   EXACT <foo>(8)
1974    4: BRANCH(7)
1975    5:   EXACT <bar>(8)
1976    7: TAIL(8)
1977    8: EXACT <baz>(10)
1978   10: END(0)
1979
1980 which would be optimizable with startbranch=1, first=1, last=7, tail=8
1981 and would end up looking like:
1982
1983     1: TRIE(8)
1984       [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1]
1985         <foo>
1986         <bar>
1987    7: TAIL(8)
1988    8: EXACT <baz>(10)
1989   10: END(0)
1990
1991     d = uvchr_to_utf8_flags(d, uv, 0);
1992
1993 is the recommended Unicode-aware way of saying
1994
1995     *(d++) = uv;
1996 */
1997
1998 #define TRIE_STORE_REVCHAR(val)                                            \
1999     STMT_START {                                                           \
2000         if (UTF) {                                                         \
2001             SV *zlopp = newSV(7); /* XXX: optimize me */                   \
2002             unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp);      \
2003             unsigned const char *const kapow = uvchr_to_utf8(flrbbbbb, val); \
2004             SvCUR_set(zlopp, kapow - flrbbbbb);                            \
2005             SvPOK_on(zlopp);                                               \
2006             SvUTF8_on(zlopp);                                              \
2007             av_push(revcharmap, zlopp);                                    \
2008         } else {                                                           \
2009             char ooooff = (char)val;                                           \
2010             av_push(revcharmap, newSVpvn(&ooooff, 1));                     \
2011         }                                                                  \
2012         } STMT_END
2013
2014 /* This gets the next character from the input, folding it if not already
2015  * folded. */
2016 #define TRIE_READ_CHAR STMT_START {                                           \
2017     wordlen++;                                                                \
2018     if ( UTF ) {                                                              \
2019         /* if it is UTF then it is either already folded, or does not need    \
2020          * folding */                                                         \
2021         uvc = valid_utf8_to_uvchr( (const U8*) uc, &len);                     \
2022     }                                                                         \
2023     else if (folder == PL_fold_latin1) {                                      \
2024         /* This folder implies Unicode rules, which in the range expressible  \
2025          *  by not UTF is the lower case, with the two exceptions, one of     \
2026          *  which should have been taken care of before calling this */       \
2027         assert(*uc != LATIN_SMALL_LETTER_SHARP_S);                            \
2028         uvc = toLOWER_L1(*uc);                                                \
2029         if (UNLIKELY(uvc == MICRO_SIGN)) uvc = GREEK_SMALL_LETTER_MU;         \
2030         len = 1;                                                              \
2031     } else {                                                                  \
2032         /* raw data, will be folded later if needed */                        \
2033         uvc = (U32)*uc;                                                       \
2034         len = 1;                                                              \
2035     }                                                                         \
2036 } STMT_END
2037
2038
2039
2040 #define TRIE_LIST_PUSH(state,fid,ns) STMT_START {               \
2041     if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) {    \
2042         U32 ging = TRIE_LIST_LEN( state ) *= 2;                 \
2043         Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \
2044     }                                                           \
2045     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid;     \
2046     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns;   \
2047     TRIE_LIST_CUR( state )++;                                   \
2048 } STMT_END
2049
2050 #define TRIE_LIST_NEW(state) STMT_START {                       \
2051     Newxz( trie->states[ state ].trans.list,               \
2052         4, reg_trie_trans_le );                                 \
2053      TRIE_LIST_CUR( state ) = 1;                                \
2054      TRIE_LIST_LEN( state ) = 4;                                \
2055 } STMT_END
2056
2057 #define TRIE_HANDLE_WORD(state) STMT_START {                    \
2058     U16 dupe= trie->states[ state ].wordnum;                    \
2059     regnode * const noper_next = regnext( noper );              \
2060                                                                 \
2061     DEBUG_r({                                                   \
2062         /* store the word for dumping */                        \
2063         SV* tmp;                                                \
2064         if (OP(noper) != NOTHING)                               \
2065             tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF);    \
2066         else                                                    \
2067             tmp = newSVpvn_utf8( "", 0, UTF );                  \
2068         av_push( trie_words, tmp );                             \
2069     });                                                         \
2070                                                                 \
2071     curword++;                                                  \
2072     trie->wordinfo[curword].prev   = 0;                         \
2073     trie->wordinfo[curword].len    = wordlen;                   \
2074     trie->wordinfo[curword].accept = state;                     \
2075                                                                 \
2076     if ( noper_next < tail ) {                                  \
2077         if (!trie->jump)                                        \
2078             trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, \
2079                                                  sizeof(U16) ); \
2080         trie->jump[curword] = (U16)(noper_next - convert);      \
2081         if (!jumper)                                            \
2082             jumper = noper_next;                                \
2083         if (!nextbranch)                                        \
2084             nextbranch= regnext(cur);                           \
2085     }                                                           \
2086                                                                 \
2087     if ( dupe ) {                                               \
2088         /* It's a dupe. Pre-insert into the wordinfo[].prev   */\
2089         /* chain, so that when the bits of chain are later    */\
2090         /* linked together, the dups appear in the chain      */\
2091         trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \
2092         trie->wordinfo[dupe].prev = curword;                    \
2093     } else {                                                    \
2094         /* we haven't inserted this word yet.                */ \
2095         trie->states[ state ].wordnum = curword;                \
2096     }                                                           \
2097 } STMT_END
2098
2099
2100 #define TRIE_TRANS_STATE(state,base,ucharcount,charid,special)          \
2101      ( ( base + charid >=  ucharcount                                   \
2102          && base + charid < ubound                                      \
2103          && state == trie->trans[ base - ucharcount + charid ].check    \
2104          && trie->trans[ base - ucharcount + charid ].next )            \
2105            ? trie->trans[ base - ucharcount + charid ].next             \
2106            : ( state==1 ? special : 0 )                                 \
2107       )
2108
2109 #define MADE_TRIE       1
2110 #define MADE_JUMP_TRIE  2
2111 #define MADE_EXACT_TRIE 4
2112
2113 STATIC I32
2114 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
2115                   regnode *first, regnode *last, regnode *tail,
2116                   U32 word_count, U32 flags, U32 depth)
2117 {
2118     /* first pass, loop through and scan words */
2119     reg_trie_data *trie;
2120     HV *widecharmap = NULL;
2121     AV *revcharmap = newAV();
2122     regnode *cur;
2123     STRLEN len = 0;
2124     UV uvc = 0;
2125     U16 curword = 0;
2126     U32 next_alloc = 0;
2127     regnode *jumper = NULL;
2128     regnode *nextbranch = NULL;
2129     regnode *convert = NULL;
2130     U32 *prev_states; /* temp array mapping each state to previous one */
2131     /* we just use folder as a flag in utf8 */
2132     const U8 * folder = NULL;
2133
2134 #ifdef DEBUGGING
2135     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tuuu"));
2136     AV *trie_words = NULL;
2137     /* along with revcharmap, this only used during construction but both are
2138      * useful during debugging so we store them in the struct when debugging.
2139      */
2140 #else
2141     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tu"));
2142     STRLEN trie_charcount=0;
2143 #endif
2144     SV *re_trie_maxbuff;
2145     GET_RE_DEBUG_FLAGS_DECL;
2146
2147     PERL_ARGS_ASSERT_MAKE_TRIE;
2148 #ifndef DEBUGGING
2149     PERL_UNUSED_ARG(depth);
2150 #endif
2151
2152     switch (flags) {
2153         case EXACT: case EXACTL: break;
2154         case EXACTFA:
2155         case EXACTFU_SS:
2156         case EXACTFU:
2157         case EXACTFLU8: folder = PL_fold_latin1; break;
2158         case EXACTF:  folder = PL_fold; break;
2159         default: Perl_croak( aTHX_ "panic! In trie construction, unknown node type %u %s", (unsigned) flags, PL_reg_name[flags] );
2160     }
2161
2162     trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) );
2163     trie->refcount = 1;
2164     trie->startstate = 1;
2165     trie->wordcount = word_count;
2166     RExC_rxi->data->data[ data_slot ] = (void*)trie;
2167     trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) );
2168     if (flags == EXACT || flags == EXACTL)
2169         trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 );
2170     trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc(
2171                        trie->wordcount+1, sizeof(reg_trie_wordinfo));
2172
2173     DEBUG_r({
2174         trie_words = newAV();
2175     });
2176
2177     re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
2178     assert(re_trie_maxbuff);
2179     if (!SvIOK(re_trie_maxbuff)) {
2180         sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
2181     }
2182     DEBUG_TRIE_COMPILE_r({
2183         PerlIO_printf( Perl_debug_log,
2184           "%*smake_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n",
2185           (int)depth * 2 + 2, "",
2186           REG_NODE_NUM(startbranch),REG_NODE_NUM(first),
2187           REG_NODE_NUM(last), REG_NODE_NUM(tail), (int)depth);
2188     });
2189
2190    /* Find the node we are going to overwrite */
2191     if ( first == startbranch && OP( last ) != BRANCH ) {
2192         /* whole branch chain */
2193         convert = first;
2194     } else {
2195         /* branch sub-chain */
2196         convert = NEXTOPER( first );
2197     }
2198
2199     /*  -- First loop and Setup --
2200
2201        We first traverse the branches and scan each word to determine if it
2202        contains widechars, and how many unique chars there are, this is
2203        important as we have to build a table with at least as many columns as we
2204        have unique chars.
2205
2206        We use an array of integers to represent the character codes 0..255
2207        (trie->charmap) and we use a an HV* to store Unicode characters. We use
2208        the native representation of the character value as the key and IV's for
2209        the coded index.
2210
2211        *TODO* If we keep track of how many times each character is used we can
2212        remap the columns so that the table compression later on is more
2213        efficient in terms of memory by ensuring the most common value is in the
2214        middle and the least common are on the outside.  IMO this would be better
2215        than a most to least common mapping as theres a decent chance the most
2216        common letter will share a node with the least common, meaning the node
2217        will not be compressible. With a middle is most common approach the worst
2218        case is when we have the least common nodes twice.
2219
2220      */
2221
2222     for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2223         regnode *noper = NEXTOPER( cur );
2224         const U8 *uc = (U8*)STRING( noper );
2225         const U8 *e  = uc + STR_LEN( noper );
2226         int foldlen = 0;
2227         U32 wordlen      = 0;         /* required init */
2228         STRLEN minchars = 0;
2229         STRLEN maxchars = 0;
2230         bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the
2231                                                bitmap?*/
2232
2233         if (OP(noper) == NOTHING) {
2234             regnode *noper_next= regnext(noper);
2235             if (noper_next != tail && OP(noper_next) == flags) {
2236                 noper = noper_next;
2237                 uc= (U8*)STRING(noper);
2238                 e= uc + STR_LEN(noper);
2239                 trie->minlen= STR_LEN(noper);
2240             } else {
2241                 trie->minlen= 0;
2242                 continue;
2243             }
2244         }
2245
2246         if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */
2247             TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
2248                                           regardless of encoding */
2249             if (OP( noper ) == EXACTFU_SS) {
2250                 /* false positives are ok, so just set this */
2251                 TRIE_BITMAP_SET(trie, LATIN_SMALL_LETTER_SHARP_S);
2252             }
2253         }
2254         for ( ; uc < e ; uc += len ) {  /* Look at each char in the current
2255                                            branch */
2256             TRIE_CHARCOUNT(trie)++;
2257             TRIE_READ_CHAR;
2258
2259             /* TRIE_READ_CHAR returns the current character, or its fold if /i
2260              * is in effect.  Under /i, this character can match itself, or
2261              * anything that folds to it.  If not under /i, it can match just
2262              * itself.  Most folds are 1-1, for example k, K, and KELVIN SIGN
2263              * all fold to k, and all are single characters.   But some folds
2264              * expand to more than one character, so for example LATIN SMALL
2265              * LIGATURE FFI folds to the three character sequence 'ffi'.  If
2266              * the string beginning at 'uc' is 'ffi', it could be matched by
2267              * three characters, or just by the one ligature character. (It
2268              * could also be matched by two characters: LATIN SMALL LIGATURE FF
2269              * followed by 'i', or by 'f' followed by LATIN SMALL LIGATURE FI).
2270              * (Of course 'I' and/or 'F' instead of 'i' and 'f' can also
2271              * match.)  The trie needs to know the minimum and maximum number
2272              * of characters that could match so that it can use size alone to
2273              * quickly reject many match attempts.  The max is simple: it is
2274              * the number of folded characters in this branch (since a fold is
2275              * never shorter than what folds to it. */
2276
2277             maxchars++;
2278
2279             /* And the min is equal to the max if not under /i (indicated by
2280              * 'folder' being NULL), or there are no multi-character folds.  If
2281              * there is a multi-character fold, the min is incremented just
2282              * once, for the character that folds to the sequence.  Each
2283              * character in the sequence needs to be added to the list below of
2284              * characters in the trie, but we count only the first towards the
2285              * min number of characters needed.  This is done through the
2286              * variable 'foldlen', which is returned by the macros that look
2287              * for these sequences as the number of bytes the sequence
2288              * occupies.  Each time through the loop, we decrement 'foldlen' by
2289              * how many bytes the current char occupies.  Only when it reaches
2290              * 0 do we increment 'minchars' or look for another multi-character
2291              * sequence. */
2292             if (folder == NULL) {
2293                 minchars++;
2294             }
2295             else if (foldlen > 0) {
2296                 foldlen -= (UTF) ? UTF8SKIP(uc) : 1;
2297             }
2298             else {
2299                 minchars++;
2300
2301                 /* See if *uc is the beginning of a multi-character fold.  If
2302                  * so, we decrement the length remaining to look at, to account
2303                  * for the current character this iteration.  (We can use 'uc'
2304                  * instead of the fold returned by TRIE_READ_CHAR because for
2305                  * non-UTF, the latin1_safe macro is smart enough to account
2306                  * for all the unfolded characters, and because for UTF, the
2307                  * string will already have been folded earlier in the
2308                  * compilation process */
2309                 if (UTF) {
2310                     if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) {
2311                         foldlen -= UTF8SKIP(uc);
2312                     }
2313                 }
2314                 else if ((foldlen = is_MULTI_CHAR_FOLD_latin1_safe(uc, e))) {
2315                     foldlen--;
2316                 }
2317             }
2318
2319             /* The current character (and any potential folds) should be added
2320              * to the possible matching characters for this position in this
2321              * branch */
2322             if ( uvc < 256 ) {
2323                 if ( folder ) {
2324                     U8 folded= folder[ (U8) uvc ];
2325                     if ( !trie->charmap[ folded ] ) {
2326                         trie->charmap[ folded ]=( ++trie->uniquecharcount );
2327                         TRIE_STORE_REVCHAR( folded );
2328                     }
2329                 }
2330                 if ( !trie->charmap[ uvc ] ) {
2331                     trie->charmap[ uvc ]=( ++trie->uniquecharcount );
2332                     TRIE_STORE_REVCHAR( uvc );
2333                 }
2334                 if ( set_bit ) {
2335                     /* store the codepoint in the bitmap, and its folded
2336                      * equivalent. */
2337                     TRIE_BITMAP_SET(trie, uvc);
2338
2339                     /* store the folded codepoint */
2340                     if ( folder ) TRIE_BITMAP_SET(trie, folder[(U8) uvc ]);
2341
2342                     if ( !UTF ) {
2343                         /* store first byte of utf8 representation of
2344                            variant codepoints */
2345                         if (! UVCHR_IS_INVARIANT(uvc)) {
2346                             TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc));
2347                         }
2348                     }
2349                     set_bit = 0; /* We've done our bit :-) */
2350                 }
2351             } else {
2352
2353                 /* XXX We could come up with the list of code points that fold
2354                  * to this using PL_utf8_foldclosures, except not for
2355                  * multi-char folds, as there may be multiple combinations
2356                  * there that could work, which needs to wait until runtime to
2357                  * resolve (The comment about LIGATURE FFI above is such an
2358                  * example */
2359
2360                 SV** svpp;
2361                 if ( !widecharmap )
2362                     widecharmap = newHV();
2363
2364                 svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 );
2365
2366                 if ( !svpp )
2367                     Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%"UVXf, uvc );
2368
2369                 if ( !SvTRUE( *svpp ) ) {
2370                     sv_setiv( *svpp, ++trie->uniquecharcount );
2371                     TRIE_STORE_REVCHAR(uvc);
2372                 }
2373             }
2374         } /* end loop through characters in this branch of the trie */
2375
2376         /* We take the min and max for this branch and combine to find the min
2377          * and max for all branches processed so far */
2378         if( cur == first ) {
2379             trie->minlen = minchars;
2380             trie->maxlen = maxchars;
2381         } else if (minchars < trie->minlen) {
2382             trie->minlen = minchars;
2383         } else if (maxchars > trie->maxlen) {
2384             trie->maxlen = maxchars;
2385         }
2386     } /* end first pass */
2387     DEBUG_TRIE_COMPILE_r(
2388         PerlIO_printf( Perl_debug_log,
2389                 "%*sTRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n",
2390                 (int)depth * 2 + 2,"",
2391                 ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count,
2392                 (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount,
2393                 (int)trie->minlen, (int)trie->maxlen )
2394     );
2395
2396     /*
2397         We now know what we are dealing with in terms of unique chars and
2398         string sizes so we can calculate how much memory a naive
2399         representation using a flat table  will take. If it's over a reasonable
2400         limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory
2401         conservative but potentially much slower representation using an array
2402         of lists.
2403
2404         At the end we convert both representations into the same compressed
2405         form that will be used in regexec.c for matching with. The latter
2406         is a form that cannot be used to construct with but has memory
2407         properties similar to the list form and access properties similar
2408         to the table form making it both suitable for fast searches and
2409         small enough that its feasable to store for the duration of a program.
2410
2411         See the comment in the code where the compressed table is produced
2412         inplace from the flat tabe representation for an explanation of how
2413         the compression works.
2414
2415     */
2416
2417
2418     Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32);
2419     prev_states[1] = 0;
2420
2421     if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1)
2422                                                     > SvIV(re_trie_maxbuff) )
2423     {
2424         /*
2425             Second Pass -- Array Of Lists Representation
2426
2427             Each state will be represented by a list of charid:state records
2428             (reg_trie_trans_le) the first such element holds the CUR and LEN
2429             points of the allocated array. (See defines above).
2430
2431             We build the initial structure using the lists, and then convert
2432             it into the compressed table form which allows faster lookups
2433             (but cant be modified once converted).
2434         */
2435
2436         STRLEN transcount = 1;
2437
2438         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
2439             "%*sCompiling trie using list compiler\n",
2440             (int)depth * 2 + 2, ""));
2441
2442         trie->states = (reg_trie_state *)
2443             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
2444                                   sizeof(reg_trie_state) );
2445         TRIE_LIST_NEW(1);
2446         next_alloc = 2;
2447
2448         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2449
2450             regnode *noper   = NEXTOPER( cur );
2451             U8 *uc           = (U8*)STRING( noper );
2452             const U8 *e      = uc + STR_LEN( noper );
2453             U32 state        = 1;         /* required init */
2454             U16 charid       = 0;         /* sanity init */
2455             U32 wordlen      = 0;         /* required init */
2456
2457             if (OP(noper) == NOTHING) {
2458                 regnode *noper_next= regnext(noper);
2459                 if (noper_next != tail && OP(noper_next) == flags) {
2460                     noper = noper_next;
2461                     uc= (U8*)STRING(noper);
2462                     e= uc + STR_LEN(noper);
2463                 }
2464             }
2465
2466             if (OP(noper) != NOTHING) {
2467                 for ( ; uc < e ; uc += len ) {
2468
2469                     TRIE_READ_CHAR;
2470
2471                     if ( uvc < 256 ) {
2472                         charid = trie->charmap[ uvc ];
2473                     } else {
2474                         SV** const svpp = hv_fetch( widecharmap,
2475                                                     (char*)&uvc,
2476                                                     sizeof( UV ),
2477                                                     0);
2478                         if ( !svpp ) {
2479                             charid = 0;
2480                         } else {
2481                             charid=(U16)SvIV( *svpp );
2482                         }
2483                     }
2484                     /* charid is now 0 if we dont know the char read, or
2485                      * nonzero if we do */
2486                     if ( charid ) {
2487
2488                         U16 check;
2489                         U32 newstate = 0;
2490
2491                         charid--;
2492                         if ( !trie->states[ state ].trans.list ) {
2493                             TRIE_LIST_NEW( state );
2494                         }
2495                         for ( check = 1;
2496                               check <= TRIE_LIST_USED( state );
2497                               check++ )
2498                         {
2499                             if ( TRIE_LIST_ITEM( state, check ).forid
2500                                                                     == charid )
2501                             {
2502                                 newstate = TRIE_LIST_ITEM( state, check ).newstate;
2503                                 break;
2504                             }
2505                         }
2506                         if ( ! newstate ) {
2507                             newstate = next_alloc++;
2508                             prev_states[newstate] = state;
2509                             TRIE_LIST_PUSH( state, charid, newstate );
2510                             transcount++;
2511                         }
2512                         state = newstate;
2513                     } else {
2514                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
2515                     }
2516                 }
2517             }
2518             TRIE_HANDLE_WORD(state);
2519
2520         } /* end second pass */
2521
2522         /* next alloc is the NEXT state to be allocated */
2523         trie->statecount = next_alloc;
2524         trie->states = (reg_trie_state *)
2525             PerlMemShared_realloc( trie->states,
2526                                    next_alloc
2527                                    * sizeof(reg_trie_state) );
2528
2529         /* and now dump it out before we compress it */
2530         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap,
2531                                                          revcharmap, next_alloc,
2532                                                          depth+1)
2533         );
2534
2535         trie->trans = (reg_trie_trans *)
2536             PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) );
2537         {
2538             U32 state;
2539             U32 tp = 0;
2540             U32 zp = 0;
2541
2542
2543             for( state=1 ; state < next_alloc ; state ++ ) {
2544                 U32 base=0;
2545
2546                 /*
2547                 DEBUG_TRIE_COMPILE_MORE_r(
2548                     PerlIO_printf( Perl_debug_log, "tp: %d zp: %d ",tp,zp)
2549                 );
2550                 */
2551
2552                 if (trie->states[state].trans.list) {
2553                     U16 minid=TRIE_LIST_ITEM( state, 1).forid;
2554                     U16 maxid=minid;
2555                     U16 idx;
2556
2557                     for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
2558                         const U16 forid = TRIE_LIST_ITEM( state, idx).forid;
2559                         if ( forid < minid ) {
2560                             minid=forid;
2561                         } else if ( forid > maxid ) {
2562                             maxid=forid;
2563                         }
2564                     }
2565                     if ( transcount < tp + maxid - minid + 1) {
2566                         transcount *= 2;
2567                         trie->trans = (reg_trie_trans *)
2568                             PerlMemShared_realloc( trie->trans,
2569                                                      transcount
2570                                                      * sizeof(reg_trie_trans) );
2571                         Zero( trie->trans + (transcount / 2),
2572                               transcount / 2,
2573                               reg_trie_trans );
2574                     }
2575                     base = trie->uniquecharcount + tp - minid;
2576                     if ( maxid == minid ) {
2577                         U32 set = 0;
2578                         for ( ; zp < tp ; zp++ ) {
2579                             if ( ! trie->trans[ zp ].next ) {
2580                                 base = trie->uniquecharcount + zp - minid;
2581                                 trie->trans[ zp ].next = TRIE_LIST_ITEM( state,
2582                                                                    1).newstate;
2583                                 trie->trans[ zp ].check = state;
2584                                 set = 1;
2585                                 break;
2586                             }
2587                         }
2588                         if ( !set ) {
2589                             trie->trans[ tp ].next = TRIE_LIST_ITEM( state,
2590                                                                    1).newstate;
2591                             trie->trans[ tp ].check = state;
2592                             tp++;
2593                             zp = tp;
2594                         }
2595                     } else {
2596                         for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
2597                             const U32 tid = base
2598                                            - trie->uniquecharcount
2599                                            + TRIE_LIST_ITEM( state, idx ).forid;
2600                             trie->trans[ tid ].next = TRIE_LIST_ITEM( state,
2601                                                                 idx ).newstate;
2602                             trie->trans[ tid ].check = state;
2603                         }
2604                         tp += ( maxid - minid + 1 );
2605                     }
2606                     Safefree(trie->states[ state ].trans.list);
2607                 }
2608                 /*
2609                 DEBUG_TRIE_COMPILE_MORE_r(
2610                     PerlIO_printf( Perl_debug_log, " base: %d\n",base);
2611                 );
2612                 */
2613                 trie->states[ state ].trans.base=base;
2614             }
2615             trie->lasttrans = tp + 1;
2616         }
2617     } else {
2618         /*
2619            Second Pass -- Flat Table Representation.
2620
2621            we dont use the 0 slot of either trans[] or states[] so we add 1 to
2622            each.  We know that we will need Charcount+1 trans at most to store
2623            the data (one row per char at worst case) So we preallocate both
2624            structures assuming worst case.
2625
2626            We then construct the trie using only the .next slots of the entry
2627            structs.
2628
2629            We use the .check field of the first entry of the node temporarily
2630            to make compression both faster and easier by keeping track of how
2631            many non zero fields are in the node.
2632
2633            Since trans are numbered from 1 any 0 pointer in the table is a FAIL
2634            transition.
2635
2636            There are two terms at use here: state as a TRIE_NODEIDX() which is
2637            a number representing the first entry of the node, and state as a
2638            TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1)
2639            and TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3)
2640            if there are 2 entrys per node. eg:
2641
2642              A B       A B
2643           1. 2 4    1. 3 7
2644           2. 0 3    3. 0 5
2645           3. 0 0    5. 0 0
2646           4. 0 0    7. 0 0
2647
2648            The table is internally in the right hand, idx form. However as we
2649            also have to deal with the states array which is indexed by nodenum
2650            we have to use TRIE_NODENUM() to convert.
2651
2652         */
2653         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
2654             "%*sCompiling trie using table compiler\n",
2655             (int)depth * 2 + 2, ""));
2656
2657         trie->trans = (reg_trie_trans *)
2658             PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 )
2659                                   * trie->uniquecharcount + 1,
2660                                   sizeof(reg_trie_trans) );
2661         trie->states = (reg_trie_state *)
2662             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
2663                                   sizeof(reg_trie_state) );
2664         next_alloc = trie->uniquecharcount + 1;
2665
2666
2667         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2668
2669             regnode *noper   = NEXTOPER( cur );
2670             const U8 *uc     = (U8*)STRING( noper );
2671             const U8 *e      = uc + STR_LEN( noper );
2672
2673             U32 state        = 1;         /* required init */
2674
2675             U16 charid       = 0;         /* sanity init */
2676             U32 accept_state = 0;         /* sanity init */
2677
2678             U32 wordlen      = 0;         /* required init */
2679
2680             if (OP(noper) == NOTHING) {
2681                 regnode *noper_next= regnext(noper);
2682                 if (noper_next != tail && OP(noper_next) == flags) {
2683                     noper = noper_next;
2684                     uc= (U8*)STRING(noper);
2685                     e= uc + STR_LEN(noper);
2686                 }
2687             }
2688
2689             if ( OP(noper) != NOTHING ) {
2690                 for ( ; uc < e ; uc += len ) {
2691
2692                     TRIE_READ_CHAR;
2693
2694                     if ( uvc < 256 ) {
2695                         charid = trie->charmap[ uvc ];
2696                     } else {
2697                         SV* const * const svpp = hv_fetch( widecharmap,
2698                                                            (char*)&uvc,
2699                                                            sizeof( UV ),
2700                                                            0);
2701                         charid = svpp ? (U16)SvIV(*svpp) : 0;
2702                     }
2703                     if ( charid ) {
2704                         charid--;
2705                         if ( !trie->trans[ state + charid ].next ) {
2706                             trie->trans[ state + charid ].next = next_alloc;
2707                             trie->trans[ state ].check++;
2708                             prev_states[TRIE_NODENUM(next_alloc)]
2709                                     = TRIE_NODENUM(state);
2710                             next_alloc += trie->uniquecharcount;
2711                         }
2712                         state = trie->trans[ state + charid ].next;
2713                     } else {
2714                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
2715                     }
2716                     /* charid is now 0 if we dont know the char read, or
2717                      * nonzero if we do */
2718                 }
2719             }
2720             accept_state = TRIE_NODENUM( state );
2721             TRIE_HANDLE_WORD(accept_state);
2722
2723         } /* end second pass */
2724
2725         /* and now dump it out before we compress it */
2726         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap,
2727                                                           revcharmap,
2728                                                           next_alloc, depth+1));
2729
2730         {
2731         /*
2732            * Inplace compress the table.*
2733
2734            For sparse data sets the table constructed by the trie algorithm will
2735            be mostly 0/FAIL transitions or to put it another way mostly empty.
2736            (Note that leaf nodes will not contain any transitions.)
2737
2738            This algorithm compresses the tables by eliminating most such
2739            transitions, at the cost of a modest bit of extra work during lookup:
2740
2741            - Each states[] entry contains a .base field which indicates the
2742            index in the state[] array wheres its transition data is stored.
2743
2744            - If .base is 0 there are no valid transitions from that node.
2745
2746            - If .base is nonzero then charid is added to it to find an entry in
2747            the trans array.
2748
2749            -If trans[states[state].base+charid].check!=state then the
2750            transition is taken to be a 0/Fail transition. Thus if there are fail
2751            transitions at the front of the node then the .base offset will point
2752            somewhere inside the previous nodes data (or maybe even into a node
2753            even earlier), but the .check field determines if the transition is
2754            valid.
2755
2756            XXX - wrong maybe?
2757            The following process inplace converts the table to the compressed
2758            table: We first do not compress the root node 1,and mark all its
2759            .check pointers as 1 and set its .base pointer as 1 as well. This
2760            allows us to do a DFA construction from the compressed table later,
2761            and ensures that any .base pointers we calculate later are greater
2762            than 0.
2763
2764            - We set 'pos' to indicate the first entry of the second node.
2765
2766            - We then iterate over the columns of the node, finding the first and
2767            last used entry at l and m. We then copy l..m into pos..(pos+m-l),
2768            and set the .check pointers accordingly, and advance pos
2769            appropriately and repreat for the next node. Note that when we copy
2770            the next pointers we have to convert them from the original
2771            NODEIDX form to NODENUM form as the former is not valid post
2772            compression.
2773
2774            - If a node has no transitions used we mark its base as 0 and do not
2775            advance the pos pointer.
2776
2777            - If a node only has one transition we use a second pointer into the
2778            structure to fill in allocated fail transitions from other states.
2779            This pointer is independent of the main pointer and scans forward
2780            looking for null transitions that are allocated to a state. When it
2781            finds one it writes the single transition into the "hole".  If the
2782            pointer doesnt find one the single transition is appended as normal.
2783
2784            - Once compressed we can Renew/realloc the structures to release the
2785            excess space.
2786
2787            See "Table-Compression Methods" in sec 3.9 of the Red Dragon,
2788            specifically Fig 3.47 and the associated pseudocode.
2789
2790            demq
2791         */
2792         const U32 laststate = TRIE_NODENUM( next_alloc );
2793         U32 state, charid;
2794         U32 pos = 0, zp=0;
2795         trie->statecount = laststate;
2796
2797         for ( state = 1 ; state < laststate ; state++ ) {
2798             U8 flag = 0;
2799             const U32 stateidx = TRIE_NODEIDX( state );
2800             const U32 o_used = trie->trans[ stateidx ].check;
2801             U32 used = trie->trans[ stateidx ].check;
2802             trie->trans[ stateidx ].check = 0;
2803
2804             for ( charid = 0;
2805                   used && charid < trie->uniquecharcount;
2806                   charid++ )
2807             {
2808                 if ( flag || trie->trans[ stateidx + charid ].next ) {
2809                     if ( trie->trans[ stateidx + charid ].next ) {
2810                         if (o_used == 1) {
2811                             for ( ; zp < pos ; zp++ ) {
2812                                 if ( ! trie->trans[ zp ].next ) {
2813                                     break;
2814                                 }
2815                             }
2816                             trie->states[ state ].trans.base
2817                                                     = zp
2818                                                       + trie->uniquecharcount
2819                                                       - charid ;
2820                             trie->trans[ zp ].next
2821                                 = SAFE_TRIE_NODENUM( trie->trans[ stateidx
2822                                                              + charid ].next );
2823                             trie->trans[ zp ].check = state;
2824                             if ( ++zp > pos ) pos = zp;
2825                             break;
2826                         }
2827                         used--;
2828                     }
2829                     if ( !flag ) {
2830                         flag = 1;
2831                         trie->states[ state ].trans.base
2832                                        = pos + trie->uniquecharcount - charid ;
2833                     }
2834                     trie->trans[ pos ].next
2835                         = SAFE_TRIE_NODENUM(
2836                                        trie->trans[ stateidx + charid ].next );
2837                     trie->trans[ pos ].check = state;
2838                     pos++;
2839                 }
2840             }
2841         }
2842         trie->lasttrans = pos + 1;
2843         trie->states = (reg_trie_state *)
2844             PerlMemShared_realloc( trie->states, laststate
2845                                    * sizeof(reg_trie_state) );
2846         DEBUG_TRIE_COMPILE_MORE_r(
2847             PerlIO_printf( Perl_debug_log,
2848                 "%*sAlloc: %d Orig: %"IVdf" elements, Final:%"IVdf". Savings of %%%5.2f\n",
2849                 (int)depth * 2 + 2,"",
2850                 (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount
2851                        + 1 ),
2852                 (IV)next_alloc,
2853                 (IV)pos,
2854                 ( ( next_alloc - pos ) * 100 ) / (double)next_alloc );
2855             );
2856
2857         } /* end table compress */
2858     }
2859     DEBUG_TRIE_COMPILE_MORE_r(
2860             PerlIO_printf(Perl_debug_log,
2861                 "%*sStatecount:%"UVxf" Lasttrans:%"UVxf"\n",
2862                 (int)depth * 2 + 2, "",
2863                 (UV)trie->statecount,
2864                 (UV)trie->lasttrans)
2865     );
2866     /* resize the trans array to remove unused space */
2867     trie->trans = (reg_trie_trans *)
2868         PerlMemShared_realloc( trie->trans, trie->lasttrans
2869                                * sizeof(reg_trie_trans) );
2870
2871     {   /* Modify the program and insert the new TRIE node */
2872         U8 nodetype =(U8)(flags & 0xFF);
2873         char *str=NULL;
2874
2875 #ifdef DEBUGGING
2876         regnode *optimize = NULL;
2877 #ifdef RE_TRACK_PATTERN_OFFSETS
2878
2879         U32 mjd_offset = 0;
2880         U32 mjd_nodelen = 0;
2881 #endif /* RE_TRACK_PATTERN_OFFSETS */
2882 #endif /* DEBUGGING */
2883         /*
2884            This means we convert either the first branch or the first Exact,
2885            depending on whether the thing following (in 'last') is a branch
2886            or not and whther first is the startbranch (ie is it a sub part of
2887            the alternation or is it the whole thing.)
2888            Assuming its a sub part we convert the EXACT otherwise we convert
2889            the whole branch sequence, including the first.
2890          */
2891         /* Find the node we are going to overwrite */
2892         if ( first != startbranch || OP( last ) == BRANCH ) {
2893             /* branch sub-chain */
2894             NEXT_OFF( first ) = (U16)(last - first);
2895 #ifdef RE_TRACK_PATTERN_OFFSETS
2896             DEBUG_r({
2897                 mjd_offset= Node_Offset((convert));
2898                 mjd_nodelen= Node_Length((convert));
2899             });
2900 #endif
2901             /* whole branch chain */
2902         }
2903 #ifdef RE_TRACK_PATTERN_OFFSETS
2904         else {
2905             DEBUG_r({
2906                 const  regnode *nop = NEXTOPER( convert );
2907                 mjd_offset= Node_Offset((nop));
2908                 mjd_nodelen= Node_Length((nop));
2909             });
2910         }
2911         DEBUG_OPTIMISE_r(
2912             PerlIO_printf(Perl_debug_log,
2913                 "%*sMJD offset:%"UVuf" MJD length:%"UVuf"\n",
2914                 (int)depth * 2 + 2, "",
2915                 (UV)mjd_offset, (UV)mjd_nodelen)
2916         );
2917 #endif
2918         /* But first we check to see if there is a common prefix we can
2919            split out as an EXACT and put in front of the TRIE node.  */
2920         trie->startstate= 1;
2921         if ( trie->bitmap && !widecharmap && !trie->jump  ) {
2922             U32 state;
2923             for ( state = 1 ; state < trie->statecount-1 ; state++ ) {
2924                 U32 ofs = 0;
2925                 I32 idx = -1;
2926                 U32 count = 0;
2927                 const U32 base = trie->states[ state ].trans.base;
2928
2929                 if ( trie->states[state].wordnum )
2930                         count = 1;
2931
2932                 for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
2933                     if ( ( base + ofs >= trie->uniquecharcount ) &&
2934                          ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
2935                          trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
2936                     {
2937                         if ( ++count > 1 ) {
2938                             SV **tmp = av_fetch( revcharmap, ofs, 0);
2939                             const U8 *ch = (U8*)SvPV_nolen_const( *tmp );
2940                             if ( state == 1 ) break;
2941                             if ( count == 2 ) {
2942                                 Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char);
2943                                 DEBUG_OPTIMISE_r(
2944                                     PerlIO_printf(Perl_debug_log,
2945                                         "%*sNew Start State=%"UVuf" Class: [",
2946                                         (int)depth * 2 + 2, "",
2947                                         (UV)state));
2948                                 if (idx >= 0) {
2949                                     SV ** const tmp = av_fetch( revcharmap, idx, 0);
2950                                     const U8 * const ch = (U8*)SvPV_nolen_const( *tmp );
2951
2952                                     TRIE_BITMAP_SET(trie,*ch);
2953                                     if ( folder )
2954                                         TRIE_BITMAP_SET(trie, folder[ *ch ]);
2955                                     DEBUG_OPTIMISE_r(
2956                                         PerlIO_printf(Perl_debug_log, "%s", (char*)ch)
2957                                     );
2958                                 }
2959                             }
2960                             TRIE_BITMAP_SET(trie,*ch);
2961                             if ( folder )
2962                                 TRIE_BITMAP_SET(trie,folder[ *ch ]);
2963                             DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"%s", ch));
2964                         }
2965                         idx = ofs;
2966                     }
2967                 }
2968                 if ( count == 1 ) {
2969                     SV **tmp = av_fetch( revcharmap, idx, 0);
2970                     STRLEN len;
2971                     char *ch = SvPV( *tmp, len );
2972                     DEBUG_OPTIMISE_r({
2973                         SV *sv=sv_newmortal();
2974                         PerlIO_printf( Perl_debug_log,
2975                             "%*sPrefix State: %"UVuf" Idx:%"UVuf" Char='%s'\n",
2976                             (int)depth * 2 + 2, "",
2977                             (UV)state, (UV)idx,
2978                             pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6,
2979                                 PL_colors[0], PL_colors[1],
2980                                 (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
2981                                 PERL_PV_ESCAPE_FIRSTCHAR
2982                             )
2983                         );
2984                     });
2985                     if ( state==1 ) {
2986                         OP( convert ) = nodetype;
2987                         str=STRING(convert);
2988                         STR_LEN(convert)=0;
2989                     }
2990                     STR_LEN(convert) += len;
2991                     while (len--)
2992                         *str++ = *ch++;
2993                 } else {
2994 #ifdef DEBUGGING
2995                     if (state>1)
2996                         DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"]\n"));
2997 #endif
2998                     break;
2999                 }
3000             }
3001             trie->prefixlen = (state-1);
3002             if (str) {
3003                 regnode *n = convert+NODE_SZ_STR(convert);
3004                 NEXT_OFF(convert) = NODE_SZ_STR(convert);
3005                 trie->startstate = state;
3006                 trie->minlen -= (state - 1);
3007                 trie->maxlen -= (state - 1);
3008 #ifdef DEBUGGING
3009                /* At least the UNICOS C compiler choked on this
3010                 * being argument to DEBUG_r(), so let's just have
3011                 * it right here. */
3012                if (
3013 #ifdef PERL_EXT_RE_BUILD
3014                    1
3015 #else
3016                    DEBUG_r_TEST
3017 #endif
3018                    ) {
3019                    regnode *fix = convert;
3020                    U32 word = trie->wordcount;
3021                    mjd_nodelen++;
3022                    Set_Node_Offset_Length(convert, mjd_offset, state - 1);
3023                    while( ++fix < n ) {
3024                        Set_Node_Offset_Length(fix, 0, 0);
3025                    }
3026                    while (word--) {
3027                        SV ** const tmp = av_fetch( trie_words, word, 0 );
3028                        if (tmp) {
3029                            if ( STR_LEN(convert) <= SvCUR(*tmp) )
3030                                sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert));
3031                            else
3032                                sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp));
3033                        }
3034                    }
3035                }
3036 #endif
3037                 if (trie->maxlen) {
3038                     convert = n;
3039                 } else {
3040                     NEXT_OFF(convert) = (U16)(tail - convert);
3041                     DEBUG_r(optimize= n);
3042                 }
3043             }
3044         }
3045         if (!jumper)
3046             jumper = last;
3047         if ( trie->maxlen ) {
3048             NEXT_OFF( convert ) = (U16)(tail - convert);
3049             ARG_SET( convert, data_slot );
3050             /* Store the offset to the first unabsorbed branch in
3051                jump[0], which is otherwise unused by the jump logic.
3052                We use this when dumping a trie and during optimisation. */
3053             if (trie->jump)
3054                 trie->jump[0] = (U16)(nextbranch - convert);
3055
3056             /* If the start state is not accepting (meaning there is no empty string/NOTHING)
3057              *   and there is a bitmap
3058              *   and the first "jump target" node we found leaves enough room
3059              * then convert the TRIE node into a TRIEC node, with the bitmap
3060              * embedded inline in the opcode - this is hypothetically faster.
3061              */
3062             if ( !trie->states[trie->startstate].wordnum
3063                  && trie->bitmap
3064                  && ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) )
3065             {
3066                 OP( convert ) = TRIEC;
3067                 Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char);
3068                 PerlMemShared_free(trie->bitmap);
3069                 trie->bitmap= NULL;
3070             } else
3071                 OP( convert ) = TRIE;
3072
3073             /* store the type in the flags */
3074             convert->flags = nodetype;
3075             DEBUG_r({
3076             optimize = convert
3077                       + NODE_STEP_REGNODE
3078                       + regarglen[ OP( convert ) ];
3079             });
3080             /* XXX We really should free up the resource in trie now,
3081                    as we won't use them - (which resources?) dmq */
3082         }
3083         /* needed for dumping*/
3084         DEBUG_r(if (optimize) {
3085             regnode *opt = convert;
3086
3087             while ( ++opt < optimize) {
3088                 Set_Node_Offset_Length(opt,0,0);
3089             }
3090             /*
3091                 Try to clean up some of the debris left after the
3092                 optimisation.
3093              */
3094             while( optimize < jumper ) {
3095                 mjd_nodelen += Node_Length((optimize));
3096                 OP( optimize ) = OPTIMIZED;
3097                 Set_Node_Offset_Length(optimize,0,0);
3098                 optimize++;
3099             }
3100             Set_Node_Offset_Length(convert,mjd_offset,mjd_nodelen);
3101         });
3102     } /* end node insert */
3103
3104     /*  Finish populating the prev field of the wordinfo array.  Walk back
3105      *  from each accept state until we find another accept state, and if
3106      *  so, point the first word's .prev field at the second word. If the
3107      *  second already has a .prev field set, stop now. This will be the
3108      *  case either if we've already processed that word's accept state,
3109      *  or that state had multiple words, and the overspill words were
3110      *  already linked up earlier.
3111      */
3112     {
3113         U16 word;
3114         U32 state;
3115         U16 prev;
3116
3117         for (word=1; word <= trie->wordcount; word++) {
3118             prev = 0;
3119             if (trie->wordinfo[word].prev)
3120                 continue;
3121             state = trie->wordinfo[word].accept;
3122             while (state) {
3123                 state = prev_states[state];
3124                 if (!state)
3125                     break;
3126                 prev = trie->states[state].wordnum;
3127                 if (prev)
3128                     break;
3129             }
3130             trie->wordinfo[word].prev = prev;
3131         }
3132         Safefree(prev_states);
3133     }
3134
3135
3136     /* and now dump out the compressed format */
3137     DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1));
3138
3139     RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap;
3140 #ifdef DEBUGGING
3141     RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words;
3142     RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap;
3143 #else
3144     SvREFCNT_dec_NN(revcharmap);
3145 #endif
3146     return trie->jump
3147            ? MADE_JUMP_TRIE
3148            : trie->startstate>1
3149              ? MADE_EXACT_TRIE
3150              : MADE_TRIE;
3151 }
3152
3153 STATIC regnode *
3154 S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth)
3155 {
3156 /* The Trie is constructed and compressed now so we can build a fail array if
3157  * it's needed
3158
3159    This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and
3160    3.32 in the
3161    "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi,
3162    Ullman 1985/88
3163    ISBN 0-201-10088-6
3164
3165    We find the fail state for each state in the trie, this state is the longest
3166    proper suffix of the current state's 'word' that is also a proper prefix of
3167    another word in our trie. State 1 represents the word '' and is thus the
3168    default fail state. This allows the DFA not to have to restart after its
3169    tried and failed a word at a given point, it simply continues as though it
3170    had been matching the other word in the first place.
3171    Consider
3172       'abcdgu'=~/abcdefg|cdgu/
3173    When we get to 'd' we are still matching the first word, we would encounter
3174    'g' which would fail, which would bring us to the state representing 'd' in
3175    the second word where we would try 'g' and succeed, proceeding to match
3176    'cdgu'.
3177  */
3178  /* add a fail transition */
3179     const U32 trie_offset = ARG(source);
3180     reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset];
3181     U32 *q;
3182     const U32 ucharcount = trie->uniquecharcount;
3183     const U32 numstates = trie->statecount;
3184     const U32 ubound = trie->lasttrans + ucharcount;
3185     U32 q_read = 0;
3186     U32 q_write = 0;
3187     U32 charid;
3188     U32 base = trie->states[ 1 ].trans.base;
3189     U32 *fail;
3190     reg_ac_data *aho;
3191     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("T"));
3192     regnode *stclass;
3193     GET_RE_DEBUG_FLAGS_DECL;
3194
3195     PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE;
3196     PERL_UNUSED_CONTEXT;
3197 #ifndef DEBUGGING
3198     PERL_UNUSED_ARG(depth);
3199 #endif
3200
3201     if ( OP(source) == TRIE ) {
3202         struct regnode_1 *op = (struct regnode_1 *)
3203             PerlMemShared_calloc(1, sizeof(struct regnode_1));
3204         StructCopy(source,op,struct regnode_1);
3205         stclass = (regnode *)op;
3206     } else {
3207         struct regnode_charclass *op = (struct regnode_charclass *)
3208             PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
3209         StructCopy(source,op,struct regnode_charclass);
3210         stclass = (regnode *)op;
3211     }
3212     OP(stclass)+=2; /* convert the TRIE type to its AHO-CORASICK equivalent */
3213
3214     ARG_SET( stclass, data_slot );
3215     aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) );
3216     RExC_rxi->data->data[ data_slot ] = (void*)aho;
3217     aho->trie=trie_offset;
3218     aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) );
3219     Copy( trie->states, aho->states, numstates, reg_trie_state );
3220     Newxz( q, numstates, U32);
3221     aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) );
3222     aho->refcount = 1;
3223     fail = aho->fail;
3224     /* initialize fail[0..1] to be 1 so that we always have
3225        a valid final fail state */
3226     fail[ 0 ] = fail[ 1 ] = 1;
3227
3228     for ( charid = 0; charid < ucharcount ; charid++ ) {
3229         const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 );
3230         if ( newstate ) {
3231             q[ q_write ] = newstate;
3232             /* set to point at the root */
3233             fail[ q[ q_write++ ] ]=1;
3234         }
3235     }
3236     while ( q_read < q_write) {
3237         const U32 cur = q[ q_read++ % numstates ];
3238         base = trie->states[ cur ].trans.base;
3239
3240         for ( charid = 0 ; charid < ucharcount ; charid++ ) {
3241             const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 );
3242             if (ch_state) {
3243                 U32 fail_state = cur;
3244                 U32 fail_base;
3245                 do {
3246                     fail_state = fail[ fail_state ];
3247                     fail_base = aho->states[ fail_state ].trans.base;
3248                 } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) );
3249
3250                 fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 );
3251                 fail[ ch_state ] = fail_state;
3252                 if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum )
3253                 {
3254                         aho->states[ ch_state ].wordnum =  aho->states[ fail_state ].wordnum;
3255                 }
3256                 q[ q_write++ % numstates] = ch_state;
3257             }
3258         }
3259     }
3260     /* restore fail[0..1] to 0 so that we "fall out" of the AC loop
3261        when we fail in state 1, this allows us to use the
3262        charclass scan to find a valid start char. This is based on the principle
3263        that theres a good chance the string being searched contains lots of stuff
3264        that cant be a start char.
3265      */
3266     fail[ 0 ] = fail[ 1 ] = 0;
3267     DEBUG_TRIE_COMPILE_r({
3268         PerlIO_printf(Perl_debug_log,
3269                       "%*sStclass Failtable (%"UVuf" states): 0",
3270                       (int)(depth * 2), "", (UV)numstates
3271         );
3272         for( q_read=1; q_read<numstates; q_read++ ) {
3273             PerlIO_printf(Perl_debug_log, ", %"UVuf, (UV)fail[q_read]);
3274         }
3275         PerlIO_printf(Perl_debug_log, "\n");
3276     });
3277     Safefree(q);
3278     /*RExC_seen |= REG_TRIEDFA_SEEN;*/
3279     return stclass;
3280 }
3281
3282
3283 #define DEBUG_PEEP(str,scan,depth) \
3284     DEBUG_OPTIMISE_r({if (scan){ \
3285        regnode *Next = regnext(scan); \
3286        regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state); \
3287        PerlIO_printf(Perl_debug_log, "%*s" str ">%3d: %s (%d)", \
3288            (int)depth*2, "", REG_NODE_NUM(scan), SvPV_nolen_const(RExC_mysv),\
3289            Next ? (REG_NODE_NUM(Next)) : 0 ); \
3290        DEBUG_SHOW_STUDY_FLAGS(flags," [ ","]");\
3291        PerlIO_printf(Perl_debug_log, "\n"); \
3292    }});
3293
3294 /* The below joins as many adjacent EXACTish nodes as possible into a single
3295  * one.  The regop may be changed if the node(s) contain certain sequences that
3296  * require special handling.  The joining is only done if:
3297  * 1) there is room in the current conglomerated node to entirely contain the
3298  *    next one.
3299  * 2) they are the exact same node type
3300  *
3301  * The adjacent nodes actually may be separated by NOTHING-kind nodes, and
3302  * these get optimized out
3303  *
3304  * If a node is to match under /i (folded), the number of characters it matches
3305  * can be different than its character length if it contains a multi-character
3306  * fold.  *min_subtract is set to the total delta number of characters of the
3307  * input nodes.
3308  *
3309  * And *unfolded_multi_char is set to indicate whether or not the node contains
3310  * an unfolded multi-char fold.  This happens when whether the fold is valid or
3311  * not won't be known until runtime; namely for EXACTF nodes that contain LATIN
3312  * SMALL LETTER SHARP S, as only if the target string being matched against
3313  * turns out to be UTF-8 is that fold valid; and also for EXACTFL nodes whose
3314  * folding rules depend on the locale in force at runtime.  (Multi-char folds
3315  * whose components are all above the Latin1 range are not run-time locale
3316  * dependent, and have already been folded by the time this function is
3317  * called.)
3318  *
3319  * This is as good a place as any to discuss the design of handling these
3320  * multi-character fold sequences.  It's been wrong in Perl for a very long
3321  * time.  There are three code points in Unicode whose multi-character folds
3322  * were long ago discovered to mess things up.  The previous designs for
3323  * dealing with these involved assigning a special node for them.  This
3324  * approach doesn't always work, as evidenced by this example:
3325  *      "\xDFs" =~ /s\xDF/ui    # Used to fail before these patches
3326  * Both sides fold to "sss", but if the pattern is parsed to create a node that
3327  * would match just the \xDF, it won't be able to handle the case where a
3328  * successful match would have to cross the node's boundary.  The new approach
3329  * that hopefully generally solves the problem generates an EXACTFU_SS node
3330  * that is "sss" in this case.
3331  *
3332  * It turns out that there are problems with all multi-character folds, and not
3333  * just these three.  Now the code is general, for all such cases.  The
3334  * approach taken is:
3335  * 1)   This routine examines each EXACTFish node that could contain multi-
3336  *      character folded sequences.  Since a single character can fold into
3337  *      such a sequence, the minimum match length for this node is less than
3338  *      the number of characters in the node.  This routine returns in
3339  *      *min_subtract how many characters to subtract from the the actual
3340  *      length of the string to get a real minimum match length; it is 0 if
3341  *      there are no multi-char foldeds.  This delta is used by the caller to
3342  *      adjust the min length of the match, and the delta between min and max,
3343  *      so that the optimizer doesn't reject these possibilities based on size
3344  *      constraints.
3345  * 2)   For the sequence involving the Sharp s (\xDF), the node type EXACTFU_SS
3346  *      is used for an EXACTFU node that contains at least one "ss" sequence in
3347  *      it.  For non-UTF-8 patterns and strings, this is the only case where
3348  *      there is a possible fold length change.  That means that a regular
3349  *      EXACTFU node without UTF-8 involvement doesn't have to concern itself
3350  *      with length changes, and so can be processed faster.  regexec.c takes
3351  *      advantage of this.  Generally, an EXACTFish node that is in UTF-8 is
3352  *      pre-folded by regcomp.c (except EXACTFL, some of whose folds aren't
3353  *      known until runtime).  This saves effort in regex matching.  However,
3354  *      the pre-folding isn't done for non-UTF8 patterns because the fold of
3355  *      the MICRO SIGN requires UTF-8, and we don't want to slow things down by
3356  *      forcing the pattern into UTF8 unless necessary.  Also what EXACTF (and,
3357  *      again, EXACTFL) nodes fold to isn't known until runtime.  The fold
3358  *      possibilities for the non-UTF8 patterns are quite simple, except for
3359  *      the sharp s.  All the ones that don't involve a UTF-8 target string are
3360  *      members of a fold-pair, and arrays are set up for all of them so that
3361  *      the other member of the pair can be found quickly.  Code elsewhere in
3362  *      this file makes sure that in EXACTFU nodes, the sharp s gets folded to
3363  *      'ss', even if the pattern isn't UTF-8.  This avoids the issues
3364  *      described in the next item.
3365  * 3)   A problem remains for unfolded multi-char folds. (These occur when the
3366  *      validity of the fold won't be known until runtime, and so must remain
3367  *      unfolded for now.  This happens for the sharp s in EXACTF and EXACTFA
3368  *      nodes when the pattern isn't in UTF-8.  (Note, BTW, that there cannot
3369  *      be an EXACTF node with a UTF-8 pattern.)  They also occur for various
3370  *      folds in EXACTFL nodes, regardless of the UTF-ness of the pattern.)
3371  *      The reason this is a problem is that the optimizer part of regexec.c
3372  *      (probably unwittingly, in Perl_regexec_flags()) makes an assumption
3373  *      that a character in the pattern corresponds to at most a single
3374  *      character in the target string.  (And I do mean character, and not byte
3375  *      here, unlike other parts of the documentation that have never been
3376  *      updated to account for multibyte Unicode.)  sharp s in EXACTF and
3377  *      EXACTFL nodes can match the two character string 'ss'; in EXACTFA nodes
3378  *      it can match "\x{17F}\x{17F}".  These, along with other ones in EXACTFL
3379  *      nodes, violate the assumption, and they are the only instances where it
3380  *      is violated.  I'm reluctant to try to change the assumption, as the
3381  *      code involved is impenetrable to me (khw), so instead the code here
3382  *      punts.  This routine examines EXACTFL nodes, and (when the pattern
3383  *      isn't UTF-8) EXACTF and EXACTFA for such unfolded folds, and returns a
3384  *      boolean indicating whether or not the node contains such a fold.  When
3385  *      it is true, the caller sets a flag that later causes the optimizer in
3386  *      this file to not set values for the floating and fixed string lengths,
3387  *      and thus avoids the optimizer code in regexec.c that makes the invalid
3388  *      assumption.  Thus, there is no optimization based on string lengths for
3389  *      EXACTFL nodes that contain these few folds, nor for non-UTF8-pattern
3390  *      EXACTF and EXACTFA nodes that contain the sharp s.  (The reason the
3391  *      assumption is wrong only in these cases is that all other non-UTF-8
3392  *      folds are 1-1; and, for UTF-8 patterns, we pre-fold all other folds to
3393  *      their expanded versions.  (Again, we can't prefold sharp s to 'ss' in
3394  *      EXACTF nodes because we don't know at compile time if it actually
3395  *      matches 'ss' or not.  For EXACTF nodes it will match iff the target
3396  *      string is in UTF-8.  This is in contrast to EXACTFU nodes, where it
3397  *      always matches; and EXACTFA where it never does.  In an EXACTFA node in
3398  *      a UTF-8 pattern, sharp s is folded to "\x{17F}\x{17F}, avoiding the
3399  *      problem; but in a non-UTF8 pattern, folding it to that above-Latin1
3400  *      string would require the pattern to be forced into UTF-8, the overhead
3401  *      of which we want to avoid.  Similarly the unfolded multi-char folds in
3402  *      EXACTFL nodes will match iff the locale at the time of match is a UTF-8
3403  *      locale.)
3404  *
3405  *      Similarly, the code that generates tries doesn't currently handle
3406  *      not-already-folded multi-char folds, and it looks like a pain to change
3407  *      that.  Therefore, trie generation of EXACTFA nodes with the sharp s
3408  *      doesn't work.  Instead, such an EXACTFA is turned into a new regnode,
3409  *      EXACTFA_NO_TRIE, which the trie code knows not to handle.  Most people
3410  *      using /iaa matching will be doing so almost entirely with ASCII
3411  *      strings, so this should rarely be encountered in practice */
3412
3413 #define JOIN_EXACT(scan,min_subtract,unfolded_multi_char, flags) \
3414     if (PL_regkind[OP(scan)] == EXACT) \
3415         join_exact(pRExC_state,(scan),(min_subtract),unfolded_multi_char, (flags),NULL,depth+1)
3416
3417 STATIC U32
3418 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan,
3419                    UV *min_subtract, bool *unfolded_multi_char,
3420                    U32 flags,regnode *val, U32 depth)
3421 {
3422     /* Merge several consecutive EXACTish nodes into one. */
3423     regnode *n = regnext(scan);
3424     U32 stringok = 1;
3425     regnode *next = scan + NODE_SZ_STR(scan);
3426     U32 merged = 0;
3427     U32 stopnow = 0;
3428 #ifdef DEBUGGING
3429     regnode *stop = scan;
3430     GET_RE_DEBUG_FLAGS_DECL;
3431 #else
3432     PERL_UNUSED_ARG(depth);
3433 #endif
3434
3435     PERL_ARGS_ASSERT_JOIN_EXACT;
3436 #ifndef EXPERIMENTAL_INPLACESCAN
3437     PERL_UNUSED_ARG(flags);
3438     PERL_UNUSED_ARG(val);
3439 #endif
3440     DEBUG_PEEP("join",scan,depth);
3441
3442     /* Look through the subsequent nodes in the chain.  Skip NOTHING, merge
3443      * EXACT ones that are mergeable to the current one. */
3444     while (n
3445            && (PL_regkind[OP(n)] == NOTHING
3446                || (stringok && OP(n) == OP(scan)))
3447            && NEXT_OFF(n)
3448            && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX)
3449     {
3450
3451         if (OP(n) == TAIL || n > next)
3452             stringok = 0;
3453         if (PL_regkind[OP(n)] == NOTHING) {
3454             DEBUG_PEEP("skip:",n,depth);
3455             NEXT_OFF(scan) += NEXT_OFF(n);
3456             next = n + NODE_STEP_REGNODE;
3457 #ifdef DEBUGGING
3458             if (stringok)
3459                 stop = n;
3460 #endif
3461             n = regnext(n);
3462         }
3463         else if (stringok) {
3464             const unsigned int oldl = STR_LEN(scan);
3465             regnode * const nnext = regnext(n);
3466
3467             /* XXX I (khw) kind of doubt that this works on platforms (should
3468              * Perl ever run on one) where U8_MAX is above 255 because of lots
3469              * of other assumptions */
3470             /* Don't join if the sum can't fit into a single node */
3471             if (oldl + STR_LEN(n) > U8_MAX)
3472                 break;
3473
3474             DEBUG_PEEP("merg",n,depth);
3475             merged++;
3476
3477             NEXT_OFF(scan) += NEXT_OFF(n);
3478             STR_LEN(scan) += STR_LEN(n);
3479             next = n + NODE_SZ_STR(n);
3480             /* Now we can overwrite *n : */
3481             Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
3482 #ifdef DEBUGGING
3483             stop = next - 1;
3484 #endif
3485             n = nnext;
3486             if (stopnow) break;
3487         }
3488
3489 #ifdef EXPERIMENTAL_INPLACESCAN
3490         if (flags && !NEXT_OFF(n)) {
3491             DEBUG_PEEP("atch", val, depth);
3492             if (reg_off_by_arg[OP(n)]) {
3493                 ARG_SET(n, val - n);
3494             }
3495             else {
3496                 NEXT_OFF(n) = val - n;
3497             }
3498             stopnow = 1;
3499         }
3500 #endif
3501     }
3502
3503     *min_subtract = 0;
3504     *unfolded_multi_char = FALSE;
3505
3506     /* Here, all the adjacent mergeable EXACTish nodes have been merged.  We
3507      * can now analyze for sequences of problematic code points.  (Prior to
3508      * this final joining, sequences could have been split over boundaries, and
3509      * hence missed).  The sequences only happen in folding, hence for any
3510      * non-EXACT EXACTish node */
3511     if (OP(scan) != EXACT && OP(scan) != EXACTL) {
3512         U8* s0 = (U8*) STRING(scan);
3513         U8* s = s0;
3514         U8* s_end = s0 + STR_LEN(scan);
3515
3516         int total_count_delta = 0;  /* Total delta number of characters that
3517                                        multi-char folds expand to */
3518
3519         /* One pass is made over the node's string looking for all the
3520          * possibilities.  To avoid some tests in the loop, there are two main
3521          * cases, for UTF-8 patterns (which can't have EXACTF nodes) and
3522          * non-UTF-8 */
3523         if (UTF) {
3524             U8* folded = NULL;
3525
3526             if (OP(scan) == EXACTFL) {
3527                 U8 *d;
3528
3529                 /* An EXACTFL node would already have been changed to another
3530                  * node type unless there is at least one character in it that
3531                  * is problematic; likely a character whose fold definition
3532                  * won't be known until runtime, and so has yet to be folded.
3533                  * For all but the UTF-8 locale, folds are 1-1 in length, but
3534                  * to handle the UTF-8 case, we need to create a temporary
3535                  * folded copy using UTF-8 locale rules in order to analyze it.
3536                  * This is because our macros that look to see if a sequence is
3537                  * a multi-char fold assume everything is folded (otherwise the
3538                  * tests in those macros would be too complicated and slow).
3539                  * Note that here, the non-problematic folds will have already
3540                  * been done, so we can just copy such characters.  We actually
3541                  * don't completely fold the EXACTFL string.  We skip the
3542                  * unfolded multi-char folds, as that would just create work
3543                  * below to figure out the size they already are */
3544
3545                 Newx(folded, UTF8_MAX_FOLD_CHAR_EXPAND * STR_LEN(scan) + 1, U8);
3546                 d = folded;
3547                 while (s < s_end) {
3548                     STRLEN s_len = UTF8SKIP(s);
3549                     if (! is_PROBLEMATIC_LOCALE_FOLD_utf8(s)) {
3550                         Copy(s, d, s_len, U8);
3551                         d += s_len;
3552                     }
3553                     else if (is_FOLDS_TO_MULTI_utf8(s)) {
3554                         *unfolded_multi_char = TRUE;
3555                         Copy(s, d, s_len, U8);
3556                         d += s_len;
3557                     }
3558                     else if (isASCII(*s)) {
3559                         *(d++) = toFOLD(*s);
3560                     }
3561                     else {
3562                         STRLEN len;
3563                         _to_utf8_fold_flags(s, d, &len, FOLD_FLAGS_FULL);
3564                         d += len;
3565                     }
3566                     s += s_len;
3567                 }
3568
3569                 /* Point the remainder of the routine to look at our temporary
3570                  * folded copy */
3571                 s = folded;
3572                 s_end = d;
3573             } /* End of creating folded copy of EXACTFL string */
3574
3575             /* Examine the string for a multi-character fold sequence.  UTF-8
3576              * patterns have all characters pre-folded by the time this code is
3577              * executed */
3578             while (s < s_end - 1) /* Can stop 1 before the end, as minimum
3579                                      length sequence we are looking for is 2 */
3580             {
3581                 int count = 0;  /* How many characters in a multi-char fold */
3582                 int len = is_MULTI_CHAR_FOLD_utf8_safe(s, s_end);
3583                 if (! len) {    /* Not a multi-char fold: get next char */
3584                     s += UTF8SKIP(s);
3585                     continue;
3586                 }
3587
3588                 /* Nodes with 'ss' require special handling, except for
3589                  * EXACTFA-ish for which there is no multi-char fold to this */
3590                 if (len == 2 && *s == 's' && *(s+1) == 's'
3591                     && OP(scan) != EXACTFA
3592                     && OP(scan) != EXACTFA_NO_TRIE)
3593                 {
3594                     count = 2;
3595                     if (OP(scan) != EXACTFL) {
3596                         OP(scan) = EXACTFU_SS;
3597                     }
3598                     s += 2;
3599                 }
3600                 else { /* Here is a generic multi-char fold. */
3601                     U8* multi_end  = s + len;
3602
3603                     /* Count how many characters are in it.  In the case of
3604                      * /aa, no folds which contain ASCII code points are
3605                      * allowed, so check for those, and skip if found. */
3606                     if (OP(scan) != EXACTFA && OP(scan) != EXACTFA_NO_TRIE) {
3607                         count = utf8_length(s, multi_end);
3608                         s = multi_end;
3609                     }
3610                     else {
3611                         while (s < multi_end) {
3612                             if (isASCII(*s)) {
3613                                 s++;
3614                                 goto next_iteration;
3615                             }
3616                             else {
3617                                 s += UTF8SKIP(s);
3618                             }
3619                             count++;
3620                         }
3621                     }
3622                 }
3623
3624                 /* The delta is how long the sequence is minus 1 (1 is how long
3625                  * the character that folds to the sequence is) */
3626                 total_count_delta += count - 1;
3627               next_iteration: ;
3628             }
3629
3630             /* We created a temporary folded copy of the string in EXACTFL
3631              * nodes.  Therefore we need to be sure it doesn't go below zero,
3632              * as the real string could be shorter */
3633             if (OP(scan) == EXACTFL) {
3634                 int total_chars = utf8_length((U8*) STRING(scan),
3635                                            (U8*) STRING(scan) + STR_LEN(scan));
3636                 if (total_count_delta > total_chars) {
3637                     total_count_delta = total_chars;
3638                 }
3639             }
3640
3641             *min_subtract += total_count_delta;
3642             Safefree(folded);
3643         }
3644         else if (OP(scan) == EXACTFA) {
3645
3646             /* Non-UTF-8 pattern, EXACTFA node.  There can't be a multi-char
3647              * fold to the ASCII range (and there are no existing ones in the
3648              * upper latin1 range).  But, as outlined in the comments preceding
3649              * this function, we need to flag any occurrences of the sharp s.
3650              * This character forbids trie formation (because of added
3651              * complexity) */
3652             while (s < s_end) {
3653                 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
3654                     OP(scan) = EXACTFA_NO_TRIE;
3655                     *unfolded_multi_char = TRUE;
3656                     break;
3657                 }
3658                 s++;
3659                 continue;
3660             }
3661         }
3662         else {
3663
3664             /* Non-UTF-8 pattern, not EXACTFA node.  Look for the multi-char
3665              * folds that are all Latin1.  As explained in the comments
3666              * preceding this function, we look also for the sharp s in EXACTF
3667              * and EXACTFL nodes; it can be in the final position.  Otherwise
3668              * we can stop looking 1 byte earlier because have to find at least
3669              * two characters for a multi-fold */
3670             const U8* upper = (OP(scan) == EXACTF || OP(scan) == EXACTFL)
3671                               ? s_end
3672                               : s_end -1;
3673
3674             while (s < upper) {
3675                 int len = is_MULTI_CHAR_FOLD_latin1_safe(s, s_end);
3676                 if (! len) {    /* Not a multi-char fold. */
3677                     if (*s == LATIN_SMALL_LETTER_SHARP_S
3678                         && (OP(scan) == EXACTF || OP(scan) == EXACTFL))
3679                     {
3680                         *unfolded_multi_char = TRUE;
3681                     }
3682                     s++;
3683                     continue;
3684                 }
3685
3686                 if (len == 2
3687                     && isALPHA_FOLD_EQ(*s, 's')
3688                     && isALPHA_FOLD_EQ(*(s+1), 's'))
3689                 {
3690
3691                     /* EXACTF nodes need to know that the minimum length
3692                      * changed so that a sharp s in the string can match this
3693                      * ss in the pattern, but they remain EXACTF nodes, as they
3694                      * won't match this unless the target string is is UTF-8,
3695                      * which we don't know until runtime.  EXACTFL nodes can't
3696                      * transform into EXACTFU nodes */
3697                     if (OP(scan) != EXACTF && OP(scan) != EXACTFL) {
3698                         OP(scan) = EXACTFU_SS;
3699                     }
3700                 }
3701
3702                 *min_subtract += len - 1;
3703                 s += len;
3704             }
3705         }
3706     }
3707
3708 #ifdef DEBUGGING
3709     /* Allow dumping but overwriting the collection of skipped
3710      * ops and/or strings with fake optimized ops */
3711     n = scan + NODE_SZ_STR(scan);
3712     while (n <= stop) {
3713         OP(n) = OPTIMIZED;
3714         FLAGS(n) = 0;
3715         NEXT_OFF(n) = 0;
3716         n++;
3717     }
3718 #endif
3719     DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl",scan,depth)});
3720     return stopnow;
3721 }
3722
3723 /* REx optimizer.  Converts nodes into quicker variants "in place".
3724    Finds fixed substrings.  */
3725
3726 /* Stops at toplevel WHILEM as well as at "last". At end *scanp is set
3727    to the position after last scanned or to NULL. */
3728
3729 #define INIT_AND_WITHP \
3730     assert(!and_withp); \
3731     Newx(and_withp,1, regnode_ssc); \
3732     SAVEFREEPV(and_withp)
3733
3734
3735 static void
3736 S_unwind_scan_frames(pTHX_ const void *p)
3737 {
3738     scan_frame *f= (scan_frame *)p;
3739     do {
3740         scan_frame *n= f->next_frame;
3741         Safefree(f);
3742         f= n;
3743     } while (f);
3744 }
3745
3746
3747 STATIC SSize_t
3748 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
3749                         SSize_t *minlenp, SSize_t *deltap,
3750                         regnode *last,
3751                         scan_data_t *data,
3752                         I32 stopparen,
3753                         U32 recursed_depth,
3754                         regnode_ssc *and_withp,
3755                         U32 flags, U32 depth)
3756                         /* scanp: Start here (read-write). */
3757                         /* deltap: Write maxlen-minlen here. */
3758                         /* last: Stop before this one. */
3759                         /* data: string data about the pattern */
3760                         /* stopparen: treat close N as END */
3761                         /* recursed: which subroutines have we recursed into */
3762                         /* and_withp: Valid if flags & SCF_DO_STCLASS_OR */
3763 {
3764     /* There must be at least this number of characters to match */
3765     SSize_t min = 0;
3766     I32 pars = 0, code;
3767     regnode *scan = *scanp, *next;
3768     SSize_t delta = 0;
3769     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
3770     int is_inf_internal = 0;            /* The studied chunk is infinite */
3771     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
3772     scan_data_t data_fake;
3773     SV *re_trie_maxbuff = NULL;
3774     regnode *first_non_open = scan;
3775     SSize_t stopmin = SSize_t_MAX;
3776     scan_frame *frame = NULL;
3777     GET_RE_DEBUG_FLAGS_DECL;
3778
3779     PERL_ARGS_ASSERT_STUDY_CHUNK;
3780
3781
3782     if ( depth == 0 ) {
3783         while (first_non_open && OP(first_non_open) == OPEN)
3784             first_non_open=regnext(first_non_open);
3785     }
3786
3787
3788   fake_study_recurse:
3789     DEBUG_r(
3790         RExC_study_chunk_recursed_count++;
3791     );
3792     DEBUG_OPTIMISE_MORE_r(
3793     {
3794         PerlIO_printf(Perl_debug_log,
3795             "%*sstudy_chunk stopparen=%ld recursed_count=%lu depth=%lu recursed_depth=%lu scan=%p last=%p",
3796             (int)(depth*2), "", (long)stopparen,
3797             (unsigned long)RExC_study_chunk_recursed_count,
3798             (unsigned long)depth, (unsigned long)recursed_depth,
3799             scan,
3800             last);
3801         if (recursed_depth) {
3802             U32 i;
3803             U32 j;
3804             for ( j = 0 ; j < recursed_depth ; j++ ) {
3805                 for ( i = 0 ; i < (U32)RExC_npar ; i++ ) {
3806                     if (
3807                         PAREN_TEST(RExC_study_chunk_recursed +
3808                                    ( j * RExC_study_chunk_recursed_bytes), i )
3809                         && (
3810                             !j ||
3811                             !PAREN_TEST(RExC_study_chunk_recursed +
3812                                    (( j - 1 ) * RExC_study_chunk_recursed_bytes), i)
3813                         )
3814                     ) {
3815                         PerlIO_printf(Perl_debug_log," %d",(int)i);
3816                         break;
3817                     }
3818                 }
3819                 if ( j + 1 < recursed_depth ) {
3820                     PerlIO_printf(Perl_debug_log, ",");
3821                 }
3822             }
3823         }
3824         PerlIO_printf(Perl_debug_log,"\n");
3825     }
3826     );
3827     while ( scan && OP(scan) != END && scan < last ){
3828         UV min_subtract = 0;    /* How mmany chars to subtract from the minimum
3829                                    node length to get a real minimum (because
3830                                    the folded version may be shorter) */
3831         bool unfolded_multi_char = FALSE;
3832         /* Peephole optimizer: */
3833         DEBUG_STUDYDATA("Peep:", data, depth);
3834         DEBUG_PEEP("Peep", scan, depth);
3835
3836
3837         /* The reason we do this here we need to deal with things like /(?:f)(?:o)(?:o)/
3838          * which cant be dealt with by the normal EXACT parsing code, as each (?:..) is handled
3839          * by a different invocation of reg() -- Yves
3840          */
3841         JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
3842
3843         /* Follow the next-chain of the current node and optimize
3844            away all the NOTHINGs from it.  */
3845         if (OP(scan) != CURLYX) {
3846             const int max = (reg_off_by_arg[OP(scan)]
3847                        ? I32_MAX
3848                        /* I32 may be smaller than U16 on CRAYs! */
3849                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
3850             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
3851             int noff;
3852             regnode *n = scan;
3853
3854             /* Skip NOTHING and LONGJMP. */
3855             while ((n = regnext(n))
3856                    && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
3857                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
3858                    && off + noff < max)
3859                 off += noff;
3860             if (reg_off_by_arg[OP(scan)])
3861                 ARG(scan) = off;
3862             else
3863                 NEXT_OFF(scan) = off;
3864         }
3865
3866         /* The principal pseudo-switch.  Cannot be a switch, since we
3867            look into several different things.  */
3868         if ( OP(scan) == DEFINEP ) {
3869             SSize_t minlen = 0;
3870             SSize_t deltanext = 0;
3871             SSize_t fake_last_close = 0;
3872             I32 f = SCF_IN_DEFINE;
3873
3874             StructCopy(&zero_scan_data, &data_fake, scan_data_t);
3875             scan = regnext(scan);
3876             assert( OP(scan) == IFTHEN );
3877             DEBUG_PEEP("expect IFTHEN", scan, depth);
3878
3879             data_fake.last_closep= &fake_last_close;
3880             minlen = *minlenp;
3881             next = regnext(scan);
3882             scan = NEXTOPER(NEXTOPER(scan));
3883             DEBUG_PEEP("scan", scan, depth);
3884             DEBUG_PEEP("next", next, depth);
3885
3886             /* we suppose the run is continuous, last=next...
3887              * NOTE we dont use the return here! */
3888             (void)study_chunk(pRExC_state, &scan, &minlen,
3889                               &deltanext, next, &data_fake, stopparen,
3890                               recursed_depth, NULL, f, depth+1);
3891
3892             scan = next;
3893         } else
3894         if (
3895             OP(scan) == BRANCH  ||
3896             OP(scan) == BRANCHJ ||
3897             OP(scan) == IFTHEN
3898         ) {
3899             next = regnext(scan);
3900             code = OP(scan);
3901
3902             /* The op(next)==code check below is to see if we
3903              * have "BRANCH-BRANCH", "BRANCHJ-BRANCHJ", "IFTHEN-IFTHEN"
3904              * IFTHEN is special as it might not appear in pairs.
3905              * Not sure whether BRANCH-BRANCHJ is possible, regardless
3906              * we dont handle it cleanly. */
3907             if (OP(next) == code || code == IFTHEN) {
3908                 /* NOTE - There is similar code to this block below for
3909                  * handling TRIE nodes on a re-study.  If you change stuff here
3910                  * check there too. */
3911                 SSize_t max1 = 0, min1 = SSize_t_MAX, num = 0;
3912                 regnode_ssc accum;
3913                 regnode * const startbranch=scan;
3914
3915                 if (flags & SCF_DO_SUBSTR) {
3916                     /* Cannot merge strings after this. */
3917                     scan_commit(pRExC_state, data, minlenp, is_inf);
3918                 }
3919
3920                 if (flags & SCF_DO_STCLASS)
3921                     ssc_init_zero(pRExC_state, &accum);
3922
3923                 while (OP(scan) == code) {
3924                     SSize_t deltanext, minnext, fake;
3925                     I32 f = 0;
3926                     regnode_ssc this_class;
3927
3928                     DEBUG_PEEP("Branch", scan, depth);
3929
3930                     num++;
3931                     StructCopy(&zero_scan_data, &data_fake, scan_data_t);
3932                     if (data) {
3933                         data_fake.whilem_c = data->whilem_c;
3934                         data_fake.last_closep = data->last_closep;
3935                     }
3936                     else
3937                         data_fake.last_closep = &fake;
3938
3939                     data_fake.pos_delta = delta;
3940                     next = regnext(scan);
3941
3942                     scan = NEXTOPER(scan); /* everything */
3943                     if (code != BRANCH)    /* everything but BRANCH */
3944                         scan = NEXTOPER(scan);
3945
3946                     if (flags & SCF_DO_STCLASS) {
3947                         ssc_init(pRExC_state, &this_class);
3948                         data_fake.start_class = &this_class;
3949                         f = SCF_DO_STCLASS_AND;
3950                     }
3951                     if (flags & SCF_WHILEM_VISITED_POS)
3952                         f |= SCF_WHILEM_VISITED_POS;
3953
3954                     /* we suppose the run is continuous, last=next...*/
3955                     minnext = study_chunk(pRExC_state, &scan, minlenp,
3956                                       &deltanext, next, &data_fake, stopparen,
3957                                       recursed_depth, NULL, f,depth+1);
3958
3959                     if (min1 > minnext)
3960                         min1 = minnext;
3961                     if (deltanext == SSize_t_MAX) {
3962                         is_inf = is_inf_internal = 1;
3963                         max1 = SSize_t_MAX;
3964                     } else if (max1 < minnext + deltanext)
3965                         max1 = minnext + deltanext;
3966                     scan = next;
3967                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3968                         pars++;
3969                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
3970                         if ( stopmin > minnext)
3971                             stopmin = min + min1;
3972                         flags &= ~SCF_DO_SUBSTR;
3973                         if (data)
3974                             data->flags |= SCF_SEEN_ACCEPT;
3975                     }
3976                     if (data) {
3977                         if (data_fake.flags & SF_HAS_EVAL)
3978                             data->flags |= SF_HAS_EVAL;
3979                         data->whilem_c = data_fake.whilem_c;
3980                     }
3981                     if (flags & SCF_DO_STCLASS)
3982                         ssc_or(pRExC_state, &accum, (regnode_charclass*)&this_class);
3983                 }
3984                 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
3985                     min1 = 0;
3986                 if (flags & SCF_DO_SUBSTR) {
3987                     data->pos_min += min1;
3988                     if (data->pos_delta >= SSize_t_MAX - (max1 - min1))
3989                         data->pos_delta = SSize_t_MAX;
3990                     else
3991                         data->pos_delta += max1 - min1;
3992                     if (max1 != min1 || is_inf)
3993                         data->longest = &(data->longest_float);
3994                 }
3995                 min += min1;
3996                 if (delta == SSize_t_MAX
3997                  || SSize_t_MAX - delta - (max1 - min1) < 0)
3998                     delta = SSize_t_MAX;
3999                 else
4000                     delta += max1 - min1;
4001                 if (flags & SCF_DO_STCLASS_OR) {
4002                     ssc_or(pRExC_state, data->start_class, (regnode_charclass*) &accum);
4003                     if (min1) {
4004                         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
4005                         flags &= ~SCF_DO_STCLASS;
4006                     }
4007                 }
4008                 else if (flags & SCF_DO_STCLASS_AND) {
4009                     if (min1) {
4010                         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum);
4011                         flags &= ~SCF_DO_STCLASS;
4012                     }
4013                     else {
4014                         /* Switch to OR mode: cache the old value of
4015                          * data->start_class */
4016                         INIT_AND_WITHP;
4017                         StructCopy(data->start_class, and_withp, regnode_ssc);
4018                         flags &= ~SCF_DO_STCLASS_AND;
4019                         StructCopy(&accum, data->start_class, regnode_ssc);
4020                         flags |= SCF_DO_STCLASS_OR;
4021                     }
4022                 }
4023
4024                 if (PERL_ENABLE_TRIE_OPTIMISATION &&
4025                         OP( startbranch ) == BRANCH )
4026                 {
4027                 /* demq.
4028
4029                    Assuming this was/is a branch we are dealing with: 'scan'
4030                    now points at the item that follows the branch sequence,
4031                    whatever it is. We now start at the beginning of the
4032                    sequence and look for subsequences of
4033
4034                    BRANCH->EXACT=>x1
4035                    BRANCH->EXACT=>x2
4036                    tail
4037
4038                    which would be constructed from a pattern like
4039                    /A|LIST|OF|WORDS/
4040
4041                    If we can find such a subsequence we need to turn the first
4042                    element into a trie and then add the subsequent branch exact
4043                    strings to the trie.
4044
4045                    We have two cases
4046
4047                      1. patterns where the whole set of branches can be
4048                         converted.
4049
4050                      2. patterns where only a subset can be converted.
4051
4052                    In case 1 we can replace the whole set with a single regop
4053                    for the trie. In case 2 we need to keep the start and end
4054                    branches so
4055
4056                      'BRANCH EXACT; BRANCH EXACT; BRANCH X'
4057                      becomes BRANCH TRIE; BRANCH X;
4058
4059                   There is an additional case, that being where there is a
4060                   common prefix, which gets split out into an EXACT like node
4061                   preceding the TRIE node.
4062
4063                   If x(1..n)==tail then we can do a simple trie, if not we make
4064                   a "jump" trie, such that when we match the appropriate word
4065                   we "jump" to the appropriate tail node. Essentially we turn
4066                   a nested if into a case structure of sorts.
4067
4068                 */
4069
4070                     int made=0;
4071                     if (!re_trie_maxbuff) {
4072                         re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
4073                         if (!SvIOK(re_trie_maxbuff))
4074                             sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
4075                     }
4076                     if ( SvIV(re_trie_maxbuff)>=0  ) {
4077                         regnode *cur;
4078                         regnode *first = (regnode *)NULL;
4079                         regnode *last = (regnode *)NULL;
4080                         regnode *tail = scan;
4081                         U8 trietype = 0;
4082                         U32 count=0;
4083
4084                         /* var tail is used because there may be a TAIL
4085                            regop in the way. Ie, the exacts will point to the
4086                            thing following the TAIL, but the last branch will
4087                            point at the TAIL. So we advance tail. If we
4088                            have nested (?:) we may have to move through several
4089                            tails.
4090                          */
4091
4092                         while ( OP( tail ) == TAIL ) {
4093                             /* this is the TAIL generated by (?:) */
4094                             tail = regnext( tail );
4095                         }
4096
4097
4098                         DEBUG_TRIE_COMPILE_r({
4099                             regprop(RExC_rx, RExC_mysv, tail, NULL, pRExC_state);
4100                             PerlIO_printf( Perl_debug_log, "%*s%s%s\n",
4101                               (int)depth * 2 + 2, "",
4102                               "Looking for TRIE'able sequences. Tail node is: ",
4103                               SvPV_nolen_const( RExC_mysv )
4104                             );
4105                         });
4106
4107                         /*
4108
4109                             Step through the branches
4110                                 cur represents each branch,
4111                                 noper is the first thing to be matched as part
4112                                       of that branch
4113                                 noper_next is the regnext() of that node.
4114
4115                             We normally handle a case like this
4116                             /FOO[xyz]|BAR[pqr]/ via a "jump trie" but we also
4117                             support building with NOJUMPTRIE, which restricts
4118                             the trie logic to structures like /FOO|BAR/.
4119
4120                             If noper is a trieable nodetype then the branch is
4121                             a possible optimization target. If we are building
4122                             under NOJUMPTRIE then we require that noper_next is
4123                             the same as scan (our current position in the regex
4124                             program).
4125
4126                             Once we have two or more consecutive such branches
4127                             we can create a trie of the EXACT's contents and
4128                             stitch it in place into the program.
4129
4130                             If the sequence represents all of the branches in
4131                             the alternation we replace the entire thing with a
4132                             single TRIE node.
4133
4134                             Otherwise when it is a subsequence we need to
4135                             stitch it in place and replace only the relevant
4136                             branches. This means the first branch has to remain
4137                             as it is used by the alternation logic, and its
4138                             next pointer, and needs to be repointed at the item
4139                             on the branch chain following the last branch we
4140                             have optimized away.
4141
4142                             This could be either a BRANCH, in which case the
4143                             subsequence is internal, or it could be the item
4144                             following the branch sequence in which case the
4145                             subsequence is at the end (which does not
4146                             necessarily mean the first node is the start of the
4147                             alternation).
4148
4149                             TRIE_TYPE(X) is a define which maps the optype to a
4150                             trietype.
4151
4152                                 optype          |  trietype
4153                                 ----------------+-----------
4154                                 NOTHING         | NOTHING
4155                                 EXACT           | EXACT
4156                                 EXACTFU         | EXACTFU
4157                                 EXACTFU_SS      | EXACTFU
4158                                 EXACTFA         | EXACTFA
4159                                 EXACTL          | EXACTL
4160                                 EXACTFLU8       | EXACTFLU8
4161
4162
4163                         */
4164 #define TRIE_TYPE(X) ( ( NOTHING == (X) )                                   \
4165                        ? NOTHING                                            \
4166                        : ( EXACT == (X) )                                   \
4167                          ? EXACT                                            \
4168                          : ( EXACTFU == (X) || EXACTFU_SS == (X) )          \
4169                            ? EXACTFU                                        \
4170                            : ( EXACTFA == (X) )                             \
4171                              ? EXACTFA                                      \
4172                              : ( EXACTL == (X) )                            \
4173                                ? EXACTL                                     \
4174                                : ( EXACTFLU8 == (X) )                        \
4175                                  ? EXACTFLU8                                 \
4176                                  : 0 )
4177
4178                         /* dont use tail as the end marker for this traverse */
4179                         for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) {
4180                             regnode * const noper = NEXTOPER( cur );
4181                             U8 noper_type = OP( noper );
4182                             U8 noper_trietype = TRIE_TYPE( noper_type );
4183 #if defined(DEBUGGING) || defined(NOJUMPTRIE)
4184                             regnode * const noper_next = regnext( noper );
4185                             U8 noper_next_type = (noper_next && noper_next != tail) ? OP(noper_next) : 0;
4186                             U8 noper_next_trietype = (noper_next && noper_next != tail) ? TRIE_TYPE( noper_next_type ) :0;
4187 #endif
4188
4189                             DEBUG_TRIE_COMPILE_r({
4190                                 regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
4191                                 PerlIO_printf( Perl_debug_log, "%*s- %s (%d)",
4192                                    (int)depth * 2 + 2,"", SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur) );
4193
4194                                 regprop(RExC_rx, RExC_mysv, noper, NULL, pRExC_state);
4195                                 PerlIO_printf( Perl_debug_log, " -> %s",
4196                                     SvPV_nolen_const(RExC_mysv));
4197
4198                                 if ( noper_next ) {
4199                                   regprop(RExC_rx, RExC_mysv, noper_next, NULL, pRExC_state);
4200                                   PerlIO_printf( Perl_debug_log,"\t=> %s\t",
4201                                     SvPV_nolen_const(RExC_mysv));
4202                                 }
4203                                 PerlIO_printf( Perl_debug_log, "(First==%d,Last==%d,Cur==%d,tt==%s,nt==%s,nnt==%s)\n",
4204                                    REG_NODE_NUM(first), REG_NODE_NUM(last), REG_NODE_NUM(cur),
4205                                    PL_reg_name[trietype], PL_reg_name[noper_trietype], PL_reg_name[noper_next_trietype]
4206                                 );
4207                             });
4208
4209                             /* Is noper a trieable nodetype that can be merged
4210                              * with the current trie (if there is one)? */
4211                             if ( noper_trietype
4212                                   &&
4213                                   (
4214                                         ( noper_trietype == NOTHING)
4215                                         || ( trietype == NOTHING )
4216                                         || ( trietype == noper_trietype )
4217                                   )
4218 #ifdef NOJUMPTRIE
4219                                   && noper_next == tail
4220 #endif
4221                                   && count < U16_MAX)
4222                             {
4223                                 /* Handle mergable triable node Either we are
4224                                  * the first node in a new trieable sequence,
4225                                  * in which case we do some bookkeeping,
4226                                  * otherwise we update the end pointer. */
4227                                 if ( !first ) {
4228                                     first = cur;
4229                                     if ( noper_trietype == NOTHING ) {
4230 #if !defined(DEBUGGING) && !defined(NOJUMPTRIE)
4231                                         regnode * const noper_next = regnext( noper );
4232                                         U8 noper_next_type = (noper_next && noper_next!=tail) ? OP(noper_next) : 0;
4233                                         U8 noper_next_trietype = noper_next_type ? TRIE_TYPE( noper_next_type ) :0;
4234 #endif
4235
4236                                         if ( noper_next_trietype ) {
4237                                             trietype = noper_next_trietype;
4238                                         } else if (noper_next_type)  {
4239                                             /* a NOTHING regop is 1 regop wide.
4240                                              * We need at least two for a trie
4241                                              * so we can't merge this in */
4242                                             first = NULL;
4243                                         }
4244                                     } else {
4245                                         trietype = noper_trietype;
4246                                     }
4247                                 } else {
4248                                     if ( trietype == NOTHING )
4249                                         trietype = noper_trietype;
4250                                     last = cur;
4251                                 }
4252                                 if (first)
4253                                     count++;
4254                             } /* end handle mergable triable node */
4255                             else {
4256                                 /* handle unmergable node -
4257                                  * noper may either be a triable node which can
4258                                  * not be tried together with the current trie,
4259                                  * or a non triable node */
4260                                 if ( last ) {
4261                                     /* If last is set and trietype is not
4262                                      * NOTHING then we have found at least two
4263                                      * triable branch sequences in a row of a
4264                                      * similar trietype so we can turn them
4265                                      * into a trie. If/when we allow NOTHING to
4266                                      * start a trie sequence this condition
4267                                      * will be required, and it isn't expensive
4268                                      * so we leave it in for now. */
4269                                     if ( trietype && trietype != NOTHING )
4270                                         make_trie( pRExC_state,
4271                                                 startbranch, first, cur, tail,
4272                                                 count, trietype, depth+1 );
4273                                     last = NULL; /* note: we clear/update
4274                                                     first, trietype etc below,
4275                                                     so we dont do it here */
4276                                 }
4277                                 if ( noper_trietype
4278 #ifdef NOJUMPTRIE
4279                                      && noper_next == tail
4280 #endif
4281                                 ){
4282                                     /* noper is triable, so we can start a new
4283                                      * trie sequence */
4284                                     count = 1;
4285                                     first = cur;
4286                                     trietype = noper_trietype;
4287                                 } else if (first) {
4288                                     /* if we already saw a first but the
4289                                      * current node is not triable then we have
4290                                      * to reset the first information. */
4291                                     count = 0;
4292                                     first = NULL;
4293                                     trietype = 0;
4294                                 }
4295                             } /* end handle unmergable node */
4296                         } /* loop over branches */
4297                         DEBUG_TRIE_COMPILE_r({
4298                             regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
4299                             PerlIO_printf( Perl_debug_log,
4300                               "%*s- %s (%d) <SCAN FINISHED>\n",
4301                               (int)depth * 2 + 2,
4302                               "", SvPV_nolen_const( RExC_mysv ),REG_NODE_NUM(cur));
4303
4304                         });
4305                         if ( last && trietype ) {
4306                             if ( trietype != NOTHING ) {
4307                                 /* the last branch of the sequence was part of
4308                                  * a trie, so we have to construct it here
4309                                  * outside of the loop */
4310                                 made= make_trie( pRExC_state, startbranch,
4311                                                  first, scan, tail, count,
4312                                                  trietype, depth+1 );
4313 #ifdef TRIE_STUDY_OPT
4314                                 if ( ((made == MADE_EXACT_TRIE &&
4315                                      startbranch == first)
4316                                      || ( first_non_open == first )) &&
4317                                      depth==0 ) {
4318                                     flags |= SCF_TRIE_RESTUDY;
4319                                     if ( startbranch == first
4320                                          && scan == tail )
4321                                     {
4322                                         RExC_seen &=~REG_TOP_LEVEL_BRANCHES_SEEN;
4323                                     }
4324                                 }
4325 #endif
4326                             } else {
4327                                 /* at this point we know whatever we have is a
4328                                  * NOTHING sequence/branch AND if 'startbranch'
4329                                  * is 'first' then we can turn the whole thing
4330                                  * into a NOTHING
4331                                  */
4332                                 if ( startbranch == first ) {
4333                                     regnode *opt;
4334                                     /* the entire thing is a NOTHING sequence,
4335                                      * something like this: (?:|) So we can
4336                                      * turn it into a plain NOTHING op. */
4337                                     DEBUG_TRIE_COMPILE_r({
4338                                         regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state);
4339                                         PerlIO_printf( Perl_debug_log,
4340                                           "%*s- %s (%d) <NOTHING BRANCH SEQUENCE>\n", (int)depth * 2 + 2,
4341                                           "", SvPV_nolen_const( RExC_mysv ),REG_NODE_NUM(cur));
4342
4343                                     });
4344                                     OP(startbranch)= NOTHING;
4345                                     NEXT_OFF(startbranch)= tail - startbranch;
4346                                     for ( opt= startbranch + 1; opt < tail ; opt++ )
4347                                         OP(opt)= OPTIMIZED;
4348                                 }
4349                             }
4350                         } /* end if ( last) */
4351                     } /* TRIE_MAXBUF is non zero */
4352
4353                 } /* do trie */
4354
4355             }
4356             else if ( code == BRANCHJ ) {  /* single branch is optimized. */
4357                 scan = NEXTOPER(NEXTOPER(scan));
4358             } else                      /* single branch is optimized. */
4359                 scan = NEXTOPER(scan);
4360             continue;
4361         } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB || OP(scan) == GOSTART) {
4362             I32 paren = 0;
4363             regnode *start = NULL;
4364             regnode *end = NULL;
4365             U32 my_recursed_depth= recursed_depth;
4366
4367
4368             if (OP(scan) != SUSPEND) { /* GOSUB/GOSTART */
4369                 /* Do setup, note this code has side effects beyond
4370                  * the rest of this block. Specifically setting
4371                  * RExC_recurse[] must happen at least once during
4372                  * study_chunk(). */
4373                 if (OP(scan) == GOSUB) {
4374                     paren = ARG(scan);
4375                     RExC_recurse[ARG2L(scan)] = scan;
4376                     start = RExC_open_parens[paren-1];
4377                     end   = RExC_close_parens[paren-1];
4378                 } else {
4379                     start = RExC_rxi->program + 1;
4380                     end   = RExC_opend;
4381                 }
4382                 /* NOTE we MUST always execute the above code, even
4383                  * if we do nothing with a GOSUB/GOSTART */
4384                 if (
4385                     ( flags & SCF_IN_DEFINE )
4386                     ||
4387                     (
4388                         (is_inf_internal || is_inf || (data && data->flags & SF_IS_INF))
4389                         &&
4390                         ( (flags & (SCF_DO_STCLASS | SCF_DO_SUBSTR)) == 0 )
4391                     )
4392                 ) {
4393                     /* no need to do anything here if we are in a define. */
4394                     /* or we are after some kind of infinite construct
4395                      * so we can skip recursing into this item.
4396                      * Since it is infinite we will not change the maxlen
4397                      * or delta, and if we miss something that might raise
4398                      * the minlen it will merely pessimise a little.
4399                      *
4400                      * Iow /(?(DEFINE)(?<foo>foo|food))a+(?&foo)/
4401                      * might result in a minlen of 1 and not of 4,
4402                      * but this doesn't make us mismatch, just try a bit
4403                      * harder than we should.
4404                      * */
4405                     scan= regnext(scan);
4406                     continue;
4407                 }
4408
4409                 if (
4410                     !recursed_depth
4411                     ||
4412                     !PAREN_TEST(RExC_study_chunk_recursed + ((recursed_depth-1) * RExC_study_chunk_recursed_bytes), paren)
4413                 ) {
4414                     /* it is quite possible that there are more efficient ways
4415                      * to do this. We maintain a bitmap per level of recursion
4416                      * of which patterns we have entered so we can detect if a
4417                      * pattern creates a possible infinite loop. When we
4418                      * recurse down a level we copy the previous levels bitmap
4419                      * down. When we are at recursion level 0 we zero the top
4420                      * level bitmap. It would be nice to implement a different
4421                      * more efficient way of doing this. In particular the top
4422                      * level bitmap may be unnecessary.
4423                      */
4424                     if (!recursed_depth) {
4425                         Zero(RExC_study_chunk_recursed, RExC_study_chunk_recursed_bytes, U8);
4426                     } else {
4427                         Copy(RExC_study_chunk_recursed + ((recursed_depth-1) * RExC_study_chunk_recursed_bytes),
4428                              RExC_study_chunk_recursed + (recursed_depth * RExC_study_chunk_recursed_bytes),
4429                              RExC_study_chunk_recursed_bytes, U8);
4430                     }
4431                     /* we havent recursed into this paren yet, so recurse into it */
4432                     DEBUG_STUDYDATA("set:", data,depth);
4433                     PAREN_SET(RExC_study_chunk_recursed + (recursed_depth * RExC_study_chunk_recursed_bytes), paren);
4434                     my_recursed_depth= recursed_depth + 1;
4435                 } else {
4436                     DEBUG_STUDYDATA("inf:", data,depth);
4437                     /* some form of infinite recursion, assume infinite length
4438                      * */
4439                     if (flags & SCF_DO_SUBSTR) {
4440                         scan_commit(pRExC_state, data, minlenp, is_inf);
4441                         data->longest = &(data->longest_float);
4442                     }
4443                     is_inf = is_inf_internal = 1;
4444                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
4445                         ssc_anything(data->start_class);
4446                     flags &= ~SCF_DO_STCLASS;
4447
4448                     start= NULL; /* reset start so we dont recurse later on. */
4449                 }
4450             } else {
4451                 paren = stopparen;
4452                 start = scan + 2;
4453                 end = regnext(scan);
4454             }
4455             if (start) {
4456                 scan_frame *newframe;
4457                 assert(end);
4458                 if (!RExC_frame_last) {
4459                     Newxz(newframe, 1, scan_frame);
4460                     SAVEDESTRUCTOR_X(S_unwind_scan_frames, newframe);
4461                     RExC_frame_head= newframe;
4462                     RExC_frame_count++;
4463                 } else if (!RExC_frame_last->next_frame) {
4464                     Newxz(newframe,1,scan_frame);
4465                     RExC_frame_last->next_frame= newframe;
4466                     newframe->prev_frame= RExC_frame_last;
4467                     RExC_frame_count++;
4468                 } else {
4469                     newframe= RExC_frame_last->next_frame;
4470                 }
4471                 RExC_frame_last= newframe;
4472
4473                 newframe->next_regnode = regnext(scan);
4474                 newframe->last_regnode = last;
4475                 newframe->stopparen = stopparen;
4476                 newframe->prev_recursed_depth = recursed_depth;
4477                 newframe->this_prev_frame= frame;
4478
4479                 DEBUG_STUDYDATA("frame-new:",data,depth);
4480                 DEBUG_PEEP("fnew", scan, depth);
4481
4482                 frame = newframe;
4483                 scan =  start;
4484                 stopparen = paren;
4485                 last = end;
4486                 depth = depth + 1;
4487                 recursed_depth= my_recursed_depth;
4488
4489                 continue;
4490             }
4491         }
4492         else if (OP(scan) == EXACT || OP(scan) == EXACTL) {
4493             SSize_t l = STR_LEN(scan);
4494             UV uc;
4495             if (UTF) {
4496                 const U8 * const s = (U8*)STRING(scan);
4497                 uc = utf8_to_uvchr_buf(s, s + l, NULL);
4498                 l = utf8_length(s, s + l);
4499             } else {
4500                 uc = *((U8*)STRING(scan));
4501             }
4502             min += l;
4503             if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
4504                 /* The code below prefers earlier match for fixed
4505                    offset, later match for variable offset.  */
4506                 if (data->last_end == -1) { /* Update the start info. */
4507                     data->last_start_min = data->pos_min;
4508                     data->last_start_max = is_inf
4509                         ? SSize_t_MAX : data->pos_min + data->pos_delta;
4510                 }
4511                 sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
4512                 if (UTF)
4513                     SvUTF8_on(data->last_found);
4514                 {
4515                     SV * const sv = data->last_found;
4516                     MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
4517                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
4518                     if (mg && mg->mg_len >= 0)
4519                         mg->mg_len += utf8_length((U8*)STRING(scan),
4520                                               (U8*)STRING(scan)+STR_LEN(scan));
4521                 }
4522                 data->last_end = data->pos_min + l;
4523                 data->pos_min += l; /* As in the first entry. */
4524                 data->flags &= ~SF_BEFORE_EOL;
4525             }
4526
4527             /* ANDing the code point leaves at most it, and not in locale, and
4528              * can't match null string */
4529             if (flags & SCF_DO_STCLASS_AND) {
4530                 ssc_cp_and(data->start_class, uc);
4531                 ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
4532                 ssc_clear_locale(data->start_class);
4533             }
4534             else if (flags & SCF_DO_STCLASS_OR) {
4535                 ssc_add_cp(data->start_class, uc);
4536                 ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
4537
4538                 /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
4539                 ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
4540             }
4541             flags &= ~SCF_DO_STCLASS;
4542         }
4543         else if (PL_regkind[OP(scan)] == EXACT) {
4544             /* But OP != EXACT!, so is EXACTFish */
4545             SSize_t l = STR_LEN(scan);
4546             const U8 * s = (U8*)STRING(scan);
4547
4548             /* Search for fixed substrings supports EXACT only. */
4549             if (flags & SCF_DO_SUBSTR) {
4550                 assert(data);
4551                 scan_commit(pRExC_state, data, minlenp, is_inf);
4552             }
4553             if (UTF) {
4554                 l = utf8_length(s, s + l);
4555             }
4556             if (unfolded_multi_char) {
4557                 RExC_seen |= REG_UNFOLDED_MULTI_SEEN;
4558             }
4559             min += l - min_subtract;
4560             assert (min >= 0);
4561             delta += min_subtract;
4562             if (flags & SCF_DO_SUBSTR) {
4563                 data->pos_min += l - min_subtract;
4564                 if (data->pos_min < 0) {
4565                     data->pos_min = 0;
4566                 }
4567                 data->pos_delta += min_subtract;
4568                 if (min_subtract) {
4569                     data->longest = &(data->longest_float);
4570                 }
4571             }
4572
4573             if (flags & SCF_DO_STCLASS) {
4574                 SV* EXACTF_invlist = _make_exactf_invlist(pRExC_state, scan);
4575
4576                 assert(EXACTF_invlist);
4577                 if (flags & SCF_DO_STCLASS_AND) {
4578                     if (OP(scan) != EXACTFL)
4579                         ssc_clear_locale(data->start_class);
4580                     ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
4581                     ANYOF_POSIXL_ZERO(data->start_class);
4582                     ssc_intersection(data->start_class, EXACTF_invlist, FALSE);
4583                 }
4584                 else {  /* SCF_DO_STCLASS_OR */
4585                     ssc_union(data->start_class, EXACTF_invlist, FALSE);
4586                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
4587
4588                     /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
4589                     ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
4590                 }
4591                 flags &= ~SCF_DO_STCLASS;
4592                 SvREFCNT_dec(EXACTF_invlist);
4593             }
4594         }
4595         else if (REGNODE_VARIES(OP(scan))) {
4596             SSize_t mincount, maxcount, minnext, deltanext, pos_before = 0;
4597             I32 fl = 0, f = flags;
4598             regnode * const oscan = scan;
4599             regnode_ssc this_class;
4600             regnode_ssc *oclass = NULL;
4601             I32 next_is_eval = 0;
4602
4603             switch (PL_regkind[OP(scan)]) {
4604             case WHILEM:                /* End of (?:...)* . */
4605                 scan = NEXTOPER(scan);
4606                 goto finish;
4607             case PLUS:
4608                 if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
4609                     next = NEXTOPER(scan);
4610                     if (OP(next) == EXACT
4611                         || OP(next) == EXACTL
4612                         || (flags & SCF_DO_STCLASS))
4613                     {
4614                         mincount = 1;
4615                         maxcount = REG_INFTY;
4616                         next = regnext(scan);
4617                         scan = NEXTOPER(scan);
4618                         goto do_curly;
4619                     }
4620                 }
4621                 if (flags & SCF_DO_SUBSTR)
4622                     data->pos_min++;
4623                 min++;
4624                 /* FALLTHROUGH */
4625             case STAR:
4626                 if (flags & SCF_DO_STCLASS) {
4627                     mincount = 0;
4628                     maxcount = REG_INFTY;
4629                     next = regnext(scan);
4630                     scan = NEXTOPER(scan);
4631                     goto do_curly;
4632                 }
4633                 if (flags & SCF_DO_SUBSTR) {
4634                     scan_commit(pRExC_state, data, minlenp, is_inf);
4635                     /* Cannot extend fixed substrings */
4636                     data->longest = &(data->longest_float);
4637                 }
4638                 is_inf = is_inf_internal = 1;
4639                 scan = regnext(scan);
4640                 goto optimize_curly_tail;
4641             case CURLY:
4642                 if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)
4643                     && (scan->flags == stopparen))
4644                 {
4645                     mincount = 1;
4646                     maxcount = 1;
4647                 } else {
4648                     mincount = ARG1(scan);
4649                     maxcount = ARG2(scan);
4650                 }
4651                 next = regnext(scan);
4652                 if (OP(scan) == CURLYX) {
4653                     I32 lp = (data ? *(data->last_closep) : 0);
4654                     scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX);
4655                 }
4656                 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
4657                 next_is_eval = (OP(scan) == EVAL);
4658               do_curly:
4659                 if (flags & SCF_DO_SUBSTR) {
4660                     if (mincount == 0)
4661                         scan_commit(pRExC_state, data, minlenp, is_inf);
4662                     /* Cannot extend fixed substrings */
4663                     pos_before = data->pos_min;
4664                 }
4665                 if (data) {
4666                     fl = data->flags;
4667                     data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
4668                     if (is_inf)
4669                         data->flags |= SF_IS_INF;
4670                 }
4671                 if (flags & SCF_DO_STCLASS) {
4672                     ssc_init(pRExC_state, &this_class);
4673                     oclass = data->start_class;
4674                     data->start_class = &this_class;
4675                     f |= SCF_DO_STCLASS_AND;
4676                     f &= ~SCF_DO_STCLASS_OR;
4677                 }
4678                 /* Exclude from super-linear cache processing any {n,m}
4679                    regops for which the combination of input pos and regex
4680                    pos is not enough information to determine if a match
4681                    will be possible.
4682
4683                    For example, in the regex /foo(bar\s*){4,8}baz/ with the
4684                    regex pos at the \s*, the prospects for a match depend not
4685                    only on the input position but also on how many (bar\s*)
4686                    repeats into the {4,8} we are. */
4687                if ((mincount > 1) || (maxcount > 1 && maxcount != REG_INFTY))
4688                     f &= ~SCF_WHILEM_VISITED_POS;
4689
4690                 /* This will finish on WHILEM, setting scan, or on NULL: */
4691                 minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
4692                                   last, data, stopparen, recursed_depth, NULL,
4693                                   (mincount == 0
4694                                    ? (f & ~SCF_DO_SUBSTR)
4695                                    : f)
4696                                   ,depth+1);
4697
4698                 if (flags & SCF_DO_STCLASS)
4699                     data->start_class = oclass;
4700                 if (mincount == 0 || minnext == 0) {
4701                     if (flags & SCF_DO_STCLASS_OR) {
4702                         ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
4703                     }
4704                     else if (flags & SCF_DO_STCLASS_AND) {
4705                         /* Switch to OR mode: cache the old value of
4706                          * data->start_class */
4707                         INIT_AND_WITHP;
4708                         StructCopy(data->start_class, and_withp, regnode_ssc);
4709                         flags &= ~SCF_DO_STCLASS_AND;
4710                         StructCopy(&this_class, data->start_class, regnode_ssc);
4711                         flags |= SCF_DO_STCLASS_OR;
4712                         ANYOF_FLAGS(data->start_class)
4713                                                 |= SSC_MATCHES_EMPTY_STRING;
4714                     }
4715                 } else {                /* Non-zero len */
4716                     if (flags & SCF_DO_STCLASS_OR) {
4717                         ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
4718                         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
4719                     }
4720                     else if (flags & SCF_DO_STCLASS_AND)
4721                         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &this_class);
4722                     flags &= ~SCF_DO_STCLASS;
4723                 }
4724                 if (!scan)              /* It was not CURLYX, but CURLY. */
4725                     scan = next;
4726                 if (!(flags & SCF_TRIE_DOING_RESTUDY)
4727                     /* ? quantifier ok, except for (?{ ... }) */
4728                     && (next_is_eval || !(mincount == 0 && maxcount == 1))
4729                     && (minnext == 0) && (deltanext == 0)
4730                     && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
4731                     && maxcount <= REG_INFTY/3) /* Complement check for big
4732                                                    count */
4733                 {
4734                     /* Fatal warnings may leak the regexp without this: */
4735                     SAVEFREESV(RExC_rx_sv);
4736                     Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
4737                         "Quantifier unexpected on zero-length expression "
4738                         "in regex m/%"UTF8f"/",
4739                          UTF8fARG(UTF, RExC_end - RExC_precomp,
4740                                   RExC_precomp));
4741                     (void)ReREFCNT_inc(RExC_rx_sv);
4742                 }
4743
4744                 min += minnext * mincount;
4745                 is_inf_internal |= deltanext == SSize_t_MAX
4746                          || (maxcount == REG_INFTY && minnext + deltanext > 0);
4747                 is_inf |= is_inf_internal;
4748                 if (is_inf) {
4749                     delta = SSize_t_MAX;
4750                 } else {
4751                     delta += (minnext + deltanext) * maxcount
4752                              - minnext * mincount;
4753                 }
4754                 /* Try powerful optimization CURLYX => CURLYN. */
4755                 if (  OP(oscan) == CURLYX && data
4756                       && data->flags & SF_IN_PAR
4757                       && !(data->flags & SF_HAS_EVAL)
4758                       && !deltanext && minnext == 1 ) {
4759                     /* Try to optimize to CURLYN.  */
4760                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
4761                     regnode * const nxt1 = nxt;
4762 #ifdef DEBUGGING
4763                     regnode *nxt2;
4764 #endif
4765
4766                     /* Skip open. */
4767                     nxt = regnext(nxt);
4768                     if (!REGNODE_SIMPLE(OP(nxt))
4769                         && !(PL_regkind[OP(nxt)] == EXACT
4770                              && STR_LEN(nxt) == 1))
4771                         goto nogo;
4772 #ifdef DEBUGGING
4773                     nxt2 = nxt;
4774 #endif
4775                     nxt = regnext(nxt);
4776                     if (OP(nxt) != CLOSE)
4777                         goto nogo;
4778                     if (RExC_open_parens) {
4779                         RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
4780                         RExC_close_parens[ARG(nxt1)-1]=nxt+2; /*close->while*/
4781                     }
4782                     /* Now we know that nxt2 is the only contents: */
4783                     oscan->flags = (U8)ARG(nxt);
4784                     OP(oscan) = CURLYN;
4785                     OP(nxt1) = NOTHING; /* was OPEN. */
4786
4787 #ifdef DEBUGGING
4788                     OP(nxt1 + 1) = OPTIMIZED; /* was count. */
4789                     NEXT_OFF(nxt1+ 1) = 0; /* just for consistency. */
4790                     NEXT_OFF(nxt2) = 0; /* just for consistency with CURLY. */
4791                     OP(nxt) = OPTIMIZED;        /* was CLOSE. */
4792                     OP(nxt + 1) = OPTIMIZED; /* was count. */
4793                     NEXT_OFF(nxt+ 1) = 0; /* just for consistency. */
4794 #endif
4795                 }
4796               nogo:
4797
4798                 /* Try optimization CURLYX => CURLYM. */
4799                 if (  OP(oscan) == CURLYX && data
4800                       && !(data->flags & SF_HAS_PAR)
4801                       && !(data->flags & SF_HAS_EVAL)
4802                       && !deltanext     /* atom is fixed width */
4803                       && minnext != 0   /* CURLYM can't handle zero width */
4804
4805                          /* Nor characters whose fold at run-time may be
4806                           * multi-character */
4807                       && ! (RExC_seen & REG_UNFOLDED_MULTI_SEEN)
4808                 ) {
4809                     /* XXXX How to optimize if data == 0? */
4810                     /* Optimize to a simpler form.  */
4811                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
4812                     regnode *nxt2;
4813
4814                     OP(oscan) = CURLYM;
4815                     while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
4816                             && (OP(nxt2) != WHILEM))
4817                         nxt = nxt2;
4818                     OP(nxt2)  = SUCCEED; /* Whas WHILEM */
4819                     /* Need to optimize away parenths. */
4820                     if ((data->flags & SF_IN_PAR) && OP(nxt) == CLOSE) {
4821                         /* Set the parenth number.  */
4822                         regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
4823
4824                         oscan->flags = (U8)ARG(nxt);
4825                         if (RExC_open_parens) {
4826                             RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
4827                             RExC_close_parens[ARG(nxt1)-1]=nxt2+1; /*close->NOTHING*/
4828                         }
4829                         OP(nxt1) = OPTIMIZED;   /* was OPEN. */
4830                         OP(nxt) = OPTIMIZED;    /* was CLOSE. */
4831
4832 #ifdef DEBUGGING
4833                         OP(nxt1 + 1) = OPTIMIZED; /* was count. */
4834                         OP(nxt + 1) = OPTIMIZED; /* was count. */
4835                         NEXT_OFF(nxt1 + 1) = 0; /* just for consistency. */
4836                         NEXT_OFF(nxt + 1) = 0; /* just for consistency. */
4837 #endif
4838 #if 0
4839                         while ( nxt1 && (OP(nxt1) != WHILEM)) {
4840                             regnode *nnxt = regnext(nxt1);
4841                             if (nnxt == nxt) {
4842                                 if (reg_off_by_arg[OP(nxt1)])
4843                                     ARG_SET(nxt1, nxt2 - nxt1);
4844                                 else if (nxt2 - nxt1 < U16_MAX)
4845                                     NEXT_OFF(nxt1) = nxt2 - nxt1;
4846                                 else
4847                                     OP(nxt) = NOTHING;  /* Cannot beautify */
4848                             }
4849                             nxt1 = nnxt;
4850                         }
4851 #endif
4852                         /* Optimize again: */
4853                         study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
4854                                     NULL, stopparen, recursed_depth, NULL, 0,depth+1);
4855                     }
4856                     else
4857                         oscan->flags = 0;
4858                 }
4859                 else if ((OP(oscan) == CURLYX)
4860                          && (flags & SCF_WHILEM_VISITED_POS)
4861                          /* See the comment on a similar expression above.
4862                             However, this time it's not a subexpression
4863                             we care about, but the expression itself. */
4864                          && (maxcount == REG_INFTY)
4865                          && data && ++data->whilem_c < 16) {
4866                     /* This stays as CURLYX, we can put the count/of pair. */
4867                     /* Find WHILEM (as in regexec.c) */
4868                     regnode *nxt = oscan + NEXT_OFF(oscan);
4869
4870                     if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
4871                         nxt += ARG(nxt);
4872                     PREVOPER(nxt)->flags = (U8)(data->whilem_c
4873                         | (RExC_whilem_seen << 4)); /* On WHILEM */
4874                 }
4875                 if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
4876                     pars++;
4877                 if (flags & SCF_DO_SUBSTR) {
4878                     SV *last_str = NULL;
4879                     STRLEN last_chrs = 0;
4880                     int counted = mincount != 0;
4881
4882                     if (data->last_end > 0 && mincount != 0) { /* Ends with a
4883                                                                   string. */
4884                         SSize_t b = pos_before >= data->last_start_min
4885                             ? pos_before : data->last_start_min;
4886                         STRLEN l;
4887                         const char * const s = SvPV_const(data->last_found, l);
4888                         SSize_t old = b - data->last_start_min;
4889
4890                         if (UTF)
4891                             old = utf8_hop((U8*)s, old) - (U8*)s;
4892                         l -= old;
4893                         /* Get the added string: */
4894                         last_str = newSVpvn_utf8(s  + old, l, UTF);
4895                         last_chrs = UTF ? utf8_length((U8*)(s + old),
4896                                             (U8*)(s + old + l)) : l;
4897                         if (deltanext == 0 && pos_before == b) {
4898                             /* What was added is a constant string */
4899                             if (mincount > 1) {
4900
4901                                 SvGROW(last_str, (mincount * l) + 1);
4902                                 repeatcpy(SvPVX(last_str) + l,
4903                                           SvPVX_const(last_str), l,
4904                                           mincount - 1);
4905                                 SvCUR_set(last_str, SvCUR(last_str) * mincount);
4906                                 /* Add additional parts. */
4907                                 SvCUR_set(data->last_found,
4908                                           SvCUR(data->last_found) - l);
4909                                 sv_catsv(data->last_found, last_str);
4910                                 {
4911                                     SV * sv = data->last_found;
4912                                     MAGIC *mg =
4913                                         SvUTF8(sv) && SvMAGICAL(sv) ?
4914                                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
4915                                     if (mg && mg->mg_len >= 0)
4916                                         mg->mg_len += last_chrs * (mincount-1);
4917                                 }
4918                                 last_chrs *= mincount;
4919                                 data->last_end += l * (mincount - 1);
4920                             }
4921                         } else {
4922                             /* start offset must point into the last copy */
4923                             data->last_start_min += minnext * (mincount - 1);
4924                             data->last_start_max =
4925                               is_inf
4926                                ? SSize_t_MAX
4927                                : data->last_start_max +
4928                                  (maxcount - 1) * (minnext + data->pos_delta);
4929                         }
4930                     }
4931                     /* It is counted once already... */
4932                     data->pos_min += minnext * (mincount - counted);
4933 #if 0
4934 PerlIO_printf(Perl_debug_log, "counted=%"UVuf" deltanext=%"UVuf
4935                               " SSize_t_MAX=%"UVuf" minnext=%"UVuf
4936                               " maxcount=%"UVuf" mincount=%"UVuf"\n",
4937     (UV)counted, (UV)deltanext, (UV)SSize_t_MAX, (UV)minnext, (UV)maxcount,
4938     (UV)mincount);
4939 if (deltanext != SSize_t_MAX)
4940 PerlIO_printf(Perl_debug_log, "LHS=%"UVuf" RHS=%"UVuf"\n",
4941     (UV)(-counted * deltanext + (minnext + deltanext) * maxcount
4942           - minnext * mincount), (UV)(SSize_t_MAX - data->pos_delta));
4943 #endif
4944                     if (deltanext == SSize_t_MAX
4945                         || -counted * deltanext + (minnext + deltanext) * maxcount - minnext * mincount >= SSize_t_MAX - data->pos_delta)
4946                         data->pos_delta = SSize_t_MAX;
4947                     else
4948                         data->pos_delta += - counted * deltanext +
4949                         (minnext + deltanext) * maxcount - minnext * mincount;
4950                     if (mincount != maxcount) {
4951                          /* Cannot extend fixed substrings found inside
4952                             the group.  */
4953                         scan_commit(pRExC_state, data, minlenp, is_inf);
4954                         if (mincount && last_str) {
4955                             SV * const sv = data->last_found;
4956                             MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
4957                                 mg_find(sv, PERL_MAGIC_utf8) : NULL;
4958
4959                             if (mg)
4960                                 mg->mg_len = -1;
4961                             sv_setsv(sv, last_str);
4962                             data->last_end = data->pos_min;
4963                             data->last_start_min = data->pos_min - last_chrs;
4964                             data->last_start_max = is_inf
4965                                 ? SSize_t_MAX
4966                                 : data->pos_min + data->pos_delta - last_chrs;
4967                         }
4968                         data->longest = &(data->longest_float);
4969                     }
4970                     SvREFCNT_dec(last_str);
4971                 }
4972                 if (data && (fl & SF_HAS_EVAL))
4973                     data->flags |= SF_HAS_EVAL;
4974               optimize_curly_tail:
4975                 if (OP(oscan) != CURLYX) {
4976                     while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
4977                            && NEXT_OFF(next))
4978                         NEXT_OFF(oscan) += NEXT_OFF(next);
4979                 }
4980                 continue;
4981
4982             default:
4983 #ifdef DEBUGGING
4984                 Perl_croak(aTHX_ "panic: unexpected varying REx opcode %d",
4985                                                                     OP(scan));
4986 #endif
4987             case REF:
4988             case CLUMP:
4989                 if (flags & SCF_DO_SUBSTR) {
4990                     /* Cannot expect anything... */
4991                     scan_commit(pRExC_state, data, minlenp, is_inf);
4992                     data->longest = &(data->longest_float);
4993                 }
4994                 is_inf = is_inf_internal = 1;
4995                 if (flags & SCF_DO_STCLASS_OR) {
4996                     if (OP(scan) == CLUMP) {
4997                         /* Actually is any start char, but very few code points
4998                          * aren't start characters */
4999                         ssc_match_all_cp(data->start_class);
5000                     }
5001                     else {
5002                         ssc_anything(data->start_class);
5003                     }
5004                 }
5005                 flags &= ~SCF_DO_STCLASS;
5006                 break;
5007             }
5008         }
5009         else if (OP(scan) == LNBREAK) {
5010             if (flags & SCF_DO_STCLASS) {
5011                 if (flags & SCF_DO_STCLASS_AND) {
5012                     ssc_intersection(data->start_class,
5013                                     PL_XPosix_ptrs[_CC_VERTSPACE], FALSE);
5014                     ssc_clear_locale(data->start_class);
5015                     ANYOF_FLAGS(data->start_class)
5016                                                 &= ~SSC_MATCHES_EMPTY_STRING;
5017                 }
5018                 else if (flags & SCF_DO_STCLASS_OR) {
5019                     ssc_union(data->start_class,
5020                               PL_XPosix_ptrs[_CC_VERTSPACE],
5021                               FALSE);
5022                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
5023
5024                     /* See commit msg for
5025                      * 749e076fceedeb708a624933726e7989f2302f6a */
5026                     ANYOF_FLAGS(data->start_class)
5027                                                 &= ~SSC_MATCHES_EMPTY_STRING;
5028                 }
5029                 flags &= ~SCF_DO_STCLASS;
5030             }
5031             min++;
5032             if (delta != SSize_t_MAX)
5033                 delta++;    /* Because of the 2 char string cr-lf */
5034             if (flags & SCF_DO_SUBSTR) {
5035                 /* Cannot expect anything... */
5036                 scan_commit(pRExC_state, data, minlenp, is_inf);
5037                 data->pos_min += 1;
5038                 data->pos_delta += 1;
5039                 data->longest = &(data->longest_float);
5040             }
5041         }
5042         else if (REGNODE_SIMPLE(OP(scan))) {
5043
5044             if (flags & SCF_DO_SUBSTR) {
5045                 scan_commit(pRExC_state, data, minlenp, is_inf);
5046                 data->pos_min++;
5047             }
5048             min++;
5049             if (flags & SCF_DO_STCLASS) {
5050                 bool invert = 0;
5051                 SV* my_invlist = NULL;
5052                 U8 namedclass;
5053
5054                 /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */
5055                 ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING;
5056
5057                 /* Some of the logic below assumes that switching
5058                    locale on will only add false positives. */
5059                 switch (OP(scan)) {
5060
5061                 default:
5062 #ifdef DEBUGGING
5063                    Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d",
5064                                                                      OP(scan));
5065 #endif
5066                 case CANY:
5067                 case SANY:
5068                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
5069                         ssc_match_all_cp(data->start_class);
5070                     break;
5071
5072                 case REG_ANY:
5073                     {
5074                         SV* REG_ANY_invlist = _new_invlist(2);
5075                         REG_ANY_invlist = add_cp_to_invlist(REG_ANY_invlist,
5076                                                             '\n');
5077                         if (flags & SCF_DO_STCLASS_OR) {
5078                             ssc_union(data->start_class,
5079                                       REG_ANY_invlist,
5080                                       TRUE /* TRUE => invert, hence all but \n
5081                                             */
5082                                       );
5083                         }
5084                         else if (flags & SCF_DO_STCLASS_AND) {
5085                             ssc_intersection(data->start_class,
5086                                              REG_ANY_invlist,
5087                                              TRUE  /* TRUE => invert */
5088                                              );
5089                             ssc_clear_locale(data->start_class);
5090                         }
5091                         SvREFCNT_dec_NN(REG_ANY_invlist);
5092                     }
5093                     break;
5094
5095                 case ANYOFL:
5096                 case ANYOF:
5097                     if (flags & SCF_DO_STCLASS_AND)
5098                         ssc_and(pRExC_state, data->start_class,
5099                                 (regnode_charclass *) scan);
5100                     else
5101                         ssc_or(pRExC_state, data->start_class,
5102                                                           (regnode_charclass *) scan);
5103                     break;
5104
5105                 case NPOSIXL:
5106                     invert = 1;
5107                     /* FALLTHROUGH */
5108
5109                 case POSIXL:
5110                     namedclass = classnum_to_namedclass(FLAGS(scan)) + invert;
5111                     if (flags & SCF_DO_STCLASS_AND) {
5112                         bool was_there = cBOOL(
5113                                           ANYOF_POSIXL_TEST(data->start_class,
5114                                                                  namedclass));
5115                         ANYOF_POSIXL_ZERO(data->start_class);
5116                         if (was_there) {    /* Do an AND */
5117                             ANYOF_POSIXL_SET(data->start_class, namedclass);
5118                         }
5119                         /* No individual code points can now match */
5120                         data->start_class->invlist
5121                                                 = sv_2mortal(_new_invlist(0));
5122                     }
5123                     else {
5124                         int complement = namedclass + ((invert) ? -1 : 1);
5125
5126                         assert(flags & SCF_DO_STCLASS_OR);
5127
5128                         /* If the complement of this class was already there,
5129                          * the result is that they match all code points,
5130                          * (\d + \D == everything).  Remove the classes from
5131                          * future consideration.  Locale is not relevant in
5132                          * this case */
5133                         if (ANYOF_POSIXL_TEST(data->start_class, complement)) {
5134                             ssc_match_all_cp(data->start_class);
5135                             ANYOF_POSIXL_CLEAR(data->start_class, namedclass);
5136                             ANYOF_POSIXL_CLEAR(data->start_class, complement);
5137                         }
5138                         else {  /* The usual case; just add this class to the
5139                                    existing set */
5140                             ANYOF_POSIXL_SET(data->start_class, namedclass);
5141                         }
5142                     }
5143                     break;
5144
5145                 case NPOSIXA:   /* For these, we always know the exact set of
5146                                    what's matched */
5147                     invert = 1;
5148                     /* FALLTHROUGH */
5149                 case POSIXA:
5150                     if (FLAGS(scan) == _CC_ASCII) {
5151                         my_invlist = invlist_clone(PL_XPosix_ptrs[_CC_ASCII]);
5152                     }
5153                     else {
5154                         _invlist_intersection(PL_XPosix_ptrs[FLAGS(scan)],
5155                                               PL_XPosix_ptrs[_CC_ASCII],
5156                                               &my_invlist);
5157                     }
5158                     goto join_posix;
5159
5160                 case NPOSIXD:
5161                 case NPOSIXU:
5162                     invert = 1;
5163                     /* FALLTHROUGH */
5164                 case POSIXD:
5165                 case POSIXU:
5166                     my_invlist = invlist_clone(PL_XPosix_ptrs[FLAGS(scan)]);
5167
5168                     /* NPOSIXD matches all upper Latin1 code points unless the
5169                      * target string being matched is UTF-8, which is
5170                      * unknowable until match time.  Since we are going to
5171                      * invert, we want to get rid of all of them so that the
5172                      * inversion will match all */
5173                     if (OP(scan) == NPOSIXD) {
5174                         _invlist_subtract(my_invlist, PL_UpperLatin1,
5175                                           &my_invlist);
5176                     }
5177
5178                   join_posix:
5179
5180                     if (flags & SCF_DO_STCLASS_AND) {
5181                         ssc_intersection(data->start_class, my_invlist, invert);
5182                         ssc_clear_locale(data->start_class);
5183                     }
5184                     else {
5185                         assert(flags & SCF_DO_STCLASS_OR);
5186                         ssc_union(data->start_class, my_invlist, invert);
5187                     }
5188                     SvREFCNT_dec(my_invlist);
5189                 }
5190                 if (flags & SCF_DO_STCLASS_OR)
5191                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
5192                 flags &= ~SCF_DO_STCLASS;
5193             }
5194         }
5195         else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
5196             data->flags |= (OP(scan) == MEOL
5197                             ? SF_BEFORE_MEOL
5198                             : SF_BEFORE_SEOL);
5199             scan_commit(pRExC_state, data, minlenp, is_inf);
5200
5201         }
5202         else if (  PL_regkind[OP(scan)] == BRANCHJ
5203                  /* Lookbehind, or need to calculate parens/evals/stclass: */
5204                    && (scan->flags || data || (flags & SCF_DO_STCLASS))
5205                    && (OP(scan) == IFMATCH || OP(scan) == UNLESSM))
5206         {
5207             if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY
5208                 || OP(scan) == UNLESSM )
5209             {
5210                 /* Negative Lookahead/lookbehind
5211                    In this case we can't do fixed string optimisation.
5212                 */
5213
5214                 SSize_t deltanext, minnext, fake = 0;
5215                 regnode *nscan;
5216                 regnode_ssc intrnl;
5217                 int f = 0;
5218
5219                 StructCopy(&zero_scan_data, &data_fake, scan_data_t);
5220                 if (data) {
5221                     data_fake.whilem_c = data->whilem_c;
5222                     data_fake.last_closep = data->last_closep;
5223                 }
5224                 else
5225                     data_fake.last_closep = &fake;
5226                 data_fake.pos_delta = delta;
5227                 if ( flags & SCF_DO_STCLASS && !scan->flags
5228                      && OP(scan) == IFMATCH ) { /* Lookahead */
5229                     ssc_init(pRExC_state, &intrnl);
5230                     data_fake.start_class = &intrnl;
5231                     f |= SCF_DO_STCLASS_AND;
5232                 }
5233                 if (flags & SCF_WHILEM_VISITED_POS)
5234                     f |= SCF_WHILEM_VISITED_POS;
5235                 next = regnext(scan);
5236                 nscan = NEXTOPER(NEXTOPER(scan));
5237                 minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext,
5238                                       last, &data_fake, stopparen,
5239                                       recursed_depth, NULL, f, depth+1);
5240                 if (scan->flags) {
5241                     if (deltanext) {
5242                         FAIL("Variable length lookbehind not implemented");
5243                     }
5244                     else if (minnext > (I32)U8_MAX) {
5245                         FAIL2("Lookbehind longer than %"UVuf" not implemented",
5246                               (UV)U8_MAX);
5247                     }
5248                     scan->flags = (U8)minnext;
5249                 }
5250                 if (data) {
5251                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
5252                         pars++;
5253                     if (data_fake.flags & SF_HAS_EVAL)
5254                         data->flags |= SF_HAS_EVAL;
5255                     data->whilem_c = data_fake.whilem_c;
5256                 }
5257                 if (f & SCF_DO_STCLASS_AND) {
5258                     if (flags & SCF_DO_STCLASS_OR) {
5259                         /* OR before, AND after: ideally we would recurse with
5260                          * data_fake to get the AND applied by study of the
5261                          * remainder of the pattern, and then derecurse;
5262                          * *** HACK *** for now just treat as "no information".
5263                          * See [perl #56690].
5264                          */
5265                         ssc_init(pRExC_state, data->start_class);
5266                     }  else {
5267                         /* AND before and after: combine and continue.  These
5268                          * assertions are zero-length, so can match an EMPTY
5269                          * string */
5270                         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl);
5271                         ANYOF_FLAGS(data->start_class)
5272                                                    |= SSC_MATCHES_EMPTY_STRING;
5273                     }
5274                 }
5275             }
5276 #if PERL_ENABLE_POSITIVE_ASSERTION_STUDY
5277             else {
5278                 /* Positive Lookahead/lookbehind
5279                    In this case we can do fixed string optimisation,
5280                    but we must be careful about it. Note in the case of
5281                    lookbehind the positions will be offset by the minimum
5282                    length of the pattern, something we won't know about
5283                    until after the recurse.
5284                 */
5285                 SSize_t deltanext, fake = 0;
5286                 regnode *nscan;
5287                 regnode_ssc intrnl;
5288                 int f = 0;
5289                 /* We use SAVEFREEPV so that when the full compile
5290                     is finished perl will clean up the allocated
5291                     minlens when it's all done. This way we don't
5292                     have to worry about freeing them when we know
5293                     they wont be used, which would be a pain.
5294                  */
5295                 SSize_t *minnextp;
5296                 Newx( minnextp, 1, SSize_t );
5297                 SAVEFREEPV(minnextp);
5298
5299                 if (data) {
5300                     StructCopy(data, &data_fake, scan_data_t);
5301                     if ((flags & SCF_DO_SUBSTR) && data->last_found) {
5302                         f |= SCF_DO_SUBSTR;
5303                         if (scan->flags)
5304                             scan_commit(pRExC_state, &data_fake, minlenp, is_inf);
5305                         data_fake.last_found=newSVsv(data->last_found);
5306                     }
5307                 }
5308                 else
5309                     data_fake.last_closep = &fake;
5310                 data_fake.flags = 0;
5311                 data_fake.pos_delta = delta;
5312                 if (is_inf)
5313                     data_fake.flags |= SF_IS_INF;
5314                 if ( flags & SCF_DO_STCLASS && !scan->flags
5315                      && OP(scan) == IFMATCH ) { /* Lookahead */
5316                     ssc_init(pRExC_state, &intrnl);
5317                     data_fake.start_class = &intrnl;
5318                     f |= SCF_DO_STCLASS_AND;
5319                 }
5320                 if (flags & SCF_WHILEM_VISITED_POS)
5321                     f |= SCF_WHILEM_VISITED_POS;
5322                 next = regnext(scan);
5323                 nscan = NEXTOPER(NEXTOPER(scan));
5324
5325                 *minnextp = study_chunk(pRExC_state, &nscan, minnextp,
5326                                         &deltanext, last, &data_fake,
5327                                         stopparen, recursed_depth, NULL,
5328                                         f,depth+1);
5329                 if (scan->flags) {
5330                     if (deltanext) {
5331                         FAIL("Variable length lookbehind not implemented");
5332                     }
5333                     else if (*minnextp > (I32)U8_MAX) {
5334                         FAIL2("Lookbehind longer than %"UVuf" not implemented",
5335                               (UV)U8_MAX);
5336                     }
5337                     scan->flags = (U8)*minnextp;
5338                 }
5339
5340                 *minnextp += min;
5341
5342                 if (f & SCF_DO_STCLASS_AND) {
5343                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl);
5344                     ANYOF_FLAGS(data->start_class) |= SSC_MATCHES_EMPTY_STRING;
5345                 }
5346                 if (data) {
5347                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
5348                         pars++;
5349                     if (data_fake.flags & SF_HAS_EVAL)
5350                         data->flags |= SF_HAS_EVAL;
5351                     data->whilem_c = data_fake.whilem_c;
5352                     if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) {
5353                         if (RExC_rx->minlen<*minnextp)
5354                             RExC_rx->minlen=*minnextp;
5355                         scan_commit(pRExC_state, &data_fake, minnextp, is_inf);
5356                         SvREFCNT_dec_NN(data_fake.last_found);
5357
5358                         if ( data_fake.minlen_fixed != minlenp )
5359                         {
5360                             data->offset_fixed= data_fake.offset_fixed;
5361                             data->minlen_fixed= data_fake.minlen_fixed;
5362                             data->lookbehind_fixed+= scan->flags;
5363                         }
5364                         if ( data_fake.minlen_float != minlenp )
5365                         {
5366                             data->minlen_float= data_fake.minlen_float;
5367                             data->offset_float_min=data_fake.offset_float_min;
5368                             data->offset_float_max=data_fake.offset_float_max;
5369                             data->lookbehind_float+= scan->flags;
5370                         }
5371                     }
5372                 }
5373             }
5374 #endif
5375         }
5376         else if (OP(scan) == OPEN) {
5377             if (stopparen != (I32)ARG(scan))
5378                 pars++;
5379         }
5380         else if (OP(scan) == CLOSE) {
5381             if (stopparen == (I32)ARG(scan)) {
5382                 break;
5383             }
5384             if ((I32)ARG(scan) == is_par) {
5385                 next = regnext(scan);
5386
5387                 if ( next && (OP(next) != WHILEM) && next < last)
5388                     is_par = 0;         /* Disable optimization */
5389             }
5390             if (data)
5391                 *(data->last_closep) = ARG(scan);
5392         }
5393         else if (OP(scan) == EVAL) {
5394                 if (data)
5395                     data->flags |= SF_HAS_EVAL;
5396         }
5397         else if ( PL_regkind[OP(scan)] == ENDLIKE ) {
5398             if (flags & SCF_DO_SUBSTR) {
5399                 scan_commit(pRExC_state, data, minlenp, is_inf);
5400                 flags &= ~SCF_DO_SUBSTR;
5401             }
5402             if (data && OP(scan)==ACCEPT) {
5403                 data->flags |= SCF_SEEN_ACCEPT;
5404                 if (stopmin > min)
5405                     stopmin = min;
5406             }
5407         }
5408         else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */
5409         {
5410                 if (flags & SCF_DO_SUBSTR) {
5411                     scan_commit(pRExC_state, data, minlenp, is_inf);
5412                     data->longest = &(data->longest_float);
5413                 }
5414                 is_inf = is_inf_internal = 1;
5415                 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
5416                     ssc_anything(data->start_class);
5417                 flags &= ~SCF_DO_STCLASS;
5418         }
5419         else if (OP(scan) == GPOS) {
5420             if (!(RExC_rx->intflags & PREGf_GPOS_FLOAT) &&
5421                 !(delta || is_inf || (data && data->pos_delta)))
5422             {
5423                 if (!(RExC_rx->intflags & PREGf_ANCH) && (flags & SCF_DO_SUBSTR))
5424                     RExC_rx->intflags |= PREGf_ANCH_GPOS;
5425                 if (RExC_rx->gofs < (STRLEN)min)
5426                     RExC_rx->gofs = min;
5427             } else {
5428                 RExC_rx->intflags |= PREGf_GPOS_FLOAT;
5429                 RExC_rx->gofs = 0;
5430             }
5431         }
5432 #ifdef TRIE_STUDY_OPT
5433 #ifdef FULL_TRIE_STUDY
5434         else if (PL_regkind[OP(scan)] == TRIE) {
5435             /* NOTE - There is similar code to this block above for handling
5436                BRANCH nodes on the initial study.  If you change stuff here
5437                check there too. */
5438             regnode *trie_node= scan;
5439             regnode *tail= regnext(scan);
5440             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
5441             SSize_t max1 = 0, min1 = SSize_t_MAX;
5442             regnode_ssc accum;
5443
5444             if (flags & SCF_DO_SUBSTR) { /* XXXX Add !SUSPEND? */
5445                 /* Cannot merge strings after this. */
5446                 scan_commit(pRExC_state, data, minlenp, is_inf);
5447             }
5448             if (flags & SCF_DO_STCLASS)
5449                 ssc_init_zero(pRExC_state, &accum);
5450
5451             if (!trie->jump) {
5452                 min1= trie->minlen;
5453                 max1= trie->maxlen;
5454             } else {
5455                 const regnode *nextbranch= NULL;
5456                 U32 word;
5457
5458                 for ( word=1 ; word <= trie->wordcount ; word++)
5459                 {
5460                     SSize_t deltanext=0, minnext=0, f = 0, fake;
5461                     regnode_ssc this_class;
5462
5463                     StructCopy(&zero_scan_data, &data_fake, scan_data_t);
5464                     if (data) {
5465                         data_fake.whilem_c = data->whilem_c;
5466                         data_fake.last_closep = data->last_closep;
5467                     }
5468                     else
5469                         data_fake.last_closep = &fake;
5470                     data_fake.pos_delta = delta;
5471                     if (flags & SCF_DO_STCLASS) {
5472                         ssc_init(pRExC_state, &this_class);
5473                         data_fake.start_class = &this_class;
5474                         f = SCF_DO_STCLASS_AND;
5475                     }
5476                     if (flags & SCF_WHILEM_VISITED_POS)
5477                         f |= SCF_WHILEM_VISITED_POS;
5478
5479                     if (trie->jump[word]) {
5480                         if (!nextbranch)
5481                             nextbranch = trie_node + trie->jump[0];
5482                         scan= trie_node + trie->jump[word];
5483                         /* We go from the jump point to the branch that follows
5484                            it. Note this means we need the vestigal unused
5485                            branches even though they arent otherwise used. */
5486                         minnext = study_chunk(pRExC_state, &scan, minlenp,
5487                             &deltanext, (regnode *)nextbranch, &data_fake,
5488                             stopparen, recursed_depth, NULL, f,depth+1);
5489                     }
5490                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
5491                         nextbranch= regnext((regnode*)nextbranch);
5492
5493                     if (min1 > (SSize_t)(minnext + trie->minlen))
5494                         min1 = minnext + trie->minlen;
5495                     if (deltanext == SSize_t_MAX) {
5496                         is_inf = is_inf_internal = 1;
5497                         max1 = SSize_t_MAX;
5498                     } else if (max1 < (SSize_t)(minnext + deltanext + trie->maxlen))
5499                         max1 = minnext + deltanext + trie->maxlen;
5500
5501                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
5502                         pars++;
5503                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
5504                         if ( stopmin > min + min1)
5505                             stopmin = min + min1;
5506                         flags &= ~SCF_DO_SUBSTR;
5507                         if (data)
5508                             data->flags |= SCF_SEEN_ACCEPT;
5509                     }
5510                     if (data) {
5511                         if (data_fake.flags & SF_HAS_EVAL)
5512                             data->flags |= SF_HAS_EVAL;
5513                         data->whilem_c = data_fake.whilem_c;
5514                     }
5515                     if (flags & SCF_DO_STCLASS)
5516                         ssc_or(pRExC_state, &accum, (regnode_charclass *) &this_class);
5517                 }
5518             }
5519             if (flags & SCF_DO_SUBSTR) {
5520                 data->pos_min += min1;
5521                 data->pos_delta += max1 - min1;
5522                 if (max1 != min1 || is_inf)
5523                     data->longest = &(data->longest_float);
5524             }
5525             min += min1;
5526             if (delta != SSize_t_MAX)
5527                 delta += max1 - min1;
5528             if (flags & SCF_DO_STCLASS_OR) {
5529                 ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &accum);
5530                 if (min1) {
5531                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
5532                     flags &= ~SCF_DO_STCLASS;
5533                 }
5534             }
5535             else if (flags & SCF_DO_STCLASS_AND) {
5536                 if (min1) {
5537                     ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum);
5538                     flags &= ~SCF_DO_STCLASS;
5539                 }
5540                 else {
5541                     /* Switch to OR mode: cache the old value of
5542                      * data->start_class */
5543                     INIT_AND_WITHP;
5544                     StructCopy(data->start_class, and_withp, regnode_ssc);
5545                     flags &= ~SCF_DO_STCLASS_AND;
5546                     StructCopy(&accum, data->start_class, regnode_ssc);
5547                     flags |= SCF_DO_STCLASS_OR;
5548                 }
5549             }
5550             scan= tail;
5551             continue;
5552         }
5553 #else
5554         else if (PL_regkind[OP(scan)] == TRIE) {
5555             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
5556             U8*bang=NULL;
5557
5558             min += trie->minlen;
5559             delta += (trie->maxlen - trie->minlen);
5560             flags &= ~SCF_DO_STCLASS; /* xxx */
5561             if (flags & SCF_DO_SUBSTR) {
5562                 /* Cannot expect anything... */
5563                 scan_commit(pRExC_state, data, minlenp, is_inf);
5564                 data->pos_min += trie->minlen;
5565                 data->pos_delta += (trie->maxlen - trie->minlen);
5566                 if (trie->maxlen != trie->minlen)
5567                     data->longest = &(data->longest_float);
5568             }
5569             if (trie->jump) /* no more substrings -- for now /grr*/
5570                flags &= ~SCF_DO_SUBSTR;
5571         }
5572 #endif /* old or new */
5573 #endif /* TRIE_STUDY_OPT */
5574
5575         /* Else: zero-length, ignore. */
5576         scan = regnext(scan);
5577     }
5578     /* If we are exiting a recursion we can unset its recursed bit
5579      * and allow ourselves to enter it again - no danger of an
5580      * infinite loop there.
5581     if (stopparen > -1 && recursed) {
5582         DEBUG_STUDYDATA("unset:", data,depth);
5583         PAREN_UNSET( recursed, stopparen);
5584     }
5585     */
5586     if (frame) {
5587         depth = depth - 1;
5588
5589         DEBUG_STUDYDATA("frame-end:",data,depth);
5590         DEBUG_PEEP("fend", scan, depth);
5591
5592         /* restore previous context */
5593         last = frame->last_regnode;
5594         scan = frame->next_regnode;
5595         stopparen = frame->stopparen;
5596         recursed_depth = frame->prev_recursed_depth;
5597
5598         RExC_frame_last = frame->prev_frame;
5599         frame = frame->this_prev_frame;
5600         goto fake_study_recurse;
5601     }
5602
5603   finish:
5604     assert(!frame);
5605     DEBUG_STUDYDATA("pre-fin:",data,depth);
5606
5607     *scanp = scan;
5608     *deltap = is_inf_internal ? SSize_t_MAX : delta;
5609
5610     if (flags & SCF_DO_SUBSTR && is_inf)
5611         data->pos_delta = SSize_t_MAX - data->pos_min;
5612     if (is_par > (I32)U8_MAX)
5613         is_par = 0;
5614     if (is_par && pars==1 && data) {
5615         data->flags |= SF_IN_PAR;
5616         data->flags &= ~SF_HAS_PAR;
5617     }
5618     else if (pars && data) {
5619         data->flags |= SF_HAS_PAR;
5620         data->flags &= ~SF_IN_PAR;
5621     }
5622     if (flags & SCF_DO_STCLASS_OR)
5623         ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp);
5624     if (flags & SCF_TRIE_RESTUDY)
5625         data->flags |=  SCF_TRIE_RESTUDY;
5626
5627     DEBUG_STUDYDATA("post-fin:",data,depth);
5628
5629     {
5630         SSize_t final_minlen= min < stopmin ? min : stopmin;
5631
5632         if (!(RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)) {
5633             if (final_minlen > SSize_t_MAX - delta)
5634                 RExC_maxlen = SSize_t_MAX;
5635             else if (RExC_maxlen < final_minlen + delta)
5636                 RExC_maxlen = final_minlen + delta;
5637         }
5638         return final_minlen;
5639     }
5640     NOT_REACHED; /* NOTREACHED */
5641 }
5642
5643 STATIC U32
5644 S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n)
5645 {
5646     U32 count = RExC_rxi->data ? RExC_rxi->data->count : 0;
5647
5648     PERL_ARGS_ASSERT_ADD_DATA;
5649
5650     Renewc(RExC_rxi->data,
5651            sizeof(*RExC_rxi->data) + sizeof(void*) * (count + n - 1),
5652            char, struct reg_data);
5653     if(count)
5654         Renew(RExC_rxi->data->what, count + n, U8);
5655     else
5656         Newx(RExC_rxi->data->what, n, U8);
5657     RExC_rxi->data->count = count + n;
5658     Copy(s, RExC_rxi->data->what + count, n, U8);
5659     return count;
5660 }
5661
5662 /*XXX: todo make this not included in a non debugging perl, but appears to be
5663  * used anyway there, in 'use re' */
5664 #ifndef PERL_IN_XSUB_RE
5665 void
5666 Perl_reginitcolors(pTHX)
5667 {
5668     const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
5669     if (s) {
5670         char *t = savepv(s);
5671         int i = 0;
5672         PL_colors[0] = t;
5673         while (++i < 6) {
5674             t = strchr(t, '\t');
5675             if (t) {
5676                 *t = '\0';
5677                 PL_colors[i] = ++t;
5678             }
5679             else
5680                 PL_colors[i] = t = (char *)"";
5681         }
5682     } else {
5683         int i = 0;
5684         while (i < 6)
5685             PL_colors[i++] = (char *)"";
5686     }
5687     PL_colorset = 1;
5688 }
5689 #endif
5690
5691
5692 #ifdef TRIE_STUDY_OPT
5693 #define CHECK_RESTUDY_GOTO_butfirst(dOsomething)            \
5694     STMT_START {                                            \
5695         if (                                                \
5696               (data.flags & SCF_TRIE_RESTUDY)               \
5697               && ! restudied++                              \
5698         ) {                                                 \
5699             dOsomething;                                    \
5700             goto reStudy;                                   \
5701         }                                                   \
5702     } STMT_END
5703 #else
5704 #define CHECK_RESTUDY_GOTO_butfirst
5705 #endif
5706
5707 /*
5708  * pregcomp - compile a regular expression into internal code
5709  *
5710  * Decides which engine's compiler to call based on the hint currently in
5711  * scope
5712  */
5713
5714 #ifndef PERL_IN_XSUB_RE
5715
5716 /* return the currently in-scope regex engine (or the default if none)  */
5717
5718 regexp_engine const *
5719 Perl_current_re_engine(pTHX)
5720 {
5721     if (IN_PERL_COMPILETIME) {
5722         HV * const table = GvHV(PL_hintgv);
5723         SV **ptr;
5724
5725         if (!table || !(PL_hints & HINT_LOCALIZE_HH))
5726             return &PL_core_reg_engine;
5727         ptr = hv_fetchs(table, "regcomp", FALSE);
5728         if ( !(ptr && SvIOK(*ptr) && SvIV(*ptr)))
5729             return &PL_core_reg_engine;
5730         return INT2PTR(regexp_engine*,SvIV(*ptr));
5731     }
5732     else {
5733         SV *ptr;
5734         if (!PL_curcop->cop_hints_hash)
5735             return &PL_core_reg_engine;
5736         ptr = cop_hints_fetch_pvs(PL_curcop, "regcomp", 0);
5737         if ( !(ptr && SvIOK(ptr) && SvIV(ptr)))
5738             return &PL_core_reg_engine;
5739         return INT2PTR(regexp_engine*,SvIV(ptr));
5740     }
5741 }
5742
5743
5744 REGEXP *
5745 Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags)
5746 {
5747     regexp_engine const *eng = current_re_engine();
5748     GET_RE_DEBUG_FLAGS_DECL;
5749
5750     PERL_ARGS_ASSERT_PREGCOMP;
5751
5752     /* Dispatch a request to compile a regexp to correct regexp engine. */
5753     DEBUG_COMPILE_r({
5754         PerlIO_printf(Perl_debug_log, "Using engine %"UVxf"\n",
5755                         PTR2UV(eng));
5756     });
5757     return CALLREGCOMP_ENG(eng, pattern, flags);
5758 }
5759 #endif
5760
5761 /* public(ish) entry point for the perl core's own regex compiling code.
5762  * It's actually a wrapper for Perl_re_op_compile that only takes an SV
5763  * pattern rather than a list of OPs, and uses the internal engine rather
5764  * than the current one */
5765
5766 REGEXP *
5767 Perl_re_compile(pTHX_ SV * const pattern, U32 rx_flags)
5768 {
5769     SV *pat = pattern; /* defeat constness! */
5770     PERL_ARGS_ASSERT_RE_COMPILE;
5771     return Perl_re_op_compile(aTHX_ &pat, 1, NULL,
5772 #ifdef PERL_IN_XSUB_RE
5773                                 &my_reg_engine,
5774 #else
5775                                 &PL_core_reg_engine,
5776 #endif
5777                                 NULL, NULL, rx_flags, 0);
5778 }
5779
5780
5781 /* upgrade pattern pat_p of length plen_p to UTF8, and if there are code
5782  * blocks, recalculate the indices. Update pat_p and plen_p in-place to
5783  * point to the realloced string and length.
5784  *
5785  * This is essentially a copy of Perl_bytes_to_utf8() with the code index
5786  * stuff added */
5787
5788 static void
5789 S_pat_upgrade_to_utf8(pTHX_ RExC_state_t * const pRExC_state,
5790                     char **pat_p, STRLEN *plen_p, int num_code_blocks)
5791 {
5792     U8 *const src = (U8*)*pat_p;
5793     U8 *dst, *d;
5794     int n=0;
5795     STRLEN s = 0;
5796     bool do_end = 0;
5797     GET_RE_DEBUG_FLAGS_DECL;
5798
5799     DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
5800         "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
5801
5802     Newx(dst, *plen_p * 2 + 1, U8);
5803     d = dst;
5804
5805     while (s < *plen_p) {
5806         append_utf8_from_native_byte(src[s], &d);
5807         if (n < num_code_blocks) {
5808             if (!do_end && pRExC_state->code_blocks[n].start == s) {
5809                 pRExC_state->code_blocks[n].start = d - dst - 1;
5810                 assert(*(d - 1) == '(');
5811                 do_end = 1;
5812             }
5813             else if (do_end && pRExC_state->code_blocks[n].end == s) {
5814                 pRExC_state->code_blocks[n].end = d - dst - 1;
5815                 assert(*(d - 1) == ')');
5816                 do_end = 0;
5817                 n++;
5818             }
5819         }
5820         s++;
5821     }
5822     *d = '\0';
5823     *plen_p = d - dst;
5824     *pat_p = (char*) dst;
5825     SAVEFREEPV(*pat_p);
5826     RExC_orig_utf8 = RExC_utf8 = 1;
5827 }
5828
5829
5830
5831 /* S_concat_pat(): concatenate a list of args to the pattern string pat,
5832  * while recording any code block indices, and handling overloading,
5833  * nested qr// objects etc.  If pat is null, it will allocate a new
5834  * string, or just return the first arg, if there's only one.
5835  *
5836  * Returns the malloced/updated pat.
5837  * patternp and pat_count is the array of SVs to be concatted;
5838  * oplist is the optional list of ops that generated the SVs;
5839  * recompile_p is a pointer to a boolean that will be set if
5840  *   the regex will need to be recompiled.
5841  * delim, if non-null is an SV that will be inserted between each element
5842  */
5843
5844 static SV*
5845 S_concat_pat(pTHX_ RExC_state_t * const pRExC_state,
5846                 SV *pat, SV ** const patternp, int pat_count,
5847                 OP *oplist, bool *recompile_p, SV *delim)
5848 {
5849     SV **svp;
5850     int n = 0;
5851     bool use_delim = FALSE;
5852     bool alloced = FALSE;
5853
5854     /* if we know we have at least two args, create an empty string,
5855      * then concatenate args to that. For no args, return an empty string */
5856     if (!pat && pat_count != 1) {
5857         pat = newSVpvs("");
5858         SAVEFREESV(pat);
5859         alloced = TRUE;
5860     }
5861
5862     for (svp = patternp; svp < patternp + pat_count; svp++) {
5863         SV *sv;
5864         SV *rx  = NULL;
5865         STRLEN orig_patlen = 0;
5866         bool code = 0;
5867         SV *msv = use_delim ? delim : *svp;
5868         if (!msv) msv = &PL_sv_undef;
5869
5870         /* if we've got a delimiter, we go round the loop twice for each
5871          * svp slot (except the last), using the delimiter the second
5872          * time round */
5873         if (use_delim) {
5874             svp--;
5875             use_delim = FALSE;
5876         }
5877         else if (delim)
5878             use_delim = TRUE;
5879
5880         if (SvTYPE(msv) == SVt_PVAV) {
5881             /* we've encountered an interpolated array within
5882              * the pattern, e.g. /...@a..../. Expand the list of elements,
5883              * then recursively append elements.
5884              * The code in this block is based on S_pushav() */
5885
5886             AV *const av = (AV*)msv;
5887             const SSize_t maxarg = AvFILL(av) + 1;
5888             SV **array;
5889
5890             if (oplist) {
5891                 assert(oplist->op_type == OP_PADAV
5892                     || oplist->op_type == OP_RV2AV);
5893                 oplist = OpSIBLING(oplist);
5894             }
5895
5896             if (SvRMAGICAL(av)) {
5897                 SSize_t i;
5898
5899                 Newx(array, maxarg, SV*);
5900                 SAVEFREEPV(array);
5901                 for (i=0; i < maxarg; i++) {
5902                     SV ** const svp = av_fetch(av, i, FALSE);
5903                     array[i] = svp ? *svp : &PL_sv_undef;
5904                 }
5905             }
5906             else
5907                 array = AvARRAY(av);
5908
5909             pat = S_concat_pat(aTHX_ pRExC_state, pat,
5910                                 array, maxarg, NULL, recompile_p,
5911                                 /* $" */
5912                                 GvSV((gv_fetchpvs("\"", GV_ADDMULTI, SVt_PV))));
5913
5914             continue;
5915         }
5916
5917
5918         /* we make the assumption here that each op in the list of
5919          * op_siblings maps to one SV pushed onto the stack,
5920          * except for code blocks, with have both an OP_NULL and
5921          * and OP_CONST.
5922          * This allows us to match up the list of SVs against the
5923          * list of OPs to find the next code block.
5924          *
5925          * Note that       PUSHMARK PADSV PADSV ..
5926          * is optimised to
5927          *                 PADRANGE PADSV  PADSV  ..
5928          * so the alignment still works. */
5929
5930         if (oplist) {
5931             if (oplist->op_type == OP_NULL
5932                 && (oplist->op_flags & OPf_SPECIAL))
5933             {
5934                 assert(n < pRExC_state->num_code_blocks);
5935                 pRExC_state->code_blocks[n].start = pat ? SvCUR(pat) : 0;
5936                 pRExC_state->code_blocks[n].block = oplist;
5937                 pRExC_state->code_blocks[n].src_regex = NULL;
5938                 n++;
5939                 code = 1;
5940                 oplist = OpSIBLING(oplist); /* skip CONST */
5941                 assert(oplist);
5942             }
5943             oplist = OpSIBLING(oplist);;
5944         }
5945
5946         /* apply magic and QR overloading to arg */
5947
5948         SvGETMAGIC(msv);
5949         if (SvROK(msv) && SvAMAGIC(msv)) {
5950             SV *sv = AMG_CALLunary(msv, regexp_amg);
5951             if (sv) {
5952                 if (SvROK(sv))
5953                     sv = SvRV(sv);
5954                 if (SvTYPE(sv) != SVt_REGEXP)
5955                     Perl_croak(aTHX_ "Overloaded qr did not return a REGEXP");
5956                 msv = sv;
5957             }
5958         }
5959
5960         /* try concatenation overload ... */
5961         if (pat && (SvAMAGIC(pat) || SvAMAGIC(msv)) &&
5962                 (sv = amagic_call(pat, msv, concat_amg, AMGf_assign)))
5963         {
5964             sv_setsv(pat, sv);
5965             /* overloading involved: all bets are off over literal
5966              * code. Pretend we haven't seen it */
5967             pRExC_state->num_code_blocks -= n;
5968             n = 0;
5969         }
5970         else  {
5971             /* ... or failing that, try "" overload */
5972             while (SvAMAGIC(msv)
5973                     && (sv = AMG_CALLunary(msv, string_amg))
5974                     && sv != msv
5975                     &&  !(   SvROK(msv)
5976                           && SvROK(sv)
5977                           && SvRV(msv) == SvRV(sv))
5978             ) {
5979                 msv = sv;
5980                 SvGETMAGIC(msv);
5981             }
5982             if (SvROK(msv) && SvTYPE(SvRV(msv)) == SVt_REGEXP)
5983                 msv = SvRV(msv);
5984
5985             if (pat) {
5986                 /* this is a partially unrolled
5987                  *     sv_catsv_nomg(pat, msv);
5988                  * that allows us to adjust code block indices if
5989                  * needed */
5990                 STRLEN dlen;
5991                 char *dst = SvPV_force_nomg(pat, dlen);
5992                 orig_patlen = dlen;
5993                 if (SvUTF8(msv) && !SvUTF8(pat)) {
5994                     S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &dst, &dlen, n);
5995                     sv_setpvn(pat, dst, dlen);
5996                     SvUTF8_on(pat);
5997                 }
5998                 sv_catsv_nomg(pat, msv);
5999                 rx = msv;
6000             }
6001             else
6002                 pat = msv;
6003
6004             if (code)
6005                 pRExC_state->code_blocks[n-1].end = SvCUR(pat)-1;
6006         }
6007
6008         /* extract any code blocks within any embedded qr//'s */
6009         if (rx && SvTYPE(rx) == SVt_REGEXP
6010             && RX_ENGINE((REGEXP*)rx)->op_comp)
6011         {
6012
6013             RXi_GET_DECL(ReANY((REGEXP *)rx), ri);
6014             if (ri->num_code_blocks) {
6015                 int i;
6016                 /* the presence of an embedded qr// with code means
6017                  * we should always recompile: the text of the
6018                  * qr// may not have changed, but it may be a
6019                  * different closure than last time */
6020                 *recompile_p = 1;
6021                 Renew(pRExC_state->code_blocks,
6022                     pRExC_state->num_code_blocks + ri->num_code_blocks,
6023                     struct reg_code_block);
6024                 pRExC_state->num_code_blocks += ri->num_code_blocks;
6025
6026                 for (i=0; i < ri->num_code_blocks; i++) {
6027                     struct reg_code_block *src, *dst;
6028                     STRLEN offset =  orig_patlen
6029                         + ReANY((REGEXP *)rx)->pre_prefix;
6030                     assert(n < pRExC_state->num_code_blocks);
6031                     src = &ri->code_blocks[i];
6032                     dst = &pRExC_state->code_blocks[n];
6033                     dst->start      = src->start + offset;
6034                     dst->end        = src->end   + offset;
6035                     dst->block      = src->block;
6036                     dst->src_regex  = (REGEXP*) SvREFCNT_inc( (SV*)
6037                                             src->src_regex
6038                                                 ? src->src_regex
6039                                                 : (REGEXP*)rx);
6040                     n++;
6041                 }
6042             }
6043         }
6044     }
6045     /* avoid calling magic multiple times on a single element e.g. =~ $qr */
6046     if (alloced)
6047         SvSETMAGIC(pat);
6048
6049     return pat;
6050 }
6051
6052
6053
6054 /* see if there are any run-time code blocks in the pattern.
6055  * False positives are allowed */
6056
6057 static bool
6058 S_has_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
6059                     char *pat, STRLEN plen)
6060 {
6061     int n = 0;
6062     STRLEN s;
6063     
6064     PERL_UNUSED_CONTEXT;
6065
6066     for (s = 0; s < plen; s++) {
6067         if (n < pRExC_state->num_code_blocks
6068             && s == pRExC_state->code_blocks[n].start)
6069         {
6070             s = pRExC_state->code_blocks[n].end;
6071             n++;
6072             continue;
6073         }
6074         /* TODO ideally should handle [..], (#..), /#.../x to reduce false
6075          * positives here */
6076         if (pat[s] == '(' && s+2 <= plen && pat[s+1] == '?' &&
6077             (pat[s+2] == '{'
6078                 || (s + 2 <= plen && pat[s+2] == '?' && pat[s+3] == '{'))
6079         )
6080             return 1;
6081     }
6082     return 0;
6083 }
6084
6085 /* Handle run-time code blocks. We will already have compiled any direct
6086  * or indirect literal code blocks. Now, take the pattern 'pat' and make a
6087  * copy of it, but with any literal code blocks blanked out and
6088  * appropriate chars escaped; then feed it into
6089  *
6090  *    eval "qr'modified_pattern'"
6091  *
6092  * For example,
6093  *
6094  *       a\bc(?{"this was literal"})def'ghi\\jkl(?{"this is runtime"})mno
6095  *
6096  * becomes
6097  *
6098  *    qr'a\\bc_______________________def\'ghi\\\\jkl(?{"this is runtime"})mno'
6099  *
6100  * After eval_sv()-ing that, grab any new code blocks from the returned qr
6101  * and merge them with any code blocks of the original regexp.
6102  *
6103  * If the pat is non-UTF8, while the evalled qr is UTF8, don't merge;
6104  * instead, just save the qr and return FALSE; this tells our caller that
6105  * the original pattern needs upgrading to utf8.
6106  */
6107
6108 static bool
6109 S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
6110     char *pat, STRLEN plen)
6111 {
6112     SV *qr;
6113
6114     GET_RE_DEBUG_FLAGS_DECL;
6115
6116     if (pRExC_state->runtime_code_qr) {
6117         /* this is the second time we've been called; this should
6118          * only happen if the main pattern got upgraded to utf8
6119          * during compilation; re-use the qr we compiled first time
6120          * round (which should be utf8 too)
6121          */
6122         qr = pRExC_state->runtime_code_qr;
6123         pRExC_state->runtime_code_qr = NULL;
6124         assert(RExC_utf8 && SvUTF8(qr));
6125     }
6126     else {
6127         int n = 0;
6128         STRLEN s;
6129         char *p, *newpat;
6130         int newlen = plen + 6; /* allow for "qr''x\0" extra chars */
6131         SV *sv, *qr_ref;
6132         dSP;
6133
6134         /* determine how many extra chars we need for ' and \ escaping */
6135         for (s = 0; s < plen; s++) {
6136             if (pat[s] == '\'' || pat[s] == '\\')
6137                 newlen++;
6138         }
6139
6140         Newx(newpat, newlen, char);
6141         p = newpat;
6142         *p++ = 'q'; *p++ = 'r'; *p++ = '\'';
6143
6144         for (s = 0; s < plen; s++) {
6145             if (n < pRExC_state->num_code_blocks
6146                 && s == pRExC_state->code_blocks[n].start)
6147             {
6148                 /* blank out literal code block */
6149                 assert(pat[s] == '(');
6150                 while (s <= pRExC_state->code_blocks[n].end) {
6151                     *p++ = '_';
6152                     s++;
6153                 }
6154                 s--;
6155                 n++;
6156                 continue;
6157             }
6158             if (pat[s] == '\'' || pat[s] == '\\')
6159                 *p++ = '\\';
6160             *p++ = pat[s];
6161         }
6162         *p++ = '\'';
6163         if (pRExC_state->pm_flags & RXf_PMf_EXTENDED)
6164             *p++ = 'x';
6165         *p++ = '\0';
6166         DEBUG_COMPILE_r({
6167             PerlIO_printf(Perl_debug_log,
6168                 "%sre-parsing pattern for runtime code:%s %s\n",
6169                 PL_colors[4],PL_colors[5],newpat);
6170         });
6171
6172         sv = newSVpvn_flags(newpat, p-newpat-1, RExC_utf8 ? SVf_UTF8 : 0);
6173         Safefree(newpat);
6174
6175         ENTER;
6176         SAVETMPS;
6177         PUSHSTACKi(PERLSI_REQUIRE);
6178         /* G_RE_REPARSING causes the toker to collapse \\ into \ when
6179          * parsing qr''; normally only q'' does this. It also alters
6180          * hints handling */
6181         eval_sv(sv, G_SCALAR|G_RE_REPARSING);
6182         SvREFCNT_dec_NN(sv);
6183         SPAGAIN;
6184         qr_ref = POPs;
6185         PUTBACK;
6186         {
6187             SV * const errsv = ERRSV;
6188             if (SvTRUE_NN(errsv))
6189             {
6190                 Safefree(pRExC_state->code_blocks);
6191                 /* use croak_sv ? */
6192                 Perl_croak_nocontext("%"SVf, SVfARG(errsv));
6193             }
6194         }
6195         assert(SvROK(qr_ref));
6196         qr = SvRV(qr_ref);
6197         assert(SvTYPE(qr) == SVt_REGEXP && RX_ENGINE((REGEXP*)qr)->op_comp);
6198         /* the leaving below frees the tmp qr_ref.
6199          * Give qr a life of its own */
6200         SvREFCNT_inc(qr);
6201         POPSTACK;
6202         FREETMPS;
6203         LEAVE;
6204
6205     }
6206
6207     if (!RExC_utf8 && SvUTF8(qr)) {
6208         /* first time through; the pattern got upgraded; save the
6209          * qr for the next time through */
6210         assert(!pRExC_state->runtime_code_qr);
6211         pRExC_state->runtime_code_qr = qr;
6212         return 0;
6213     }
6214
6215
6216     /* extract any code blocks within the returned qr//  */
6217
6218
6219     /* merge the main (r1) and run-time (r2) code blocks into one */
6220     {
6221         RXi_GET_DECL(ReANY((REGEXP *)qr), r2);
6222         struct reg_code_block *new_block, *dst;
6223         RExC_state_t * const r1 = pRExC_state; /* convenient alias */
6224         int i1 = 0, i2 = 0;
6225
6226         if (!r2->num_code_blocks) /* we guessed wrong */
6227         {
6228             SvREFCNT_dec_NN(qr);
6229             return 1;
6230         }
6231
6232         Newx(new_block,
6233             r1->num_code_blocks + r2->num_code_blocks,
6234             struct reg_code_block);
6235         dst = new_block;
6236
6237         while (    i1 < r1->num_code_blocks
6238                 || i2 < r2->num_code_blocks)
6239         {
6240             struct reg_code_block *src;
6241             bool is_qr = 0;
6242
6243             if (i1 == r1->num_code_blocks) {
6244                 src = &r2->code_blocks[i2++];
6245                 is_qr = 1;
6246             }
6247             else if (i2 == r2->num_code_blocks)
6248                 src = &r1->code_blocks[i1++];
6249             else if (  r1->code_blocks[i1].start
6250                      < r2->code_blocks[i2].start)
6251             {
6252                 src = &r1->code_blocks[i1++];
6253                 assert(src->end < r2->code_blocks[i2].start);
6254             }
6255             else {
6256                 assert(  r1->code_blocks[i1].start
6257                        > r2->code_blocks[i2].start);
6258                 src = &r2->code_blocks[i2++];
6259                 is_qr = 1;
6260                 assert(src->end < r1->code_blocks[i1].start);
6261             }
6262
6263             assert(pat[src->start] == '(');
6264             assert(pat[src->end]   == ')');
6265             dst->start      = src->start;
6266             dst->end        = src->end;
6267             dst->block      = src->block;
6268             dst->src_regex  = is_qr ? (REGEXP*) SvREFCNT_inc( (SV*) qr)
6269                                     : src->src_regex;
6270             dst++;
6271         }
6272         r1->num_code_blocks += r2->num_code_blocks;
6273         Safefree(r1->code_blocks);
6274         r1->code_blocks = new_block;
6275     }
6276
6277     SvREFCNT_dec_NN(qr);
6278     return 1;
6279 }
6280
6281
6282 STATIC bool
6283 S_setup_longest(pTHX_ RExC_state_t *pRExC_state, SV* sv_longest,
6284                       SV** rx_utf8, SV** rx_substr, SSize_t* rx_end_shift,
6285                       SSize_t lookbehind, SSize_t offset, SSize_t *minlen,
6286                       STRLEN longest_length, bool eol, bool meol)
6287 {
6288     /* This is the common code for setting up the floating and fixed length
6289      * string data extracted from Perl_re_op_compile() below.  Returns a boolean
6290      * as to whether succeeded or not */
6291
6292     I32 t;
6293     SSize_t ml;
6294
6295     if (! (longest_length
6296            || (eol /* Can't have SEOL and MULTI */
6297                && (! meol || (RExC_flags & RXf_PMf_MULTILINE)))
6298           )
6299             /* See comments for join_exact for why REG_UNFOLDED_MULTI_SEEN */
6300         || (RExC_seen & REG_UNFOLDED_MULTI_SEEN))
6301     {
6302         return FALSE;
6303     }
6304
6305     /* copy the information about the longest from the reg_scan_data
6306         over to the program. */
6307     if (SvUTF8(sv_longest)) {
6308         *rx_utf8 = sv_longest;
6309         *rx_substr = NULL;
6310     } else {
6311         *rx_substr = sv_longest;
6312         *rx_utf8 = NULL;
6313     }
6314     /* end_shift is how many chars that must be matched that
6315         follow this item. We calculate it ahead of time as once the
6316         lookbehind offset is added in we lose the ability to correctly
6317         calculate it.*/
6318     ml = minlen ? *(minlen) : (SSize_t)longest_length;
6319     *rx_end_shift = ml - offset
6320         - longest_length + (SvTAIL(sv_longest) != 0)
6321         + lookbehind;
6322
6323     t = (eol/* Can't have SEOL and MULTI */
6324          && (! meol || (RExC_flags & RXf_PMf_MULTILINE)));
6325     fbm_compile(sv_longest, t ? FBMcf_TAIL : 0);
6326
6327     return TRUE;
6328 }
6329
6330 /*
6331  * Perl_re_op_compile - the perl internal RE engine's function to compile a
6332  * regular expression into internal code.
6333  * The pattern may be passed either as:
6334  *    a list of SVs (patternp plus pat_count)
6335  *    a list of OPs (expr)
6336  * If both are passed, the SV list is used, but the OP list indicates
6337  * which SVs are actually pre-compiled code blocks
6338  *
6339  * The SVs in the list have magic and qr overloading applied to them (and
6340  * the list may be modified in-place with replacement SVs in the latter
6341  * case).
6342  *
6343  * If the pattern hasn't changed from old_re, then old_re will be
6344  * returned.
6345  *
6346  * eng is the current engine. If that engine has an op_comp method, then
6347  * handle directly (i.e. we assume that op_comp was us); otherwise, just
6348  * do the initial concatenation of arguments and pass on to the external
6349  * engine.
6350  *
6351  * If is_bare_re is not null, set it to a boolean indicating whether the
6352  * arg list reduced (after overloading) to a single bare regex which has
6353  * been returned (i.e. /$qr/).
6354  *
6355  * orig_rx_flags contains RXf_* flags. See perlreapi.pod for more details.
6356  *
6357  * pm_flags contains the PMf_* flags, typically based on those from the
6358  * pm_flags field of the related PMOP. Currently we're only interested in
6359  * PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL.
6360  *
6361  * We can't allocate space until we know how big the compiled form will be,
6362  * but we can't compile it (and thus know how big it is) until we've got a
6363  * place to put the code.  So we cheat:  we compile it twice, once with code
6364  * generation turned off and size counting turned on, and once "for real".
6365  * This also means that we don't allocate space until we are sure that the
6366  * thing really will compile successfully, and we never have to move the
6367  * code and thus invalidate pointers into it.  (Note that it has to be in
6368  * one piece because free() must be able to free it all.) [NB: not true in perl]
6369  *
6370  * Beware that the optimization-preparation code in here knows about some
6371  * of the structure of the compiled regexp.  [I'll say.]
6372  */
6373
6374 REGEXP *
6375 Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
6376                     OP *expr, const regexp_engine* eng, REGEXP *old_re,
6377                      bool *is_bare_re, U32 orig_rx_flags, U32 pm_flags)
6378 {
6379     REGEXP *rx;
6380     struct regexp *r;
6381     regexp_internal *ri;
6382     STRLEN plen;
6383     char *exp;
6384     regnode *scan;
6385     I32 flags;
6386     SSize_t minlen = 0;
6387     U32 rx_flags;
6388     SV *pat;
6389     SV *code_blocksv = NULL;
6390     SV** new_patternp = patternp;
6391
6392     /* these are all flags - maybe they should be turned
6393      * into a single int with different bit masks */
6394     I32 sawlookahead = 0;
6395     I32 sawplus = 0;
6396     I32 sawopen = 0;
6397     I32 sawminmod = 0;
6398
6399     regex_charset initial_charset = get_regex_charset(orig_rx_flags);
6400     bool recompile = 0;
6401     bool runtime_code = 0;
6402     scan_data_t data;
6403     RExC_state_t RExC_state;
6404     RExC_state_t * const pRExC_state = &RExC_state;
6405 #ifdef TRIE_STUDY_OPT
6406     int restudied = 0;
6407     RExC_state_t copyRExC_state;
6408 #endif
6409     GET_RE_DEBUG_FLAGS_DECL;
6410
6411     PERL_ARGS_ASSERT_RE_OP_COMPILE;
6412
6413     DEBUG_r(if (!PL_colorset) reginitcolors());
6414
6415     /* Initialize these here instead of as-needed, as is quick and avoids
6416      * having to test them each time otherwise */
6417     if (! PL_AboveLatin1) {
6418         PL_AboveLatin1 = _new_invlist_C_array(AboveLatin1_invlist);
6419         PL_Latin1 = _new_invlist_C_array(Latin1_invlist);
6420         PL_UpperLatin1 = _new_invlist_C_array(UpperLatin1_invlist);
6421         PL_utf8_foldable = _new_invlist_C_array(_Perl_Any_Folds_invlist);
6422         PL_HasMultiCharFold =
6423                        _new_invlist_C_array(_Perl_Folds_To_Multi_Char_invlist);
6424
6425         /* This is calculated here, because the Perl program that generates the
6426          * static global ones doesn't currently have access to
6427          * NUM_ANYOF_CODE_POINTS */
6428         PL_InBitmap = _new_invlist(2);
6429         PL_InBitmap = _add_range_to_invlist(PL_InBitmap, 0,
6430                                                     NUM_ANYOF_CODE_POINTS - 1);
6431     }
6432
6433     pRExC_state->code_blocks = NULL;
6434     pRExC_state->num_code_blocks = 0;
6435
6436     if (is_bare_re)
6437         *is_bare_re = FALSE;
6438
6439     if (expr && (expr->op_type == OP_LIST ||
6440                 (expr->op_type == OP_NULL && expr->op_targ == OP_LIST))) {
6441         /* allocate code_blocks if needed */
6442         OP *o;
6443         int ncode = 0;
6444
6445         for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o))
6446             if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL))
6447                 ncode++; /* count of DO blocks */
6448         if (ncode) {
6449             pRExC_state->num_code_blocks = ncode;
6450             Newx(pRExC_state->code_blocks, ncode, struct reg_code_block);
6451         }
6452     }
6453
6454     if (!pat_count) {
6455         /* compile-time pattern with just OP_CONSTs and DO blocks */
6456
6457         int n;
6458         OP *o;
6459
6460         /* find how many CONSTs there are */
6461         assert(expr);
6462         n = 0;
6463         if (expr->op_type == OP_CONST)
6464             n = 1;
6465         else
6466             for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
6467                 if (o->op_type == OP_CONST)
6468                     n++;
6469             }
6470
6471         /* fake up an SV array */
6472
6473         assert(!new_patternp);
6474         Newx(new_patternp, n, SV*);
6475         SAVEFREEPV(new_patternp);
6476         pat_count = n;
6477
6478         n = 0;
6479         if (expr->op_type == OP_CONST)
6480             new_patternp[n] = cSVOPx_sv(expr);
6481         else
6482             for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) {
6483                 if (o->op_type == OP_CONST)
6484                     new_patternp[n++] = cSVOPo_sv;
6485             }
6486
6487     }
6488
6489     DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
6490         "Assembling pattern from %d elements%s\n", pat_count,
6491             orig_rx_flags & RXf_SPLIT ? " for split" : ""));
6492
6493     /* set expr to the first arg op */
6494
6495     if (pRExC_state->num_code_blocks
6496          && expr->op_type != OP_CONST)
6497     {
6498             expr = cLISTOPx(expr)->op_first;
6499             assert(   expr->op_type == OP_PUSHMARK
6500                    || (expr->op_type == OP_NULL && expr->op_targ == OP_PUSHMARK)
6501                    || expr->op_type == OP_PADRANGE);
6502             expr = OpSIBLING(expr);
6503     }
6504
6505     pat = S_concat_pat(aTHX_ pRExC_state, NULL, new_patternp, pat_count,
6506                         expr, &recompile, NULL);
6507
6508     /* handle bare (possibly after overloading) regex: foo =~ $re */
6509     {
6510         SV *re = pat;
6511         if (SvROK(re))
6512             re = SvRV(re);
6513         if (SvTYPE(re) == SVt_REGEXP) {
6514             if (is_bare_re)
6515                 *is_bare_re = TRUE;
6516             SvREFCNT_inc(re);
6517             Safefree(pRExC_state->code_blocks);
6518             DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
6519                 "Precompiled pattern%s\n",
6520                     orig_rx_flags & RXf_SPLIT ? " for split" : ""));
6521
6522             return (REGEXP*)re;
6523         }
6524     }
6525
6526     exp = SvPV_nomg(pat, plen);
6527
6528     if (!eng->op_comp) {
6529         if ((SvUTF8(pat) && IN_BYTES)
6530                 || SvGMAGICAL(pat) || SvAMAGIC(pat))
6531         {
6532             /* make a temporary copy; either to convert to bytes,
6533              * or to avoid repeating get-magic / overloaded stringify */
6534             pat = newSVpvn_flags(exp, plen, SVs_TEMP |
6535                                         (IN_BYTES ? 0 : SvUTF8(pat)));
6536         }
6537         Safefree(pRExC_state->code_blocks);
6538         return CALLREGCOMP_ENG(eng, pat, orig_rx_flags);
6539     }
6540
6541     /* ignore the utf8ness if the pattern is 0 length */
6542     RExC_utf8 = RExC_orig_utf8 = (plen == 0 || IN_BYTES) ? 0 : SvUTF8(pat);
6543     RExC_uni_semantics = 0;
6544     RExC_contains_locale = 0;
6545     RExC_contains_i = 0;
6546     RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT);
6547     pRExC_state->runtime_code_qr = NULL;
6548     RExC_frame_head= NULL;
6549     RExC_frame_last= NULL;
6550     RExC_frame_count= 0;
6551
6552     DEBUG_r({
6553         RExC_mysv1= sv_newmortal();
6554         RExC_mysv2= sv_newmortal();
6555     });
6556     DEBUG_COMPILE_r({
6557             SV *dsv= sv_newmortal();
6558             RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, 60);
6559             PerlIO_printf(Perl_debug_log, "%sCompiling REx%s %s\n",
6560                           PL_colors[4],PL_colors[5],s);
6561         });
6562
6563   redo_first_pass:
6564     /* we jump here if we upgrade the pattern to utf8 and have to
6565      * recompile */
6566
6567     if ((pm_flags & PMf_USE_RE_EVAL)
6568                 /* this second condition covers the non-regex literal case,
6569                  * i.e.  $foo =~ '(?{})'. */
6570                 || (IN_PERL_COMPILETIME && (PL_hints & HINT_RE_EVAL))
6571     )
6572         runtime_code = S_has_runtime_code(aTHX_ pRExC_state, exp, plen);
6573
6574     /* return old regex if pattern hasn't changed */
6575     /* XXX: note in the below we have to check the flags as well as the
6576      * pattern.
6577      *
6578      * Things get a touch tricky as we have to compare the utf8 flag
6579      * independently from the compile flags.  */
6580
6581     if (   old_re
6582         && !recompile
6583         && !!RX_UTF8(old_re) == !!RExC_utf8
6584         && ( RX_COMPFLAGS(old_re) == ( orig_rx_flags & RXf_PMf_FLAGCOPYMASK ) )
6585         && RX_PRECOMP(old_re)
6586         && RX_PRELEN(old_re) == plen
6587         && memEQ(RX_PRECOMP(old_re), exp, plen)
6588         && !runtime_code /* with runtime code, always recompile */ )
6589     {
6590         Safefree(pRExC_state->code_blocks);
6591         return old_re;
6592     }
6593
6594     rx_flags = orig_rx_flags;
6595
6596     if (rx_flags & PMf_FOLD) {
6597         RExC_contains_i = 1;
6598     }
6599     if (RExC_utf8 && initial_charset == REGEX_DEPENDS_CHARSET) {
6600
6601         /* Set to use unicode semantics if the pattern is in utf8 and has the
6602          * 'depends' charset specified, as it means unicode when utf8  */
6603         set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET);
6604     }
6605
6606     RExC_precomp = exp;
6607     RExC_flags = rx_flags;
6608     RExC_pm_flags = pm_flags;
6609
6610     if (runtime_code) {
6611         if (TAINTING_get && TAINT_get)
6612             Perl_croak(aTHX_ "Eval-group in insecure regular expression");
6613
6614         if (!S_compile_runtime_code(aTHX_ pRExC_state, exp, plen)) {
6615             /* whoops, we have a non-utf8 pattern, whilst run-time code
6616              * got compiled as utf8. Try again with a utf8 pattern */
6617             S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
6618                                     pRExC_state->num_code_blocks);
6619             goto redo_first_pass;
6620         }
6621     }
6622     assert(!pRExC_state->runtime_code_qr);
6623
6624     RExC_sawback = 0;
6625
6626     RExC_seen = 0;
6627     RExC_maxlen = 0;
6628     RExC_in_lookbehind = 0;
6629     RExC_seen_zerolen = *exp == '^' ? -1 : 0;
6630     RExC_extralen = 0;
6631     RExC_override_recoding = 0;
6632     RExC_in_multi_char_class = 0;
6633
6634     /* First pass: determine size, legality. */
6635     RExC_parse = exp;
6636     RExC_start = exp;
6637     RExC_end = exp + plen;
6638     RExC_naughty = 0;
6639     RExC_npar = 1;
6640     RExC_nestroot = 0;
6641     RExC_size = 0L;
6642     RExC_emit = (regnode *) &RExC_emit_dummy;
6643     RExC_whilem_seen = 0;
6644     RExC_open_parens = NULL;
6645     RExC_close_parens = NULL;
6646     RExC_opend = NULL;
6647     RExC_paren_names = NULL;
6648 #ifdef DEBUGGING
6649     RExC_paren_name_list = NULL;
6650 #endif
6651     RExC_recurse = NULL;
6652     RExC_study_chunk_recursed = NULL;
6653     RExC_study_chunk_recursed_bytes= 0;
6654     RExC_recurse_count = 0;
6655     pRExC_state->code_index = 0;
6656
6657     DEBUG_PARSE_r(
6658         PerlIO_printf(Perl_debug_log, "Starting first pass (sizing)\n");
6659         RExC_lastnum=0;
6660         RExC_lastparse=NULL;
6661     );
6662     /* reg may croak on us, not giving us a chance to free
6663        pRExC_state->code_blocks.  We cannot SAVEFREEPV it now, as we may
6664        need it to survive as long as the regexp (qr/(?{})/).
6665        We must check that code_blocksv is not already set, because we may
6666        have jumped back to restart the sizing pass. */
6667     if (pRExC_state->code_blocks && !code_blocksv) {
6668         code_blocksv = newSV_type(SVt_PV);
6669         SAVEFREESV(code_blocksv);
6670         SvPV_set(code_blocksv, (char *)pRExC_state->code_blocks);
6671         SvLEN_set(code_blocksv, 1); /*sufficient to make sv_clear free it*/
6672     }
6673     if (reg(pRExC_state, 0, &flags,1) == NULL) {
6674         /* It's possible to write a regexp in ascii that represents Unicode
6675         codepoints outside of the byte range, such as via \x{100}. If we
6676         detect such a sequence we have to convert the entire pattern to utf8
6677         and then recompile, as our sizing calculation will have been based
6678         on 1 byte == 1 character, but we will need to use utf8 to encode
6679         at least some part of the pattern, and therefore must convert the whole
6680         thing.
6681         -- dmq */
6682         if (flags & RESTART_UTF8) {
6683             S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen,
6684                                     pRExC_state->num_code_blocks);
6685             goto redo_first_pass;
6686         }
6687         Perl_croak(aTHX_ "panic: reg returned NULL to re_op_compile for sizing pass, flags=%#"UVxf"", (UV) flags);
6688     }
6689     if (code_blocksv)
6690         SvLEN_set(code_blocksv,0); /* no you can't have it, sv_clear */
6691
6692     DEBUG_PARSE_r({
6693         PerlIO_printf(Perl_debug_log,
6694             "Required size %"IVdf" nodes\n"
6695             "Starting second pass (creation)\n",
6696             (IV)RExC_size);
6697         RExC_lastnum=0;
6698         RExC_lastparse=NULL;
6699     });
6700
6701     /* The first pass could have found things that force Unicode semantics */
6702     if ((RExC_utf8 || RExC_uni_semantics)
6703          && get_regex_charset(rx_flags) == REGEX_DEPENDS_CHARSET)
6704     {
6705         set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET);
6706     }
6707
6708     /* Small enough for pointer-storage convention?
6709        If extralen==0, this means that we will not need long jumps. */
6710     if (RExC_size >= 0x10000L && RExC_extralen)
6711         RExC_size += RExC_extralen;
6712     else
6713         RExC_extralen = 0;
6714     if (RExC_whilem_seen > 15)
6715         RExC_whilem_seen = 15;
6716
6717     /* Allocate space and zero-initialize. Note, the two step process
6718        of zeroing when in debug mode, thus anything assigned has to
6719        happen after that */
6720     rx = (REGEXP*) newSV_type(SVt_REGEXP);
6721     r = ReANY(rx);
6722     Newxc(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode),
6723          char, regexp_internal);
6724     if ( r == NULL || ri == NULL )
6725         FAIL("Regexp out of space");
6726 #ifdef DEBUGGING
6727     /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
6728     Zero(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode),
6729          char);
6730 #else
6731     /* bulk initialize base fields with 0. */
6732     Zero(ri, sizeof(regexp_internal), char);
6733 #endif
6734
6735     /* non-zero initialization begins here */
6736     RXi_SET( r, ri );
6737     r->engine= eng;
6738     r->extflags = rx_flags;
6739     RXp_COMPFLAGS(r) = orig_rx_flags & RXf_PMf_FLAGCOPYMASK;
6740
6741     if (pm_flags & PMf_IS_QR) {
6742         ri->code_blocks = pRExC_state->code_blocks;
6743         ri->num_code_blocks = pRExC_state->num_code_blocks;
6744     }
6745     else
6746     {
6747         int n;
6748         for (n = 0; n < pRExC_state->num_code_blocks; n++)
6749             if (pRExC_state->code_blocks[n].src_regex)
6750                 SAVEFREESV(pRExC_state->code_blocks[n].src_regex);
6751         SAVEFREEPV(pRExC_state->code_blocks);
6752     }
6753
6754     {
6755         bool has_p     = ((r->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
6756         bool has_charset = (get_regex_charset(r->extflags)
6757                                                     != REGEX_DEPENDS_CHARSET);
6758
6759         /* The caret is output if there are any defaults: if not all the STD
6760          * flags are set, or if no character set specifier is needed */
6761         bool has_default =
6762                     (((r->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD)
6763                     || ! has_charset);
6764         bool has_runon = ((RExC_seen & REG_RUN_ON_COMMENT_SEEN)
6765                                                    == REG_RUN_ON_COMMENT_SEEN);
6766         U16 reganch = (U16)((r->extflags & RXf_PMf_STD_PMMOD)
6767                             >> RXf_PMf_STD_PMMOD_SHIFT);
6768         const char *fptr = STD_PAT_MODS;        /*"msixn"*/
6769         char *p;
6770         /* Allocate for the worst case, which is all the std flags are turned
6771          * on.  If more precision is desired, we could do a population count of
6772          * the flags set.  This could be done with a small lookup table, or by
6773          * shifting, masking and adding, or even, when available, assembly
6774          * language for a machine-language population count.
6775          * We never output a minus, as all those are defaults, so are
6776          * covered by the caret */
6777         const STRLEN wraplen = plen + has_p + has_runon
6778             + has_default       /* If needs a caret */
6779
6780                 /* If needs a character set specifier */
6781             + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0)
6782             + (sizeof(STD_PAT_MODS) - 1)
6783             + (sizeof("(?:)") - 1);
6784
6785         Newx(p, wraplen + 1, char); /* +1 for the ending NUL */
6786         r->xpv_len_u.xpvlenu_pv = p;
6787         if (RExC_utf8)
6788             SvFLAGS(rx) |= SVf_UTF8;
6789         *p++='('; *p++='?';
6790
6791         /* If a default, cover it using the caret */
6792         if (has_default) {
6793             *p++= DEFAULT_PAT_MOD;
6794         }
6795         if (has_charset) {
6796             STRLEN len;
6797             const char* const name = get_regex_charset_name(r->extflags, &len);
6798             Copy(name, p, len, char);
6799             p += len;
6800         }
6801         if (has_p)
6802             *p++ = KEEPCOPY_PAT_MOD; /*'p'*/
6803         {
6804             char ch;
6805             while((ch = *fptr++)) {
6806                 if(reganch & 1)
6807                     *p++ = ch;
6808                 reganch >>= 1;
6809             }
6810         }
6811
6812         *p++ = ':';
6813         Copy(RExC_precomp, p, plen, char);
6814         assert ((RX_WRAPPED(rx) - p) < 16);
6815         r->pre_prefix = p - RX_WRAPPED(rx);
6816         p += plen;
6817         if (has_runon)
6818             *p++ = '\n';
6819         *p++ = ')';
6820         *p = 0;
6821         SvCUR_set(rx, p - RX_WRAPPED(rx));
6822     }
6823
6824     r->intflags = 0;
6825     r->nparens = RExC_npar - 1; /* set early to validate backrefs */
6826
6827     /* setup various meta data about recursion, this all requires
6828      * RExC_npar to be correctly set, and a bit later on we clear it */
6829     if (RExC_seen & REG_RECURSE_SEEN) {
6830         Newxz(RExC_open_parens, RExC_npar,regnode *);
6831         SAVEFREEPV(RExC_open_parens);
6832         Newxz(RExC_close_parens,RExC_npar,regnode *);
6833         SAVEFREEPV(RExC_close_parens);
6834     }
6835     if (RExC_seen & (REG_RECURSE_SEEN | REG_GOSTART_SEEN)) {
6836         /* Note, RExC_npar is 1 + the number of parens in a pattern.
6837          * So its 1 if there are no parens. */
6838         RExC_study_chunk_recursed_bytes= (RExC_npar >> 3) +
6839                                          ((RExC_npar & 0x07) != 0);
6840         Newx(RExC_study_chunk_recursed,
6841              RExC_study_chunk_recursed_bytes * RExC_npar, U8);
6842         SAVEFREEPV(RExC_study_chunk_recursed);
6843     }
6844
6845     /* Useful during FAIL. */
6846 #ifdef RE_TRACK_PATTERN_OFFSETS
6847     Newxz(ri->u.offsets, 2*RExC_size+1, U32); /* MJD 20001228 */
6848     DEBUG_OFFSETS_r(PerlIO_printf(Perl_debug_log,
6849                           "%s %"UVuf" bytes for offset annotations.\n",
6850                           ri->u.offsets ? "Got" : "Couldn't get",
6851                           (UV)((2*RExC_size+1) * sizeof(U32))));
6852 #endif
6853     SetProgLen(ri,RExC_size);
6854     RExC_rx_sv = rx;
6855     RExC_rx = r;
6856     RExC_rxi = ri;
6857
6858     /* Second pass: emit code. */
6859     RExC_flags = rx_flags;      /* don't let top level (?i) bleed */
6860     RExC_pm_flags = pm_flags;
6861     RExC_parse = exp;
6862     RExC_end = exp + plen;
6863     RExC_naughty = 0;
6864     RExC_npar = 1;
6865     RExC_emit_start = ri->program;
6866     RExC_emit = ri->program;
6867     RExC_emit_bound = ri->program + RExC_size + 1;
6868     pRExC_state->code_index = 0;
6869
6870     *((char*) RExC_emit++) = (char) REG_MAGIC;
6871     if (reg(pRExC_state, 0, &flags,1) == NULL) {
6872         ReREFCNT_dec(rx);
6873         Perl_croak(aTHX_ "panic: reg returned NULL to re_op_compile for generation pass, flags=%#"UVxf"", (UV) flags);
6874     }
6875     /* XXXX To minimize changes to RE engine we always allocate
6876        3-units-long substrs field. */
6877     Newx(r->substrs, 1, struct reg_substr_data);
6878     if (RExC_recurse_count) {
6879         Newxz(RExC_recurse,RExC_recurse_count,regnode *);
6880         SAVEFREEPV(RExC_recurse);
6881     }
6882
6883   reStudy:
6884     r->minlen = minlen = sawlookahead = sawplus = sawopen = sawminmod = 0;
6885     DEBUG_r(
6886         RExC_study_chunk_recursed_count= 0;
6887     );
6888     Zero(r->substrs, 1, struct reg_substr_data);
6889     if (RExC_study_chunk_recursed) {
6890         Zero(RExC_study_chunk_recursed,
6891              RExC_study_chunk_recursed_bytes * RExC_npar, U8);
6892     }
6893
6894
6895 #ifdef TRIE_STUDY_OPT
6896     if (!restudied) {
6897         StructCopy(&zero_scan_data, &data, scan_data_t);
6898         copyRExC_state = RExC_state;
6899     } else {
6900         U32 seen=RExC_seen;
6901         DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log,"Restudying\n"));
6902
6903         RExC_state = copyRExC_state;
6904         if (seen & REG_TOP_LEVEL_BRANCHES_SEEN)
6905             RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN;
6906         else
6907             RExC_seen &= ~REG_TOP_LEVEL_BRANCHES_SEEN;
6908         StructCopy(&zero_scan_data, &data, scan_data_t);
6909     }
6910 #else
6911     StructCopy(&zero_scan_data, &data, scan_data_t);
6912 #endif
6913
6914     /* Dig out information for optimizations. */
6915     r->extflags = RExC_flags; /* was pm_op */
6916     /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
6917
6918     if (UTF)
6919         SvUTF8_on(rx);  /* Unicode in it? */
6920     ri->regstclass = NULL;
6921     if (RExC_naughty >= TOO_NAUGHTY)    /* Probably an expensive pattern. */
6922         r->intflags |= PREGf_NAUGHTY;
6923     scan = ri->program + 1;             /* First BRANCH. */
6924
6925     /* testing for BRANCH here tells us whether there is "must appear"
6926        data in the pattern. If there is then we can use it for optimisations */
6927     if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)) { /*  Only one top-level choice.
6928                                                   */
6929         SSize_t fake;
6930         STRLEN longest_float_length, longest_fixed_length;
6931         regnode_ssc ch_class; /* pointed to by data */
6932         int stclass_flag;
6933         SSize_t last_close = 0; /* pointed to by data */
6934         regnode *first= scan;
6935         regnode *first_next= regnext(first);
6936         /*
6937          * Skip introductions and multiplicators >= 1
6938          * so that we can extract the 'meat' of the pattern that must
6939          * match in the large if() sequence following.
6940          * NOTE that EXACT is NOT covered here, as it is normally
6941          * picked up by the optimiser separately.
6942          *
6943          * This is unfortunate as the optimiser isnt handling lookahead
6944          * properly currently.
6945          *
6946          */
6947         while ((OP(first) == OPEN && (sawopen = 1)) ||
6948                /* An OR of *one* alternative - should not happen now. */
6949             (OP(first) == BRANCH && OP(first_next) != BRANCH) ||
6950             /* for now we can't handle lookbehind IFMATCH*/
6951             (OP(first) == IFMATCH && !first->flags && (sawlookahead = 1)) ||
6952             (OP(first) == PLUS) ||
6953             (OP(first) == MINMOD) ||
6954                /* An {n,m} with n>0 */
6955             (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) ||
6956             (OP(first) == NOTHING && PL_regkind[OP(first_next)] != END ))
6957         {
6958                 /*
6959                  * the only op that could be a regnode is PLUS, all the rest
6960                  * will be regnode_1 or regnode_2.
6961                  *
6962                  * (yves doesn't think this is true)
6963                  */
6964                 if (OP(first) == PLUS)
6965                     sawplus = 1;
6966                 else {
6967                     if (OP(first) == MINMOD)
6968                         sawminmod = 1;
6969                     first += regarglen[OP(first)];
6970                 }
6971                 first = NEXTOPER(first);
6972                 first_next= regnext(first);
6973         }
6974
6975         /* Starting-point info. */
6976       again:
6977         DEBUG_PEEP("first:",first,0);
6978         /* Ignore EXACT as we deal with it later. */
6979         if (PL_regkind[OP(first)] == EXACT) {
6980             if (OP(first) == EXACT || OP(first) == EXACTL)
6981                 NOOP;   /* Empty, get anchored substr later. */
6982             else
6983                 ri->regstclass = first;
6984         }
6985 #ifdef TRIE_STCLASS
6986         else if (PL_regkind[OP(first)] == TRIE &&
6987                 ((reg_trie_data *)ri->data->data[ ARG(first) ])->minlen>0)
6988         {
6989             /* this can happen only on restudy */
6990             ri->regstclass = construct_ahocorasick_from_trie(pRExC_state, (regnode *)first, 0);
6991         }
6992 #endif
6993         else if (REGNODE_SIMPLE(OP(first)))
6994             ri->regstclass = first;
6995         else if (PL_regkind[OP(first)] == BOUND ||
6996                  PL_regkind[OP(first)] == NBOUND)
6997             ri->regstclass = first;
6998         else if (PL_regkind[OP(first)] == BOL) {
6999             r->intflags |= (OP(first) == MBOL
7000                            ? PREGf_ANCH_MBOL
7001                            : PREGf_ANCH_SBOL);
7002             first = NEXTOPER(first);
7003             goto again;
7004         }
7005         else if (OP(first) == GPOS) {
7006             r->intflags |= PREGf_ANCH_GPOS;
7007             first = NEXTOPER(first);
7008             goto again;
7009         }
7010         else if ((!sawopen || !RExC_sawback) &&
7011             !sawlookahead &&
7012             (OP(first) == STAR &&
7013             PL_regkind[OP(NEXTOPER(first))] == REG_ANY) &&
7014             !(r->intflags & PREGf_ANCH) && !pRExC_state->num_code_blocks)
7015         {
7016             /* turn .* into ^.* with an implied $*=1 */
7017             const int type =
7018                 (OP(NEXTOPER(first)) == REG_ANY)
7019                     ? PREGf_ANCH_MBOL
7020                     : PREGf_ANCH_SBOL;
7021             r->intflags |= (type | PREGf_IMPLICIT);
7022             first = NEXTOPER(first);
7023             goto again;
7024         }
7025         if (sawplus && !sawminmod && !sawlookahead
7026             && (!sawopen || !RExC_sawback)
7027             && !pRExC_state->num_code_blocks) /* May examine pos and $& */
7028             /* x+ must match at the 1st pos of run of x's */
7029             r->intflags |= PREGf_SKIP;
7030
7031         /* Scan is after the zeroth branch, first is atomic matcher. */
7032 #ifdef TRIE_STUDY_OPT
7033         DEBUG_PARSE_r(
7034             if (!restudied)
7035                 PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
7036                               (IV)(first - scan + 1))
7037         );
7038 #else
7039         DEBUG_PARSE_r(
7040             PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
7041                 (IV)(first - scan + 1))
7042         );
7043 #endif
7044
7045
7046         /*
7047         * If there's something expensive in the r.e., find the
7048         * longest literal string that must appear and make it the
7049         * regmust.  Resolve ties in favor of later strings, since
7050         * the regstart check works with the beginning of the r.e.
7051         * and avoiding duplication strengthens checking.  Not a
7052         * strong reason, but sufficient in the absence of others.
7053         * [Now we resolve ties in favor of the earlier string if
7054         * it happens that c_offset_min has been invalidated, since the
7055         * earlier string may buy us something the later one won't.]
7056         */
7057
7058         data.longest_fixed = newSVpvs("");
7059         data.longest_float = newSVpvs("");
7060         data.last_found = newSVpvs("");
7061         data.longest = &(data.longest_fixed);
7062         ENTER_with_name("study_chunk");
7063         SAVEFREESV(data.longest_fixed);
7064         SAVEFREESV(data.longest_float);
7065         SAVEFREESV(data.last_found);
7066         first = scan;
7067         if (!ri->regstclass) {
7068             ssc_init(pRExC_state, &ch_class);
7069             data.start_class = &ch_class;
7070             stclass_flag = SCF_DO_STCLASS_AND;
7071         } else                          /* XXXX Check for BOUND? */
7072             stclass_flag = 0;
7073         data.last_closep = &last_close;
7074
7075         DEBUG_RExC_seen();
7076         minlen = study_chunk(pRExC_state, &first, &minlen, &fake,
7077                              scan + RExC_size, /* Up to end */
7078             &data, -1, 0, NULL,
7079             SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag
7080                           | (restudied ? SCF_TRIE_DOING_RESTUDY : 0),
7081             0);
7082
7083
7084         CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk"));
7085
7086
7087         if ( RExC_npar == 1 && data.longest == &(data.longest_fixed)
7088              && data.last_start_min == 0 && data.last_end > 0
7089              && !RExC_seen_zerolen
7090              && !(RExC_seen & REG_VERBARG_SEEN)
7091              && !(RExC_seen & REG_GPOS_SEEN)
7092         ){
7093             r->extflags |= RXf_CHECK_ALL;
7094         }
7095         scan_commit(pRExC_state, &data,&minlen,0);
7096
7097         longest_float_length = CHR_SVLEN(data.longest_float);
7098
7099         if (! ((SvCUR(data.longest_fixed)  /* ok to leave SvCUR */
7100                    && data.offset_fixed == data.offset_float_min
7101                    && SvCUR(data.longest_fixed) == SvCUR(data.longest_float)))
7102             && S_setup_longest (aTHX_ pRExC_state,
7103                                     data.longest_float,
7104                                     &(r->float_utf8),
7105                                     &(r->float_substr),
7106                                     &(r->float_end_shift),
7107                                     data.lookbehind_float,
7108                                     data.offset_float_min,
7109                                     data.minlen_float,
7110                                     longest_float_length,
7111                                     cBOOL(data.flags & SF_FL_BEFORE_EOL),
7112                                     cBOOL(data.flags & SF_FL_BEFORE_MEOL)))
7113         {
7114             r->float_min_offset = data.offset_float_min - data.lookbehind_float;
7115             r->float_max_offset = data.offset_float_max;
7116             if (data.offset_float_max < SSize_t_MAX) /* Don't offset infinity */
7117                 r->float_max_offset -= data.lookbehind_float;
7118             SvREFCNT_inc_simple_void_NN(data.longest_float);
7119         }
7120         else {
7121             r->float_substr = r->float_utf8 = NULL;
7122             longest_float_length = 0;
7123         }
7124
7125         longest_fixed_length = CHR_SVLEN(data.longest_fixed);
7126
7127         if (S_setup_longest (aTHX_ pRExC_state,
7128                                 data.longest_fixed,
7129                                 &(r->anchored_utf8),
7130                                 &(r->anchored_substr),
7131                                 &(r->anchored_end_shift),
7132                                 data.lookbehind_fixed,
7133                                 data.offset_fixed,
7134                                 data.minlen_fixed,
7135                                 longest_fixed_length,
7136                                 cBOOL(data.flags & SF_FIX_BEFORE_EOL),
7137                                 cBOOL(data.flags & SF_FIX_BEFORE_MEOL)))
7138         {
7139             r->anchored_offset = data.offset_fixed - data.lookbehind_fixed;
7140             SvREFCNT_inc_simple_void_NN(data.longest_fixed);
7141         }
7142         else {
7143             r->anchored_substr = r->anchored_utf8 = NULL;
7144             longest_fixed_length = 0;
7145         }
7146         LEAVE_with_name("study_chunk");
7147
7148         if (ri->regstclass
7149             && (OP(ri->regstclass) == REG_ANY || OP(ri->regstclass) == SANY))
7150             ri->regstclass = NULL;
7151
7152         if ((!(r->anchored_substr || r->anchored_utf8) || r->anchored_offset)
7153             && stclass_flag
7154             && ! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
7155             && is_ssc_worth_it(pRExC_state, data.start_class))
7156         {
7157             const U32 n = add_data(pRExC_state, STR_WITH_LEN("f"));
7158
7159             ssc_finalize(pRExC_state, data.start_class);
7160
7161             Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
7162             StructCopy(data.start_class,
7163                        (regnode_ssc*)RExC_rxi->data->data[n],
7164                        regnode_ssc);
7165             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
7166             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
7167             DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
7168                       regprop(r, sv, (regnode*)data.start_class, NULL, pRExC_state);
7169                       PerlIO_printf(Perl_debug_log,
7170                                     "synthetic stclass \"%s\".\n",
7171                                     SvPVX_const(sv));});
7172             data.start_class = NULL;
7173         }
7174
7175         /* A temporary algorithm prefers floated substr to fixed one to dig
7176          * more info. */
7177         if (longest_fixed_length > longest_float_length) {
7178             r->substrs->check_ix = 0;
7179             r->check_end_shift = r->anchored_end_shift;
7180             r->check_substr = r->anchored_substr;
7181             r->check_utf8 = r->anchored_utf8;
7182             r->check_offset_min = r->check_offset_max = r->anchored_offset;
7183             if (r->intflags & (PREGf_ANCH_SBOL|PREGf_ANCH_GPOS))
7184                 r->intflags |= PREGf_NOSCAN;
7185         }
7186         else {
7187             r->substrs->check_ix = 1;
7188             r->check_end_shift = r->float_end_shift;
7189             r->check_substr = r->float_substr;
7190             r->check_utf8 = r->float_utf8;
7191             r->check_offset_min = r->float_min_offset;
7192             r->check_offset_max = r->float_max_offset;
7193         }
7194         if ((r->check_substr || r->check_utf8) ) {
7195             r->extflags |= RXf_USE_INTUIT;
7196             if (SvTAIL(r->check_substr ? r->check_substr : r->check_utf8))
7197                 r->extflags |= RXf_INTUIT_TAIL;
7198         }
7199         r->substrs->data[0].max_offset = r->substrs->data[0].min_offset;
7200
7201         /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
7202         if ( (STRLEN)minlen < longest_float_length )
7203             minlen= longest_float_length;
7204         if ( (STRLEN)minlen < longest_fixed_length )
7205             minlen= longest_fixed_length;
7206         */
7207     }
7208     else {
7209         /* Several toplevels. Best we can is to set minlen. */
7210         SSize_t fake;
7211         regnode_ssc ch_class;
7212         SSize_t last_close = 0;
7213
7214         DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "\nMulti Top Level\n"));
7215
7216         scan = ri->program + 1;
7217         ssc_init(pRExC_state, &ch_class);
7218         data.start_class = &ch_class;
7219         data.last_closep = &last_close;
7220
7221         DEBUG_RExC_seen();
7222         minlen = study_chunk(pRExC_state,
7223             &scan, &minlen, &fake, scan + RExC_size, &data, -1, 0, NULL,
7224             SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied
7225                                                       ? SCF_TRIE_DOING_RESTUDY
7226                                                       : 0),
7227             0);
7228
7229         CHECK_RESTUDY_GOTO_butfirst(NOOP);
7230
7231         r->check_substr = r->check_utf8 = r->anchored_substr = r->anchored_utf8
7232                 = r->float_substr = r->float_utf8 = NULL;
7233
7234         if (! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING)
7235             && is_ssc_worth_it(pRExC_state, data.start_class))
7236         {
7237             const U32 n = add_data(pRExC_state, STR_WITH_LEN("f"));
7238
7239             ssc_finalize(pRExC_state, data.start_class);
7240
7241             Newx(RExC_rxi->data->data[n], 1, regnode_ssc);
7242             StructCopy(data.start_class,
7243                        (regnode_ssc*)RExC_rxi->data->data[n],
7244                        regnode_ssc);
7245             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
7246             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
7247             DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
7248                       regprop(r, sv, (regnode*)data.start_class, NULL, pRExC_state);
7249                       PerlIO_printf(Perl_debug_log,
7250                                     "synthetic stclass \"%s\".\n",
7251                                     SvPVX_const(sv));});
7252             data.start_class = NULL;
7253         }
7254     }
7255
7256     if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) {
7257         r->extflags |= RXf_UNBOUNDED_QUANTIFIER_SEEN;
7258         r->maxlen = REG_INFTY;
7259     }
7260     else {
7261         r->maxlen = RExC_maxlen;
7262     }
7263
7264     /* Guard against an embedded (?=) or (?<=) with a longer minlen than
7265        the "real" pattern. */
7266     DEBUG_OPTIMISE_r({
7267         PerlIO_printf(Perl_debug_log,"minlen: %"IVdf" r->minlen:%"IVdf" maxlen:%"IVdf"\n",
7268                       (IV)minlen, (IV)r->minlen, (IV)RExC_maxlen);
7269     });
7270     r->minlenret = minlen;
7271     if (r->minlen < minlen)
7272         r->minlen = minlen;
7273
7274     if (RExC_seen & REG_GPOS_SEEN)
7275         r->intflags |= PREGf_GPOS_SEEN;
7276     if (RExC_seen & REG_LOOKBEHIND_SEEN)
7277         r->extflags |= RXf_NO_INPLACE_SUBST; /* inplace might break the
7278                                                 lookbehind */
7279     if (pRExC_state->num_code_blocks)
7280         r->extflags |= RXf_EVAL_SEEN;
7281     if (RExC_seen & REG_CANY_SEEN)
7282         r->intflags |= PREGf_CANY_SEEN;
7283     if (RExC_seen & REG_VERBARG_SEEN)
7284     {
7285         r->intflags |= PREGf_VERBARG_SEEN;
7286         r->extflags |= RXf_NO_INPLACE_SUBST; /* don't understand this! Yves */
7287     }
7288     if (RExC_seen & REG_CUTGROUP_SEEN)
7289         r->intflags |= PREGf_CUTGROUP_SEEN;
7290     if (pm_flags & PMf_USE_RE_EVAL)
7291         r->intflags |= PREGf_USE_RE_EVAL;
7292     if (RExC_paren_names)
7293         RXp_PAREN_NAMES(r) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
7294     else
7295         RXp_PAREN_NAMES(r) = NULL;
7296
7297     /* If we have seen an anchor in our pattern then we set the extflag RXf_IS_ANCHORED
7298      * so it can be used in pp.c */
7299     if (r->intflags & PREGf_ANCH)
7300         r->extflags |= RXf_IS_ANCHORED;
7301
7302
7303     {
7304         /* this is used to identify "special" patterns that might result
7305          * in Perl NOT calling the regex engine and instead doing the match "itself",
7306          * particularly special cases in split//. By having the regex compiler
7307          * do this pattern matching at a regop level (instead of by inspecting the pattern)
7308          * we avoid weird issues with equivalent patterns resulting in different behavior,
7309          * AND we allow non Perl engines to get the same optimizations by the setting the
7310          * flags appropriately - Yves */
7311         regnode *first = ri->program + 1;
7312         U8 fop = OP(first);
7313         regnode *next = NEXTOPER(first);
7314         U8 nop = OP(next);
7315
7316         if (PL_regkind[fop] == NOTHING && nop == END)
7317             r->extflags |= RXf_NULL;
7318         else if ((fop == MBOL || (fop == SBOL && !first->flags)) && nop == END)
7319             /* when fop is SBOL first->flags will be true only when it was
7320              * produced by parsing /\A/, and not when parsing /^/. This is
7321              * very important for the split code as there we want to
7322              * treat /^/ as /^/m, but we do not want to treat /\A/ as /^/m.
7323              * See rt #122761 for more details. -- Yves */
7324             r->extflags |= RXf_START_ONLY;
7325         else if (fop == PLUS
7326                  && PL_regkind[nop] == POSIXD && FLAGS(next) == _CC_SPACE
7327                  && OP(regnext(first)) == END)
7328             r->extflags |= RXf_WHITE;
7329         else if ( r->extflags & RXf_SPLIT
7330                   && (fop == EXACT || fop == EXACTL)
7331                   && STR_LEN(first) == 1
7332                   && *(STRING(first)) == ' '
7333                   && OP(regnext(first)) == END )
7334             r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
7335
7336     }
7337
7338     if (RExC_contains_locale) {
7339         RXp_EXTFLAGS(r) |= RXf_TAINTED;
7340     }
7341
7342 #ifdef DEBUGGING
7343     if (RExC_paren_names) {
7344         ri->name_list_idx = add_data( pRExC_state, STR_WITH_LEN("a"));
7345         ri->data->data[ri->name_list_idx]
7346                                    = (void*)SvREFCNT_inc(RExC_paren_name_list);
7347     } else
7348 #endif
7349         ri->name_list_idx = 0;
7350
7351     if (RExC_recurse_count) {
7352         for ( ; RExC_recurse_count ; RExC_recurse_count-- ) {
7353             const regnode *scan = RExC_recurse[RExC_recurse_count-1];
7354             ARG2L_SET( scan, RExC_open_parens[ARG(scan)-1] - scan );
7355         }
7356     }
7357     Newxz(r->offs, RExC_npar, regexp_paren_pair);
7358     /* assume we don't need to swap parens around before we match */
7359     DEBUG_TEST_r({
7360         PerlIO_printf(Perl_debug_log,"study_chunk_recursed_count: %lu\n",
7361             (unsigned long)RExC_study_chunk_recursed_count);
7362     });
7363     DEBUG_DUMP_r({
7364         DEBUG_RExC_seen();
7365         PerlIO_printf(Perl_debug_log,"Final program:\n");
7366         regdump(r);
7367     });
7368 #ifdef RE_TRACK_PATTERN_OFFSETS
7369     DEBUG_OFFSETS_r(if (ri->u.offsets) {
7370         const STRLEN len = ri->u.offsets[0];
7371         STRLEN i;
7372         GET_RE_DEBUG_FLAGS_DECL;
7373         PerlIO_printf(Perl_debug_log,
7374                       "Offsets: [%"UVuf"]\n\t", (UV)ri->u.offsets[0]);
7375         for (i = 1; i <= len; i++) {
7376             if (ri->u.offsets[i*2-1] || ri->u.offsets[i*2])
7377                 PerlIO_printf(Perl_debug_log, "%"UVuf":%"UVuf"[%"UVuf"] ",
7378                 (UV)i, (UV)ri->u.offsets[i*2-1], (UV)ri->u.offsets[i*2]);
7379             }
7380         PerlIO_printf(Perl_debug_log, "\n");
7381     });
7382 #endif
7383
7384 #ifdef USE_ITHREADS
7385     /* under ithreads the ?pat? PMf_USED flag on the pmop is simulated
7386      * by setting the regexp SV to readonly-only instead. If the
7387      * pattern's been recompiled, the USEDness should remain. */
7388     if (old_re && SvREADONLY(old_re))
7389         SvREADONLY_on(rx);
7390 #endif
7391     return rx;
7392 }
7393
7394
7395 SV*
7396 Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value,
7397                     const U32 flags)
7398 {
7399     PERL_ARGS_ASSERT_REG_NAMED_BUFF;
7400
7401     PERL_UNUSED_ARG(value);
7402
7403     if (flags & RXapif_FETCH) {
7404         return reg_named_buff_fetch(rx, key, flags);
7405     } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) {
7406         Perl_croak_no_modify();
7407         return NULL;
7408     } else if (flags & RXapif_EXISTS) {
7409         return reg_named_buff_exists(rx, key, flags)
7410             ? &PL_sv_yes
7411             : &PL_sv_no;
7412     } else if (flags & RXapif_REGNAMES) {
7413         return reg_named_buff_all(rx, flags);
7414     } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) {
7415         return reg_named_buff_scalar(rx, flags);
7416     } else {
7417         Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags);
7418         return NULL;
7419     }
7420 }
7421
7422 SV*
7423 Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey,
7424                          const U32 flags)
7425 {
7426     PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER;
7427     PERL_UNUSED_ARG(lastkey);
7428
7429     if (flags & RXapif_FIRSTKEY)
7430         return reg_named_buff_firstkey(rx, flags);
7431     else if (flags & RXapif_NEXTKEY)
7432         return reg_named_buff_nextkey(rx, flags);
7433     else {
7434         Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter",
7435                                             (int)flags);
7436         return NULL;
7437     }
7438 }
7439
7440 SV*
7441 Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv,
7442                           const U32 flags)
7443 {
7444     AV *retarray = NULL;
7445     SV *ret;
7446     struct regexp *const rx = ReANY(r);
7447
7448     PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH;
7449
7450     if (flags & RXapif_ALL)
7451         retarray=newAV();
7452
7453     if (rx && RXp_PAREN_NAMES(rx)) {
7454         HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 );
7455         if (he_str) {
7456             IV i;
7457             SV* sv_dat=HeVAL(he_str);
7458             I32 *nums=(I32*)SvPVX(sv_dat);
7459             for ( i=0; i<SvIVX(sv_dat); i++ ) {
7460                 if ((I32)(rx->nparens) >= nums[i]
7461                     && rx->offs[nums[i]].start != -1
7462                     && rx->offs[nums[i]].end != -1)
7463                 {
7464                     ret = newSVpvs("");
7465                     CALLREG_NUMBUF_FETCH(r,nums[i],ret);
7466                     if (!retarray)
7467                         return ret;
7468                 } else {
7469                     if (retarray)
7470                         ret = newSVsv(&PL_sv_undef);
7471                 }
7472                 if (retarray)
7473                     av_push(retarray, ret);
7474             }
7475             if (retarray)
7476                 return newRV_noinc(MUTABLE_SV(retarray));
7477         }
7478     }
7479     return NULL;
7480 }
7481
7482 bool
7483 Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key,
7484                            const U32 flags)
7485 {
7486     struct regexp *const rx = ReANY(r);
7487
7488     PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS;
7489
7490     if (rx && RXp_PAREN_NAMES(rx)) {
7491         if (flags & RXapif_ALL) {
7492             return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0);
7493         } else {
7494             SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags);
7495             if (sv) {
7496                 SvREFCNT_dec_NN(sv);
7497                 return TRUE;
7498             } else {
7499                 return FALSE;
7500             }
7501         }
7502     } else {
7503         return FALSE;
7504     }
7505 }
7506
7507 SV*
7508 Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags)
7509 {
7510     struct regexp *const rx = ReANY(r);
7511
7512     PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY;
7513
7514     if ( rx && RXp_PAREN_NAMES(rx) ) {
7515         (void)hv_iterinit(RXp_PAREN_NAMES(rx));
7516
7517         return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY);
7518     } else {
7519         return FALSE;
7520     }
7521 }
7522
7523 SV*
7524 Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags)
7525 {
7526     struct regexp *const rx = ReANY(r);
7527     GET_RE_DEBUG_FLAGS_DECL;
7528
7529     PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY;
7530
7531     if (rx && RXp_PAREN_NAMES(rx)) {
7532         HV *hv = RXp_PAREN_NAMES(rx);
7533         HE *temphe;
7534         while ( (temphe = hv_iternext_flags(hv,0)) ) {
7535             IV i;
7536             IV parno = 0;
7537             SV* sv_dat = HeVAL(temphe);
7538             I32 *nums = (I32*)SvPVX(sv_dat);
7539             for ( i = 0; i < SvIVX(sv_dat); i++ ) {
7540                 if ((I32)(rx->lastparen) >= nums[i] &&
7541                     rx->offs[nums[i]].start != -1 &&
7542                     rx->offs[nums[i]].end != -1)
7543                 {
7544                     parno = nums[i];
7545                     break;
7546                 }
7547             }
7548             if (parno || flags & RXapif_ALL) {
7549                 return newSVhek(HeKEY_hek(temphe));
7550             }
7551         }
7552     }
7553     return NULL;
7554 }
7555
7556 SV*
7557 Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags)
7558 {
7559     SV *ret;
7560     AV *av;
7561     SSize_t length;
7562     struct regexp *const rx = ReANY(r);
7563
7564     PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR;
7565
7566     if (rx && RXp_PAREN_NAMES(rx)) {
7567         if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) {
7568             return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx)));
7569         } else if (flags & RXapif_ONE) {
7570             ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
7571             av = MUTABLE_AV(SvRV(ret));
7572             length = av_tindex(av);
7573             SvREFCNT_dec_NN(ret);
7574             return newSViv(length + 1);
7575         } else {
7576             Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar",
7577                                                 (int)flags);
7578             return NULL;
7579         }
7580     }
7581     return &PL_sv_undef;
7582 }
7583
7584 SV*
7585 Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags)
7586 {
7587     struct regexp *const rx = ReANY(r);
7588     AV *av = newAV();
7589
7590     PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL;
7591
7592     if (rx && RXp_PAREN_NAMES(rx)) {
7593         HV *hv= RXp_PAREN_NAMES(rx);
7594         HE *temphe;
7595         (void)hv_iterinit(hv);
7596         while ( (temphe = hv_iternext_flags(hv,0)) ) {
7597             IV i;
7598             IV parno = 0;
7599             SV* sv_dat = HeVAL(temphe);
7600             I32 *nums = (I32*)SvPVX(sv_dat);
7601             for ( i = 0; i < SvIVX(sv_dat); i++ ) {
7602                 if ((I32)(rx->lastparen) >= nums[i] &&
7603                     rx->offs[nums[i]].start != -1 &&
7604                     rx->offs[nums[i]].end != -1)
7605                 {
7606                     parno = nums[i];
7607                     break;
7608                 }
7609             }
7610             if (parno || flags & RXapif_ALL) {
7611                 av_push(av, newSVhek(HeKEY_hek(temphe)));
7612             }
7613         }
7614     }
7615
7616     return newRV_noinc(MUTABLE_SV(av));
7617 }
7618
7619 void
7620 Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const r, const I32 paren,
7621                              SV * const sv)
7622 {
7623     struct regexp *const rx = ReANY(r);
7624     char *s = NULL;
7625     SSize_t i = 0;
7626     SSize_t s1, t1;
7627     I32 n = paren;
7628
7629     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH;
7630
7631     if (      n == RX_BUFF_IDX_CARET_PREMATCH
7632            || n == RX_BUFF_IDX_CARET_FULLMATCH
7633            || n == RX_BUFF_IDX_CARET_POSTMATCH
7634        )
7635     {
7636         bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
7637         if (!keepcopy) {
7638             /* on something like
7639              *    $r = qr/.../;
7640              *    /$qr/p;
7641              * the KEEPCOPY is set on the PMOP rather than the regex */
7642             if (PL_curpm && r == PM_GETRE(PL_curpm))
7643                  keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
7644         }
7645         if (!keepcopy)
7646             goto ret_undef;
7647     }
7648
7649     if (!rx->subbeg)
7650         goto ret_undef;
7651
7652     if (n == RX_BUFF_IDX_CARET_FULLMATCH)
7653         /* no need to distinguish between them any more */
7654         n = RX_BUFF_IDX_FULLMATCH;
7655
7656     if ((n == RX_BUFF_IDX_PREMATCH || n == RX_BUFF_IDX_CARET_PREMATCH)
7657         && rx->offs[0].start != -1)
7658     {
7659         /* $`, ${^PREMATCH} */
7660         i = rx->offs[0].start;
7661         s = rx->subbeg;
7662     }
7663     else
7664     if ((n == RX_BUFF_IDX_POSTMATCH || n == RX_BUFF_IDX_CARET_POSTMATCH)
7665         && rx->offs[0].end != -1)
7666     {
7667         /* $', ${^POSTMATCH} */
7668         s = rx->subbeg - rx->suboffset + rx->offs[0].end;
7669         i = rx->sublen + rx->suboffset - rx->offs[0].end;
7670     }
7671     else
7672     if ( 0 <= n && n <= (I32)rx->nparens &&
7673         (s1 = rx->offs[n].start) != -1 &&
7674         (t1 = rx->offs[n].end) != -1)
7675     {
7676         /* $&, ${^MATCH},  $1 ... */
7677         i = t1 - s1;
7678         s = rx->subbeg + s1 - rx->suboffset;
7679     } else {
7680         goto ret_undef;
7681     }
7682
7683     assert(s >= rx->subbeg);
7684     assert((STRLEN)rx->sublen >= (STRLEN)((s - rx->subbeg) + i) );
7685     if (i >= 0) {
7686 #ifdef NO_TAINT_SUPPORT
7687         sv_setpvn(sv, s, i);
7688 #else
7689         const int oldtainted = TAINT_get;
7690         TAINT_NOT;
7691         sv_setpvn(sv, s, i);
7692         TAINT_set(oldtainted);
7693 #endif
7694         if ( (rx->intflags & PREGf_CANY_SEEN)
7695             ? (RXp_MATCH_UTF8(rx)
7696                         && (!i || is_utf8_string((U8*)s, i)))
7697             : (RXp_MATCH_UTF8(rx)) )
7698         {
7699             SvUTF8_on(sv);
7700         }
7701         else
7702             SvUTF8_off(sv);
7703         if (TAINTING_get) {
7704             if (RXp_MATCH_TAINTED(rx)) {
7705                 if (SvTYPE(sv) >= SVt_PVMG) {
7706                     MAGIC* const mg = SvMAGIC(sv);
7707                     MAGIC* mgt;
7708                     TAINT;
7709                     SvMAGIC_set(sv, mg->mg_moremagic);
7710                     SvTAINT(sv);
7711                     if ((mgt = SvMAGIC(sv))) {
7712                         mg->mg_moremagic = mgt;
7713                         SvMAGIC_set(sv, mg);
7714                     }
7715                 } else {
7716                     TAINT;
7717                     SvTAINT(sv);
7718                 }
7719             } else
7720                 SvTAINTED_off(sv);
7721         }
7722     } else {
7723       ret_undef:
7724         sv_setsv(sv,&PL_sv_undef);
7725         return;
7726     }
7727 }
7728
7729 void
7730 Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
7731                                                          SV const * const value)
7732 {
7733     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE;
7734
7735     PERL_UNUSED_ARG(rx);
7736     PERL_UNUSED_ARG(paren);
7737     PERL_UNUSED_ARG(value);
7738
7739     if (!PL_localizing)
7740         Perl_croak_no_modify();
7741 }
7742
7743 I32
7744 Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv,
7745                               const I32 paren)
7746 {
7747     struct regexp *const rx = ReANY(r);
7748     I32 i;
7749     I32 s1, t1;
7750
7751     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH;
7752
7753     if (   paren == RX_BUFF_IDX_CARET_PREMATCH
7754         || paren == RX_BUFF_IDX_CARET_FULLMATCH
7755         || paren == RX_BUFF_IDX_CARET_POSTMATCH
7756     )
7757     {
7758         bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY);
7759         if (!keepcopy) {
7760             /* on something like
7761              *    $r = qr/.../;
7762              *    /$qr/p;
7763              * the KEEPCOPY is set on the PMOP rather than the regex */
7764             if (PL_curpm && r == PM_GETRE(PL_curpm))
7765                  keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY);
7766         }
7767         if (!keepcopy)
7768             goto warn_undef;
7769     }
7770
7771     /* Some of this code was originally in C<Perl_magic_len> in F<mg.c> */
7772     switch (paren) {
7773       case RX_BUFF_IDX_CARET_PREMATCH: /* ${^PREMATCH} */
7774       case RX_BUFF_IDX_PREMATCH:       /* $` */
7775         if (rx->offs[0].start != -1) {
7776                         i = rx->offs[0].start;
7777                         if (i > 0) {
7778                                 s1 = 0;
7779                                 t1 = i;
7780                                 goto getlen;
7781                         }
7782             }
7783         return 0;
7784
7785       case RX_BUFF_IDX_CARET_POSTMATCH: /* ${^POSTMATCH} */
7786       case RX_BUFF_IDX_POSTMATCH:       /* $' */
7787             if (rx->offs[0].end != -1) {
7788                         i = rx->sublen - rx->offs[0].end;
7789                         if (i > 0) {
7790                                 s1 = rx->offs[0].end;
7791                                 t1 = rx->sublen;
7792                                 goto getlen;
7793                         }
7794             }
7795         return 0;
7796
7797       default: /* $& / ${^MATCH}, $1, $2, ... */
7798             if (paren <= (I32)rx->nparens &&
7799             (s1 = rx->offs[paren].start) != -1 &&
7800             (t1 = rx->offs[paren].end) != -1)
7801             {
7802             i = t1 - s1;
7803             goto getlen;
7804         } else {
7805           warn_undef:
7806             if (ckWARN(WARN_UNINITIALIZED))
7807                 report_uninit((const SV *)sv);
7808             return 0;
7809         }
7810     }
7811   getlen:
7812     if (i > 0 && RXp_MATCH_UTF8(rx)) {
7813         const char * const s = rx->subbeg - rx->suboffset + s1;
7814         const U8 *ep;
7815         STRLEN el;
7816
7817         i = t1 - s1;
7818         if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
7819                         i = el;
7820     }
7821     return i;
7822 }
7823
7824 SV*
7825 Perl_reg_qr_package(pTHX_ REGEXP * const rx)
7826 {
7827     PERL_ARGS_ASSERT_REG_QR_PACKAGE;
7828         PERL_UNUSED_ARG(rx);
7829         if (0)
7830             return NULL;
7831         else
7832             return newSVpvs("Regexp");
7833 }
7834
7835 /* Scans the name of a named buffer from the pattern.
7836  * If flags is REG_RSN_RETURN_NULL returns null.
7837  * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
7838  * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
7839  * to the parsed name as looked up in the RExC_paren_names hash.
7840  * If there is an error throws a vFAIL().. type exception.
7841  */
7842
7843 #define REG_RSN_RETURN_NULL    0
7844 #define REG_RSN_RETURN_NAME    1
7845 #define REG_RSN_RETURN_DATA    2
7846
7847 STATIC SV*
7848 S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
7849 {
7850     char *name_start = RExC_parse;
7851
7852     PERL_ARGS_ASSERT_REG_SCAN_NAME;
7853
7854     assert (RExC_parse <= RExC_end);
7855     if (RExC_parse == RExC_end) NOOP;
7856     else if (isIDFIRST_lazy_if(RExC_parse, UTF)) {
7857          /* skip IDFIRST by using do...while */
7858         if (UTF)
7859             do {
7860                 RExC_parse += UTF8SKIP(RExC_parse);
7861             } while (isWORDCHAR_utf8((U8*)RExC_parse));
7862         else
7863             do {
7864                 RExC_parse++;
7865             } while (isWORDCHAR(*RExC_parse));
7866     } else {
7867         RExC_parse++; /* so the <- from the vFAIL is after the offending
7868                          character */
7869         vFAIL("Group name must start with a non-digit word character");
7870     }
7871     if ( flags ) {
7872         SV* sv_name
7873             = newSVpvn_flags(name_start, (int)(RExC_parse - name_start),
7874                              SVs_TEMP | (UTF ? SVf_UTF8 : 0));
7875         if ( flags == REG_RSN_RETURN_NAME)
7876             return sv_name;
7877         else if (flags==REG_RSN_RETURN_DATA) {
7878             HE *he_str = NULL;
7879             SV *sv_dat = NULL;
7880             if ( ! sv_name )      /* should not happen*/
7881                 Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
7882             if (RExC_paren_names)
7883                 he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
7884             if ( he_str )
7885                 sv_dat = HeVAL(he_str);
7886             if ( ! sv_dat )
7887                 vFAIL("Reference to nonexistent named group");
7888             return sv_dat;
7889         }
7890         else {
7891             Perl_croak(aTHX_ "panic: bad flag %lx in reg_scan_name",
7892                        (unsigned long) flags);
7893         }
7894         NOT_REACHED; /* NOTREACHED */
7895     }
7896     return NULL;
7897 }
7898
7899 #define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
7900     int num;                                                    \
7901     if (RExC_lastparse!=RExC_parse) {                           \
7902         PerlIO_printf(Perl_debug_log, "%s",                     \
7903             Perl_pv_pretty(aTHX_ RExC_mysv1, RExC_parse,        \
7904                 RExC_end - RExC_parse, 16,                      \
7905                 "", "",                                         \
7906                 PERL_PV_ESCAPE_UNI_DETECT |                     \
7907                 PERL_PV_PRETTY_ELLIPSES   |                     \
7908                 PERL_PV_PRETTY_LTGT       |                     \
7909                 PERL_PV_ESCAPE_RE         |                     \
7910                 PERL_PV_PRETTY_EXACTSIZE                        \
7911             )                                                   \
7912         );                                                      \
7913     } else                                                      \
7914         PerlIO_printf(Perl_debug_log,"%16s","");                \
7915                                                                 \
7916     if (SIZE_ONLY)                                              \
7917        num = RExC_size + 1;                                     \
7918     else                                                        \
7919        num=REG_NODE_NUM(RExC_emit);                             \
7920     if (RExC_lastnum!=num)                                      \
7921        PerlIO_printf(Perl_debug_log,"|%4d",num);                \
7922     else                                                        \
7923        PerlIO_printf(Perl_debug_log,"|%4s","");                 \
7924     PerlIO_printf(Perl_debug_log,"|%*s%-4s",                    \
7925         (int)((depth*2)), "",                                   \
7926         (funcname)                                              \
7927     );                                                          \
7928     RExC_lastnum=num;                                           \
7929     RExC_lastparse=RExC_parse;                                  \
7930 })
7931
7932
7933
7934 #define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
7935     DEBUG_PARSE_MSG((funcname));                            \
7936     PerlIO_printf(Perl_debug_log,"%4s","\n");               \
7937 })
7938 #define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({           \
7939     DEBUG_PARSE_MSG((funcname));                            \
7940     PerlIO_printf(Perl_debug_log,fmt "\n",args);               \
7941 })
7942
7943 /* This section of code defines the inversion list object and its methods.  The
7944  * interfaces are highly subject to change, so as much as possible is static to
7945  * this file.  An inversion list is here implemented as a malloc'd C UV array
7946  * as an SVt_INVLIST scalar.
7947  *
7948  * An inversion list for Unicode is an array of code points, sorted by ordinal
7949  * number.  The zeroth element is the first code point in the list.  The 1th
7950  * element is the first element beyond that not in the list.  In other words,
7951  * the first range is
7952  *  invlist[0]..(invlist[1]-1)
7953  * The other ranges follow.  Thus every element whose index is divisible by two
7954  * marks the beginning of a range that is in the list, and every element not
7955  * divisible by two marks the beginning of a range not in the list.  A single
7956  * element inversion list that contains the single code point N generally
7957  * consists of two elements
7958  *  invlist[0] == N
7959  *  invlist[1] == N+1
7960  * (The exception is when N is the highest representable value on the
7961  * machine, in which case the list containing just it would be a single
7962  * element, itself.  By extension, if the last range in the list extends to
7963  * infinity, then the first element of that range will be in the inversion list
7964  * at a position that is divisible by two, and is the final element in the
7965  * list.)
7966  * Taking the complement (inverting) an inversion list is quite simple, if the
7967  * first element is 0, remove it; otherwise add a 0 element at the beginning.
7968  * This implementation reserves an element at the beginning of each inversion
7969  * list to always contain 0; there is an additional flag in the header which
7970  * indicates if the list begins at the 0, or is offset to begin at the next
7971  * element.
7972  *
7973  * More about inversion lists can be found in "Unicode Demystified"
7974  * Chapter 13 by Richard Gillam, published by Addison-Wesley.
7975  * More will be coming when functionality is added later.
7976  *
7977  * The inversion list data structure is currently implemented as an SV pointing
7978  * to an array of UVs that the SV thinks are bytes.  This allows us to have an
7979  * array of UV whose memory management is automatically handled by the existing
7980  * facilities for SV's.
7981  *
7982  * Some of the methods should always be private to the implementation, and some
7983  * should eventually be made public */
7984
7985 /* The header definitions are in F<inline_invlist.c> */
7986
7987 PERL_STATIC_INLINE UV*
7988 S__invlist_array_init(SV* const invlist, const bool will_have_0)
7989 {
7990     /* Returns a pointer to the first element in the inversion list's array.
7991      * This is called upon initialization of an inversion list.  Where the
7992      * array begins depends on whether the list has the code point U+0000 in it
7993      * or not.  The other parameter tells it whether the code that follows this
7994      * call is about to put a 0 in the inversion list or not.  The first
7995      * element is either the element reserved for 0, if TRUE, or the element
7996      * after it, if FALSE */
7997
7998     bool* offset = get_invlist_offset_addr(invlist);
7999     UV* zero_addr = (UV *) SvPVX(invlist);
8000
8001     PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT;
8002
8003     /* Must be empty */
8004     assert(! _invlist_len(invlist));
8005
8006     *zero_addr = 0;
8007
8008     /* 1^1 = 0; 1^0 = 1 */
8009     *offset = 1 ^ will_have_0;
8010     return zero_addr + *offset;
8011 }
8012
8013 PERL_STATIC_INLINE void
8014 S_invlist_set_len(pTHX_ SV* const invlist, const UV len, const bool offset)
8015 {
8016     /* Sets the current number of elements stored in the inversion list.
8017      * Updates SvCUR correspondingly */
8018     PERL_UNUSED_CONTEXT;
8019     PERL_ARGS_ASSERT_INVLIST_SET_LEN;
8020
8021     assert(SvTYPE(invlist) == SVt_INVLIST);
8022
8023     SvCUR_set(invlist,
8024               (len == 0)
8025                ? 0
8026                : TO_INTERNAL_SIZE(len + offset));
8027     assert(SvLEN(invlist) == 0 || SvCUR(invlist) <= SvLEN(invlist));
8028 }
8029
8030 #ifndef PERL_IN_XSUB_RE
8031
8032 PERL_STATIC_INLINE IV*
8033 S_get_invlist_previous_index_addr(SV* invlist)
8034 {
8035     /* Return the address of the IV that is reserved to hold the cached index
8036      * */
8037     PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR;
8038
8039     assert(SvTYPE(invlist) == SVt_INVLIST);
8040
8041     return &(((XINVLIST*) SvANY(invlist))->prev_index);
8042 }
8043
8044 PERL_STATIC_INLINE IV
8045 S_invlist_previous_index(SV* const invlist)
8046 {
8047     /* Returns cached index of previous search */
8048
8049     PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX;
8050
8051     return *get_invlist_previous_index_addr(invlist);
8052 }
8053
8054 PERL_STATIC_INLINE void
8055 S_invlist_set_previous_index(SV* const invlist, const IV index)
8056 {
8057     /* Caches <index> for later retrieval */
8058
8059     PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX;
8060
8061     assert(index == 0 || index < (int) _invlist_len(invlist));
8062
8063     *get_invlist_previous_index_addr(invlist) = index;
8064 }
8065
8066 PERL_STATIC_INLINE void
8067 S_invlist_trim(SV* const invlist)
8068 {
8069     PERL_ARGS_ASSERT_INVLIST_TRIM;
8070
8071     assert(SvTYPE(invlist) == SVt_INVLIST);
8072
8073     /* Change the length of the inversion list to how many entries it currently
8074      * has */
8075     SvPV_shrink_to_cur((SV *) invlist);
8076 }
8077
8078 PERL_STATIC_INLINE bool
8079 S_invlist_is_iterating(SV* const invlist)
8080 {
8081     PERL_ARGS_ASSERT_INVLIST_IS_ITERATING;
8082
8083     return *(get_invlist_iter_addr(invlist)) < (STRLEN) UV_MAX;
8084 }
8085
8086 #endif /* ifndef PERL_IN_XSUB_RE */
8087
8088 PERL_STATIC_INLINE UV
8089 S_invlist_max(SV* const invlist)
8090 {
8091     /* Returns the maximum number of elements storable in the inversion list's
8092      * array, without having to realloc() */
8093
8094     PERL_ARGS_ASSERT_INVLIST_MAX;
8095
8096     assert(SvTYPE(invlist) == SVt_INVLIST);
8097
8098     /* Assumes worst case, in which the 0 element is not counted in the
8099      * inversion list, so subtracts 1 for that */
8100     return SvLEN(invlist) == 0  /* This happens under _new_invlist_C_array */
8101            ? FROM_INTERNAL_SIZE(SvCUR(invlist)) - 1
8102            : FROM_INTERNAL_SIZE(SvLEN(invlist)) - 1;
8103 }
8104
8105 #ifndef PERL_IN_XSUB_RE
8106 SV*
8107 Perl__new_invlist(pTHX_ IV initial_size)
8108 {
8109
8110     /* Return a pointer to a newly constructed inversion list, with enough
8111      * space to store 'initial_size' elements.  If that number is negative, a
8112      * system default is used instead */
8113
8114     SV* new_list;
8115
8116     if (initial_size < 0) {
8117         initial_size = 10;
8118     }
8119
8120     /* Allocate the initial space */
8121     new_list = newSV_type(SVt_INVLIST);
8122
8123     /* First 1 is in case the zero element isn't in the list; second 1 is for
8124      * trailing NUL */
8125     SvGROW(new_list, TO_INTERNAL_SIZE(initial_size + 1) + 1);
8126     invlist_set_len(new_list, 0, 0);
8127
8128     /* Force iterinit() to be used to get iteration to work */
8129     *get_invlist_iter_addr(new_list) = (STRLEN) UV_MAX;
8130
8131     *get_invlist_previous_index_addr(new_list) = 0;
8132
8133     return new_list;
8134 }
8135
8136 SV*
8137 Perl__new_invlist_C_array(pTHX_ const UV* const list)
8138 {
8139     /* Return a pointer to a newly constructed inversion list, initialized to
8140      * point to <list>, which has to be in the exact correct inversion list
8141      * form, including internal fields.  Thus this is a dangerous routine that
8142      * should not be used in the wrong hands.  The passed in 'list' contains
8143      * several header fields at the beginning that are not part of the
8144      * inversion list body proper */
8145
8146     const STRLEN length = (STRLEN) list[0];
8147     const UV version_id =          list[1];
8148     const bool offset   =    cBOOL(list[2]);
8149 #define HEADER_LENGTH 3
8150     /* If any of the above changes in any way, you must change HEADER_LENGTH
8151      * (if appropriate) and regenerate INVLIST_VERSION_ID by running
8152      *      perl -E 'say int(rand 2**31-1)'
8153      */
8154 #define INVLIST_VERSION_ID 148565664 /* This is a combination of a version and
8155                                         data structure type, so that one being
8156                                         passed in can be validated to be an
8157                                         inversion list of the correct vintage.
8158                                        */
8159
8160     SV* invlist = newSV_type(SVt_INVLIST);
8161
8162     PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY;
8163
8164     if (version_id != INVLIST_VERSION_ID) {
8165         Perl_croak(aTHX_ "panic: Incorrect version for previously generated inversion list");
8166     }
8167
8168     /* The generated array passed in includes header elements that aren't part
8169      * of the list proper, so start it just after them */
8170     SvPV_set(invlist, (char *) (list + HEADER_LENGTH));
8171
8172     SvLEN_set(invlist, 0);  /* Means we own the contents, and the system
8173                                shouldn't touch it */
8174
8175     *(get_invlist_offset_addr(invlist)) = offset;
8176
8177     /* The 'length' passed to us is the physical number of elements in the
8178      * inversion list.  But if there is an offset the logical number is one
8179      * less than that */
8180     invlist_set_len(invlist, length  - offset, offset);
8181
8182     invlist_set_previous_index(invlist, 0);
8183
8184     /* Initialize the iteration pointer. */
8185     invlist_iterfinish(invlist);
8186
8187     SvREADONLY_on(invlist);
8188
8189     return invlist;
8190 }
8191 #endif /* ifndef PERL_IN_XSUB_RE */
8192
8193 STATIC void
8194 S_invlist_extend(pTHX_ SV* const invlist, const UV new_max)
8195 {
8196     /* Grow the maximum size of an inversion list */
8197
8198     PERL_ARGS_ASSERT_INVLIST_EXTEND;
8199
8200     assert(SvTYPE(invlist) == SVt_INVLIST);
8201
8202     /* Add one to account for the zero element at the beginning which may not
8203      * be counted by the calling parameters */
8204     SvGROW((SV *)invlist, TO_INTERNAL_SIZE(new_max + 1));
8205 }
8206
8207 STATIC void
8208 S__append_range_to_invlist(pTHX_ SV* const invlist,
8209                                  const UV start, const UV end)
8210 {
8211    /* Subject to change or removal.  Append the range from 'start' to 'end' at
8212     * the end of the inversion list.  The range must be above any existing
8213     * ones. */
8214
8215     UV* array;
8216     UV max = invlist_max(invlist);
8217     UV len = _invlist_len(invlist);
8218     bool offset;
8219
8220     PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST;
8221
8222     if (len == 0) { /* Empty lists must be initialized */
8223         offset = start != 0;
8224         array = _invlist_array_init(invlist, ! offset);
8225     }
8226     else {
8227         /* Here, the existing list is non-empty. The current max entry in the
8228          * list is generally the first value not in the set, except when the
8229          * set extends to the end of permissible values, in which case it is
8230          * the first entry in that final set, and so this call is an attempt to
8231          * append out-of-order */
8232
8233         UV final_element = len - 1;
8234         array = invlist_array(invlist);
8235         if (array[final_element] > start
8236             || ELEMENT_RANGE_MATCHES_INVLIST(final_element))
8237         {
8238             Perl_croak(aTHX_ "panic: attempting to append to an inversion list, but wasn't at the end of the list, final=%"UVuf", start=%"UVuf", match=%c",
8239                      array[final_element], start,
8240                      ELEMENT_RANGE_MATCHES_INVLIST(final_element) ? 't' : 'f');
8241         }
8242
8243         /* Here, it is a legal append.  If the new range begins with the first
8244          * value not in the set, it is extending the set, so the new first
8245          * value not in the set is one greater than the newly extended range.
8246          * */
8247         offset = *get_invlist_offset_addr(invlist);
8248         if (array[final_element] == start) {
8249             if (end != UV_MAX) {
8250                 array[final_element] = end + 1;
8251             }
8252             else {
8253                 /* But if the end is the maximum representable on the machine,
8254                  * just let the range that this would extend to have no end */
8255                 invlist_set_len(invlist, len - 1, offset);
8256             }
8257             return;
8258         }
8259     }
8260
8261     /* Here the new range doesn't extend any existing set.  Add it */
8262
8263     len += 2;   /* Includes an element each for the start and end of range */
8264
8265     /* If wll overflow the existing space, extend, which may cause the array to
8266      * be moved */
8267     if (max < len) {
8268         invlist_extend(invlist, len);
8269
8270         /* Have to set len here to avoid assert failure in invlist_array() */
8271         invlist_set_len(invlist, len, offset);
8272
8273         array = invlist_array(invlist);
8274     }
8275     else {
8276         invlist_set_len(invlist, len, offset);
8277     }
8278
8279     /* The next item on the list starts the range, the one after that is
8280      * one past the new range.  */
8281     array[len - 2] = start;
8282     if (end != UV_MAX) {
8283         array[len - 1] = end + 1;
8284     }
8285     else {
8286         /* But if the end is the maximum representable on the machine, just let
8287          * the range have no end */
8288         invlist_set_len(invlist, len - 1, offset);
8289     }
8290 }
8291
8292 #ifndef PERL_IN_XSUB_RE
8293
8294 IV
8295 Perl__invlist_search(SV* const invlist, const UV cp)
8296 {
8297     /* Searches the inversion list for the entry that contains the input code
8298      * point <cp>.  If <cp> is not in the list, -1 is returned.  Otherwise, the
8299      * return value is the index into the list's array of the range that
8300      * contains <cp> */
8301
8302     IV low = 0;
8303     IV mid;
8304     IV high = _invlist_len(invlist);
8305     const IV highest_element = high - 1;
8306     const UV* array;
8307
8308     PERL_ARGS_ASSERT__INVLIST_SEARCH;
8309
8310     /* If list is empty, return failure. */
8311     if (high == 0) {
8312         return -1;
8313     }
8314
8315     /* (We can't get the array unless we know the list is non-empty) */
8316     array = invlist_array(invlist);
8317
8318     mid = invlist_previous_index(invlist);
8319     assert(mid >=0 && mid <= highest_element);
8320
8321     /* <mid> contains the cache of the result of the previous call to this
8322      * function (0 the first time).  See if this call is for the same result,
8323      * or if it is for mid-1.  This is under the theory that calls to this
8324      * function will often be for related code points that are near each other.
8325      * And benchmarks show that caching gives better results.  We also test
8326      * here if the code point is within the bounds of the list.  These tests
8327      * replace others that would have had to be made anyway to make sure that
8328      * the array bounds were not exceeded, and these give us extra information
8329      * at the same time */
8330     if (cp >= array[mid]) {
8331         if (cp >= array[highest_element]) {
8332             return highest_element;
8333         }
8334
8335         /* Here, array[mid] <= cp < array[highest_element].  This means that
8336          * the final element is not the answer, so can exclude it; it also
8337          * means that <mid> is not the final element, so can refer to 'mid + 1'
8338          * safely */
8339         if (cp < array[mid + 1]) {
8340             return mid;
8341         }
8342         high--;
8343         low = mid + 1;
8344     }
8345     else { /* cp < aray[mid] */
8346         if (cp < array[0]) { /* Fail if outside the array */
8347             return -1;
8348         }
8349         high = mid;
8350         if (cp >= array[mid - 1]) {
8351             goto found_entry;
8352         }
8353     }
8354
8355     /* Binary search.  What we are looking for is <i> such that
8356      *  array[i] <= cp < array[i+1]
8357      * The loop below converges on the i+1.  Note that there may not be an
8358      * (i+1)th element in the array, and things work nonetheless */
8359     while (low < high) {
8360         mid = (low + high) / 2;
8361         assert(mid <= highest_element);
8362         if (array[mid] <= cp) { /* cp >= array[mid] */
8363             low = mid + 1;
8364
8365             /* We could do this extra test to exit the loop early.
8366             if (cp < array[low]) {
8367                 return mid;
8368             }
8369             */
8370         }
8371         else { /* cp < array[mid] */
8372             high = mid;
8373         }
8374     }
8375
8376   found_entry:
8377     high--;
8378     invlist_set_previous_index(invlist, high);
8379     return high;
8380 }
8381
8382 void
8383 Perl__invlist_populate_swatch(SV* const invlist,
8384                               const UV start, const UV end, U8* swatch)
8385 {
8386     /* populates a swatch of a swash the same way swatch_get() does in utf8.c,
8387      * but is used when the swash has an inversion list.  This makes this much
8388      * faster, as it uses a binary search instead of a linear one.  This is
8389      * intimately tied to that function, and perhaps should be in utf8.c,
8390      * except it is intimately tied to inversion lists as well.  It assumes
8391      * that <swatch> is all 0's on input */
8392
8393     UV current = start;
8394     const IV len = _invlist_len(invlist);
8395     IV i;
8396     const UV * array;
8397
8398     PERL_ARGS_ASSERT__INVLIST_POPULATE_SWATCH;
8399
8400     if (len == 0) { /* Empty inversion list */
8401         return;
8402     }
8403
8404     array = invlist_array(invlist);
8405
8406     /* Find which element it is */
8407     i = _invlist_search(invlist, start);
8408
8409     /* We populate from <start> to <end> */
8410     while (current < end) {
8411         UV upper;
8412
8413         /* The inversion list gives the results for every possible code point
8414          * after the first one in the list.  Only those ranges whose index is
8415          * even are ones that the inversion list matches.  For the odd ones,
8416          * and if the initial code point is not in the list, we have to skip
8417          * forward to the next element */
8418         if (i == -1 || ! ELEMENT_RANGE_MATCHES_INVLIST(i)) {
8419             i++;
8420             if (i >= len) { /* Finished if beyond the end of the array */
8421                 return;
8422             }
8423             current = array[i];
8424             if (current >= end) {   /* Finished if beyond the end of what we
8425                                        are populating */
8426                 if (LIKELY(end < UV_MAX)) {
8427                     return;
8428                 }
8429
8430                 /* We get here when the upper bound is the maximum
8431                  * representable on the machine, and we are looking for just
8432                  * that code point.  Have to special case it */
8433                 i = len;
8434                 goto join_end_of_list;
8435             }
8436         }
8437         assert(current >= start);
8438
8439         /* The current range ends one below the next one, except don't go past
8440          * <end> */
8441         i++;
8442         upper = (i < len && array[i] < end) ? array[i] : end;
8443
8444         /* Here we are in a range that matches.  Populate a bit in the 3-bit U8
8445          * for each code point in it */
8446         for (; current < upper; current++) {
8447             const STRLEN offset = (STRLEN)(current - start);
8448             swatch[offset >> 3] |= 1 << (offset & 7);
8449         }
8450
8451       join_end_of_list:
8452
8453         /* Quit if at the end of the list */
8454         if (i >= len) {
8455
8456             /* But first, have to deal with the highest possible code point on
8457              * the platform.  The previous code assumes that <end> is one
8458              * beyond where we want to populate, but that is impossible at the
8459              * platform's infinity, so have to handle it specially */
8460             if (UNLIKELY(end == UV_MAX && ELEMENT_RANGE_MATCHES_INVLIST(len-1)))
8461             {
8462                 const STRLEN offset = (STRLEN)(end - start);
8463                 swatch[offset >> 3] |= 1 << (offset & 7);
8464             }
8465             return;
8466         }
8467
8468         /* Advance to the next range, which will be for code points not in the
8469          * inversion list */
8470         current = array[i];
8471     }
8472
8473     return;
8474 }
8475
8476 void
8477 Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b,
8478                                          const bool complement_b, SV** output)
8479 {
8480     /* Take the union of two inversion lists and point <output> to it.  *output
8481      * SHOULD BE DEFINED upon input, and if it points to one of the two lists,
8482      * the reference count to that list will be decremented if not already a
8483      * temporary (mortal); otherwise *output will be made correspondingly
8484      * mortal.  The first list, <a>, may be NULL, in which case a copy of the
8485      * second list is returned.  If <complement_b> is TRUE, the union is taken
8486      * of the complement (inversion) of <b> instead of b itself.
8487      *
8488      * The basis for this comes from "Unicode Demystified" Chapter 13 by
8489      * Richard Gillam, published by Addison-Wesley, and explained at some
8490      * length there.  The preface says to incorporate its examples into your
8491      * code at your own risk.
8492      *
8493      * The algorithm is like a merge sort.
8494      *
8495      * XXX A potential performance improvement is to keep track as we go along
8496      * if only one of the inputs contributes to the result, meaning the other
8497      * is a subset of that one.  In that case, we can skip the final copy and
8498      * return the larger of the input lists, but then outside code might need
8499      * to keep track of whether to free the input list or not */
8500
8501     const UV* array_a;    /* a's array */
8502     const UV* array_b;
8503     UV len_a;       /* length of a's array */
8504     UV len_b;
8505
8506     SV* u;                      /* the resulting union */
8507     UV* array_u;
8508     UV len_u;
8509
8510     UV i_a = 0;             /* current index into a's array */
8511     UV i_b = 0;
8512     UV i_u = 0;
8513
8514     /* running count, as explained in the algorithm source book; items are
8515      * stopped accumulating and are output when the count changes to/from 0.
8516      * The count is incremented when we start a range that's in the set, and
8517      * decremented when we start a range that's not in the set.  So its range
8518      * is 0 to 2.  Only when the count is zero is something not in the set.
8519      */
8520     UV count = 0;
8521
8522     PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND;
8523     assert(a != b);
8524
8525     /* If either one is empty, the union is the other one */
8526     if (a == NULL || ((len_a = _invlist_len(a)) == 0)) {
8527         bool make_temp = FALSE; /* Should we mortalize the result? */
8528
8529         if (*output == a) {
8530             if (a != NULL) {
8531                 if (! (make_temp = cBOOL(SvTEMP(a)))) {
8532                     SvREFCNT_dec_NN(a);
8533                 }
8534             }
8535         }
8536         if (*output != b) {
8537             *output = invlist_clone(b);
8538             if (complement_b) {
8539                 _invlist_invert(*output);
8540             }
8541         } /* else *output already = b; */
8542
8543         if (make_temp) {
8544             sv_2mortal(*output);
8545         }
8546         return;
8547     }
8548     else if ((len_b = _invlist_len(b)) == 0) {
8549         bool make_temp = FALSE;
8550         if (*output == b) {
8551             if (! (make_temp = cBOOL(SvTEMP(b)))) {
8552                 SvREFCNT_dec_NN(b);
8553             }
8554         }
8555
8556         /* The complement of an empty list is a list that has everything in it,
8557          * so the union with <a> includes everything too */
8558         if (complement_b) {
8559             if (a == *output) {
8560                 if (! (make_temp = cBOOL(SvTEMP(a)))) {
8561                     SvREFCNT_dec_NN(a);
8562                 }
8563             }
8564             *output = _new_invlist(1);
8565             _append_range_to_invlist(*output, 0, UV_MAX);
8566         }
8567         else if (*output != a) {
8568             *output = invlist_clone(a);
8569         }
8570         /* else *output already = a; */
8571
8572         if (make_temp) {
8573             sv_2mortal(*output);
8574         }
8575         return;
8576     }
8577
8578     /* Here both lists exist and are non-empty */
8579     array_a = invlist_array(a);
8580     array_b = invlist_array(b);
8581
8582     /* If are to take the union of 'a' with the complement of b, set it
8583      * up so are looking at b's complement. */
8584     if (complement_b) {
8585
8586         /* To complement, we invert: if the first element is 0, remove it.  To
8587          * do this, we just pretend the array starts one later */
8588         if (array_b[0] == 0) {
8589             array_b++;
8590             len_b--;
8591         }
8592         else {
8593
8594             /* But if the first element is not zero, we pretend the list starts
8595              * at the 0 that is always stored immediately before the array. */
8596             array_b--;
8597             len_b++;
8598         }
8599     }
8600
8601     /* Size the union for the worst case: that the sets are completely
8602      * disjoint */
8603     u = _new_invlist(len_a + len_b);
8604
8605     /* Will contain U+0000 if either component does */
8606     array_u = _invlist_array_init(u, (len_a > 0 && array_a[0] == 0)
8607                                       || (len_b > 0 && array_b[0] == 0));
8608
8609     /* Go through each list item by item, stopping when exhausted one of
8610      * them */
8611     while (i_a < len_a && i_b < len_b) {
8612         UV cp;      /* The element to potentially add to the union's array */
8613         bool cp_in_set;   /* is it in the the input list's set or not */
8614
8615         /* We need to take one or the other of the two inputs for the union.
8616          * Since we are merging two sorted lists, we take the smaller of the
8617          * next items.  In case of a tie, we take the one that is in its set
8618          * first.  If we took one not in the set first, it would decrement the
8619          * count, possibly to 0 which would cause it to be output as ending the
8620          * range, and the next time through we would take the same number, and
8621          * output it again as beginning the next range.  By doing it the
8622          * opposite way, there is no possibility that the count will be
8623          * momentarily decremented to 0, and thus the two adjoining ranges will
8624          * be seamlessly merged.  (In a tie and both are in the set or both not
8625          * in the set, it doesn't matter which we take first.) */
8626         if (array_a[i_a] < array_b[i_b]
8627             || (array_a[i_a] == array_b[i_b]
8628                 && ELEMENT_RANGE_MATCHES_INVLIST(i_a)))
8629         {
8630             cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a);
8631             cp= array_a[i_a++];
8632         }
8633         else {
8634             cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b);
8635             cp = array_b[i_b++];
8636         }
8637
8638         /* Here, have chosen which of the two inputs to look at.  Only output
8639          * if the running count changes to/from 0, which marks the
8640          * beginning/end of a range in that's in the set */
8641         if (cp_in_set) {
8642             if (count == 0) {
8643                 array_u[i_u++] = cp;
8644             }
8645             count++;
8646         }
8647         else {
8648             count--;
8649             if (count == 0) {
8650                 array_u[i_u++] = cp;
8651             }
8652         }
8653     }
8654
8655     /* Here, we are finished going through at least one of the lists, which
8656      * means there is something remaining in at most one.  We check if the list
8657      * that hasn't been exhausted is positioned such that we are in the middle
8658      * of a range in its set or not.  (i_a and i_b point to the element beyond
8659      * the one we care about.) If in the set, we decrement 'count'; if 0, there
8660      * is potentially more to output.
8661      * There are four cases:
8662      *  1) Both weren't in their sets, count is 0, and remains 0.  What's left
8663      *     in the union is entirely from the non-exhausted set.
8664      *  2) Both were in their sets, count is 2.  Nothing further should
8665      *     be output, as everything that remains will be in the exhausted
8666      *     list's set, hence in the union; decrementing to 1 but not 0 insures
8667      *     that
8668      *  3) the exhausted was in its set, non-exhausted isn't, count is 1.
8669      *     Nothing further should be output because the union includes
8670      *     everything from the exhausted set.  Not decrementing ensures that.
8671      *  4) the exhausted wasn't in its set, non-exhausted is, count is 1;
8672      *     decrementing to 0 insures that we look at the remainder of the
8673      *     non-exhausted set */
8674     if ((i_a != len_a && PREV_RANGE_MATCHES_INVLIST(i_a))
8675         || (i_b != len_b && PREV_RANGE_MATCHES_INVLIST(i_b)))
8676     {
8677         count--;
8678     }
8679
8680     /* The final length is what we've output so far, plus what else is about to
8681      * be output.  (If 'count' is non-zero, then the input list we exhausted
8682      * has everything remaining up to the machine's limit in its set, and hence
8683      * in the union, so there will be no further output. */
8684     len_u = i_u;
8685     if (count == 0) {
8686         /* At most one of the subexpressions will be non-zero */
8687         len_u += (len_a - i_a) + (len_b - i_b);
8688     }
8689
8690     /* Set result to final length, which can change the pointer to array_u, so
8691      * re-find it */
8692     if (len_u != _invlist_len(u)) {
8693         invlist_set_len(u, len_u, *get_invlist_offset_addr(u));
8694         invlist_trim(u);
8695         array_u = invlist_array(u);
8696     }
8697
8698     /* When 'count' is 0, the list that was exhausted (if one was shorter than
8699      * the other) ended with everything above it not in its set.  That means
8700      * that the remaining part of the union is precisely the same as the
8701      * non-exhausted list, so can just copy it unchanged.  (If both list were
8702      * exhausted at the same time, then the operations below will be both 0.)
8703      */
8704     if (count == 0) {
8705         IV copy_count; /* At most one will have a non-zero copy count */
8706         if ((copy_count = len_a - i_a) > 0) {
8707             Copy(array_a + i_a, array_u + i_u, copy_count, UV);
8708         }
8709         else if ((copy_count = len_b - i_b) > 0) {
8710             Copy(array_b + i_b, array_u + i_u, copy_count, UV);
8711         }
8712     }
8713
8714     /*  We may be removing a reference to one of the inputs.  If so, the output
8715      *  is made mortal if the input was.  (Mortal SVs shouldn't have their ref
8716      *  count decremented) */
8717     if (a == *output || b == *output) {
8718         assert(! invlist_is_iterating(*output));
8719         if ((SvTEMP(*output))) {
8720             sv_2mortal(u);
8721         }
8722         else {
8723             SvREFCNT_dec_NN(*output);
8724         }
8725     }
8726
8727     *output = u;
8728
8729     return;
8730 }
8731
8732 void
8733 Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b,
8734                                                const bool complement_b, SV** i)
8735 {
8736     /* Take the intersection of two inversion lists and point <i> to it.  *i
8737      * SHOULD BE DEFINED upon input, and if it points to one of the two lists,
8738      * the reference count to that list will be decremented if not already a
8739      * temporary (mortal); otherwise *i will be made correspondingly mortal.
8740      * The first list, <a>, may be NULL, in which case an empty list is
8741      * returned.  If <complement_b> is TRUE, the result will be the
8742      * intersection of <a> and the complement (or inversion) of <b> instead of
8743      * <b> directly.
8744      *
8745      * The basis for this comes from "Unicode Demystified" Chapter 13 by
8746      * Richard Gillam, published by Addison-Wesley, and explained at some
8747      * length there.  The preface says to incorporate its examples into your
8748      * code at your own risk.  In fact, it had bugs
8749      *
8750      * The algorithm is like a merge sort, and is essentially the same as the
8751      * union above
8752      */
8753
8754     const UV* array_a;          /* a's array */
8755     const UV* array_b;
8756     UV len_a;   /* length of a's array */
8757     UV len_b;
8758
8759     SV* r;                   /* the resulting intersection */
8760     UV* array_r;
8761     UV len_r;
8762
8763     UV i_a = 0;             /* current index into a's array */
8764     UV i_b = 0;
8765     UV i_r = 0;
8766
8767     /* running count, as explained in the algorithm source book; items are
8768      * stopped accumulating and are output when the count changes to/from 2.
8769      * The count is incremented when we start a range that's in the set, and
8770      * decremented when we start a range that's not in the set.  So its range
8771      * is 0 to 2.  Only when the count is 2 is something in the intersection.
8772      */
8773     UV count = 0;
8774
8775     PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND;
8776     assert(a != b);
8777
8778     /* Special case if either one is empty */
8779     len_a = (a == NULL) ? 0 : _invlist_len(a);
8780     if ((len_a == 0) || ((len_b = _invlist_len(b)) == 0)) {
8781         bool make_temp = FALSE;
8782
8783         if (len_a != 0 && complement_b) {
8784
8785             /* Here, 'a' is not empty, therefore from the above 'if', 'b' must
8786              * be empty.  Here, also we are using 'b's complement, which hence
8787              * must be every possible code point.  Thus the intersection is
8788              * simply 'a'. */
8789             if (*i != a) {
8790                 if (*i == b) {
8791                     if (! (make_temp = cBOOL(SvTEMP(b)))) {
8792                         SvREFCNT_dec_NN(b);
8793                     }
8794                 }
8795
8796                 *i = invlist_clone(a);
8797             }
8798             /* else *i is already 'a' */
8799
8800             if (make_temp) {
8801                 sv_2mortal(*i);
8802             }
8803             return;
8804         }
8805
8806         /* Here, 'a' or 'b' is empty and not using the complement of 'b'.  The
8807          * intersection must be empty */
8808         if (*i == a) {
8809             if (! (make_temp = cBOOL(SvTEMP(a)))) {
8810                 SvREFCNT_dec_NN(a);
8811             }
8812         }
8813         else if (*i == b) {
8814             if (! (make_temp = cBOOL(SvTEMP(b)))) {
8815                 SvREFCNT_dec_NN(b);
8816             }
8817         }
8818         *i = _new_invlist(0);
8819         if (make_temp) {
8820             sv_2mortal(*i);
8821         }
8822
8823         return;
8824     }
8825
8826     /* Here both lists exist and are non-empty */
8827     array_a = invlist_array(a);
8828     array_b = invlist_array(b);
8829
8830     /* If are to take the intersection of 'a' with the complement of b, set it
8831      * up so are looking at b's complement. */
8832     if (complement_b) {
8833
8834         /* To complement, we invert: if the first element is 0, remove it.  To
8835          * do this, we just pretend the array starts one later */
8836         if (array_b[0] == 0) {
8837             array_b++;
8838             len_b--;
8839         }
8840         else {
8841
8842             /* But if the first element is not zero, we pretend the list starts
8843              * at the 0 that is always stored immediately before the array. */
8844             array_b--;
8845             len_b++;
8846         }
8847     }
8848
8849     /* Size the intersection for the worst case: that the intersection ends up
8850      * fragmenting everything to be completely disjoint */
8851     r= _new_invlist(len_a + len_b);
8852
8853     /* Will contain U+0000 iff both components do */
8854     array_r = _invlist_array_init(r, len_a > 0 && array_a[0] == 0
8855                                      && len_b > 0 && array_b[0] == 0);
8856
8857     /* Go through each list item by item, stopping when exhausted one of
8858      * them */
8859     while (i_a < len_a && i_b < len_b) {
8860         UV cp;      /* The element to potentially add to the intersection's
8861                        array */
8862         bool cp_in_set; /* Is it in the input list's set or not */
8863
8864         /* We need to take one or the other of the two inputs for the
8865          * intersection.  Since we are merging two sorted lists, we take the
8866          * smaller of the next items.  In case of a tie, we take the one that
8867          * is not in its set first (a difference from the union algorithm).  If
8868          * we took one in the set first, it would increment the count, possibly
8869          * to 2 which would cause it to be output as starting a range in the
8870          * intersection, and the next time through we would take that same
8871          * number, and output it again as ending the set.  By doing it the
8872          * opposite of this, there is no possibility that the count will be
8873          * momentarily incremented to 2.  (In a tie and both are in the set or
8874          * both not in the set, it doesn't matter which we take first.) */
8875         if (array_a[i_a] < array_b[i_b]
8876             || (array_a[i_a] == array_b[i_b]
8877                 && ! ELEMENT_RANGE_MATCHES_INVLIST(i_a)))
8878         {
8879             cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a);
8880             cp= array_a[i_a++];
8881         }
8882         else {
8883             cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b);
8884             cp= array_b[i_b++];
8885         }
8886
8887         /* Here, have chosen which of the two inputs to look at.  Only output
8888          * if the running count changes to/from 2, which marks the
8889          * beginning/end of a range that's in the intersection */
8890         if (cp_in_set) {
8891             count++;
8892             if (count == 2) {
8893                 array_r[i_r++] = cp;
8894             }
8895         }
8896         else {
8897             if (count == 2) {
8898                 array_r[i_r++] = cp;
8899             }
8900             count--;
8901         }
8902     }
8903
8904     /* Here, we are finished going through at least one of the lists, which
8905      * means there is something remaining in at most one.  We check if the list
8906      * that has been exhausted is positioned such that we are in the middle
8907      * of a range in its set or not.  (i_a and i_b point to elements 1 beyond
8908      * the ones we care about.)  There are four cases:
8909      *  1) Both weren't in their sets, count is 0, and remains 0.  There's
8910      *     nothing left in the intersection.
8911      *  2) Both were in their sets, count is 2 and perhaps is incremented to
8912      *     above 2.  What should be output is exactly that which is in the
8913      *     non-exhausted set, as everything it has is also in the intersection
8914      *     set, and everything it doesn't have can't be in the intersection
8915      *  3) The exhausted was in its set, non-exhausted isn't, count is 1, and
8916      *     gets incremented to 2.  Like the previous case, the intersection is
8917      *     everything that remains in the non-exhausted set.
8918      *  4) the exhausted wasn't in its set, non-exhausted is, count is 1, and
8919      *     remains 1.  And the intersection has nothing more. */
8920     if ((i_a == len_a && PREV_RANGE_MATCHES_INVLIST(i_a))
8921         || (i_b == len_b && PREV_RANGE_MATCHES_INVLIST(i_b)))
8922     {
8923         count++;
8924     }
8925
8926     /* The final length is what we've output so far plus what else is in the
8927      * intersection.  At most one of the subexpressions below will be non-zero
8928      * */
8929     len_r = i_r;
8930     if (count >= 2) {
8931         len_r += (len_a - i_a) + (len_b - i_b);
8932     }
8933
8934     /* Set result to final length, which can change the pointer to array_r, so
8935      * re-find it */
8936     if (len_r != _invlist_len(r)) {
8937         invlist_set_len(r, len_r, *get_invlist_offset_addr(r));
8938         invlist_trim(r);
8939         array_r = invlist_array(r);
8940     }
8941
8942     /* Finish outputting any remaining */
8943     if (count >= 2) { /* At most one will have a non-zero copy count */
8944         IV copy_count;
8945         if ((copy_count = len_a - i_a) > 0) {
8946             Copy(array_a + i_a, array_r + i_r, copy_count, UV);
8947         }
8948         else if ((copy_count = len_b - i_b) > 0) {
8949             Copy(array_b + i_b, array_r + i_r, copy_count, UV);
8950         }
8951     }
8952
8953     /*  We may be removing a reference to one of the inputs.  If so, the output
8954      *  is made mortal if the input was.  (Mortal SVs shouldn't have their ref
8955      *  count decremented) */
8956     if (a == *i || b == *i) {
8957         assert(! invlist_is_iterating(*i));
8958         if (SvTEMP(*i)) {
8959             sv_2mortal(r);
8960         }
8961         else {
8962             SvREFCNT_dec_NN(*i);
8963         }
8964     }
8965
8966     *i = r;
8967
8968     return;
8969 }
8970
8971 SV*
8972 Perl__add_range_to_invlist(pTHX_ SV* invlist, const UV start, const UV end)
8973 {
8974     /* Add the range from 'start' to 'end' inclusive to the inversion list's
8975      * set.  A pointer to the inversion list is returned.  This may actually be
8976      * a new list, in which case the passed in one has been destroyed.  The
8977      * passed-in inversion list can be NULL, in which case a new one is created
8978      * with just the one range in it */
8979
8980     SV* range_invlist;
8981     UV len;
8982
8983     if (invlist == NULL) {
8984         invlist = _new_invlist(2);
8985         len = 0;
8986     }
8987     else {
8988         len = _invlist_len(invlist);
8989     }
8990
8991     /* If comes after the final entry actually in the list, can just append it
8992      * to the end, */
8993     if (len == 0
8994         || (! ELEMENT_RANGE_MATCHES_INVLIST(len - 1)
8995             && start >= invlist_array(invlist)[len - 1]))
8996     {
8997         _append_range_to_invlist(invlist, start, end);
8998         return invlist;
8999     }
9000
9001     /* Here, can't just append things, create and return a new inversion list
9002      * which is the union of this range and the existing inversion list */
9003     range_invlist = _new_invlist(2);
9004     _append_range_to_invlist(range_invlist, start, end);
9005
9006     _invlist_union(invlist, range_invlist, &invlist);
9007
9008     /* The temporary can be freed */
9009     SvREFCNT_dec_NN(range_invlist);
9010
9011     return invlist;
9012 }
9013
9014 SV*
9015 Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0,
9016                                  UV** other_elements_ptr)
9017 {
9018     /* Create and return an inversion list whose contents are to be populated
9019      * by the caller.  The caller gives the number of elements (in 'size') and
9020      * the very first element ('element0').  This function will set
9021      * '*other_elements_ptr' to an array of UVs, where the remaining elements
9022      * are to be placed.
9023      *
9024      * Obviously there is some trust involved that the caller will properly
9025      * fill in the other elements of the array.
9026      *
9027      * (The first element needs to be passed in, as the underlying code does
9028      * things differently depending on whether it is zero or non-zero) */
9029
9030     SV* invlist = _new_invlist(size);
9031     bool offset;
9032
9033     PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST;
9034
9035     _append_range_to_invlist(invlist, element0, element0);
9036     offset = *get_invlist_offset_addr(invlist);
9037
9038     invlist_set_len(invlist, size, offset);
9039     *other_elements_ptr = invlist_array(invlist) + 1;
9040     return invlist;
9041 }
9042
9043 #endif
9044
9045 PERL_STATIC_INLINE SV*
9046 S_add_cp_to_invlist(pTHX_ SV* invlist, const UV cp) {
9047     return _add_range_to_invlist(invlist, cp, cp);
9048 }
9049
9050 #ifndef PERL_IN_XSUB_RE
9051 void
9052 Perl__invlist_invert(pTHX_ SV* const invlist)
9053 {
9054     /* Complement the input inversion list.  This adds a 0 if the list didn't
9055      * have a zero; removes it otherwise.  As described above, the data
9056      * structure is set up so that this is very efficient */
9057
9058     PERL_ARGS_ASSERT__INVLIST_INVERT;
9059
9060     assert(! invlist_is_iterating(invlist));
9061
9062     /* The inverse of matching nothing is matching everything */
9063     if (_invlist_len(invlist) == 0) {
9064         _append_range_to_invlist(invlist, 0, UV_MAX);
9065         return;
9066     }
9067
9068     *get_invlist_offset_addr(invlist) = ! *get_invlist_offset_addr(invlist);
9069 }
9070
9071 #endif
9072
9073 PERL_STATIC_INLINE SV*
9074 S_invlist_clone(pTHX_ SV* const invlist)
9075 {
9076
9077     /* Return a new inversion list that is a copy of the input one, which is
9078      * unchanged.  The new list will not be mortal even if the old one was. */
9079
9080     /* Need to allocate extra space to accommodate Perl's addition of a
9081      * trailing NUL to SvPV's, since it thinks they are always strings */
9082     SV* new_invlist = _new_invlist(_invlist_len(invlist) + 1);
9083     STRLEN physical_length = SvCUR(invlist);
9084     bool offset = *(get_invlist_offset_addr(invlist));
9085
9086     PERL_ARGS_ASSERT_INVLIST_CLONE;
9087
9088     *(get_invlist_offset_addr(new_invlist)) = offset;
9089     invlist_set_len(new_invlist, _invlist_len(invlist), offset);
9090     Copy(SvPVX(invlist), SvPVX(new_invlist), physical_length, char);
9091
9092     return new_invlist;
9093 }
9094
9095 PERL_STATIC_INLINE STRLEN*
9096 S_get_invlist_iter_addr(SV* invlist)
9097 {
9098     /* Return the address of the UV that contains the current iteration
9099      * position */
9100
9101     PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR;
9102
9103     assert(SvTYPE(invlist) == SVt_INVLIST);
9104
9105     return &(((XINVLIST*) SvANY(invlist))->iterator);
9106 }
9107
9108 PERL_STATIC_INLINE void
9109 S_invlist_iterinit(SV* invlist) /* Initialize iterator for invlist */
9110 {
9111     PERL_ARGS_ASSERT_INVLIST_ITERINIT;
9112
9113     *get_invlist_iter_addr(invlist) = 0;
9114 }
9115
9116 PERL_STATIC_INLINE void
9117 S_invlist_iterfinish(SV* invlist)
9118 {
9119     /* Terminate iterator for invlist.  This is to catch development errors.
9120      * Any iteration that is interrupted before completed should call this
9121      * function.  Functions that add code points anywhere else but to the end
9122      * of an inversion list assert that they are not in the middle of an
9123      * iteration.  If they were, the addition would make the iteration
9124      * problematical: if the iteration hadn't reached the place where things
9125      * were being added, it would be ok */
9126
9127     PERL_ARGS_ASSERT_INVLIST_ITERFINISH;
9128
9129     *get_invlist_iter_addr(invlist) = (STRLEN) UV_MAX;
9130 }
9131
9132 STATIC bool
9133 S_invlist_iternext(SV* invlist, UV* start, UV* end)
9134 {
9135     /* An C<invlist_iterinit> call on <invlist> must be used to set this up.
9136      * This call sets in <*start> and <*end>, the next range in <invlist>.
9137      * Returns <TRUE> if successful and the next call will return the next
9138      * range; <FALSE> if was already at the end of the list.  If the latter,
9139      * <*start> and <*end> are unchanged, and the next call to this function
9140      * will start over at the beginning of the list */
9141
9142     STRLEN* pos = get_invlist_iter_addr(invlist);
9143     UV len = _invlist_len(invlist);
9144     UV *array;
9145
9146     PERL_ARGS_ASSERT_INVLIST_ITERNEXT;
9147
9148     if (*pos >= len) {
9149         *pos = (STRLEN) UV_MAX; /* Force iterinit() to be required next time */
9150         return FALSE;
9151     }
9152
9153     array = invlist_array(invlist);
9154
9155     *start = array[(*pos)++];
9156
9157     if (*pos >= len) {
9158         *end = UV_MAX;
9159     }
9160     else {
9161         *end = array[(*pos)++] - 1;
9162     }
9163
9164     return TRUE;
9165 }
9166
9167 PERL_STATIC_INLINE UV
9168 S_invlist_highest(SV* const invlist)
9169 {
9170     /* Returns the highest code point that matches an inversion list.  This API
9171      * has an ambiguity, as it returns 0 under either the highest is actually
9172      * 0, or if the list is empty.  If this distinction matters to you, check
9173      * for emptiness before calling this function */
9174
9175     UV len = _invlist_len(invlist);
9176     UV *array;
9177
9178     PERL_ARGS_ASSERT_INVLIST_HIGHEST;
9179
9180     if (len == 0) {
9181         return 0;
9182     }
9183
9184     array = invlist_array(invlist);
9185
9186     /* The last element in the array in the inversion list always starts a
9187      * range that goes to infinity.  That range may be for code points that are
9188      * matched in the inversion list, or it may be for ones that aren't
9189      * matched.  In the latter case, the highest code point in the set is one
9190      * less than the beginning of this range; otherwise it is the final element
9191      * of this range: infinity */
9192     return (ELEMENT_RANGE_MATCHES_INVLIST(len - 1))
9193            ? UV_MAX
9194            : array[len - 1] - 1;
9195 }
9196
9197 #ifndef PERL_IN_XSUB_RE
9198 SV *
9199 Perl__invlist_contents(pTHX_ SV* const invlist)
9200 {
9201     /* Get the contents of an inversion list into a string SV so that they can
9202      * be printed out.  It uses the format traditionally done for debug tracing
9203      */
9204
9205     UV start, end;
9206     SV* output = newSVpvs("\n");
9207
9208     PERL_ARGS_ASSERT__INVLIST_CONTENTS;
9209
9210     assert(! invlist_is_iterating(invlist));
9211
9212     invlist_iterinit(invlist);
9213     while (invlist_iternext(invlist, &start, &end)) {
9214         if (end == UV_MAX) {
9215             Perl_sv_catpvf(aTHX_ output, "%04"UVXf"\tINFINITY\n", start);
9216         }
9217         else if (end != start) {
9218             Perl_sv_catpvf(aTHX_ output, "%04"UVXf"\t%04"UVXf"\n",
9219                     start,       end);
9220         }
9221         else {
9222             Perl_sv_catpvf(aTHX_ output, "%04"UVXf"\n", start);
9223         }
9224     }
9225
9226     return output;
9227 }
9228 #endif
9229
9230 #ifndef PERL_IN_XSUB_RE
9231 void
9232 Perl__invlist_dump(pTHX_ PerlIO *file, I32 level,
9233                          const char * const indent, SV* const invlist)
9234 {
9235     /* Designed to be called only by do_sv_dump().  Dumps out the ranges of the
9236      * inversion list 'invlist' to 'file' at 'level'  Each line is prefixed by
9237      * the string 'indent'.  The output looks like this:
9238          [0] 0x000A .. 0x000D
9239          [2] 0x0085
9240          [4] 0x2028 .. 0x2029
9241          [6] 0x3104 .. INFINITY
9242      * This means that the first range of code points matched by the list are
9243      * 0xA through 0xD; the second range contains only the single code point
9244      * 0x85, etc.  An inversion list is an array of UVs.  Two array elements
9245      * are used to define each range (except if the final range extends to
9246      * infinity, only a single element is needed).  The array index of the
9247      * first element for the corresponding range is given in brackets. */
9248
9249     UV start, end;
9250     STRLEN count = 0;
9251
9252     PERL_ARGS_ASSERT__INVLIST_DUMP;
9253
9254     if (invlist_is_iterating(invlist)) {
9255         Perl_dump_indent(aTHX_ level, file,
9256              "%sCan't dump inversion list because is in middle of iterating\n",
9257              indent);
9258         return;
9259     }
9260
9261     invlist_iterinit(invlist);
9262     while (invlist_iternext(invlist, &start, &end)) {
9263         if (end == UV_MAX) {
9264             Perl_dump_indent(aTHX_ level, file,
9265                                        "%s[%"UVuf"] 0x%04"UVXf" .. INFINITY\n",
9266                                    indent, (UV)count, start);
9267         }
9268         else if (end != start) {
9269             Perl_dump_indent(aTHX_ level, file,
9270                                     "%s[%"UVuf"] 0x%04"UVXf" .. 0x%04"UVXf"\n",
9271                                 indent, (UV)count, start,         end);
9272         }
9273         else {
9274             Perl_dump_indent(aTHX_ level, file, "%s[%"UVuf"] 0x%04"UVXf"\n",
9275                                             indent, (UV)count, start);
9276         }
9277         count += 2;
9278     }
9279 }
9280
9281 void
9282 Perl__load_PL_utf8_foldclosures (pTHX)
9283 {
9284     assert(! PL_utf8_foldclosures);
9285
9286     /* If the folds haven't been read in, call a fold function
9287      * to force that */
9288     if (! PL_utf8_tofold) {
9289         U8 dummy[UTF8_MAXBYTES_CASE+1];
9290
9291         /* This string is just a short named one above \xff */
9292         to_utf8_fold((U8*) HYPHEN_UTF8, dummy, NULL);
9293         assert(PL_utf8_tofold); /* Verify that worked */
9294     }
9295     PL_utf8_foldclosures = _swash_inversion_hash(PL_utf8_tofold);
9296 }
9297 #endif
9298
9299 #ifdef PERL_ARGS_ASSERT__INVLISTEQ
9300 bool
9301 S__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b)
9302 {
9303     /* Return a boolean as to if the two passed in inversion lists are
9304      * identical.  The final argument, if TRUE, says to take the complement of
9305      * the second inversion list before doing the comparison */
9306
9307     const UV* array_a = invlist_array(a);
9308     const UV* array_b = invlist_array(b);
9309     UV len_a = _invlist_len(a);
9310     UV len_b = _invlist_len(b);
9311
9312     UV i = 0;               /* current index into the arrays */
9313     bool retval = TRUE;     /* Assume are identical until proven otherwise */
9314
9315     PERL_ARGS_ASSERT__INVLISTEQ;
9316
9317     /* If are to compare 'a' with the complement of b, set it
9318      * up so are looking at b's complement. */
9319     if (complement_b) {
9320
9321         /* The complement of nothing is everything, so <a> would have to have
9322          * just one element, starting at zero (ending at infinity) */
9323         if (len_b == 0) {
9324             return (len_a == 1 && array_a[0] == 0);
9325         }
9326         else if (array_b[0] == 0) {
9327
9328             /* Otherwise, to complement, we invert.  Here, the first element is
9329              * 0, just remove it.  To do this, we just pretend the array starts
9330              * one later */
9331
9332             array_b++;
9333             len_b--;
9334         }
9335         else {
9336
9337             /* But if the first element is not zero, we pretend the list starts
9338              * at the 0 that is always stored immediately before the array. */
9339             array_b--;
9340             len_b++;
9341         }
9342     }
9343
9344     /* Make sure that the lengths are the same, as well as the final element
9345      * before looping through the remainder.  (Thus we test the length, final,
9346      * and first elements right off the bat) */
9347     if (len_a != len_b || array_a[len_a-1] != array_b[len_a-1]) {
9348         retval = FALSE;
9349     }
9350     else for (i = 0; i < len_a - 1; i++) {
9351         if (array_a[i] != array_b[i]) {
9352             retval = FALSE;
9353             break;
9354         }
9355     }
9356
9357     return retval;
9358 }
9359 #endif
9360
9361 /*
9362  * As best we can, determine the characters that can match the start of
9363  * the given EXACTF-ish node.
9364  *
9365  * Returns the invlist as a new SV*; it is the caller's responsibility to
9366  * call SvREFCNT_dec() when done with it.
9367  */
9368 STATIC SV*
9369 S__make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node)
9370 {
9371     const U8 * s = (U8*)STRING(node);
9372     SSize_t bytelen = STR_LEN(node);
9373     UV uc;
9374     /* Start out big enough for 2 separate code points */
9375     SV* invlist = _new_invlist(4);
9376
9377     PERL_ARGS_ASSERT__MAKE_EXACTF_INVLIST;
9378
9379     if (! UTF) {
9380         uc = *s;
9381
9382         /* We punt and assume can match anything if the node begins
9383          * with a multi-character fold.  Things are complicated.  For
9384          * example, /ffi/i could match any of:
9385          *  "\N{LATIN SMALL LIGATURE FFI}"
9386          *  "\N{LATIN SMALL LIGATURE FF}I"
9387          *  "F\N{LATIN SMALL LIGATURE FI}"
9388          *  plus several other things; and making sure we have all the
9389          *  possibilities is hard. */
9390         if (is_MULTI_CHAR_FOLD_latin1_safe(s, s + bytelen)) {
9391             invlist = _add_range_to_invlist(invlist, 0, UV_MAX);
9392         }
9393         else {
9394             /* Any Latin1 range character can potentially match any
9395              * other depending on the locale */
9396             if (OP(node) == EXACTFL) {
9397                 _invlist_union(invlist, PL_Latin1, &invlist);
9398             }
9399             else {
9400                 /* But otherwise, it matches at least itself.  We can
9401                  * quickly tell if it has a distinct fold, and if so,
9402                  * it matches that as well */
9403                 invlist = add_cp_to_invlist(invlist, uc);
9404                 if (IS_IN_SOME_FOLD_L1(uc))
9405                     invlist = add_cp_to_invlist(invlist, PL_fold_latin1[uc]);
9406             }
9407
9408             /* Some characters match above-Latin1 ones under /i.  This
9409              * is true of EXACTFL ones when the locale is UTF-8 */
9410             if (HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(uc)
9411                 && (! isASCII(uc) || (OP(node) != EXACTFA
9412                                     && OP(node) != EXACTFA_NO_TRIE)))
9413             {
9414                 add_above_Latin1_folds(pRExC_state, (U8) uc, &invlist);
9415             }
9416         }
9417     }
9418     else {  /* Pattern is UTF-8 */
9419         U8 folded[UTF8_MAX_FOLD_CHAR_EXPAND * UTF8_MAXBYTES_CASE + 1] = { '\0' };
9420         STRLEN foldlen = UTF8SKIP(s);
9421         const U8* e = s + bytelen;
9422         SV** listp;
9423
9424         uc = utf8_to_uvchr_buf(s, s + bytelen, NULL);
9425
9426         /* The only code points that aren't folded in a UTF EXACTFish
9427          * node are are the problematic ones in EXACTFL nodes */
9428         if (OP(node) == EXACTFL && is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp(uc)) {
9429             /* We need to check for the possibility that this EXACTFL
9430              * node begins with a multi-char fold.  Therefore we fold
9431              * the first few characters of it so that we can make that
9432              * check */
9433             U8 *d = folded;
9434             int i;
9435
9436             for (i = 0; i < UTF8_MAX_FOLD_CHAR_EXPAND && s < e; i++) {
9437                 if (isASCII(*s)) {
9438                     *(d++) = (U8) toFOLD(*s);
9439                     s++;
9440                 }
9441                 else {
9442                     STRLEN len;
9443                     to_utf8_fold(s, d, &len);
9444                     d += len;
9445                     s += UTF8SKIP(s);
9446                 }
9447             }
9448
9449             /* And set up so the code below that looks in this folded
9450              * buffer instead of the node's string */
9451             e = d;
9452             foldlen = UTF8SKIP(folded);
9453             s = folded;
9454         }
9455
9456         /* When we reach here 's' points to the fold of the first
9457          * character(s) of the node; and 'e' points to far enough along
9458          * the folded string to be just past any possible multi-char
9459          * fold. 'foldlen' is the length in bytes of the first
9460          * character in 's'
9461          *
9462          * Unlike the non-UTF-8 case, the macro for determining if a
9463          * string is a multi-char fold requires all the characters to
9464          * already be folded.  This is because of all the complications
9465          * if not.  Note that they are folded anyway, except in EXACTFL
9466          * nodes.  Like the non-UTF case above, we punt if the node
9467          * begins with a multi-char fold  */
9468
9469         if (is_MULTI_CHAR_FOLD_utf8_safe(s, e)) {
9470             invlist = _add_range_to_invlist(invlist, 0, UV_MAX);
9471         }
9472         else {  /* Single char fold */
9473
9474             /* It matches all the things that fold to it, which are
9475              * found in PL_utf8_foldclosures (including itself) */
9476             invlist = add_cp_to_invlist(invlist, uc);
9477             if (! PL_utf8_foldclosures)
9478                 _load_PL_utf8_foldclosures();
9479             if ((listp = hv_fetch(PL_utf8_foldclosures,
9480                                 (char *) s, foldlen, FALSE)))
9481             {
9482                 AV* list = (AV*) *listp;
9483                 IV k;
9484                 for (k = 0; k <= av_tindex(list); k++) {
9485                     SV** c_p = av_fetch(list, k, FALSE);
9486                     UV c;
9487                     assert(c_p);
9488
9489                     c = SvUV(*c_p);
9490
9491                     /* /aa doesn't allow folds between ASCII and non- */
9492                     if ((OP(node) == EXACTFA || OP(node) == EXACTFA_NO_TRIE)
9493                         && isASCII(c) != isASCII(uc))
9494                     {
9495                         continue;
9496                     }
9497
9498                     invlist = add_cp_to_invlist(invlist, c);
9499                 }
9500             }
9501         }
9502     }
9503
9504     return invlist;
9505 }
9506
9507 #undef HEADER_LENGTH
9508 #undef TO_INTERNAL_SIZE
9509 #undef FROM_INTERNAL_SIZE
9510 #undef INVLIST_VERSION_ID
9511
9512 /* End of inversion list object */
9513
9514 STATIC void
9515 S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state)
9516 {
9517     /* This parses the flags that are in either the '(?foo)' or '(?foo:bar)'
9518      * constructs, and updates RExC_flags with them.  On input, RExC_parse
9519      * should point to the first flag; it is updated on output to point to the
9520      * final ')' or ':'.  There needs to be at least one flag, or this will
9521      * abort */
9522
9523     /* for (?g), (?gc), and (?o) warnings; warning
9524        about (?c) will warn about (?g) -- japhy    */
9525
9526 #define WASTED_O  0x01
9527 #define WASTED_G  0x02
9528 #define WASTED_C  0x04
9529 #define WASTED_GC (WASTED_G|WASTED_C)
9530     I32 wastedflags = 0x00;
9531     U32 posflags = 0, negflags = 0;
9532     U32 *flagsp = &posflags;
9533     char has_charset_modifier = '\0';
9534     regex_charset cs;
9535     bool has_use_defaults = FALSE;
9536     const char* const seqstart = RExC_parse - 1; /* Point to the '?' */
9537     int x_mod_count = 0;
9538
9539     PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS;
9540
9541     /* '^' as an initial flag sets certain defaults */
9542     if (UCHARAT(RExC_parse) == '^') {
9543         RExC_parse++;
9544         has_use_defaults = TRUE;
9545         STD_PMMOD_FLAGS_CLEAR(&RExC_flags);
9546         set_regex_charset(&RExC_flags, (RExC_utf8 || RExC_uni_semantics)
9547                                         ? REGEX_UNICODE_CHARSET
9548                                         : REGEX_DEPENDS_CHARSET);
9549     }
9550
9551     cs = get_regex_charset(RExC_flags);
9552     if (cs == REGEX_DEPENDS_CHARSET
9553         && (RExC_utf8 || RExC_uni_semantics))
9554     {
9555         cs = REGEX_UNICODE_CHARSET;
9556     }
9557
9558     while (*RExC_parse) {
9559         /* && strchr("iogcmsx", *RExC_parse) */
9560         /* (?g), (?gc) and (?o) are useless here
9561            and must be globally applied -- japhy */
9562         switch (*RExC_parse) {
9563
9564             /* Code for the imsxn flags */
9565             CASE_STD_PMMOD_FLAGS_PARSE_SET(flagsp, x_mod_count);
9566
9567             case LOCALE_PAT_MOD:
9568                 if (has_charset_modifier) {
9569                     goto excess_modifier;
9570                 }
9571                 else if (flagsp == &negflags) {
9572                     goto neg_modifier;
9573                 }
9574                 cs = REGEX_LOCALE_CHARSET;
9575                 has_charset_modifier = LOCALE_PAT_MOD;
9576                 break;
9577             case UNICODE_PAT_MOD:
9578                 if (has_charset_modifier) {
9579                     goto excess_modifier;
9580                 }
9581                 else if (flagsp == &negflags) {
9582                     goto neg_modifier;
9583                 }
9584                 cs = REGEX_UNICODE_CHARSET;
9585                 has_charset_modifier = UNICODE_PAT_MOD;
9586                 break;
9587             case ASCII_RESTRICT_PAT_MOD:
9588                 if (flagsp == &negflags) {
9589                     goto neg_modifier;
9590                 }
9591                 if (has_charset_modifier) {
9592                     if (cs != REGEX_ASCII_RESTRICTED_CHARSET) {
9593                         goto excess_modifier;
9594                     }
9595                     /* Doubled modifier implies more restricted */
9596                     cs = REGEX_ASCII_MORE_RESTRICTED_CHARSET;
9597                 }
9598                 else {
9599                     cs = REGEX_ASCII_RESTRICTED_CHARSET;
9600                 }
9601                 has_charset_modifier = ASCII_RESTRICT_PAT_MOD;
9602                 break;
9603             case DEPENDS_PAT_MOD:
9604                 if (has_use_defaults) {
9605                     goto fail_modifiers;
9606                 }
9607                 else if (flagsp == &negflags) {
9608                     goto neg_modifier;
9609                 }
9610                 else if (has_charset_modifier) {
9611                     goto excess_modifier;
9612                 }
9613
9614                 /* The dual charset means unicode semantics if the
9615                  * pattern (or target, not known until runtime) are
9616                  * utf8, or something in the pattern indicates unicode
9617                  * semantics */
9618                 cs = (RExC_utf8 || RExC_uni_semantics)
9619                      ? REGEX_UNICODE_CHARSET
9620                      : REGEX_DEPENDS_CHARSET;
9621                 has_charset_modifier = DEPENDS_PAT_MOD;
9622                 break;
9623               excess_modifier:
9624                 RExC_parse++;
9625                 if (has_charset_modifier == ASCII_RESTRICT_PAT_MOD) {
9626                     vFAIL2("Regexp modifier \"%c\" may appear a maximum of twice", ASCII_RESTRICT_PAT_MOD);
9627                 }
9628                 else if (has_charset_modifier == *(RExC_parse - 1)) {
9629                     vFAIL2("Regexp modifier \"%c\" may not appear twice",
9630                                         *(RExC_parse - 1));
9631                 }
9632                 else {
9633                     vFAIL3("Regexp modifiers \"%c\" and \"%c\" are mutually exclusive", has_charset_modifier, *(RExC_parse - 1));
9634                 }
9635                 NOT_REACHED; /*NOTREACHED*/
9636               neg_modifier:
9637                 RExC_parse++;
9638                 vFAIL2("Regexp modifier \"%c\" may not appear after the \"-\"",
9639                                     *(RExC_parse - 1));
9640                 NOT_REACHED; /*NOTREACHED*/
9641             case ONCE_PAT_MOD: /* 'o' */
9642             case GLOBAL_PAT_MOD: /* 'g' */
9643                 if (PASS2 && ckWARN(WARN_REGEXP)) {
9644                     const I32 wflagbit = *RExC_parse == 'o'
9645                                          ? WASTED_O
9646                                          : WASTED_G;
9647                     if (! (wastedflags & wflagbit) ) {
9648                         wastedflags |= wflagbit;
9649                         /* diag_listed_as: Useless (?-%s) - don't use /%s modifier in regex; marked by <-- HERE in m/%s/ */
9650                         vWARN5(
9651                             RExC_parse + 1,
9652                             "Useless (%s%c) - %suse /%c modifier",
9653                             flagsp == &negflags ? "?-" : "?",
9654                             *RExC_parse,
9655                             flagsp == &negflags ? "don't " : "",
9656                             *RExC_parse
9657                         );
9658                     }
9659                 }
9660                 break;
9661
9662             case CONTINUE_PAT_MOD: /* 'c' */
9663                 if (PASS2 && ckWARN(WARN_REGEXP)) {
9664                     if (! (wastedflags & WASTED_C) ) {
9665                         wastedflags |= WASTED_GC;
9666                         /* diag_listed_as: Useless (?-%s) - don't use /%s modifier in regex; marked by <-- HERE in m/%s/ */
9667                         vWARN3(
9668                             RExC_parse + 1,
9669                             "Useless (%sc) - %suse /gc modifier",
9670                             flagsp == &negflags ? "?-" : "?",
9671                             flagsp == &negflags ? "don't " : ""
9672                         );
9673                     }
9674                 }
9675                 break;
9676             case KEEPCOPY_PAT_MOD: /* 'p' */
9677                 if (flagsp == &negflags) {
9678                     if (PASS2)
9679                         ckWARNreg(RExC_parse + 1,"Useless use of (?-p)");
9680                 } else {
9681                     *flagsp |= RXf_PMf_KEEPCOPY;
9682                 }
9683                 break;
9684             case '-':
9685                 /* A flag is a default iff it is following a minus, so
9686                  * if there is a minus, it means will be trying to
9687                  * re-specify a default which is an error */
9688                 if (has_use_defaults || flagsp == &negflags) {
9689                     goto fail_modifiers;
9690                 }
9691                 flagsp = &negflags;
9692                 wastedflags = 0;  /* reset so (?g-c) warns twice */
9693                 break;
9694             case ':':
9695             case ')':
9696                 RExC_flags |= posflags;
9697                 RExC_flags &= ~negflags;
9698                 set_regex_charset(&RExC_flags, cs);
9699                 if (RExC_flags & RXf_PMf_FOLD) {
9700                     RExC_contains_i = 1;
9701                 }
9702                 if (PASS2) {
9703                     STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
9704                 }
9705                 return;
9706                 /*NOTREACHED*/
9707             default:
9708               fail_modifiers:
9709                 RExC_parse += SKIP_IF_CHAR(RExC_parse);
9710                 /* diag_listed_as: Sequence (?%s...) not recognized in regex; marked by <-- HERE in m/%s/ */
9711                 vFAIL2utf8f("Sequence (%"UTF8f"...) not recognized",
9712                       UTF8fARG(UTF, RExC_parse-seqstart, seqstart));
9713                 NOT_REACHED; /*NOTREACHED*/
9714         }
9715
9716         ++RExC_parse;
9717     }
9718
9719     if (PASS2) {
9720         STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count);
9721     }
9722 }
9723
9724 /*
9725  - reg - regular expression, i.e. main body or parenthesized thing
9726  *
9727  * Caller must absorb opening parenthesis.
9728  *
9729  * Combining parenthesis handling with the base level of regular expression
9730  * is a trifle forced, but the need to tie the tails of the branches to what
9731  * follows makes it hard to avoid.
9732  */
9733 #define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
9734 #ifdef DEBUGGING
9735 #define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
9736 #else
9737 #define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
9738 #endif
9739
9740 /* Returns NULL, setting *flagp to TRYAGAIN at the end of (?) that only sets
9741    flags. Returns NULL, setting *flagp to RESTART_UTF8 if the sizing scan
9742    needs to be restarted.
9743    Otherwise would only return NULL if regbranch() returns NULL, which
9744    cannot happen.  */
9745 STATIC regnode *
9746 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
9747     /* paren: Parenthesized? 0=top; 1,2=inside '(': changed to letter.
9748      * 2 is like 1, but indicates that nextchar() has been called to advance
9749      * RExC_parse beyond the '('.  Things like '(?' are indivisible tokens, and
9750      * this flag alerts us to the need to check for that */
9751 {
9752     regnode *ret;               /* Will be the head of the group. */
9753     regnode *br;
9754     regnode *lastbr;
9755     regnode *ender = NULL;
9756     I32 parno = 0;
9757     I32 flags;
9758     U32 oregflags = RExC_flags;
9759     bool have_branch = 0;
9760     bool is_open = 0;
9761     I32 freeze_paren = 0;
9762     I32 after_freeze = 0;
9763     I32 num; /* numeric backreferences */
9764
9765     char * parse_start = RExC_parse; /* MJD */
9766     char * const oregcomp_parse = RExC_parse;
9767
9768     GET_RE_DEBUG_FLAGS_DECL;
9769
9770     PERL_ARGS_ASSERT_REG;
9771     DEBUG_PARSE("reg ");
9772
9773     *flagp = 0;                         /* Tentatively. */
9774
9775
9776     /* Make an OPEN node, if parenthesized. */
9777     if (paren) {
9778
9779         /* Under /x, space and comments can be gobbled up between the '(' and
9780          * here (if paren ==2).  The forms '(*VERB' and '(?...' disallow such
9781          * intervening space, as the sequence is a token, and a token should be
9782          * indivisible */
9783         bool has_intervening_patws = paren == 2 && *(RExC_parse - 1) != '(';
9784
9785         if ( *RExC_parse == '*') { /* (*VERB:ARG) */
9786             char *start_verb = RExC_parse;
9787             STRLEN verb_len = 0;
9788             char *start_arg = NULL;
9789             unsigned char op = 0;
9790             int argok = 1;
9791             int internal_argval = 0; /* internal_argval is only useful if
9792                                         !argok */
9793
9794             if (has_intervening_patws) {
9795                 RExC_parse++;
9796                 vFAIL("In '(*VERB...)', the '(' and '*' must be adjacent");
9797             }
9798             while ( *RExC_parse && *RExC_parse != ')' ) {
9799                 if ( *RExC_parse == ':' ) {
9800                     start_arg = RExC_parse + 1;
9801                     break;
9802                 }
9803                 RExC_parse++;
9804             }
9805             ++start_verb;
9806             verb_len = RExC_parse - start_verb;
9807             if ( start_arg ) {
9808                 RExC_parse++;
9809                 while ( *RExC_parse && *RExC_parse != ')' )
9810                     RExC_parse++;
9811                 if ( *RExC_parse != ')' )
9812                     vFAIL("Unterminated verb pattern argument");
9813                 if ( RExC_parse == start_arg )
9814                     start_arg = NULL;
9815             } else {
9816                 if ( *RExC_parse != ')' )
9817                     vFAIL("Unterminated verb pattern");
9818             }
9819
9820             switch ( *start_verb ) {
9821             case 'A':  /* (*ACCEPT) */
9822                 if ( memEQs(start_verb,verb_len,"ACCEPT") ) {
9823                     op = ACCEPT;
9824                     internal_argval = RExC_nestroot;
9825                 }
9826                 break;
9827             case 'C':  /* (*COMMIT) */
9828                 if ( memEQs(start_verb,verb_len,"COMMIT") )
9829                     op = COMMIT;
9830                 break;
9831             case 'F':  /* (*FAIL) */
9832                 if ( verb_len==1 || memEQs(start_verb,verb_len,"FAIL") ) {
9833                     op = OPFAIL;
9834                     argok = 0;
9835                 }
9836                 break;
9837             case ':':  /* (*:NAME) */
9838             case 'M':  /* (*MARK:NAME) */
9839                 if ( verb_len==0 || memEQs(start_verb,verb_len,"MARK") ) {
9840                     op = MARKPOINT;
9841                     argok = -1;
9842                 }
9843                 break;
9844             case 'P':  /* (*PRUNE) */
9845                 if ( memEQs(start_verb,verb_len,"PRUNE") )
9846                     op = PRUNE;
9847                 break;
9848             case 'S':   /* (*SKIP) */
9849                 if ( memEQs(start_verb,verb_len,"SKIP") )
9850                     op = SKIP;
9851                 break;
9852             case 'T':  /* (*THEN) */
9853                 /* [19:06] <TimToady> :: is then */
9854                 if ( memEQs(start_verb,verb_len,"THEN") ) {
9855                     op = CUTGROUP;
9856                     RExC_seen |= REG_CUTGROUP_SEEN;
9857                 }
9858                 break;
9859             }
9860             if ( ! op ) {
9861                 RExC_parse += UTF ? UTF8SKIP(RExC_parse) : 1;
9862                 vFAIL2utf8f(
9863                     "Unknown verb pattern '%"UTF8f"'",
9864                     UTF8fARG(UTF, verb_len, start_verb));
9865             }
9866             if ( argok ) {
9867                 if ( start_arg && internal_argval ) {
9868                     vFAIL3("Verb pattern '%.*s' may not have an argument",
9869                         verb_len, start_verb);
9870                 } else if ( argok < 0 && !start_arg ) {
9871                     vFAIL3("Verb pattern '%.*s' has a mandatory argument",
9872                         verb_len, start_verb);
9873                 } else {
9874                     ret = reganode(pRExC_state, op, internal_argval);
9875                     if ( ! internal_argval && ! SIZE_ONLY ) {
9876                         if (start_arg) {
9877                             SV *sv = newSVpvn( start_arg,
9878                                                RExC_parse - start_arg);
9879                             ARG(ret) = add_data( pRExC_state,
9880                                                  STR_WITH_LEN("S"));
9881                             RExC_rxi->data->data[ARG(ret)]=(void*)sv;
9882                             ret->flags = 0;
9883                         } else {
9884                             ret->flags = 1;
9885                         }
9886                     }
9887                 }
9888                 if (!internal_argval)
9889                     RExC_seen |= REG_VERBARG_SEEN;
9890             } else if ( start_arg ) {
9891                 vFAIL3("Verb pattern '%.*s' may not have an argument",
9892                         verb_len, start_verb);
9893             } else {
9894                 ret = reg_node(pRExC_state, op);
9895             }
9896             nextchar(pRExC_state);
9897             return ret;
9898         }
9899         else if (*RExC_parse == '?') { /* (?...) */
9900             bool is_logical = 0;
9901             const char * const seqstart = RExC_parse;
9902             const char * endptr;
9903             if (has_intervening_patws) {
9904                 RExC_parse++;
9905                 vFAIL("In '(?...)', the '(' and '?' must be adjacent");
9906             }
9907
9908             RExC_parse++;
9909             paren = *RExC_parse++;
9910             ret = NULL;                 /* For look-ahead/behind. */
9911             switch (paren) {
9912
9913             case 'P':   /* (?P...) variants for those used to PCRE/Python */
9914                 paren = *RExC_parse++;
9915                 if ( paren == '<')         /* (?P<...>) named capture */
9916                     goto named_capture;
9917                 else if (paren == '>') {   /* (?P>name) named recursion */
9918                     goto named_recursion;
9919                 }
9920                 else if (paren == '=') {   /* (?P=...)  named backref */
9921                     /* this pretty much dupes the code for \k<NAME> in
9922                      * regatom(), if you change this make sure you change that
9923                      * */
9924                     char* name_start = RExC_parse;
9925                     U32 num = 0;
9926                     SV *sv_dat = reg_scan_name(pRExC_state,
9927                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
9928                     if (RExC_parse == name_start || *RExC_parse != ')')
9929                         /* diag_listed_as: Sequence ?P=... not terminated in regex; marked by <-- HERE in m/%s/ */
9930                         vFAIL2("Sequence %.3s... not terminated",parse_start);
9931
9932                     if (!SIZE_ONLY) {
9933                         num = add_data( pRExC_state, STR_WITH_LEN("S"));
9934                         RExC_rxi->data->data[num]=(void*)sv_dat;
9935                         SvREFCNT_inc_simple_void(sv_dat);
9936                     }
9937                     RExC_sawback = 1;
9938                     ret = reganode(pRExC_state,
9939                                    ((! FOLD)
9940                                      ? NREF
9941                                      : (ASCII_FOLD_RESTRICTED)
9942                                        ? NREFFA
9943                                        : (AT_LEAST_UNI_SEMANTICS)
9944                                          ? NREFFU
9945                                          : (LOC)
9946                                            ? NREFFL
9947                                            : NREFF),
9948                                     num);
9949                     *flagp |= HASWIDTH;
9950
9951                     Set_Node_Offset(ret, parse_start+1);
9952                     Set_Node_Cur_Length(ret, parse_start);
9953
9954                     nextchar(pRExC_state);
9955                     return ret;
9956                 }
9957                 --RExC_parse;
9958                 RExC_parse += SKIP_IF_CHAR(RExC_parse);
9959                 /* diag_listed_as: Sequence (?%s...) not recognized in regex; marked by <-- HERE in m/%s/ */
9960                 vFAIL3("Sequence (%.*s...) not recognized",
9961                                 RExC_parse-seqstart, seqstart);
9962                 NOT_REACHED; /*NOTREACHED*/
9963             case '<':           /* (?<...) */
9964                 if (*RExC_parse == '!')
9965                     paren = ',';
9966                 else if (*RExC_parse != '=')
9967               named_capture:
9968                 {               /* (?<...>) */
9969                     char *name_start;
9970                     SV *svname;
9971                     paren= '>';
9972             case '\'':          /* (?'...') */
9973                     name_start= RExC_parse;
9974                     svname = reg_scan_name(pRExC_state,
9975                         SIZE_ONLY    /* reverse test from the others */
9976                         ? REG_RSN_RETURN_NAME
9977                         : REG_RSN_RETURN_NULL);
9978                     if (RExC_parse == name_start || *RExC_parse != paren)
9979                         vFAIL2("Sequence (?%c... not terminated",
9980                             paren=='>' ? '<' : paren);
9981                     if (SIZE_ONLY) {
9982                         HE *he_str;
9983                         SV *sv_dat = NULL;
9984                         if (!svname) /* shouldn't happen */
9985                             Perl_croak(aTHX_
9986                                 "panic: reg_scan_name returned NULL");
9987                         if (!RExC_paren_names) {
9988                             RExC_paren_names= newHV();
9989                             sv_2mortal(MUTABLE_SV(RExC_paren_names));
9990 #ifdef DEBUGGING
9991                             RExC_paren_name_list= newAV();
9992                             sv_2mortal(MUTABLE_SV(RExC_paren_name_list));
9993 #endif
9994                         }
9995                         he_str = hv_fetch_ent( RExC_paren_names, svname, 1, 0 );
9996                         if ( he_str )
9997                             sv_dat = HeVAL(he_str);
9998                         if ( ! sv_dat ) {
9999                             /* croak baby croak */
10000                             Perl_croak(aTHX_
10001                                 "panic: paren_name hash element allocation failed");
10002                         } else if ( SvPOK(sv_dat) ) {
10003                             /* (?|...) can mean we have dupes so scan to check
10004                                its already been stored. Maybe a flag indicating
10005                                we are inside such a construct would be useful,
10006                                but the arrays are likely to be quite small, so
10007                                for now we punt -- dmq */
10008                             IV count = SvIV(sv_dat);
10009                             I32 *pv = (I32*)SvPVX(sv_dat);
10010                             IV i;
10011                             for ( i = 0 ; i < count ; i++ ) {
10012                                 if ( pv[i] == RExC_npar ) {
10013                                     count = 0;
10014                                     break;
10015                                 }
10016                             }
10017                             if ( count ) {
10018                                 pv = (I32*)SvGROW(sv_dat,
10019                                                 SvCUR(sv_dat) + sizeof(I32)+1);
10020                                 SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
10021                                 pv[count] = RExC_npar;
10022                                 SvIV_set(sv_dat, SvIVX(sv_dat) + 1);
10023                             }
10024                         } else {
10025                             (void)SvUPGRADE(sv_dat,SVt_PVNV);
10026                             sv_setpvn(sv_dat, (char *)&(RExC_npar),
10027                                                                 sizeof(I32));
10028                             SvIOK_on(sv_dat);
10029                             SvIV_set(sv_dat, 1);
10030                         }
10031 #ifdef DEBUGGING
10032                         /* Yes this does cause a memory leak in debugging Perls
10033                          * */
10034                         if (!av_store(RExC_paren_name_list,
10035                                       RExC_npar, SvREFCNT_inc(svname)))
10036                             SvREFCNT_dec_NN(svname);
10037 #endif
10038
10039                         /*sv_dump(sv_dat);*/
10040                     }
10041                     nextchar(pRExC_state);
10042                     paren = 1;
10043                     goto capturing_parens;
10044                 }
10045                 RExC_seen |= REG_LOOKBEHIND_SEEN;
10046                 RExC_in_lookbehind++;
10047                 RExC_parse++;
10048                 /* FALLTHROUGH */
10049             case '=':           /* (?=...) */
10050                 RExC_seen_zerolen++;
10051                 break;
10052             case '!':           /* (?!...) */
10053                 RExC_seen_zerolen++;
10054                 /* check if we're really just a "FAIL" assertion */
10055                 --RExC_parse;
10056                 nextchar(pRExC_state);
10057                 if (*RExC_parse == ')') {
10058                     ret=reg_node(pRExC_state, OPFAIL);
10059                     nextchar(pRExC_state);
10060                     return ret;
10061                 }
10062                 break;
10063             case '|':           /* (?|...) */
10064                 /* branch reset, behave like a (?:...) except that
10065                    buffers in alternations share the same numbers */
10066                 paren = ':';
10067                 after_freeze = freeze_paren = RExC_npar;
10068                 break;
10069             case ':':           /* (?:...) */
10070             case '>':           /* (?>...) */
10071                 break;
10072             case '$':           /* (?$...) */
10073             case '@':           /* (?@...) */
10074                 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
10075                 break;
10076             case '0' :           /* (?0) */
10077             case 'R' :           /* (?R) */
10078                 if (*RExC_parse != ')')
10079                     FAIL("Sequence (?R) not terminated");
10080                 ret = reg_node(pRExC_state, GOSTART);
10081                     RExC_seen |= REG_GOSTART_SEEN;
10082                 *flagp |= POSTPONED;
10083                 nextchar(pRExC_state);
10084                 return ret;
10085                 /*notreached*/
10086             /* named and numeric backreferences */
10087             case '&':            /* (?&NAME) */
10088                 parse_start = RExC_parse - 1;
10089               named_recursion:
10090                 {
10091                     SV *sv_dat = reg_scan_name(pRExC_state,
10092                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
10093                      num = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
10094                 }
10095                 if (RExC_parse == RExC_end || *RExC_parse != ')')
10096                     vFAIL("Sequence (?&... not terminated");
10097                 goto gen_recurse_regop;
10098                 /* NOTREACHED */
10099             case '+':
10100                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
10101                     RExC_parse++;
10102                     vFAIL("Illegal pattern");
10103                 }
10104                 goto parse_recursion;
10105                 /* NOTREACHED*/
10106             case '-': /* (?-1) */
10107                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
10108                     RExC_parse--; /* rewind to let it be handled later */
10109                     goto parse_flags;
10110                 }
10111                 /* FALLTHROUGH */
10112             case '1': case '2': case '3': case '4': /* (?1) */
10113             case '5': case '6': case '7': case '8': case '9':
10114                 RExC_parse--;
10115               parse_recursion:
10116                 {
10117                     bool is_neg = FALSE;
10118                     UV unum;
10119                     parse_start = RExC_parse - 1; /* MJD */
10120                     if (*RExC_parse == '-') {
10121                         RExC_parse++;
10122                         is_neg = TRUE;
10123                     }
10124                     unum = grok_atou(RExC_parse, &endptr);
10125                     num = (unum > I32_MAX) ? I32_MAX : (I32)unum;
10126                     if (endptr)
10127                         RExC_parse = (char*)endptr;
10128                     if (is_neg) {
10129                         /* Some limit for num? */
10130                         num = -num;
10131                     }
10132                 }
10133                 if (*RExC_parse!=')')
10134                     vFAIL("Expecting close bracket");
10135
10136               gen_recurse_regop:
10137                 if ( paren == '-' ) {
10138                     /*
10139                     Diagram of capture buffer numbering.
10140                     Top line is the normal capture buffer numbers
10141                     Bottom line is the negative indexing as from
10142                     the X (the (?-2))
10143
10144                     +   1 2    3 4 5 X          6 7
10145                        /(a(x)y)(a(b(c(?-2)d)e)f)(g(h))/
10146                     -   5 4    3 2 1 X          x x
10147
10148                     */
10149                     num = RExC_npar + num;
10150                     if (num < 1)  {
10151                         RExC_parse++;
10152                         vFAIL("Reference to nonexistent group");
10153                     }
10154                 } else if ( paren == '+' ) {
10155                     num = RExC_npar + num - 1;
10156                 }
10157
10158                 ret = reg2Lanode(pRExC_state, GOSUB, num, RExC_recurse_count);
10159                 if (!SIZE_ONLY) {
10160                     if (num > (I32)RExC_rx->nparens) {
10161                         RExC_parse++;
10162                         vFAIL("Reference to nonexistent group");
10163                     }
10164                     RExC_recurse_count++;
10165                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
10166                         "%*s%*s Recurse #%"UVuf" to %"IVdf"\n",
10167                               22, "|    |", (int)(depth * 2 + 1), "",
10168                               (UV)ARG(ret), (IV)ARG2L(ret)));
10169                 }
10170                 RExC_seen |= REG_RECURSE_SEEN;
10171                 Set_Node_Length(ret, 1 + regarglen[OP(ret)]); /* MJD */
10172                 Set_Node_Offset(ret, parse_start); /* MJD */
10173
10174                 *flagp |= POSTPONED;
10175                 nextchar(pRExC_state);
10176                 return ret;
10177
10178             /* NOTREACHED */
10179
10180             case '?':           /* (??...) */
10181                 is_logical = 1;
10182                 if (*RExC_parse != '{') {
10183                     RExC_parse += SKIP_IF_CHAR(RExC_parse);
10184                     /* diag_listed_as: Sequence (?%s...) not recognized in regex; marked by <-- HERE in m/%s/ */
10185                     vFAIL2utf8f(
10186                         "Sequence (%"UTF8f"...) not recognized",
10187                         UTF8fARG(UTF, RExC_parse-seqstart, seqstart));
10188                     NOT_REACHED; /*NOTREACHED*/
10189                 }
10190                 *flagp |= POSTPONED;
10191                 paren = *RExC_parse++;
10192                 /* FALLTHROUGH */
10193             case '{':           /* (?{...}) */
10194             {
10195                 U32 n = 0;
10196                 struct reg_code_block *cb;
10197
10198                 RExC_seen_zerolen++;
10199
10200                 if (   !pRExC_state->num_code_blocks
10201                     || pRExC_state->code_index >= pRExC_state->num_code_blocks
10202                     || pRExC_state->code_blocks[pRExC_state->code_index].start
10203                         != (STRLEN)((RExC_parse -3 - (is_logical ? 1 : 0))
10204                             - RExC_start)
10205                 ) {
10206                     if (RExC_pm_flags & PMf_USE_RE_EVAL)
10207                         FAIL("panic: Sequence (?{...}): no code block found\n");
10208                     FAIL("Eval-group not allowed at runtime, use re 'eval'");
10209                 }
10210                 /* this is a pre-compiled code block (?{...}) */
10211                 cb = &pRExC_state->code_blocks[pRExC_state->code_index];
10212                 RExC_parse = RExC_start + cb->end;
10213                 if (!SIZE_ONLY) {
10214                     OP *o = cb->block;
10215                     if (cb->src_regex) {
10216                         n = add_data(pRExC_state, STR_WITH_LEN("rl"));
10217                         RExC_rxi->data->data[n] =
10218                             (void*)SvREFCNT_inc((SV*)cb->src_regex);
10219                         RExC_rxi->data->data[n+1] = (void*)o;
10220                     }
10221                     else {
10222                         n = add_data(pRExC_state,
10223                                (RExC_pm_flags & PMf_HAS_CV) ? "L" : "l", 1);
10224                         RExC_rxi->data->data[n] = (void*)o;
10225                     }
10226                 }
10227                 pRExC_state->code_index++;
10228                 nextchar(pRExC_state);
10229
10230                 if (is_logical) {
10231                     regnode *eval;
10232                     ret = reg_node(pRExC_state, LOGICAL);
10233
10234                     eval = reg2Lanode(pRExC_state, EVAL,
10235                                        n,
10236
10237                                        /* for later propagation into (??{})
10238                                         * return value */
10239                                        RExC_flags & RXf_PMf_COMPILETIME
10240                                       );
10241                     if (!SIZE_ONLY) {
10242                         ret->flags = 2;
10243                     }
10244                     REGTAIL(pRExC_state, ret, eval);
10245                     /* deal with the length of this later - MJD */
10246                     return ret;
10247                 }
10248                 ret = reg2Lanode(pRExC_state, EVAL, n, 0);
10249                 Set_Node_Length(ret, RExC_parse - parse_start + 1);
10250                 Set_Node_Offset(ret, parse_start);
10251                 return ret;
10252             }
10253             case '(':           /* (?(?{...})...) and (?(?=...)...) */
10254             {
10255                 int is_define= 0;
10256                 const int DEFINE_len = sizeof("DEFINE") - 1;
10257                 if (RExC_parse[0] == '?') {        /* (?(?...)) */
10258                     if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
10259                         || RExC_parse[1] == '<'
10260                         || RExC_parse[1] == '{') { /* Lookahead or eval. */
10261                         I32 flag;
10262                         regnode *tail;
10263
10264                         ret = reg_node(pRExC_state, LOGICAL);
10265                         if (!SIZE_ONLY)
10266                             ret->flags = 1;
10267
10268                         tail = reg(pRExC_state, 1, &flag, depth+1);
10269                         if (flag & RESTART_UTF8) {
10270                             *flagp = RESTART_UTF8;
10271                             return NULL;
10272                         }
10273                         REGTAIL(pRExC_state, ret, tail);
10274                         goto insert_if;
10275                     }
10276                     /* Fall through to â€˜Unknown switch condition’ at the
10277                        end of the if/else chain. */
10278                 }
10279                 else if ( RExC_parse[0] == '<'     /* (?(<NAME>)...) */
10280                          || RExC_parse[0] == '\'' ) /* (?('NAME')...) */
10281                 {
10282                     char ch = RExC_parse[0] == '<' ? '>' : '\'';
10283                     char *name_start= RExC_parse++;
10284                     U32 num = 0;
10285                     SV *sv_dat=reg_scan_name(pRExC_state,
10286                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
10287                     if (RExC_parse == name_start || *RExC_parse != ch)
10288                         vFAIL2("Sequence (?(%c... not terminated",
10289                             (ch == '>' ? '<' : ch));
10290                     RExC_parse++;
10291                     if (!SIZE_ONLY) {
10292                         num = add_data( pRExC_state, STR_WITH_LEN("S"));
10293                         RExC_rxi->data->data[num]=(void*)sv_dat;
10294                         SvREFCNT_inc_simple_void(sv_dat);
10295                     }
10296                     ret = reganode(pRExC_state,NGROUPP,num);
10297                     goto insert_if_check_paren;
10298                 }
10299                 else if (RExC_end - RExC_parse >= DEFINE_len
10300                         && strnEQ(RExC_parse, "DEFINE", DEFINE_len))
10301                 {
10302                     ret = reganode(pRExC_state,DEFINEP,0);
10303                     RExC_parse += DEFINE_len;
10304                     is_define = 1;
10305                     goto insert_if_check_paren;
10306                 }
10307                 else if (RExC_parse[0] == 'R') {
10308                     RExC_parse++;
10309                     parno = 0;
10310                     if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
10311                         parno = grok_atou(RExC_parse, &endptr);
10312                         if (endptr)
10313                             RExC_parse = (char*)endptr;
10314                     } else if (RExC_parse[0] == '&') {
10315                         SV *sv_dat;
10316                         RExC_parse++;
10317                         sv_dat = reg_scan_name(pRExC_state,
10318                             SIZE_ONLY
10319                             ? REG_RSN_RETURN_NULL
10320                             : REG_RSN_RETURN_DATA);
10321                         parno = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
10322                     }
10323                     ret = reganode(pRExC_state,INSUBP,parno);
10324                     goto insert_if_check_paren;
10325                 }
10326                 else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
10327                     /* (?(1)...) */
10328                     char c;
10329                     char *tmp;
10330                     parno = grok_atou(RExC_parse, &endptr);
10331                     if (endptr)
10332                         RExC_parse = (char*)endptr;
10333                     ret = reganode(pRExC_state, GROUPP, parno);
10334
10335                  insert_if_check_paren:
10336                     if (*(tmp = nextchar(pRExC_state)) != ')') {
10337                         /* nextchar also skips comments, so undo its work
10338                          * and skip over the the next character.
10339                          */
10340                         RExC_parse = tmp;
10341                         RExC_parse += UTF ? UTF8SKIP(RExC_parse) : 1;
10342                         vFAIL("Switch condition not recognized");
10343                     }
10344                   insert_if:
10345                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
10346                     br = regbranch(pRExC_state, &flags, 1,depth+1);
10347                     if (br == NULL) {
10348                         if (flags & RESTART_UTF8) {
10349                             *flagp = RESTART_UTF8;
10350                             return NULL;
10351                         }
10352                         FAIL2("panic: regbranch returned NULL, flags=%#"UVxf"",
10353                               (UV) flags);
10354                     } else
10355                         REGTAIL(pRExC_state, br, reganode(pRExC_state,
10356                                                           LONGJMP, 0));
10357                     c = *nextchar(pRExC_state);
10358                     if (flags&HASWIDTH)
10359                         *flagp |= HASWIDTH;
10360                     if (c == '|') {
10361                         if (is_define)
10362                             vFAIL("(?(DEFINE)....) does not allow branches");
10363
10364                         /* Fake one for optimizer.  */
10365                         lastbr = reganode(pRExC_state, IFTHEN, 0);
10366
10367                         if (!regbranch(pRExC_state, &flags, 1,depth+1)) {
10368                             if (flags & RESTART_UTF8) {
10369                                 *flagp = RESTART_UTF8;
10370                                 return NULL;
10371                             }
10372                             FAIL2("panic: regbranch returned NULL, flags=%#"UVxf"",
10373                                   (UV) flags);
10374                         }
10375                         REGTAIL(pRExC_state, ret, lastbr);
10376                         if (flags&HASWIDTH)
10377                             *flagp |= HASWIDTH;
10378                         c = *nextchar(pRExC_state);
10379                     }
10380                     else
10381                         lastbr = NULL;
10382                     if (c != ')') {
10383                         if (RExC_parse>RExC_end)
10384                             vFAIL("Switch (?(condition)... not terminated");
10385                         else
10386                             vFAIL("Switch (?(condition)... contains too many branches");
10387                     }
10388                     ender = reg_node(pRExC_state, TAIL);
10389                     REGTAIL(pRExC_state, br, ender);
10390                     if (lastbr) {
10391                         REGTAIL(pRExC_state, lastbr, ender);
10392                         REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
10393                     }
10394                     else
10395                         REGTAIL(pRExC_state, ret, ender);
10396                     RExC_size++; /* XXX WHY do we need this?!!
10397                                     For large programs it seems to be required
10398                                     but I can't figure out why. -- dmq*/
10399                     return ret;
10400                 }
10401                 RExC_parse += UTF ? UTF8SKIP(RExC_parse) : 1;
10402                 vFAIL("Unknown switch condition (?(...))");
10403             }
10404             case '[':           /* (?[ ... ]) */
10405                 return handle_regex_sets(pRExC_state, NULL, flagp, depth,
10406                                          oregcomp_parse);
10407             case 0:
10408                 RExC_parse--; /* for vFAIL to print correctly */
10409                 vFAIL("Sequence (? incomplete");
10410                 break;
10411             default: /* e.g., (?i) */
10412                 --RExC_parse;
10413               parse_flags:
10414                 parse_lparen_question_flags(pRExC_state);
10415                 if (UCHARAT(RExC_parse) != ':') {
10416                     if (*RExC_parse)
10417                         nextchar(pRExC_state);
10418                     *flagp = TRYAGAIN;
10419                     return NULL;
10420                 }
10421                 paren = ':';
10422                 nextchar(pRExC_state);
10423                 ret = NULL;
10424                 goto parse_rest;
10425             } /* end switch */
10426         }
10427         else if (!(RExC_flags & RXf_PMf_NOCAPTURE)) {   /* (...) */
10428           capturing_parens:
10429             parno = RExC_npar;
10430             RExC_npar++;
10431
10432             ret = reganode(pRExC_state, OPEN, parno);
10433             if (!SIZE_ONLY ){
10434                 if (!RExC_nestroot)
10435                     RExC_nestroot = parno;
10436                 if (RExC_seen & REG_RECURSE_SEEN
10437                     && !RExC_open_parens[parno-1])
10438                 {
10439                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
10440                         "%*s%*s Setting open paren #%"IVdf" to %d\n",
10441                         22, "|    |", (int)(depth * 2 + 1), "",
10442                         (IV)parno, REG_NODE_NUM(ret)));
10443                     RExC_open_parens[parno-1]= ret;
10444                 }
10445             }
10446             Set_Node_Length(ret, 1); /* MJD */
10447             Set_Node_Offset(ret, RExC_parse); /* MJD */
10448             is_open = 1;
10449         } else {
10450             /* with RXf_PMf_NOCAPTURE treat (...) as (?:...) */
10451             paren = ':';
10452             ret = NULL;
10453         }
10454     }
10455     else                        /* ! paren */
10456         ret = NULL;
10457
10458    parse_rest:
10459     /* Pick up the branches, linking them together. */
10460     parse_start = RExC_parse;   /* MJD */
10461     br = regbranch(pRExC_state, &flags, 1,depth+1);
10462
10463     /*     branch_len = (paren != 0); */
10464
10465     if (br == NULL) {
10466         if (flags & RESTART_UTF8) {
10467             *flagp = RESTART_UTF8;
10468             return NULL;
10469         }
10470         FAIL2("panic: regbranch returned NULL, flags=%#"UVxf"", (UV) flags);
10471     }
10472     if (*RExC_parse == '|') {
10473         if (!SIZE_ONLY && RExC_extralen) {
10474             reginsert(pRExC_state, BRANCHJ, br, depth+1);
10475         }
10476         else {                  /* MJD */
10477             reginsert(pRExC_state, BRANCH, br, depth+1);
10478             Set_Node_Length(br, paren != 0);
10479             Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
10480         }
10481         have_branch = 1;
10482         if (SIZE_ONLY)
10483             RExC_extralen += 1;         /* For BRANCHJ-BRANCH. */
10484     }
10485     else if (paren == ':') {
10486         *flagp |= flags&SIMPLE;
10487     }
10488     if (is_open) {                              /* Starts with OPEN. */
10489         REGTAIL(pRExC_state, ret, br);          /* OPEN -> first. */
10490     }
10491     else if (paren != '?')              /* Not Conditional */
10492         ret = br;
10493     *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
10494     lastbr = br;
10495     while (*RExC_parse == '|') {
10496         if (!SIZE_ONLY && RExC_extralen) {
10497             ender = reganode(pRExC_state, LONGJMP,0);
10498
10499             /* Append to the previous. */
10500             REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
10501         }
10502         if (SIZE_ONLY)
10503             RExC_extralen += 2;         /* Account for LONGJMP. */
10504         nextchar(pRExC_state);
10505         if (freeze_paren) {
10506             if (RExC_npar > after_freeze)
10507                 after_freeze = RExC_npar;
10508             RExC_npar = freeze_paren;
10509         }
10510         br = regbranch(pRExC_state, &flags, 0, depth+1);
10511
10512         if (br == NULL) {
10513             if (flags & RESTART_UTF8) {
10514                 *flagp = RESTART_UTF8;
10515                 return NULL;
10516             }
10517             FAIL2("panic: regbranch returned NULL, flags=%#"UVxf"", (UV) flags);
10518         }
10519         REGTAIL(pRExC_state, lastbr, br);               /* BRANCH -> BRANCH. */
10520         lastbr = br;
10521         *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
10522     }
10523
10524     if (have_branch || paren != ':') {
10525         /* Make a closing node, and hook it on the end. */
10526         switch (paren) {
10527         case ':':
10528             ender = reg_node(pRExC_state, TAIL);
10529             break;
10530         case 1: case 2:
10531             ender = reganode(pRExC_state, CLOSE, parno);
10532             if (!SIZE_ONLY && RExC_seen & REG_RECURSE_SEEN) {
10533                 DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
10534                         "%*s%*s Setting close paren #%"IVdf" to %d\n",
10535                         22, "|    |", (int)(depth * 2 + 1), "", (IV)parno, REG_NODE_NUM(ender)));
10536                 RExC_close_parens[parno-1]= ender;
10537                 if (RExC_nestroot == parno)
10538                     RExC_nestroot = 0;
10539             }
10540             Set_Node_Offset(ender,RExC_parse+1); /* MJD */
10541             Set_Node_Length(ender,1); /* MJD */
10542             break;
10543         case '<':
10544         case ',':
10545         case '=':
10546         case '!':
10547             *flagp &= ~HASWIDTH;
10548             /* FALLTHROUGH */
10549         case '>':
10550             ender = reg_node(pRExC_state, SUCCEED);
10551             break;
10552         case 0:
10553             ender = reg_node(pRExC_state, END);
10554             if (!SIZE_ONLY) {
10555                 assert(!RExC_opend); /* there can only be one! */
10556                 RExC_opend = ender;
10557             }
10558             break;
10559         }
10560         DEBUG_PARSE_r(if (!SIZE_ONLY) {
10561             DEBUG_PARSE_MSG("lsbr");
10562             regprop(RExC_rx, RExC_mysv1, lastbr, NULL, pRExC_state);
10563             regprop(RExC_rx, RExC_mysv2, ender, NULL, pRExC_state);
10564             PerlIO_printf(Perl_debug_log, "~ tying lastbr %s (%"IVdf") to ender %s (%"IVdf") offset %"IVdf"\n",
10565                           SvPV_nolen_const(RExC_mysv1),
10566                           (IV)REG_NODE_NUM(lastbr),
10567                           SvPV_nolen_const(RExC_mysv2),
10568                           (IV)REG_NODE_NUM(ender),
10569                           (IV)(ender - lastbr)
10570             );
10571         });
10572         REGTAIL(pRExC_state, lastbr, ender);
10573
10574         if (have_branch && !SIZE_ONLY) {
10575             char is_nothing= 1;
10576             if (depth==1)
10577                 RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN;
10578
10579             /* Hook the tails of the branches to the closing node. */
10580             for (br = ret; br; br = regnext(br)) {
10581                 const U8 op = PL_regkind[OP(br)];
10582                 if (op == BRANCH) {
10583                     REGTAIL_STUDY(pRExC_state, NEXTOPER(br), ender);
10584                     if ( OP(NEXTOPER(br)) != NOTHING
10585                          || regnext(NEXTOPER(br)) != ender)
10586                         is_nothing= 0;
10587                 }
10588                 else if (op == BRANCHJ) {
10589                     REGTAIL_STUDY(pRExC_state, NEXTOPER(NEXTOPER(br)), ender);
10590                     /* for now we always disable this optimisation * /
10591                     if ( OP(NEXTOPER(NEXTOPER(br))) != NOTHING
10592                          || regnext(NEXTOPER(NEXTOPER(br))) != ender)
10593                     */
10594                         is_nothing= 0;
10595                 }
10596             }
10597             if (is_nothing) {
10598                 br= PL_regkind[OP(ret)] != BRANCH ? regnext(ret) : ret;
10599                 DEBUG_PARSE_r(if (!SIZE_ONLY) {
10600                     DEBUG_PARSE_MSG("NADA");
10601                     regprop(RExC_rx, RExC_mysv1, ret, NULL, pRExC_state);
10602                     regprop(RExC_rx, RExC_mysv2, ender, NULL, pRExC_state);
10603                     PerlIO_printf(Perl_debug_log, "~ converting ret %s (%"IVdf") to ender %s (%"IVdf") offset %"IVdf"\n",
10604                                   SvPV_nolen_const(RExC_mysv1),
10605                                   (IV)REG_NODE_NUM(ret),
10606                                   SvPV_nolen_const(RExC_mysv2),
10607                                   (IV)REG_NODE_NUM(ender),
10608                                   (IV)(ender - ret)
10609                     );
10610                 });
10611                 OP(br)= NOTHING;
10612                 if (OP(ender) == TAIL) {
10613                     NEXT_OFF(br)= 0;
10614                     RExC_emit= br + 1;
10615                 } else {
10616                     regnode *opt;
10617                     for ( opt= br + 1; opt < ender ; opt++ )
10618                         OP(opt)= OPTIMIZED;
10619                     NEXT_OFF(br)= ender - br;
10620                 }
10621             }
10622         }
10623     }
10624
10625     {
10626         const char *p;
10627         static const char parens[] = "=!<,>";
10628
10629         if (paren && (p = strchr(parens, paren))) {
10630             U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
10631             int flag = (p - parens) > 1;
10632
10633             if (paren == '>')
10634                 node = SUSPEND, flag = 0;
10635             reginsert(pRExC_state, node,ret, depth+1);
10636             Set_Node_Cur_Length(ret, parse_start);
10637             Set_Node_Offset(ret, parse_start + 1);
10638             ret->flags = flag;
10639             REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL));
10640         }
10641     }
10642
10643     /* Check for proper termination. */
10644     if (paren) {
10645         /* restore original flags, but keep (?p) */
10646         RExC_flags = oregflags | (RExC_flags & RXf_PMf_KEEPCOPY);
10647         if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
10648             RExC_parse = oregcomp_parse;
10649             vFAIL("Unmatched (");
10650         }
10651     }
10652     else if (!paren && RExC_parse < RExC_end) {
10653         if (*RExC_parse == ')') {
10654             RExC_parse++;
10655             vFAIL("Unmatched )");
10656         }
10657         else
10658             FAIL("Junk on end of regexp");      /* "Can't happen". */
10659         NOT_REACHED; /* NOTREACHED */
10660     }
10661
10662     if (RExC_in_lookbehind) {
10663         RExC_in_lookbehind--;
10664     }
10665     if (after_freeze > RExC_npar)
10666         RExC_npar = after_freeze;
10667     return(ret);
10668 }
10669
10670 /*
10671  - regbranch - one alternative of an | operator
10672  *
10673  * Implements the concatenation operator.
10674  *
10675  * Returns NULL, setting *flagp to RESTART_UTF8 if the sizing scan needs to be
10676  * restarted.
10677  */
10678 STATIC regnode *
10679 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
10680 {
10681     regnode *ret;
10682     regnode *chain = NULL;
10683     regnode *latest;
10684     I32 flags = 0, c = 0;
10685     GET_RE_DEBUG_FLAGS_DECL;
10686
10687     PERL_ARGS_ASSERT_REGBRANCH;
10688
10689     DEBUG_PARSE("brnc");
10690
10691     if (first)
10692         ret = NULL;
10693     else {
10694         if (!SIZE_ONLY && RExC_extralen)
10695             ret = reganode(pRExC_state, BRANCHJ,0);
10696         else {
10697             ret = reg_node(pRExC_state, BRANCH);
10698             Set_Node_Length(ret, 1);
10699         }
10700     }
10701
10702     if (!first && SIZE_ONLY)
10703         RExC_extralen += 1;                     /* BRANCHJ */
10704
10705     *flagp = WORST;                     /* Tentatively. */
10706
10707     RExC_parse--;
10708     nextchar(pRExC_state);
10709     while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
10710         flags &= ~TRYAGAIN;
10711         latest = regpiece(pRExC_state, &flags,depth+1);
10712         if (latest == NULL) {
10713             if (flags & TRYAGAIN)
10714                 continue;
10715             if (flags & RESTART_UTF8) {
10716                 *flagp = RESTART_UTF8;
10717                 return NULL;
10718             }
10719             FAIL2("panic: regpiece returned NULL, flags=%#"UVxf"", (UV) flags);
10720         }
10721         else if (ret == NULL)
10722             ret = latest;
10723         *flagp |= flags&(HASWIDTH|POSTPONED);
10724         if (chain == NULL)      /* First piece. */
10725             *flagp |= flags&SPSTART;
10726         else {
10727             /* FIXME adding one for every branch after the first is probably
10728              * excessive now we have TRIE support. (hv) */
10729             MARK_NAUGHTY(1);
10730             REGTAIL(pRExC_state, chain, latest);
10731         }
10732         chain = latest;
10733         c++;
10734     }
10735     if (chain == NULL) {        /* Loop ran zero times. */
10736         chain = reg_node(pRExC_state, NOTHING);
10737         if (ret == NULL)
10738             ret = chain;
10739     }
10740     if (c == 1) {
10741         *flagp |= flags&SIMPLE;
10742     }
10743
10744     return ret;
10745 }
10746
10747 /*
10748  - regpiece - something followed by possible [*+?]
10749  *
10750  * Note that the branching code sequences used for ? and the general cases
10751  * of * and + are somewhat optimized:  they use the same NOTHING node as
10752  * both the endmarker for their branch list and the body of the last branch.
10753  * It might seem that this node could be dispensed with entirely, but the
10754  * endmarker role is not redundant.
10755  *
10756  * Returns NULL, setting *flagp to TRYAGAIN if regatom() returns NULL with
10757  * TRYAGAIN.
10758  * Returns NULL, setting *flagp to RESTART_UTF8 if the sizing scan needs to be
10759  * restarted.
10760  */
10761 STATIC regnode *
10762 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
10763 {
10764     regnode *ret;
10765     char op;
10766     char *next;
10767     I32 flags;
10768     const char * const origparse = RExC_parse;
10769     I32 min;
10770     I32 max = REG_INFTY;
10771 #ifdef RE_TRACK_PATTERN_OFFSETS
10772     char *parse_start;
10773 #endif
10774     const char *maxpos = NULL;
10775
10776     /* Save the original in case we change the emitted regop to a FAIL. */
10777     regnode * const orig_emit = RExC_emit;
10778
10779     GET_RE_DEBUG_FLAGS_DECL;
10780
10781     PERL_ARGS_ASSERT_REGPIECE;
10782
10783     DEBUG_PARSE("piec");
10784
10785     ret = regatom(pRExC_state, &flags,depth+1);
10786     if (ret == NULL) {
10787         if (flags & (TRYAGAIN|RESTART_UTF8))
10788             *flagp |= flags & (TRYAGAIN|RESTART_UTF8);
10789         else
10790             FAIL2("panic: regatom returned NULL, flags=%#"UVxf"", (UV) flags);
10791         return(NULL);
10792     }
10793
10794     op = *RExC_parse;
10795
10796     if (op == '{' && regcurly(RExC_parse)) {
10797         maxpos = NULL;
10798 #ifdef RE_TRACK_PATTERN_OFFSETS
10799         parse_start = RExC_parse; /* MJD */
10800 #endif
10801         next = RExC_parse + 1;
10802         while (isDIGIT(*next) || *next == ',') {
10803             if (*next == ',') {
10804                 if (maxpos)
10805                     break;
10806                 else
10807                     maxpos = next;
10808             }
10809             next++;
10810         }
10811         if (*next == '}') {             /* got one */
10812             const char* endptr;
10813             if (!maxpos)
10814                 maxpos = next;
10815             RExC_parse++;
10816             min = grok_atou(RExC_parse, &endptr);
10817             if (*maxpos == ',')
10818                 maxpos++;
10819             else
10820                 maxpos = RExC_parse;
10821             max = grok_atou(maxpos, &endptr);
10822             if (!max && *maxpos != '0')
10823                 max = REG_INFTY;                /* meaning "infinity" */
10824             else if (max >= REG_INFTY)
10825                 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
10826             RExC_parse = next;
10827             nextchar(pRExC_state);
10828             if (max < min) {    /* If can't match, warn and optimize to fail
10829                                    unconditionally */
10830                 if (SIZE_ONLY) {
10831
10832                     /* We can't back off the size because we have to reserve
10833                      * enough space for all the things we are about to throw
10834                      * away, but we can shrink it by the ammount we are about
10835                      * to re-use here */
10836                     RExC_size = PREVOPER(RExC_size) - regarglen[(U8)OPFAIL];
10837                 }
10838                 else {
10839                     ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match");
10840                     RExC_emit = orig_emit;
10841                 }
10842                 ret = reg_node(pRExC_state, OPFAIL);
10843                 return ret;
10844             }
10845             else if (min == max
10846                      && RExC_parse < RExC_end
10847                      && (*RExC_parse == '?' || *RExC_parse == '+'))
10848             {
10849                 if (PASS2) {
10850                     ckWARN2reg(RExC_parse + 1,
10851                                "Useless use of greediness modifier '%c'",
10852                                *RExC_parse);
10853                 }
10854                 /* Absorb the modifier, so later code doesn't see nor use
10855                     * it */
10856                 nextchar(pRExC_state);
10857             }
10858
10859           do_curly:
10860             if ((flags&SIMPLE)) {
10861                 MARK_NAUGHTY_EXP(2, 2);
10862                 reginsert(pRExC_state, CURLY, ret, depth+1);
10863                 Set_Node_Offset(ret, parse_start+1); /* MJD */
10864                 Set_Node_Cur_Length(ret, parse_start);
10865             }
10866             else {
10867                 regnode * const w = reg_node(pRExC_state, WHILEM);
10868
10869                 w->flags = 0;
10870                 REGTAIL(pRExC_state, ret, w);
10871                 if (!SIZE_ONLY && RExC_extralen) {
10872                     reginsert(pRExC_state, LONGJMP,ret, depth+1);
10873                     reginsert(pRExC_state, NOTHING,ret, depth+1);
10874                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
10875                 }
10876                 reginsert(pRExC_state, CURLYX,ret, depth+1);
10877                                 /* MJD hk */
10878                 Set_Node_Offset(ret, parse_start+1);
10879                 Set_Node_Length(ret,
10880                                 op == '{' ? (RExC_parse - parse_start) : 1);
10881
10882                 if (!SIZE_ONLY && RExC_extralen)
10883                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
10884                 REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
10885                 if (SIZE_ONLY)
10886                     RExC_whilem_seen++, RExC_extralen += 3;
10887                 MARK_NAUGHTY_EXP(1, 4);     /* compound interest */
10888             }
10889             ret->flags = 0;
10890
10891             if (min > 0)
10892                 *flagp = WORST;
10893             if (max > 0)
10894                 *flagp |= HASWIDTH;
10895             if (!SIZE_ONLY) {
10896                 ARG1_SET(ret, (U16)min);
10897                 ARG2_SET(ret, (U16)max);
10898             }
10899             if (max == REG_INFTY)
10900                 RExC_seen |= REG_UNBOUNDED_QUANTIFIER_SEEN;
10901
10902             goto nest_check;
10903         }
10904     }
10905
10906     if (!ISMULT1(op)) {
10907         *flagp = flags;
10908         return(ret);
10909     }
10910
10911 #if 0                           /* Now runtime fix should be reliable. */
10912
10913     /* if this is reinstated, don't forget to put this back into perldiag:
10914
10915             =item Regexp *+ operand could be empty at {#} in regex m/%s/
10916
10917            (F) The part of the regexp subject to either the * or + quantifier
10918            could match an empty string. The {#} shows in the regular
10919            expression about where the problem was discovered.
10920
10921     */
10922
10923     if (!(flags&HASWIDTH) && op != '?')
10924       vFAIL("Regexp *+ operand could be empty");
10925 #endif
10926
10927 #ifdef RE_TRACK_PATTERN_OFFSETS
10928     parse_start = RExC_parse;
10929 #endif
10930     nextchar(pRExC_state);
10931
10932     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
10933
10934     if (op == '*' && (flags&SIMPLE)) {
10935         reginsert(pRExC_state, STAR, ret, depth+1);
10936         ret->flags = 0;
10937         MARK_NAUGHTY(4);
10938         RExC_seen |= REG_UNBOUNDED_QUANTIFIER_SEEN;
10939     }
10940     else if (op == '*') {
10941         min = 0;
10942         goto do_curly;
10943     }
10944     else if (op == '+' && (flags&SIMPLE)) {
10945         reginsert(pRExC_state, PLUS, ret, depth+1);
10946         ret->flags = 0;
10947         MARK_NAUGHTY(3);
10948         RExC_seen |= REG_UNBOUNDED_QUANTIFIER_SEEN;
10949     }
10950     else if (op == '+') {
10951         min = 1;
10952         goto do_curly;
10953     }
10954     else if (op == '?') {
10955         min = 0; max = 1;
10956         goto do_curly;
10957     }
10958   nest_check:
10959     if (!SIZE_ONLY && !(flags&(HASWIDTH|POSTPONED)) && max > REG_INFTY/3) {
10960         SAVEFREESV(RExC_rx_sv); /* in case of fatal warnings */
10961         ckWARN2reg(RExC_parse,
10962                    "%"UTF8f" matches null string many times",
10963                    UTF8fARG(UTF, (RExC_parse >= origparse
10964                                  ? RExC_parse - origparse
10965                                  : 0),
10966                    origparse));
10967         (void)ReREFCNT_inc(RExC_rx_sv);
10968     }
10969
10970     if (RExC_parse < RExC_end && *RExC_parse == '?') {
10971         nextchar(pRExC_state);
10972         reginsert(pRExC_state, MINMOD, ret, depth+1);
10973         REGTAIL(pRExC_state, ret, ret + NODE_STEP_REGNODE);
10974     }
10975     else
10976     if (RExC_parse < RExC_end && *RExC_parse == '+') {
10977         regnode *ender;
10978         nextchar(pRExC_state);
10979         ender = reg_node(pRExC_state, SUCCEED);
10980         REGTAIL(pRExC_state, ret, ender);
10981         reginsert(pRExC_state, SUSPEND, ret, depth+1);
10982         ret->flags = 0;
10983         ender = reg_node(pRExC_state, TAIL);
10984         REGTAIL(pRExC_state, ret, ender);
10985     }
10986
10987     if (RExC_parse < RExC_end && ISMULT2(RExC_parse)) {
10988         RExC_parse++;
10989         vFAIL("Nested quantifiers");
10990     }
10991
10992     return(ret);
10993 }
10994
10995 STATIC STRLEN
10996 S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode** node_p,
10997                       UV *valuep, I32 *flagp, U32 depth, SV** substitute_parse
10998     )
10999 {
11000
11001  /* This is expected to be called by a parser routine that has recognized '\N'
11002    and needs to handle the rest. RExC_parse is expected to point at the first
11003    char following the N at the time of the call.  On successful return,
11004    RExC_parse has been updated to point to just after the sequence identified
11005    by this routine, <*flagp> has been updated, and the non-NULL input pointers
11006    have been set appropriately.
11007
11008    The typical case for this is \N{some character name}.  This is usually
11009    called while parsing the input, filling in or ready to fill in an EXACTish
11010    node, and the code point for the character should be returned, so that it
11011    can be added to the node, and parsing continued with the next input
11012    character.  But it may be that instead of a single character the \N{}
11013    expands to more than one, a named sequence.  In this case any following
11014    quantifier applies to the whole sequence, and it is easier, given the code
11015    structure that calls this, to handle it from a different area of the code.
11016    For this reason, the input parameters can be set so that it returns valid
11017    only on one or the other of these cases.
11018
11019    Another possibility is for the input to be an empty \N{}, which for
11020    backwards compatibility we accept, but generate a NOTHING node which should
11021    later get optimized out.  This is handled from the area of code which can
11022    handle a named sequence, so if called with the parameters for the other, it
11023    fails.
11024
11025    Still another possibility is for the \N to mean [^\n], and not a single
11026    character or explicit sequence at all.  This is determined by context.
11027    Again, this is handled from the area of code which can handle a named
11028    sequence, so if called with the parameters for the other, it also fails.
11029
11030    And the final possibility is for the \N to be called from within a bracketed
11031    character class.  In this case the [^\n] meaning makes no sense, and so is
11032    an error.  Other anomalous situations are left to the calling code to handle.
11033
11034    For non-single-quoted regexes, the tokenizer has attempted to decide which
11035    of the above applies, and in the case of a named sequence, has converted it
11036    into one of the forms: \N{} (if the sequence is null), or \N{U+c1.c2...},
11037    where c1... are the characters in the sequence.  For single-quoted regexes,
11038    the tokenizer passes the \N sequence through unchanged; this code will not
11039    attempt to determine this nor expand those, instead raising a syntax error.
11040    The net effect is that if the beginning of the passed-in pattern isn't '{U+'
11041    or there is no '}', it signals that this \N occurrence means to match a
11042    non-newline. (This mostly was done because of [perl #56444].)
11043
11044    The API is somewhat convoluted due to historical and the above reasons.
11045
11046    The function raises an error (via vFAIL), and doesn't return for various
11047    syntax errors.  For other failures, it returns (STRLEN) -1.  For successes,
11048    it returns a count of how many characters were accounted for by it.  (This
11049    can be 0 for \N{}; 1 for it meaning [^\n]; and otherwise the number of code
11050    points in the sequence.  It sets <node_p>, <valuep>, and/or
11051    <substitute_parse> on success.
11052
11053    If <valuep> is non-null, it means the caller can accept an input sequence
11054    consisting of just a single code point; <*valuep> is set to the value of the
11055    only or first code point in the input.
11056
11057    If <substitute_parse> is non-null, it means the caller can accept an input
11058    sequence consisting of one or more code points; <*substitute_parse> is a
11059    newly created mortal SV* in this case, containing \x{} escapes representing
11060    those code points.
11061
11062    Both <valuep> and <substitute_parse> can be non-NULL.
11063
11064    If <node_p> is non-null, <substitute_parse> must be NULL.  This signifies
11065    that the caller can accept any legal sequence other than a single code
11066    point.  To wit, <*node_p> is set as follows:
11067     1) \N means not-a-NL: points to a newly created REG_ANY node; return is 1
11068     2) \N{}:              points to a new NOTHING node; return is 0
11069     3) otherwise:         points to a new EXACT node containing the resolved
11070                           string; return is the number of code points in the
11071                           string.  This will never be 1.
11072    Note that failure is returned for single code point sequences if <valuep> is
11073    null and <node_p> is not.
11074  */
11075
11076     char * endbrace;    /* '}' following the name */
11077     char* p;
11078     char *endchar;      /* Points to '.' or '}' ending cur char in the input
11079                            stream */
11080     bool has_multiple_chars; /* true if the input stream contains a sequence of
11081                                 more than one character */
11082     bool in_char_class = substitute_parse != NULL;
11083     STRLEN count = 0;   /* Number of characters in this sequence */
11084
11085     GET_RE_DEBUG_FLAGS_DECL;
11086
11087     PERL_ARGS_ASSERT_GROK_BSLASH_N;
11088
11089     GET_RE_DEBUG_FLAGS;
11090
11091     assert(cBOOL(node_p) ^ cBOOL(valuep));  /* Exactly one should be set */
11092     assert(! (node_p && substitute_parse)); /* At most 1 should be set */
11093
11094     /* The [^\n] meaning of \N ignores spaces and comments under the /x
11095      * modifier.  The other meaning does not, so use a temporary until we find
11096      * out which we are being called with */
11097     p = (RExC_flags & RXf_PMf_EXTENDED)
11098         ? regpatws(pRExC_state, RExC_parse,
11099                                 TRUE) /* means recognize comments */
11100         : RExC_parse;
11101
11102     /* Disambiguate between \N meaning a named character versus \N meaning
11103      * [^\n].  The former is assumed when it can't be the latter. */
11104     if (*p != '{' || regcurly(p)) {
11105         RExC_parse = p;
11106         if (! node_p) {
11107             /* no bare \N allowed in a charclass */
11108             if (in_char_class) {
11109                 vFAIL("\\N in a character class must be a named character: \\N{...}");
11110             }
11111             return (STRLEN) -1;
11112         }
11113         RExC_parse--;   /* Need to back off so nextchar() doesn't skip the
11114                            current char */
11115         nextchar(pRExC_state);
11116         *node_p = reg_node(pRExC_state, REG_ANY);
11117         *flagp |= HASWIDTH|SIMPLE;
11118         MARK_NAUGHTY(1);
11119         Set_Node_Length(*node_p, 1); /* MJD */
11120         return 1;
11121     }
11122
11123     /* Here, we have decided it should be a named character or sequence */
11124
11125     /* The test above made sure that the next real character is a '{', but
11126      * under the /x modifier, it could be separated by space (or a comment and
11127      * \n) and this is not allowed (for consistency with \x{...} and the
11128      * tokenizer handling of \N{NAME}). */
11129     if (*RExC_parse != '{') {
11130         vFAIL("Missing braces on \\N{}");
11131     }
11132
11133     RExC_parse++;       /* Skip past the '{' */
11134
11135     if (! (endbrace = strchr(RExC_parse, '}'))  /* no trailing brace */
11136         || ! (endbrace == RExC_parse            /* nothing between the {} */
11137               || (endbrace - RExC_parse >= 2    /* U+ (bad hex is checked... */
11138                   && strnEQ(RExC_parse, "U+", 2)))) /* ... below for a better
11139                                                        error msg) */
11140     {
11141         if (endbrace) RExC_parse = endbrace;    /* position msg's '<--HERE' */
11142         vFAIL("\\N{NAME} must be resolved by the lexer");
11143     }
11144
11145     RExC_uni_semantics = 1; /* Unicode named chars imply Unicode semantics */
11146
11147     if (endbrace == RExC_parse) {   /* empty: \N{} */
11148         if (node_p) {
11149             *node_p = reg_node(pRExC_state,NOTHING);
11150         }
11151         else if (! in_char_class) {
11152             return (STRLEN) -1;
11153         }
11154         nextchar(pRExC_state);
11155         return 0;
11156     }
11157
11158     RExC_parse += 2;    /* Skip past the 'U+' */
11159
11160     endchar = RExC_parse + strcspn(RExC_parse, ".}");
11161
11162     /* Code points are separated by dots.  If none, there is only one code
11163      * point, and is terminated by the brace */
11164     has_multiple_chars = (endchar < endbrace);
11165
11166     /* We get the first code point if we want it, and either there is only one,
11167      * or we can accept both cases of one and there is more than one */
11168     if (valuep && (substitute_parse || ! has_multiple_chars)) {
11169         STRLEN length_of_hex = (STRLEN)(endchar - RExC_parse);
11170         I32 grok_hex_flags = PERL_SCAN_ALLOW_UNDERSCORES
11171                            | PERL_SCAN_DISALLOW_PREFIX
11172
11173                              /* No errors in the first pass (See [perl
11174                               * #122671].)  We let the code below find the
11175                               * errors when there are multiple chars. */
11176                            | ((SIZE_ONLY || has_multiple_chars)
11177                               ? PERL_SCAN_SILENT_ILLDIGIT
11178                               : 0);
11179
11180         *valuep = grok_hex(RExC_parse, &length_of_hex, &grok_hex_flags, NULL);
11181
11182         /* The tokenizer should have guaranteed validity, but it's possible to
11183          * bypass it by using single quoting, so check.  Don't do the check
11184          * here when there are multiple chars; we do it below anyway. */
11185         if (! has_multiple_chars) {
11186             if (length_of_hex == 0
11187                 || length_of_hex != (STRLEN)(endchar - RExC_parse) )
11188             {
11189                 RExC_parse += length_of_hex;    /* Includes all the valid */
11190                 RExC_parse += (RExC_orig_utf8)  /* point to after 1st invalid */
11191                                 ? UTF8SKIP(RExC_parse)
11192                                 : 1;
11193                 /* Guard against malformed utf8 */
11194                 if (RExC_parse >= endchar) {
11195                     RExC_parse = endchar;
11196                 }
11197                 vFAIL("Invalid hexadecimal number in \\N{U+...}");
11198             }
11199
11200             RExC_parse = endbrace + 1;
11201             return 1;
11202         }
11203     }
11204
11205     /* Here, we should have already handled the case where a single character
11206      * is expected and found.  So it is a failure if we aren't expecting
11207      * multiple chars and got them; or didn't get them but wanted them.  We
11208      * fail without advancing the parse, so that the caller can try again with
11209      * different acceptance criteria */
11210     if ((! node_p && ! substitute_parse) || ! has_multiple_chars) {
11211         RExC_parse = p;
11212         return (STRLEN) -1;
11213     }
11214
11215     {
11216         /* What is done here is to convert this to a sub-pattern of the form
11217          * \x{char1}\x{char2}...
11218          * and then either return it in <*substitute_parse> if non-null; or
11219          * call reg recursively to parse it (enclosing in "(?: ... )" ).  That
11220          * way, it retains its atomicness, while not having to worry about
11221          * special handling that some code points may have.  toke.c has
11222          * converted the original Unicode values to native, so that we can just
11223          * pass on the hex values unchanged.  We do have to set a flag to keep
11224          * recoding from happening in the recursion */
11225
11226         SV * dummy = NULL;
11227         STRLEN len;
11228         char *orig_end = RExC_end;
11229         I32 flags;
11230
11231         if (substitute_parse) {
11232             *substitute_parse = newSVpvs("");
11233         }
11234         else {
11235             substitute_parse = &dummy;
11236             *substitute_parse = newSVpvs("?:");
11237         }
11238         *substitute_parse = sv_2mortal(*substitute_parse);
11239
11240         while (RExC_parse < endbrace) {
11241
11242             /* Convert to notation the rest of the code understands */
11243             sv_catpv(*substitute_parse, "\\x{");
11244             sv_catpvn(*substitute_parse, RExC_parse, endchar - RExC_parse);
11245             sv_catpv(*substitute_parse, "}");
11246
11247             /* Point to the beginning of the next character in the sequence. */
11248             RExC_parse = endchar + 1;
11249             endchar = RExC_parse + strcspn(RExC_parse, ".}");
11250
11251             count++;
11252         }
11253         if (! in_char_class) {
11254             sv_catpv(*substitute_parse, ")");
11255         }
11256
11257         RExC_parse = SvPV(*substitute_parse, len);
11258
11259         /* Don't allow empty number */
11260         if (len < (STRLEN) ((substitute_parse) ? 6 : 8)) {
11261             RExC_parse = endbrace;
11262             vFAIL("Invalid hexadecimal number in \\N{U+...}");
11263         }
11264         RExC_end = RExC_parse + len;
11265
11266         /* The values are Unicode, and therefore not subject to recoding */
11267         RExC_override_recoding = 1;
11268
11269         if (node_p) {
11270             if (!(*node_p = reg(pRExC_state, 1, &flags, depth+1))) {
11271                 if (flags & RESTART_UTF8) {
11272                     *flagp = RESTART_UTF8;
11273                     return (STRLEN) -1;
11274                 }
11275                 FAIL2("panic: reg returned NULL to grok_bslash_N, flags=%#"UVxf"",
11276                     (UV) flags);
11277             }
11278             *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
11279         }
11280
11281         RExC_parse = endbrace;
11282         RExC_end = orig_end;
11283         RExC_override_recoding = 0;
11284
11285         nextchar(pRExC_state);
11286     }
11287
11288     return count;
11289 }
11290
11291
11292 /*
11293  * reg_recode
11294  *
11295  * It returns the code point in utf8 for the value in *encp.
11296  *    value: a code value in the source encoding
11297  *    encp:  a pointer to an Encode object
11298  *
11299  * If the result from Encode is not a single character,
11300  * it returns U+FFFD (Replacement character) and sets *encp to NULL.
11301  */
11302 STATIC UV
11303 S_reg_recode(pTHX_ const char value, SV **encp)
11304 {
11305     STRLEN numlen = 1;
11306     SV * const sv = newSVpvn_flags(&value, numlen, SVs_TEMP);
11307     const char * const s = *encp ? sv_recode_to_utf8(sv, *encp) : SvPVX(sv);
11308     const STRLEN newlen = SvCUR(sv);
11309     UV uv = UNICODE_REPLACEMENT;
11310
11311     PERL_ARGS_ASSERT_REG_RECODE;
11312
11313     if (newlen)
11314         uv = SvUTF8(sv)
11315              ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
11316              : *(U8*)s;
11317
11318     if (!newlen || numlen != newlen) {
11319         uv = UNICODE_REPLACEMENT;
11320         *encp = NULL;
11321     }
11322     return uv;
11323 }
11324
11325 PERL_STATIC_INLINE U8
11326 S_compute_EXACTish(RExC_state_t *pRExC_state)
11327 {
11328     U8 op;
11329
11330     PERL_ARGS_ASSERT_COMPUTE_EXACTISH;
11331
11332     if (! FOLD) {
11333         return (LOC)
11334                 ? EXACTL
11335                 : EXACT;
11336     }
11337
11338     op = get_regex_charset(RExC_flags);
11339     if (op >= REGEX_ASCII_RESTRICTED_CHARSET) {
11340         op--; /* /a is same as /u, and map /aa's offset to what /a's would have
11341                  been, so there is no hole */
11342     }
11343
11344     return op + EXACTF;
11345 }
11346
11347 PERL_STATIC_INLINE void
11348 S_alloc_maybe_populate_EXACT(pTHX_ RExC_state_t *pRExC_state,
11349                          regnode *node, I32* flagp, STRLEN len, UV code_point,
11350                          bool downgradable)
11351 {
11352     /* This knows the details about sizing an EXACTish node, setting flags for
11353      * it (by setting <*flagp>, and potentially populating it with a single
11354      * character.
11355      *
11356      * If <len> (the length in bytes) is non-zero, this function assumes that
11357      * the node has already been populated, and just does the sizing.  In this
11358      * case <code_point> should be the final code point that has already been
11359      * placed into the node.  This value will be ignored except that under some
11360      * circumstances <*flagp> is set based on it.
11361      *
11362      * If <len> is zero, the function assumes that the node is to contain only
11363      * the single character given by <code_point> and calculates what <len>
11364      * should be.  In pass 1, it sizes the node appropriately.  In pass 2, it
11365      * additionally will populate the node's STRING with <code_point> or its
11366      * fold if folding.
11367      *
11368      * In both cases <*flagp> is appropriately set
11369      *
11370      * It knows that under FOLD, the Latin Sharp S and UTF characters above
11371      * 255, must be folded (the former only when the rules indicate it can
11372      * match 'ss')
11373      *
11374      * When it does the populating, it looks at the flag 'downgradable'.  If
11375      * true with a node that folds, it checks if the single code point
11376      * participates in a fold, and if not downgrades the node to an EXACT.
11377      * This helps the optimizer */
11378
11379     bool len_passed_in = cBOOL(len != 0);
11380     U8 character[UTF8_MAXBYTES_CASE+1];
11381
11382     PERL_ARGS_ASSERT_ALLOC_MAYBE_POPULATE_EXACT;
11383
11384     /* Don't bother to check for downgrading in PASS1, as it doesn't make any
11385      * sizing difference, and is extra work that is thrown away */
11386     if (downgradable && ! PASS2) {
11387         downgradable = FALSE;
11388     }
11389
11390     if (! len_passed_in) {
11391         if (UTF) {
11392             if (UVCHR_IS_INVARIANT(code_point)) {
11393                 if (LOC || ! FOLD) {    /* /l defers folding until runtime */
11394                     *character = (U8) code_point;
11395                 }
11396                 else { /* Here is /i and not /l. (toFOLD() is defined on just
11397                           ASCII, which isn't the same thing as INVARIANT on
11398                           EBCDIC, but it works there, as the extra invariants
11399                           fold to themselves) */
11400                     *character = toFOLD((U8) code_point);
11401
11402                     /* We can downgrade to an EXACT node if this character
11403                      * isn't a folding one.  Note that this assumes that
11404                      * nothing above Latin1 folds to some other invariant than
11405                      * one of these alphabetics; otherwise we would also have
11406                      * to check:
11407                      *  && (! HAS_NONLATIN1_FOLD_CLOSURE(code_point)
11408                      *      || ASCII_FOLD_RESTRICTED))
11409                      */
11410                     if (downgradable && PL_fold[code_point] == code_point) {
11411                         OP(node) = EXACT;
11412                     }
11413                 }
11414                 len = 1;
11415             }
11416             else if (FOLD && (! LOC
11417                               || ! is_PROBLEMATIC_LOCALE_FOLD_cp(code_point)))
11418             {   /* Folding, and ok to do so now */
11419                 UV folded = _to_uni_fold_flags(
11420                                    code_point,
11421                                    character,
11422                                    &len,
11423                                    FOLD_FLAGS_FULL | ((ASCII_FOLD_RESTRICTED)
11424                                                       ? FOLD_FLAGS_NOMIX_ASCII
11425                                                       : 0));
11426                 if (downgradable
11427                     && folded == code_point /* This quickly rules out many
11428                                                cases, avoiding the
11429                                                _invlist_contains_cp() overhead
11430                                                for those.  */
11431                     && ! _invlist_contains_cp(PL_utf8_foldable, code_point))
11432                 {
11433                     OP(node) = (LOC)
11434                                ? EXACTL
11435                                : EXACT;
11436                 }
11437             }
11438             else if (code_point <= MAX_UTF8_TWO_BYTE) {
11439
11440                 /* Not folding this cp, and can output it directly */
11441                 *character = UTF8_TWO_BYTE_HI(code_point);
11442                 *(character + 1) = UTF8_TWO_BYTE_LO(code_point);
11443                 len = 2;
11444             }
11445             else {
11446                 uvchr_to_utf8( character, code_point);
11447                 len = UTF8SKIP(character);
11448             }
11449         } /* Else pattern isn't UTF8.  */
11450         else if (! FOLD) {
11451             *character = (U8) code_point;
11452             len = 1;
11453         } /* Else is folded non-UTF8 */
11454         else if (LIKELY(code_point != LATIN_SMALL_LETTER_SHARP_S)) {
11455
11456             /* We don't fold any non-UTF8 except possibly the Sharp s  (see
11457              * comments at join_exact()); */
11458             *character = (U8) code_point;
11459             len = 1;
11460
11461             /* Can turn into an EXACT node if we know the fold at compile time,
11462              * and it folds to itself and doesn't particpate in other folds */
11463             if (downgradable
11464                 && ! LOC
11465                 && PL_fold_latin1[code_point] == code_point
11466                 && (! HAS_NONLATIN1_FOLD_CLOSURE(code_point)
11467                     || (isASCII(code_point) && ASCII_FOLD_RESTRICTED)))
11468             {
11469                 OP(node) = EXACT;
11470             }
11471         } /* else is Sharp s.  May need to fold it */
11472         else if (AT_LEAST_UNI_SEMANTICS && ! ASCII_FOLD_RESTRICTED) {
11473             *character = 's';
11474             *(character + 1) = 's';
11475             len = 2;
11476         }
11477         else {
11478             *character = LATIN_SMALL_LETTER_SHARP_S;
11479             len = 1;
11480         }
11481     }
11482
11483     if (SIZE_ONLY) {
11484         RExC_size += STR_SZ(len);
11485     }
11486     else {
11487         RExC_emit += STR_SZ(len);
11488         STR_LEN(node) = len;
11489         if (! len_passed_in) {
11490             Copy((char *) character, STRING(node), len, char);
11491         }
11492     }
11493
11494     *flagp |= HASWIDTH;
11495
11496     /* A single character node is SIMPLE, except for the special-cased SHARP S
11497      * under /di. */
11498     if ((len == 1 || (UTF && len == UNISKIP(code_point)))
11499         && (code_point != LATIN_SMALL_LETTER_SHARP_S
11500             || ! FOLD || ! DEPENDS_SEMANTICS))
11501     {
11502         *flagp |= SIMPLE;
11503     }
11504
11505     /* The OP may not be well defined in PASS1 */
11506     if (PASS2 && OP(node) == EXACTFL) {
11507         RExC_contains_locale = 1;
11508     }
11509 }
11510
11511
11512 /* Parse backref decimal value, unless it's too big to sensibly be a backref,
11513  * in which case return I32_MAX (rather than possibly 32-bit wrapping) */
11514
11515 static I32
11516 S_backref_value(char *p)
11517 {
11518     const char* endptr;
11519     UV val = grok_atou(p, &endptr);
11520     if (endptr == p || endptr == NULL || val > I32_MAX)
11521         return I32_MAX;
11522     return (I32)val;
11523 }
11524
11525
11526 /*
11527  - regatom - the lowest level
11528
11529    Try to identify anything special at the start of the pattern. If there
11530    is, then handle it as required. This may involve generating a single regop,
11531    such as for an assertion; or it may involve recursing, such as to
11532    handle a () structure.
11533
11534    If the string doesn't start with something special then we gobble up
11535    as much literal text as we can.
11536
11537    Once we have been able to handle whatever type of thing started the
11538    sequence, we return.
11539
11540    Note: we have to be careful with escapes, as they can be both literal
11541    and special, and in the case of \10 and friends, context determines which.
11542
11543    A summary of the code structure is:
11544
11545    switch (first_byte) {
11546         cases for each special:
11547             handle this special;
11548             break;
11549         case '\\':
11550             switch (2nd byte) {
11551                 cases for each unambiguous special:
11552                     handle this special;
11553                     break;
11554                 cases for each ambigous special/literal:
11555                     disambiguate;
11556                     if (special)  handle here
11557                     else goto defchar;
11558                 default: // unambiguously literal:
11559                     goto defchar;
11560             }
11561         default:  // is a literal char
11562             // FALL THROUGH
11563         defchar:
11564             create EXACTish node for literal;
11565             while (more input and node isn't full) {
11566                 switch (input_byte) {
11567                    cases for each special;
11568                        make sure parse pointer is set so that the next call to
11569                            regatom will see this special first
11570                        goto loopdone; // EXACTish node terminated by prev. char
11571                    default:
11572                        append char to EXACTISH node;
11573                 }
11574                 get next input byte;
11575             }
11576         loopdone:
11577    }
11578    return the generated node;
11579
11580    Specifically there are two separate switches for handling
11581    escape sequences, with the one for handling literal escapes requiring
11582    a dummy entry for all of the special escapes that are actually handled
11583    by the other.
11584
11585    Returns NULL, setting *flagp to TRYAGAIN if reg() returns NULL with
11586    TRYAGAIN.
11587    Returns NULL, setting *flagp to RESTART_UTF8 if the sizing scan needs to be
11588    restarted.
11589    Otherwise does not return NULL.
11590 */
11591
11592 STATIC regnode *
11593 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
11594 {
11595     regnode *ret = NULL;
11596     I32 flags = 0;
11597     char *parse_start = RExC_parse;
11598     U8 op;
11599     int invert = 0;
11600     U8 arg;
11601
11602     GET_RE_DEBUG_FLAGS_DECL;
11603
11604     *flagp = WORST;             /* Tentatively. */
11605
11606     DEBUG_PARSE("atom");
11607
11608     PERL_ARGS_ASSERT_REGATOM;
11609
11610   tryagain:
11611     switch ((U8)*RExC_parse) {
11612     case '^':
11613         RExC_seen_zerolen++;
11614         nextchar(pRExC_state);
11615         if (RExC_flags & RXf_PMf_MULTILINE)
11616             ret = reg_node(pRExC_state, MBOL);
11617         else
11618             ret = reg_node(pRExC_state, SBOL);
11619         Set_Node_Length(ret, 1); /* MJD */
11620         break;
11621     case '$':
11622         nextchar(pRExC_state);
11623         if (*RExC_parse)
11624             RExC_seen_zerolen++;
11625         if (RExC_flags & RXf_PMf_MULTILINE)
11626             ret = reg_node(pRExC_state, MEOL);
11627         else
11628             ret = reg_node(pRExC_state, SEOL);
11629         Set_Node_Length(ret, 1); /* MJD */
11630         break;
11631     case '.':
11632         nextchar(pRExC_state);
11633         if (RExC_flags & RXf_PMf_SINGLELINE)
11634             ret = reg_node(pRExC_state, SANY);
11635         else
11636             ret = reg_node(pRExC_state, REG_ANY);
11637         *flagp |= HASWIDTH|SIMPLE;
11638         MARK_NAUGHTY(1);
11639         Set_Node_Length(ret, 1); /* MJD */
11640         break;
11641     case '[':
11642     {
11643         char * const oregcomp_parse = ++RExC_parse;
11644         ret = regclass(pRExC_state, flagp,depth+1,
11645                        FALSE, /* means parse the whole char class */
11646                        TRUE, /* allow multi-char folds */
11647                        FALSE, /* don't silence non-portable warnings. */
11648                        (bool) RExC_strict,
11649                        NULL);
11650         if (*RExC_parse != ']') {
11651             RExC_parse = oregcomp_parse;
11652             vFAIL("Unmatched [");
11653         }
11654         if (ret == NULL) {
11655             if (*flagp & RESTART_UTF8)
11656                 return NULL;
11657             FAIL2("panic: regclass returned NULL to regatom, flags=%#"UVxf"",
11658                   (UV) *flagp);
11659         }
11660         nextchar(pRExC_state);
11661         Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
11662         break;
11663     }
11664     case '(':
11665         nextchar(pRExC_state);
11666         ret = reg(pRExC_state, 2, &flags,depth+1);
11667         if (ret == NULL) {
11668                 if (flags & TRYAGAIN) {
11669                     if (RExC_parse == RExC_end) {
11670                          /* Make parent create an empty node if needed. */
11671                         *flagp |= TRYAGAIN;
11672                         return(NULL);
11673                     }
11674                     goto tryagain;
11675                 }
11676                 if (flags & RESTART_UTF8) {
11677                     *flagp = RESTART_UTF8;
11678                     return NULL;
11679                 }
11680                 FAIL2("panic: reg returned NULL to regatom, flags=%#"UVxf"",
11681                                                                  (UV) flags);
11682         }
11683         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
11684         break;
11685     case '|':
11686     case ')':
11687         if (flags & TRYAGAIN) {
11688             *flagp |= TRYAGAIN;
11689             return NULL;
11690         }
11691         vFAIL("Internal urp");
11692                                 /* Supposed to be caught earlier. */
11693         break;
11694     case '?':
11695     case '+':
11696     case '*':
11697         RExC_parse++;
11698         vFAIL("Quantifier follows nothing");
11699         break;
11700     case '\\':
11701         /* Special Escapes
11702
11703            This switch handles escape sequences that resolve to some kind
11704            of special regop and not to literal text. Escape sequnces that
11705            resolve to literal text are handled below in the switch marked
11706            "Literal Escapes".
11707
11708            Every entry in this switch *must* have a corresponding entry
11709            in the literal escape switch. However, the opposite is not
11710            required, as the default for this switch is to jump to the
11711            literal text handling code.
11712         */
11713         switch ((U8)*++RExC_parse) {
11714         /* Special Escapes */
11715         case 'A':
11716             RExC_seen_zerolen++;
11717             ret = reg_node(pRExC_state, SBOL);
11718             /* SBOL is shared with /^/ so we set the flags so we can tell
11719              * /\A/ from /^/ in split. We check ret because first pass we
11720              * have no regop struct to set the flags on. */
11721             if (PASS2)
11722                 ret->flags = 1;
11723             *flagp |= SIMPLE;
11724             goto finish_meta_pat;
11725         case 'G':
11726             ret = reg_node(pRExC_state, GPOS);
11727             RExC_seen |= REG_GPOS_SEEN;
11728             *flagp |= SIMPLE;
11729             goto finish_meta_pat;
11730         case 'K':
11731             RExC_seen_zerolen++;
11732             ret = reg_node(pRExC_state, KEEPS);
11733             *flagp |= SIMPLE;
11734             /* XXX:dmq : disabling in-place substitution seems to
11735              * be necessary here to avoid cases of memory corruption, as
11736              * with: C<$_="x" x 80; s/x\K/y/> -- rgs
11737              */
11738             RExC_seen |= REG_LOOKBEHIND_SEEN;
11739             goto finish_meta_pat;
11740         case 'Z':
11741             ret = reg_node(pRExC_state, SEOL);
11742             *flagp |= SIMPLE;
11743             RExC_seen_zerolen++;                /* Do not optimize RE away */
11744             goto finish_meta_pat;
11745         case 'z':
11746             ret = reg_node(pRExC_state, EOS);
11747             *flagp |= SIMPLE;
11748             RExC_seen_zerolen++;                /* Do not optimize RE away */
11749             goto finish_meta_pat;
11750         case 'C':
11751             ret = reg_node(pRExC_state, CANY);
11752             RExC_seen |= REG_CANY_SEEN;
11753             *flagp |= HASWIDTH|SIMPLE;
11754             if (PASS2) {
11755                 ckWARNdep(RExC_parse+1, "\\C is deprecated");
11756             }
11757             goto finish_meta_pat;
11758         case 'X':
11759             ret = reg_node(pRExC_state, CLUMP);
11760             *flagp |= HASWIDTH;
11761             goto finish_meta_pat;
11762
11763         case 'W':
11764             invert = 1;
11765             /* FALLTHROUGH */
11766         case 'w':
11767             arg = ANYOF_WORDCHAR;
11768             goto join_posix;
11769
11770         case 'B':
11771             invert = 1;
11772             /* FALLTHROUGH */
11773         case 'b':
11774           {
11775             regex_charset charset = get_regex_charset(RExC_flags);
11776
11777             RExC_seen_zerolen++;
11778             RExC_seen |= REG_LOOKBEHIND_SEEN;
11779             op = BOUND + charset;
11780
11781             if (op == BOUNDL) {
11782                 RExC_contains_locale = 1;
11783             }
11784
11785             ret = reg_node(pRExC_state, op);
11786             *flagp |= SIMPLE;
11787             if (*(RExC_parse + 1) != '{') {
11788                 FLAGS(ret) = TRADITIONAL_BOUND;
11789                 if (PASS2 && op > BOUNDA) {  /* /aa is same as /a */
11790                     OP(ret) = BOUNDA;
11791                 }
11792             }
11793             else {
11794                 STRLEN length;
11795                 char name = *RExC_parse;
11796                 char * endbrace;
11797                 RExC_parse += 2;
11798                 endbrace = strchr(RExC_parse, '}');
11799
11800                 if (! endbrace) {
11801                     vFAIL2("Missing right brace on \\%c{}", name);
11802                 }
11803                 /* XXX Need to decide whether to take spaces or not.  Should be
11804                  * consistent with \p{}, but that currently is SPACE, which
11805                  * means vertical too, which seems wrong
11806                  * while (isBLANK(*RExC_parse)) {
11807                     RExC_parse++;
11808                 }*/
11809                 if (endbrace == RExC_parse) {
11810                     RExC_parse++;  /* After the '}' */
11811                     vFAIL2("Empty \\%c{}", name);
11812                 }
11813                 length = endbrace - RExC_parse;
11814                 /*while (isBLANK(*(RExC_parse + length - 1))) {
11815                     length--;
11816                 }*/
11817                 switch (*RExC_parse) {
11818                     case 'g':
11819                         if (length != 1
11820                             && (length != 3 || strnNE(RExC_parse + 1, "cb", 2)))
11821                         {
11822                             goto bad_bound_type;
11823                         }
11824                         FLAGS(ret) = GCB_BOUND;
11825                         break;
11826                     case 's':
11827                         if (length != 2 || *(RExC_parse + 1) != 'b') {
11828                             goto bad_bound_type;
11829                         }
11830                         FLAGS(ret) = SB_BOUND;
11831                         break;
11832                     case 'w':
11833                         if (length != 2 || *(RExC_parse + 1) != 'b') {
11834                             goto bad_bound_type;
11835                         }
11836                         FLAGS(ret) = WB_BOUND;
11837                         break;
11838                     default:
11839                       bad_bound_type:
11840                         RExC_parse = endbrace;
11841                         vFAIL2utf8f(
11842                             "'%"UTF8f"' is an unknown bound type",
11843                             UTF8fARG(UTF, length, endbrace - length));
11844                         NOT_REACHED; /*NOTREACHED*/
11845                 }
11846                 RExC_parse = endbrace;
11847                 RExC_uni_semantics = 1;
11848
11849                 if (PASS2 && op >= BOUNDA) {  /* /aa is same as /a */
11850                     OP(ret) = BOUNDU;
11851                     length += 4;
11852
11853                     /* Don't have to worry about UTF-8, in this message because
11854                      * to get here the contents of the \b must be ASCII */
11855                     ckWARN4reg(RExC_parse + 1,  /* Include the '}' in msg */
11856                               "Using /u for '%.*s' instead of /%s",
11857                               (unsigned) length,
11858                               endbrace - length + 1,
11859                               (charset == REGEX_ASCII_RESTRICTED_CHARSET)
11860                               ? ASCII_RESTRICT_PAT_MODS
11861                               : ASCII_MORE_RESTRICT_PAT_MODS);
11862                 }
11863             }
11864
11865             if (PASS2 && invert) {
11866                 OP(ret) += NBOUND - BOUND;
11867             }
11868             goto finish_meta_pat;
11869           }
11870
11871         case 'D':
11872             invert = 1;
11873             /* FALLTHROUGH */
11874         case 'd':
11875             arg = ANYOF_DIGIT;
11876             if (! DEPENDS_SEMANTICS) {
11877                 goto join_posix;
11878             }
11879
11880             /* \d doesn't have any matches in the upper Latin1 range, hence /d
11881              * is equivalent to /u.  Changing to /u saves some branches at
11882              * runtime */
11883             op = POSIXU;
11884             goto join_posix_op_known;
11885
11886         case 'R':
11887             ret = reg_node(pRExC_state, LNBREAK);
11888             *flagp |= HASWIDTH|SIMPLE;
11889             goto finish_meta_pat;
11890
11891         case 'H':
11892             invert = 1;
11893             /* FALLTHROUGH */
11894         case 'h':
11895             arg = ANYOF_BLANK;
11896             op = POSIXU;
11897             goto join_posix_op_known;
11898
11899         case 'V':
11900             invert = 1;
11901             /* FALLTHROUGH */
11902         case 'v':
11903             arg = ANYOF_VERTWS;
11904             op = POSIXU;
11905             goto join_posix_op_known;
11906
11907         case 'S':
11908             invert = 1;
11909             /* FALLTHROUGH */
11910         case 's':
11911             arg = ANYOF_SPACE;
11912
11913           join_posix:
11914
11915             op = POSIXD + get_regex_charset(RExC_flags);
11916             if (op > POSIXA) {  /* /aa is same as /a */
11917                 op = POSIXA;
11918             }
11919             else if (op == POSIXL) {
11920                 RExC_contains_locale = 1;
11921             }
11922
11923           join_posix_op_known:
11924
11925             if (invert) {
11926                 op += NPOSIXD - POSIXD;
11927             }
11928
11929             ret = reg_node(pRExC_state, op);
11930             if (! SIZE_ONLY) {
11931                 FLAGS(ret) = namedclass_to_classnum(arg);
11932             }
11933
11934             *flagp |= HASWIDTH|SIMPLE;
11935             /* FALLTHROUGH */
11936
11937           finish_meta_pat:
11938             nextchar(pRExC_state);
11939             Set_Node_Length(ret, 2); /* MJD */
11940             break;
11941         case 'p':
11942         case 'P':
11943             {
11944 #ifdef DEBUGGING
11945                 char* parse_start = RExC_parse - 2;
11946 #endif
11947
11948                 RExC_parse--;
11949
11950                 ret = regclass(pRExC_state, flagp,depth+1,
11951                                TRUE, /* means just parse this element */
11952                                FALSE, /* don't allow multi-char folds */
11953                                FALSE, /* don't silence non-portable warnings.
11954                                          It would be a bug if these returned
11955                                          non-portables */
11956                                (bool) RExC_strict,
11957                                NULL);
11958                 /* regclass() can only return RESTART_UTF8 if multi-char folds
11959                    are allowed.  */
11960                 if (!ret)
11961                     FAIL2("panic: regclass returned NULL to regatom, flags=%#"UVxf"",
11962                           (UV) *flagp);
11963
11964                 RExC_parse--;
11965
11966                 Set_Node_Offset(ret, parse_start + 2);
11967                 Set_Node_Cur_Length(ret, parse_start);
11968                 nextchar(pRExC_state);
11969             }
11970             break;
11971         case 'N':
11972             /* Handle \N and \N{NAME} with multiple code points here and not
11973              * below because it can be multicharacter. join_exact() will join
11974              * them up later on.  Also this makes sure that things like
11975              * /\N{BLAH}+/ and \N{BLAH} being multi char Just Happen. dmq.
11976              * The options to the grok function call causes it to fail if the
11977              * sequence is just a single code point.  We then go treat it as
11978              * just another character in the current EXACT node, and hence it
11979              * gets uniform treatment with all the other characters.  The
11980              * special treatment for quantifiers is not needed for such single
11981              * character sequences */
11982             ++RExC_parse;
11983             if ((STRLEN) -1 == grok_bslash_N(pRExC_state, &ret, NULL, flagp,
11984                                              depth, FALSE))
11985             {
11986                 if (*flagp & RESTART_UTF8)
11987                     return NULL;
11988                 RExC_parse--;
11989                 goto defchar;
11990             }
11991             break;
11992         case 'k':    /* Handle \k<NAME> and \k'NAME' */
11993       parse_named_seq:
11994         {
11995             char ch= RExC_parse[1];
11996             if (ch != '<' && ch != '\'' && ch != '{') {
11997                 RExC_parse++;
11998                 /* diag_listed_as: Sequence \%s... not terminated in regex; marked by <-- HERE in m/%s/ */
11999                 vFAIL2("Sequence %.2s... not terminated",parse_start);
12000             } else {
12001                 /* this pretty much dupes the code for (?P=...) in reg(), if
12002                    you change this make sure you change that */
12003                 char* name_start = (RExC_parse += 2);
12004                 U32 num = 0;
12005                 SV *sv_dat = reg_scan_name(pRExC_state,
12006                     SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
12007                 ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
12008                 if (RExC_parse == name_start || *RExC_parse != ch)
12009                     /* diag_listed_as: Sequence \%s... not terminated in regex; marked by <-- HERE in m/%s/ */
12010                     vFAIL2("Sequence %.3s... not terminated",parse_start);
12011
12012                 if (!SIZE_ONLY) {
12013                     num = add_data( pRExC_state, STR_WITH_LEN("S"));
12014                     RExC_rxi->data->data[num]=(void*)sv_dat;
12015                     SvREFCNT_inc_simple_void(sv_dat);
12016                 }
12017
12018                 RExC_sawback = 1;
12019                 ret = reganode(pRExC_state,
12020                                ((! FOLD)
12021                                  ? NREF
12022                                  : (ASCII_FOLD_RESTRICTED)
12023                                    ? NREFFA
12024                                    : (AT_LEAST_UNI_SEMANTICS)
12025                                      ? NREFFU
12026                                      : (LOC)
12027                                        ? NREFFL
12028                                        : NREFF),
12029                                 num);
12030                 *flagp |= HASWIDTH;
12031
12032                 /* override incorrect value set in reganode MJD */
12033                 Set_Node_Offset(ret, parse_start+1);
12034                 Set_Node_Cur_Length(ret, parse_start);
12035                 nextchar(pRExC_state);
12036
12037             }
12038             break;
12039         }
12040         case 'g':
12041         case '1': case '2': case '3': case '4':
12042         case '5': case '6': case '7': case '8': case '9':
12043             {
12044                 I32 num;
12045                 bool hasbrace = 0;
12046
12047                 if (*RExC_parse == 'g') {
12048                     bool isrel = 0;
12049
12050                     RExC_parse++;
12051                     if (*RExC_parse == '{') {
12052                         RExC_parse++;
12053                         hasbrace = 1;
12054                     }
12055                     if (*RExC_parse == '-') {
12056                         RExC_parse++;
12057                         isrel = 1;
12058                     }
12059                     if (hasbrace && !isDIGIT(*RExC_parse)) {
12060                         if (isrel) RExC_parse--;
12061                         RExC_parse -= 2;
12062                         goto parse_named_seq;
12063                     }
12064
12065                     num = S_backref_value(RExC_parse);
12066                     if (num == 0)
12067                         vFAIL("Reference to invalid group 0");
12068                     else if (num == I32_MAX) {
12069                          if (isDIGIT(*RExC_parse))
12070                             vFAIL("Reference to nonexistent group");
12071                         else
12072                             vFAIL("Unterminated \\g... pattern");
12073                     }
12074
12075                     if (isrel) {
12076                         num = RExC_npar - num;
12077                         if (num < 1)
12078                             vFAIL("Reference to nonexistent or unclosed group");
12079                     }
12080                 }
12081                 else {
12082                     num = S_backref_value(RExC_parse);
12083                     /* bare \NNN might be backref or octal - if it is larger
12084                      * than or equal RExC_npar then it is assumed to be an
12085                      * octal escape. Note RExC_npar is +1 from the actual
12086                      * number of parens. */
12087                     /* Note we do NOT check if num == I32_MAX here, as that is
12088                      * handled by the RExC_npar check */
12089
12090                     if (
12091                         /* any numeric escape < 10 is always a backref */
12092                         num > 9
12093                         /* any numeric escape < RExC_npar is a backref */
12094                         && num >= RExC_npar
12095                         /* cannot be an octal escape if it starts with 8 */
12096                         && *RExC_parse != '8'
12097                         /* cannot be an octal escape it it starts with 9 */
12098                         && *RExC_parse != '9'
12099                     )
12100                     {
12101                         /* Probably not a backref, instead likely to be an
12102                          * octal character escape, e.g. \35 or \777.
12103                          * The above logic should make it obvious why using
12104                          * octal escapes in patterns is problematic. - Yves */
12105                         goto defchar;
12106                     }
12107                 }
12108
12109                 /* At this point RExC_parse points at a numeric escape like
12110                  * \12 or \88 or something similar, which we should NOT treat
12111                  * as an octal escape. It may or may not be a valid backref
12112                  * escape. For instance \88888888 is unlikely to be a valid
12113                  * backref. */
12114                 {
12115 #ifdef RE_TRACK_PATTERN_OFFSETS
12116                     char * const parse_start = RExC_parse - 1; /* MJD */
12117 #endif
12118                     while (isDIGIT(*RExC_parse))
12119                         RExC_parse++;
12120                     if (hasbrace) {
12121                         if (*RExC_parse != '}')
12122                             vFAIL("Unterminated \\g{...} pattern");
12123                         RExC_parse++;
12124                     }
12125                     if (!SIZE_ONLY) {
12126                         if (num > (I32)RExC_rx->nparens)
12127                             vFAIL("Reference to nonexistent group");
12128                     }
12129                     RExC_sawback = 1;
12130                     ret = reganode(pRExC_state,
12131                                    ((! FOLD)
12132                                      ? REF
12133                                      : (ASCII_FOLD_RESTRICTED)
12134                                        ? REFFA
12135                                        : (AT_LEAST_UNI_SEMANTICS)
12136                                          ? REFFU
12137                                          : (LOC)
12138                                            ? REFFL
12139                                            : REFF),
12140                                     num);
12141                     *flagp |= HASWIDTH;
12142
12143                     /* override incorrect value set in reganode MJD */
12144                     Set_Node_Offset(ret, parse_start+1);
12145                     Set_Node_Cur_Length(ret, parse_start);
12146                     RExC_parse--;
12147                     nextchar(pRExC_state);
12148                 }
12149             }
12150             break;
12151         case '\0':
12152             if (RExC_parse >= RExC_end)
12153                 FAIL("Trailing \\");
12154             /* FALLTHROUGH */
12155         default:
12156             /* Do not generate "unrecognized" warnings here, we fall
12157                back into the quick-grab loop below */
12158             parse_start--;
12159             goto defchar;
12160         }
12161         break;
12162
12163     case '#':
12164         if (RExC_flags & RXf_PMf_EXTENDED) {
12165             RExC_parse = reg_skipcomment( pRExC_state, RExC_parse );
12166             if (RExC_parse < RExC_end)
12167                 goto tryagain;
12168         }
12169         /* FALLTHROUGH */
12170
12171     default:
12172
12173             parse_start = RExC_parse - 1;
12174
12175             RExC_parse++;
12176
12177           defchar: {
12178             STRLEN len = 0;
12179             UV ender = 0;
12180             char *p;
12181             char *s;
12182 #define MAX_NODE_STRING_SIZE 127
12183             char foldbuf[MAX_NODE_STRING_SIZE+UTF8_MAXBYTES_CASE];
12184             char *s0;
12185             U8 upper_parse = MAX_NODE_STRING_SIZE;
12186             U8 node_type = compute_EXACTish(pRExC_state);
12187             bool next_is_quantifier;
12188             char * oldp = NULL;
12189
12190             /* We can convert EXACTF nodes to EXACTFU if they contain only
12191              * characters that match identically regardless of the target
12192              * string's UTF8ness.  The reason to do this is that EXACTF is not
12193              * trie-able, EXACTFU is.
12194              *
12195              * Similarly, we can convert EXACTFL nodes to EXACTFU if they
12196              * contain only above-Latin1 characters (hence must be in UTF8),
12197              * which don't participate in folds with Latin1-range characters,
12198              * as the latter's folds aren't known until runtime.  (We don't
12199              * need to figure this out until pass 2) */
12200             bool maybe_exactfu = PASS2
12201                                && (node_type == EXACTF || node_type == EXACTFL);
12202
12203             /* If a folding node contains only code points that don't
12204              * participate in folds, it can be changed into an EXACT node,
12205              * which allows the optimizer more things to look for */
12206             bool maybe_exact;
12207
12208             ret = reg_node(pRExC_state, node_type);
12209
12210             /* In pass1, folded, we use a temporary buffer instead of the
12211              * actual node, as the node doesn't exist yet */
12212             s = (SIZE_ONLY && FOLD) ? foldbuf : STRING(ret);
12213
12214             s0 = s;
12215
12216           reparse:
12217
12218             /* We do the EXACTFish to EXACT node only if folding.  (And we
12219              * don't need to figure this out until pass 2) */
12220             maybe_exact = FOLD && PASS2;
12221
12222             /* XXX The node can hold up to 255 bytes, yet this only goes to
12223              * 127.  I (khw) do not know why.  Keeping it somewhat less than
12224              * 255 allows us to not have to worry about overflow due to
12225              * converting to utf8 and fold expansion, but that value is
12226              * 255-UTF8_MAXBYTES_CASE.  join_exact() may join adjacent nodes
12227              * split up by this limit into a single one using the real max of
12228              * 255.  Even at 127, this breaks under rare circumstances.  If
12229              * folding, we do not want to split a node at a character that is a
12230              * non-final in a multi-char fold, as an input string could just
12231              * happen to want to match across the node boundary.  The join
12232              * would solve that problem if the join actually happens.  But a
12233              * series of more than two nodes in a row each of 127 would cause
12234              * the first join to succeed to get to 254, but then there wouldn't
12235              * be room for the next one, which could at be one of those split
12236              * multi-char folds.  I don't know of any fool-proof solution.  One
12237              * could back off to end with only a code point that isn't such a
12238              * non-final, but it is possible for there not to be any in the
12239              * entire node. */
12240             for (p = RExC_parse - 1;
12241                  len < upper_parse && p < RExC_end;
12242                  len++)
12243             {
12244                 oldp = p;
12245
12246                 if (RExC_flags & RXf_PMf_EXTENDED)
12247                     p = regpatws(pRExC_state, p,
12248                                           TRUE); /* means recognize comments */
12249                 switch ((U8)*p) {
12250                 case '^':
12251                 case '$':
12252                 case '.':
12253                 case '[':
12254                 case '(':
12255                 case ')':
12256                 case '|':
12257                     goto loopdone;
12258                 case '\\':
12259                     /* Literal Escapes Switch
12260
12261                        This switch is meant to handle escape sequences that
12262                        resolve to a literal character.
12263
12264                        Every escape sequence that represents something
12265                        else, like an assertion or a char class, is handled
12266                        in the switch marked 'Special Escapes' above in this
12267                        routine, but also has an entry here as anything that
12268                        isn't explicitly mentioned here will be treated as
12269                        an unescaped equivalent literal.
12270                     */
12271
12272                     switch ((U8)*++p) {
12273                     /* These are all the special escapes. */
12274                     case 'A':             /* Start assertion */
12275                     case 'b': case 'B':   /* Word-boundary assertion*/
12276                     case 'C':             /* Single char !DANGEROUS! */
12277                     case 'd': case 'D':   /* digit class */
12278                     case 'g': case 'G':   /* generic-backref, pos assertion */
12279                     case 'h': case 'H':   /* HORIZWS */
12280                     case 'k': case 'K':   /* named backref, keep marker */
12281                     case 'p': case 'P':   /* Unicode property */
12282                               case 'R':   /* LNBREAK */
12283                     case 's': case 'S':   /* space class */
12284                     case 'v': case 'V':   /* VERTWS */
12285                     case 'w': case 'W':   /* word class */
12286                     case 'X':             /* eXtended Unicode "combining
12287                                              character sequence" */
12288                     case 'z': case 'Z':   /* End of line/string assertion */
12289                         --p;
12290                         goto loopdone;
12291
12292                     /* Anything after here is an escape that resolves to a
12293                        literal. (Except digits, which may or may not)
12294                      */
12295                     case 'n':
12296                         ender = '\n';
12297                         p++;
12298                         break;
12299                     case 'N': /* Handle a single-code point named character. */
12300                         /* The options cause it to fail if a multiple code
12301                          * point sequence.  Handle those in the switch() above
12302                          * */
12303                         RExC_parse = p + 1;
12304                         if ((STRLEN) -1 == grok_bslash_N(pRExC_state, NULL,
12305                                                          &ender,
12306                                                          flagp,
12307                                                          depth,
12308                                                          FALSE
12309                         )) {
12310                             if (*flagp & RESTART_UTF8)
12311                                 FAIL("panic: grok_bslash_N set RESTART_UTF8");
12312                             RExC_parse = p = oldp;
12313                             goto loopdone;
12314                         }
12315                         p = RExC_parse;
12316                         if (ender > 0xff) {
12317                             REQUIRE_UTF8;
12318                         }
12319                         break;
12320                     case 'r':
12321                         ender = '\r';
12322                         p++;
12323                         break;
12324                     case 't':
12325                         ender = '\t';
12326                         p++;
12327                         break;
12328                     case 'f':
12329                         ender = '\f';
12330                         p++;
12331                         break;
12332                     case 'e':
12333                         ender = ESC_NATIVE;
12334                         p++;
12335                         break;
12336                     case 'a':
12337                         ender = '\a';
12338                         p++;
12339                         break;
12340                     case 'o':
12341                         {
12342                             UV result;
12343                             const char* error_msg;
12344
12345                             bool valid = grok_bslash_o(&p,
12346                                                        &result,
12347                                                        &error_msg,
12348                                                        PASS2, /* out warnings */
12349                                                        (bool) RExC_strict,
12350                                                        TRUE, /* Output warnings
12351                                                                 for non-
12352                                                                 portables */
12353                                                        UTF);
12354                             if (! valid) {
12355                                 RExC_parse = p; /* going to die anyway; point
12356                                                    to exact spot of failure */
12357                                 vFAIL(error_msg);
12358                             }
12359                             ender = result;
12360                             if (IN_ENCODING && ender < 0x100) {
12361                                 goto recode_encoding;
12362                             }
12363                             if (ender > 0xff) {
12364                                 REQUIRE_UTF8;
12365                             }
12366                             break;
12367                         }
12368                     case 'x':
12369                         {
12370                             UV result = UV_MAX; /* initialize to erroneous
12371                                                    value */
12372                             const char* error_msg;
12373
12374                             bool valid = grok_bslash_x(&p,
12375                                                        &result,
12376                                                        &error_msg,
12377                                                        PASS2, /* out warnings */
12378                                                        (bool) RExC_strict,
12379                                                        TRUE, /* Silence warnings
12380                                                                 for non-
12381                                                                 portables */
12382                                                        UTF);
12383                             if (! valid) {
12384                                 RExC_parse = p; /* going to die anyway; point
12385                                                    to exact spot of failure */
12386                                 vFAIL(error_msg);
12387                             }
12388                             ender = result;
12389
12390                             if (IN_ENCODING && ender < 0x100) {
12391                                 goto recode_encoding;
12392                             }
12393                             if (ender > 0xff) {
12394                                 REQUIRE_UTF8;
12395                             }
12396                             break;
12397                         }
12398                     case 'c':
12399                         p++;
12400                         ender = grok_bslash_c(*p++, PASS2);
12401                         break;
12402                     case '8': case '9': /* must be a backreference */
12403                         --p;
12404                         /* we have an escape like \8 which cannot be an octal escape
12405                          * so we exit the loop, and let the outer loop handle this
12406                          * escape which may or may not be a legitimate backref. */
12407                         goto loopdone;
12408                     case '1': case '2': case '3':case '4':
12409                     case '5': case '6': case '7':
12410                         /* When we parse backslash escapes there is ambiguity
12411                          * between backreferences and octal escapes. Any escape
12412                          * from \1 - \9 is a backreference, any multi-digit
12413                          * escape which does not start with 0 and which when
12414                          * evaluated as decimal could refer to an already
12415                          * parsed capture buffer is a back reference. Anything
12416                          * else is octal.
12417                          *
12418                          * Note this implies that \118 could be interpreted as
12419                          * 118 OR as "\11" . "8" depending on whether there
12420                          * were 118 capture buffers defined already in the
12421                          * pattern.  */
12422
12423                         /* NOTE, RExC_npar is 1 more than the actual number of
12424                          * parens we have seen so far, hence the < RExC_npar below. */
12425
12426                         if ( !isDIGIT(p[1]) || S_backref_value(p) < RExC_npar)
12427                         {  /* Not to be treated as an octal constant, go
12428                                    find backref */
12429                             --p;
12430                             goto loopdone;
12431                         }
12432                         /* FALLTHROUGH */
12433                     case '0':
12434                         {
12435                             I32 flags = PERL_SCAN_SILENT_ILLDIGIT;
12436                             STRLEN numlen = 3;
12437                             ender = grok_oct(p, &numlen, &flags, NULL);
12438                             if (ender > 0xff) {
12439                                 REQUIRE_UTF8;
12440                             }
12441                             p += numlen;
12442                             if (PASS2   /* like \08, \178 */
12443                                 && numlen < 3
12444                                 && p < RExC_end
12445                                 && isDIGIT(*p) && ckWARN(WARN_REGEXP))
12446                             {
12447                                 reg_warn_non_literal_string(
12448                                          p + 1,
12449                                          form_short_octal_warning(p, numlen));
12450                             }
12451                         }
12452                         if (IN_ENCODING && ender < 0x100)
12453                             goto recode_encoding;
12454                         break;
12455                       recode_encoding:
12456                         if (! RExC_override_recoding) {
12457                             SV* enc = _get_encoding();
12458                             ender = reg_recode((const char)(U8)ender, &enc);
12459                             if (!enc && PASS2)
12460                                 ckWARNreg(p, "Invalid escape in the specified encoding");
12461                             REQUIRE_UTF8;
12462                         }
12463                         break;
12464                     case '\0':
12465                         if (p >= RExC_end)
12466                             FAIL("Trailing \\");
12467                         /* FALLTHROUGH */
12468                     default:
12469                         if (!SIZE_ONLY&& isALPHANUMERIC(*p)) {
12470                             /* Include any { following the alpha to emphasize
12471                              * that it could be part of an escape at some point
12472                              * in the future */
12473                             int len = (isALPHA(*p) && *(p + 1) == '{') ? 2 : 1;
12474                             ckWARN3reg(p + len, "Unrecognized escape \\%.*s passed through", len, p);
12475                         }
12476                         goto normal_default;
12477                     } /* End of switch on '\' */
12478                     break;
12479                 case '{':
12480                     /* Currently we don't warn when the lbrace is at the start
12481                      * of a construct.  This catches it in the middle of a
12482                      * literal string, or when its the first thing after
12483                      * something like "\b" */
12484                     if (! SIZE_ONLY
12485                         && (len || (p > RExC_start && isALPHA_A(*(p -1)))))
12486                     {
12487                         ckWARNregdep(p + 1, "Unescaped left brace in regex is deprecated, passed through");
12488                     }
12489                     /*FALLTHROUGH*/
12490                 default:    /* A literal character */
12491                   normal_default:
12492                     if (UTF8_IS_START(*p) && UTF) {
12493                         STRLEN numlen;
12494                         ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
12495                                                &numlen, UTF8_ALLOW_DEFAULT);
12496                         p += numlen;
12497                     }
12498                     else
12499                         ender = (U8) *p++;
12500                     break;
12501                 } /* End of switch on the literal */
12502
12503                 /* Here, have looked at the literal character and <ender>
12504                  * contains its ordinal, <p> points to the character after it
12505                  */
12506
12507                 if ( RExC_flags & RXf_PMf_EXTENDED)
12508                     p = regpatws(pRExC_state, p,
12509                                           TRUE); /* means recognize comments */
12510
12511                 /* If the next thing is a quantifier, it applies to this
12512                  * character only, which means that this character has to be in
12513                  * its own node and can't just be appended to the string in an
12514                  * existing node, so if there are already other characters in
12515                  * the node, close the node with just them, and set up to do
12516                  * this character again next time through, when it will be the
12517                  * only thing in its new node */
12518                 if ((next_is_quantifier = (p < RExC_end && ISMULT2(p))) && len)
12519                 {
12520                     p = oldp;
12521                     goto loopdone;
12522                 }
12523
12524                 if (! FOLD) {  /* The simple case, just append the literal */
12525
12526                     /* In the sizing pass, we need only the size of the
12527                      * character we are appending, hence we can delay getting
12528                      * its representation until PASS2. */
12529                     if (SIZE_ONLY) {
12530                         if (UTF) {
12531                             const STRLEN unilen = UNISKIP(ender);
12532                             s += unilen;
12533
12534                             /* We have to subtract 1 just below (and again in
12535                              * the corresponding PASS2 code) because the loop
12536                              * increments <len> each time, as all but this path
12537                              * (and one other) through it add a single byte to
12538                              * the EXACTish node.  But these paths would change
12539                              * len to be the correct final value, so cancel out
12540                              * the increment that follows */
12541                             len += unilen - 1;
12542                         }
12543                         else {
12544                             s++;
12545                         }
12546                     } else { /* PASS2 */
12547                       not_fold_common:
12548                         if (UTF) {
12549                             U8 * new_s = uvchr_to_utf8((U8*)s, ender);
12550                             len += (char *) new_s - s - 1;
12551                             s = (char *) new_s;
12552                         }
12553                         else {
12554                             *(s++) = (char) ender;
12555                         }
12556                     }
12557                 }
12558                 else if (LOC && is_PROBLEMATIC_LOCALE_FOLD_cp(ender)) {
12559
12560                     /* Here are folding under /l, and the code point is
12561                      * problematic.  First, we know we can't simplify things */
12562                     maybe_exact = FALSE;
12563                     maybe_exactfu = FALSE;
12564
12565                     /* A problematic code point in this context means that its
12566                      * fold isn't known until runtime, so we can't fold it now.
12567                      * (The non-problematic code points are the above-Latin1
12568                      * ones that fold to also all above-Latin1.  Their folds
12569                      * don't vary no matter what the locale is.) But here we
12570                      * have characters whose fold depends on the locale.
12571                      * Unlike the non-folding case above, we have to keep track
12572                      * of these in the sizing pass, so that we can make sure we
12573                      * don't split too-long nodes in the middle of a potential
12574                      * multi-char fold.  And unlike the regular fold case
12575                      * handled in the else clauses below, we don't actually
12576                      * fold and don't have special cases to consider.  What we
12577                      * do for both passes is the PASS2 code for non-folding */
12578                     goto not_fold_common;
12579                 }
12580                 else /* A regular FOLD code point */
12581                     if (! ( UTF
12582                         /* See comments for join_exact() as to why we fold this
12583                          * non-UTF at compile time */
12584                         || (node_type == EXACTFU
12585                             && ender == LATIN_SMALL_LETTER_SHARP_S)))
12586                 {
12587                     /* Here, are folding and are not UTF-8 encoded; therefore
12588                      * the character must be in the range 0-255, and is not /l
12589                      * (Not /l because we already handled these under /l in
12590                      * is_PROBLEMATIC_LOCALE_FOLD_cp) */
12591                     if (IS_IN_SOME_FOLD_L1(ender)) {
12592                         maybe_exact = FALSE;
12593
12594                         /* See if the character's fold differs between /d and
12595                          * /u.  This includes the multi-char fold SHARP S to
12596                          * 'ss' */
12597                         if (maybe_exactfu
12598                             && (PL_fold[ender] != PL_fold_latin1[ender]
12599                                 || ender == LATIN_SMALL_LETTER_SHARP_S
12600                                 || (len > 0
12601                                    && isALPHA_FOLD_EQ(ender, 's')
12602                                    && isALPHA_FOLD_EQ(*(s-1), 's'))))
12603                         {
12604                             maybe_exactfu = FALSE;
12605                         }
12606                     }
12607
12608                     /* Even when folding, we store just the input character, as
12609                      * we have an array that finds its fold quickly */
12610                     *(s++) = (char) ender;
12611                 }
12612                 else {  /* FOLD and UTF */
12613                     /* Unlike the non-fold case, we do actually have to
12614                      * calculate the results here in pass 1.  This is for two
12615                      * reasons, the folded length may be longer than the
12616                      * unfolded, and we have to calculate how many EXACTish
12617                      * nodes it will take; and we may run out of room in a node
12618                      * in the middle of a potential multi-char fold, and have
12619                      * to back off accordingly.  */
12620
12621                     UV folded;
12622                     if (isASCII_uni(ender)) {
12623                         folded = toFOLD(ender);
12624                         *(s)++ = (U8) folded;
12625                     }
12626                     else {
12627                         STRLEN foldlen;
12628
12629                         folded = _to_uni_fold_flags(
12630                                      ender,
12631                                      (U8 *) s,
12632                                      &foldlen,
12633                                      FOLD_FLAGS_FULL | ((ASCII_FOLD_RESTRICTED)
12634                                                         ? FOLD_FLAGS_NOMIX_ASCII
12635                                                         : 0));
12636                         s += foldlen;
12637
12638                         /* The loop increments <len> each time, as all but this
12639                          * path (and one other) through it add a single byte to
12640                          * the EXACTish node.  But this one has changed len to
12641                          * be the correct final value, so subtract one to
12642                          * cancel out the increment that follows */
12643                         len += foldlen - 1;
12644                     }
12645                     /* If this node only contains non-folding code points so
12646                      * far, see if this new one is also non-folding */
12647                     if (maybe_exact) {
12648                         if (folded != ender) {
12649                             maybe_exact = FALSE;
12650                         }
12651                         else {
12652                             /* Here the fold is the original; we have to check
12653                              * further to see if anything folds to it */
12654                             if (_invlist_contains_cp(PL_utf8_foldable,
12655                                                         ender))
12656                             {
12657                                 maybe_exact = FALSE;
12658                             }
12659                         }
12660                     }
12661                     ender = folded;
12662                 }
12663
12664                 if (next_is_quantifier) {
12665
12666                     /* Here, the next input is a quantifier, and to get here,
12667                      * the current character is the only one in the node.
12668                      * Also, here <len> doesn't include the final byte for this
12669                      * character */
12670                     len++;
12671                     goto loopdone;
12672                 }
12673
12674             } /* End of loop through literal characters */
12675
12676             /* Here we have either exhausted the input or ran out of room in
12677              * the node.  (If we encountered a character that can't be in the
12678              * node, transfer is made directly to <loopdone>, and so we
12679              * wouldn't have fallen off the end of the loop.)  In the latter
12680              * case, we artificially have to split the node into two, because
12681              * we just don't have enough space to hold everything.  This
12682              * creates a problem if the final character participates in a
12683              * multi-character fold in the non-final position, as a match that
12684              * should have occurred won't, due to the way nodes are matched,
12685              * and our artificial boundary.  So back off until we find a non-
12686              * problematic character -- one that isn't at the beginning or
12687              * middle of such a fold.  (Either it doesn't participate in any
12688              * folds, or appears only in the final position of all the folds it
12689              * does participate in.)  A better solution with far fewer false
12690              * positives, and that would fill the nodes more completely, would
12691              * be to actually have available all the multi-character folds to
12692              * test against, and to back-off only far enough to be sure that
12693              * this node isn't ending with a partial one.  <upper_parse> is set
12694              * further below (if we need to reparse the node) to include just
12695              * up through that final non-problematic character that this code
12696              * identifies, so when it is set to less than the full node, we can
12697              * skip the rest of this */
12698             if (FOLD && p < RExC_end && upper_parse == MAX_NODE_STRING_SIZE) {
12699
12700                 const STRLEN full_len = len;
12701
12702                 assert(len >= MAX_NODE_STRING_SIZE);
12703
12704                 /* Here, <s> points to the final byte of the final character.
12705                  * Look backwards through the string until find a non-
12706                  * problematic character */
12707
12708                 if (! UTF) {
12709
12710                     /* This has no multi-char folds to non-UTF characters */
12711                     if (ASCII_FOLD_RESTRICTED) {
12712                         goto loopdone;
12713                     }
12714
12715                     while (--s >= s0 && IS_NON_FINAL_FOLD(*s)) { }
12716                     len = s - s0 + 1;
12717                 }
12718                 else {
12719                     if (!  PL_NonL1NonFinalFold) {
12720                         PL_NonL1NonFinalFold = _new_invlist_C_array(
12721                                         NonL1_Perl_Non_Final_Folds_invlist);
12722                     }
12723
12724                     /* Point to the first byte of the final character */
12725                     s = (char *) utf8_hop((U8 *) s, -1);
12726
12727                     while (s >= s0) {   /* Search backwards until find
12728                                            non-problematic char */
12729                         if (UTF8_IS_INVARIANT(*s)) {
12730
12731                             /* There are no ascii characters that participate
12732                              * in multi-char folds under /aa.  In EBCDIC, the
12733                              * non-ascii invariants are all control characters,
12734                              * so don't ever participate in any folds. */
12735                             if (ASCII_FOLD_RESTRICTED
12736                                 || ! IS_NON_FINAL_FOLD(*s))
12737                             {
12738                                 break;
12739                             }
12740                         }
12741                         else if (UTF8_IS_DOWNGRADEABLE_START(*s)) {
12742                             if (! IS_NON_FINAL_FOLD(TWO_BYTE_UTF8_TO_NATIVE(
12743                                                                   *s, *(s+1))))
12744                             {
12745                                 break;
12746                             }
12747                         }
12748                         else if (! _invlist_contains_cp(
12749                                         PL_NonL1NonFinalFold,
12750                                         valid_utf8_to_uvchr((U8 *) s, NULL)))
12751                         {
12752                             break;
12753                         }
12754
12755                         /* Here, the current character is problematic in that
12756                          * it does occur in the non-final position of some
12757                          * fold, so try the character before it, but have to
12758                          * special case the very first byte in the string, so
12759                          * we don't read outside the string */
12760                         s = (s == s0) ? s -1 : (char *) utf8_hop((U8 *) s, -1);
12761                     } /* End of loop backwards through the string */
12762
12763                     /* If there were only problematic characters in the string,
12764                      * <s> will point to before s0, in which case the length
12765                      * should be 0, otherwise include the length of the
12766                      * non-problematic character just found */
12767                     len = (s < s0) ? 0 : s - s0 + UTF8SKIP(s);
12768                 }
12769
12770                 /* Here, have found the final character, if any, that is
12771                  * non-problematic as far as ending the node without splitting
12772                  * it across a potential multi-char fold.  <len> contains the
12773                  * number of bytes in the node up-to and including that
12774                  * character, or is 0 if there is no such character, meaning
12775                  * the whole node contains only problematic characters.  In
12776                  * this case, give up and just take the node as-is.  We can't
12777                  * do any better */
12778                 if (len == 0) {
12779                     len = full_len;
12780
12781                     /* If the node ends in an 's' we make sure it stays EXACTF,
12782                      * as if it turns into an EXACTFU, it could later get
12783                      * joined with another 's' that would then wrongly match
12784                      * the sharp s */
12785                     if (maybe_exactfu && isALPHA_FOLD_EQ(ender, 's'))
12786                     {
12787                         maybe_exactfu = FALSE;
12788                     }
12789                 } else {
12790
12791                     /* Here, the node does contain some characters that aren't
12792                      * problematic.  If one such is the final character in the
12793                      * node, we are done */
12794                     if (len == full_len) {
12795                         goto loopdone;
12796                     }
12797                     else if (len + ((UTF) ? UTF8SKIP(s) : 1) == full_len) {
12798
12799                         /* If the final character is problematic, but the
12800                          * penultimate is not, back-off that last character to
12801                          * later start a new node with it */
12802                         p = oldp;
12803                         goto loopdone;
12804                     }
12805
12806                     /* Here, the final non-problematic character is earlier
12807                      * in the input than the penultimate character.  What we do
12808                      * is reparse from the beginning, going up only as far as
12809                      * this final ok one, thus guaranteeing that the node ends
12810                      * in an acceptable character.  The reason we reparse is
12811                      * that we know how far in the character is, but we don't
12812                      * know how to correlate its position with the input parse.
12813                      * An alternate implementation would be to build that
12814                      * correlation as we go along during the original parse,
12815                      * but that would entail extra work for every node, whereas
12816                      * this code gets executed only when the string is too
12817                      * large for the node, and the final two characters are
12818                      * problematic, an infrequent occurrence.  Yet another
12819                      * possible strategy would be to save the tail of the
12820                      * string, and the next time regatom is called, initialize
12821                      * with that.  The problem with this is that unless you
12822                      * back off one more character, you won't be guaranteed
12823                      * regatom will get called again, unless regbranch,
12824                      * regpiece ... are also changed.  If you do back off that
12825                      * extra character, so that there is input guaranteed to
12826                      * force calling regatom, you can't handle the case where
12827                      * just the first character in the node is acceptable.  I
12828                      * (khw) decided to try this method which doesn't have that
12829                      * pitfall; if performance issues are found, we can do a
12830                      * combination of the current approach plus that one */
12831                     upper_parse = len;
12832                     len = 0;
12833                     s = s0;
12834                     goto reparse;
12835                 }
12836             }   /* End of verifying node ends with an appropriate char */
12837
12838           loopdone:   /* Jumped to when encounters something that shouldn't be
12839                          in the node */
12840
12841             /* I (khw) don't know if you can get here with zero length, but the
12842              * old code handled this situation by creating a zero-length EXACT
12843              * node.  Might as well be NOTHING instead */
12844             if (len == 0) {
12845                 OP(ret) = NOTHING;
12846             }
12847             else {
12848                 if (FOLD) {
12849                     /* If 'maybe_exact' is still set here, means there are no
12850                      * code points in the node that participate in folds;
12851                      * similarly for 'maybe_exactfu' and code points that match
12852                      * differently depending on UTF8ness of the target string
12853                      * (for /u), or depending on locale for /l */
12854                     if (maybe_exact) {
12855                         OP(ret) = (LOC)
12856                                   ? EXACTL
12857                                   : EXACT;
12858                     }
12859                     else if (maybe_exactfu) {
12860                         OP(ret) = (LOC)
12861                                   ? EXACTFLU8
12862                                   : EXACTFU;
12863                     }
12864                 }
12865                 alloc_maybe_populate_EXACT(pRExC_state, ret, flagp, len, ender,
12866                                            FALSE /* Don't look to see if could
12867                                                     be turned into an EXACT
12868                                                     node, as we have already
12869                                                     computed that */
12870                                           );
12871             }
12872
12873             RExC_parse = p - 1;
12874             Set_Node_Cur_Length(ret, parse_start);
12875             nextchar(pRExC_state);
12876             {
12877                 /* len is STRLEN which is unsigned, need to copy to signed */
12878                 IV iv = len;
12879                 if (iv < 0)
12880                     vFAIL("Internal disaster");
12881             }
12882
12883         } /* End of label 'defchar:' */
12884         break;
12885     } /* End of giant switch on input character */
12886
12887     return(ret);
12888 }
12889
12890 STATIC char *
12891 S_regpatws(RExC_state_t *pRExC_state, char *p , const bool recognize_comment )
12892 {
12893     /* Returns the next non-pattern-white space, non-comment character (the
12894      * latter only if 'recognize_comment is true) in the string p, which is
12895      * ended by RExC_end.  See also reg_skipcomment */
12896     const char *e = RExC_end;
12897
12898     PERL_ARGS_ASSERT_REGPATWS;
12899
12900     while (p < e) {
12901         STRLEN len;
12902         if ((len = is_PATWS_safe(p, e, UTF))) {
12903             p += len;
12904         }
12905         else if (recognize_comment && *p == '#') {
12906             p = reg_skipcomment(pRExC_state, p);
12907         }
12908         else
12909             break;
12910     }
12911     return p;
12912 }
12913
12914 STATIC void
12915 S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
12916 {
12917     /* Uses the inversion list '*invlist_ptr' to populate the ANYOF 'node'.  It
12918      * sets up the bitmap and any flags, removing those code points from the
12919      * inversion list, setting it to NULL should it become completely empty */
12920
12921     PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST;
12922     assert(PL_regkind[OP(node)] == ANYOF);
12923
12924     ANYOF_BITMAP_ZERO(node);
12925     if (*invlist_ptr) {
12926
12927         /* This gets set if we actually need to modify things */
12928         bool change_invlist = FALSE;
12929
12930         UV start, end;
12931
12932         /* Start looking through *invlist_ptr */
12933         invlist_iterinit(*invlist_ptr);
12934         while (invlist_iternext(*invlist_ptr, &start, &end)) {
12935             UV high;
12936             int i;
12937
12938             if (end == UV_MAX && start <= NUM_ANYOF_CODE_POINTS) {
12939                 ANYOF_FLAGS(node) |= ANYOF_MATCHES_ALL_ABOVE_BITMAP;
12940             }
12941             else if (end >= NUM_ANYOF_CODE_POINTS) {
12942                 ANYOF_FLAGS(node) |= ANYOF_HAS_UTF8_NONBITMAP_MATCHES;
12943             }
12944
12945             /* Quit if are above what we should change */
12946             if (start >= NUM_ANYOF_CODE_POINTS) {
12947                 break;
12948             }
12949
12950             change_invlist = TRUE;
12951
12952             /* Set all the bits in the range, up to the max that we are doing */
12953             high = (end < NUM_ANYOF_CODE_POINTS - 1)
12954                    ? end
12955                    : NUM_ANYOF_CODE_POINTS - 1;
12956             for (i = start; i <= (int) high; i++) {
12957                 if (! ANYOF_BITMAP_TEST(node, i)) {
12958                     ANYOF_BITMAP_SET(node, i);
12959                 }
12960             }
12961         }
12962         invlist_iterfinish(*invlist_ptr);
12963
12964         /* Done with loop; remove any code points that are in the bitmap from
12965          * *invlist_ptr; similarly for code points above the bitmap if we have
12966          * a flag to match all of them anyways */
12967         if (change_invlist) {
12968             _invlist_subtract(*invlist_ptr, PL_InBitmap, invlist_ptr);
12969         }
12970         if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
12971             _invlist_intersection(*invlist_ptr, PL_InBitmap, invlist_ptr);
12972         }
12973
12974         /* If have completely emptied it, remove it completely */
12975         if (_invlist_len(*invlist_ptr) == 0) {
12976             SvREFCNT_dec_NN(*invlist_ptr);
12977             *invlist_ptr = NULL;
12978         }
12979     }
12980 }
12981
12982 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
12983    Character classes ([:foo:]) can also be negated ([:^foo:]).
12984    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
12985    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
12986    but trigger failures because they are currently unimplemented. */
12987
12988 #define POSIXCC_DONE(c)   ((c) == ':')
12989 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
12990 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
12991
12992 PERL_STATIC_INLINE I32
12993 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value, const bool strict)
12994 {
12995     I32 namedclass = OOB_NAMEDCLASS;
12996
12997     PERL_ARGS_ASSERT_REGPPOSIXCC;
12998
12999     if (value == '[' && RExC_parse + 1 < RExC_end &&
13000         /* I smell either [: or [= or [. -- POSIX has been here, right? */
13001         POSIXCC(UCHARAT(RExC_parse)))
13002     {
13003         const char c = UCHARAT(RExC_parse);
13004         char* const s = RExC_parse++;
13005
13006         while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
13007             RExC_parse++;
13008         if (RExC_parse == RExC_end) {
13009             if (strict) {
13010
13011                 /* Try to give a better location for the error (than the end of
13012                  * the string) by looking for the matching ']' */
13013                 RExC_parse = s;
13014                 while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
13015                     RExC_parse++;
13016                 }
13017                 vFAIL2("Unmatched '%c' in POSIX class", c);
13018             }
13019             /* Grandfather lone [:, [=, [. */
13020             RExC_parse = s;
13021         }
13022         else {
13023             const char* const t = RExC_parse++; /* skip over the c */
13024             assert(*t == c);
13025
13026             if (UCHARAT(RExC_parse) == ']') {
13027                 const char *posixcc = s + 1;
13028                 RExC_parse++; /* skip over the ending ] */
13029
13030                 if (*s == ':') {
13031                     const I32 complement = *posixcc == '^' ? *posixcc++ : 0;
13032                     const I32 skip = t - posixcc;
13033
13034                     /* Initially switch on the length of the name.  */
13035                     switch (skip) {
13036                     case 4:
13037                         if (memEQ(posixcc, "word", 4)) /* this is not POSIX,
13038                                                           this is the Perl \w
13039                                                         */
13040                             namedclass = ANYOF_WORDCHAR;
13041                         break;
13042                     case 5:
13043                         /* Names all of length 5.  */
13044                         /* alnum alpha ascii blank cntrl digit graph lower
13045                            print punct space upper  */
13046                         /* Offset 4 gives the best switch position.  */
13047                         switch (posixcc[4]) {
13048                         case 'a':
13049                             if (memEQ(posixcc, "alph", 4)) /* alpha */
13050                                 namedclass = ANYOF_ALPHA;
13051                             break;
13052                         case 'e':
13053                             if (memEQ(posixcc, "spac", 4)) /* space */
13054                                 namedclass = ANYOF_SPACE;
13055                             break;
13056                         case 'h':
13057                             if (memEQ(posixcc, "grap", 4)) /* graph */
13058                                 namedclass = ANYOF_GRAPH;
13059                             break;
13060                         case 'i':
13061                             if (memEQ(posixcc, "asci", 4)) /* ascii */
13062                                 namedclass = ANYOF_ASCII;
13063                             break;
13064                         case 'k':
13065                             if (memEQ(posixcc, "blan", 4)) /* blank */
13066                                 namedclass = ANYOF_BLANK;
13067                             break;
13068                         case 'l':
13069                             if (memEQ(posixcc, "cntr", 4)) /* cntrl */
13070                                 namedclass = ANYOF_CNTRL;
13071                             break;
13072                         case 'm':
13073                             if (memEQ(posixcc, "alnu", 4)) /* alnum */
13074                                 namedclass = ANYOF_ALPHANUMERIC;
13075                             break;
13076                         case 'r':
13077                             if (memEQ(posixcc, "lowe", 4)) /* lower */
13078                                 namedclass = (FOLD) ? ANYOF_CASED : ANYOF_LOWER;
13079                             else if (memEQ(posixcc, "uppe", 4)) /* upper */
13080                                 namedclass = (FOLD) ? ANYOF_CASED : ANYOF_UPPER;
13081                             break;
13082                         case 't':
13083                             if (memEQ(posixcc, "digi", 4)) /* digit */
13084                                 namedclass = ANYOF_DIGIT;
13085                             else if (memEQ(posixcc, "prin", 4)) /* print */
13086                                 namedclass = ANYOF_PRINT;
13087                             else if (memEQ(posixcc, "punc", 4)) /* punct */
13088                                 namedclass = ANYOF_PUNCT;
13089                             break;
13090                         }
13091                         break;
13092                     case 6:
13093                         if (memEQ(posixcc, "xdigit", 6))
13094                             namedclass = ANYOF_XDIGIT;
13095                         break;
13096                     }
13097
13098                     if (namedclass == OOB_NAMEDCLASS)
13099                         vFAIL2utf8f(
13100                             "POSIX class [:%"UTF8f":] unknown",
13101                             UTF8fARG(UTF, t - s - 1, s + 1));
13102
13103                     /* The #defines are structured so each complement is +1 to
13104                      * the normal one */
13105                     if (complement) {
13106                         namedclass++;
13107                     }
13108                     assert (posixcc[skip] == ':');
13109                     assert (posixcc[skip+1] == ']');
13110                 } else if (!SIZE_ONLY) {
13111                     /* [[=foo=]] and [[.foo.]] are still future. */
13112
13113                     /* adjust RExC_parse so the warning shows after
13114                        the class closes */
13115                     while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
13116                         RExC_parse++;
13117                     vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
13118                 }
13119             } else {
13120                 /* Maternal grandfather:
13121                  * "[:" ending in ":" but not in ":]" */
13122                 if (strict) {
13123                     vFAIL("Unmatched '[' in POSIX class");
13124                 }
13125
13126                 /* Grandfather lone [:, [=, [. */
13127                 RExC_parse = s;
13128             }
13129         }
13130     }
13131
13132     return namedclass;
13133 }
13134
13135 STATIC bool
13136 S_could_it_be_a_POSIX_class(RExC_state_t *pRExC_state)
13137 {
13138     /* This applies some heuristics at the current parse position (which should
13139      * be at a '[') to see if what follows might be intended to be a [:posix:]
13140      * class.  It returns true if it really is a posix class, of course, but it
13141      * also can return true if it thinks that what was intended was a posix
13142      * class that didn't quite make it.
13143      *
13144      * It will return true for
13145      *      [:alphanumerics:
13146      *      [:alphanumerics]  (as long as the ] isn't followed immediately by a
13147      *                         ')' indicating the end of the (?[
13148      *      [:any garbage including %^&$ punctuation:]
13149      *
13150      * This is designed to be called only from S_handle_regex_sets; it could be
13151      * easily adapted to be called from the spot at the beginning of regclass()
13152      * that checks to see in a normal bracketed class if the surrounding []
13153      * have been omitted ([:word:] instead of [[:word:]]).  But doing so would
13154      * change long-standing behavior, so I (khw) didn't do that */
13155     char* p = RExC_parse + 1;
13156     char first_char = *p;
13157
13158     PERL_ARGS_ASSERT_COULD_IT_BE_A_POSIX_CLASS;
13159
13160     assert(*(p - 1) == '[');
13161
13162     if (! POSIXCC(first_char)) {
13163         return FALSE;
13164     }
13165
13166     p++;
13167     while (p < RExC_end && isWORDCHAR(*p)) p++;
13168
13169     if (p >= RExC_end) {
13170         return FALSE;
13171     }
13172
13173     if (p - RExC_parse > 2    /* Got at least 1 word character */
13174         && (*p == first_char
13175             || (*p == ']' && p + 1 < RExC_end && *(p + 1) != ')')))
13176     {
13177         return TRUE;
13178     }
13179
13180     p = (char *) memchr(RExC_parse, ']', RExC_end - RExC_parse);
13181
13182     return (p
13183             && p - RExC_parse > 2 /* [:] evaluates to colon;
13184                                       [::] is a bad posix class. */
13185             && first_char == *(p - 1));
13186 }
13187
13188 STATIC regnode *
13189 S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist,
13190                     I32 *flagp, U32 depth,
13191                     char * const oregcomp_parse)
13192 {
13193     /* Handle the (?[...]) construct to do set operations */
13194
13195     U8 curchar;
13196     UV start, end;      /* End points of code point ranges */
13197     SV* result_string;
13198     char *save_end, *save_parse;
13199     SV* final;
13200     STRLEN len;
13201     regnode* node;
13202     AV* stack;
13203     const bool save_fold = FOLD;
13204
13205     GET_RE_DEBUG_FLAGS_DECL;
13206
13207     PERL_ARGS_ASSERT_HANDLE_REGEX_SETS;
13208
13209     if (LOC) {
13210         vFAIL("(?[...]) not valid in locale");
13211     }
13212     RExC_uni_semantics = 1;
13213
13214     /* This will return only an ANYOF regnode, or (unlikely) something smaller
13215      * (such as EXACT).  Thus we can skip most everything if just sizing.  We
13216      * call regclass to handle '[]' so as to not have to reinvent its parsing
13217      * rules here (throwing away the size it computes each time).  And, we exit
13218      * upon an unescaped ']' that isn't one ending a regclass.  To do both
13219      * these things, we need to realize that something preceded by a backslash
13220      * is escaped, so we have to keep track of backslashes */
13221     if (PASS2) {
13222         Perl_ck_warner_d(aTHX_
13223             packWARN(WARN_EXPERIMENTAL__REGEX_SETS),
13224             "The regex_sets feature is experimental" REPORT_LOCATION,
13225                 UTF8fARG(UTF, (RExC_parse - RExC_precomp), RExC_precomp),
13226                 UTF8fARG(UTF,
13227                          RExC_end - RExC_start - (RExC_parse - RExC_precomp),
13228                          RExC_precomp + (RExC_parse - RExC_precomp)));
13229     }
13230     else {
13231         UV depth = 0; /* how many nested (?[...]) constructs */
13232
13233         while (RExC_parse < RExC_end) {
13234             SV* current = NULL;
13235             RExC_parse = regpatws(pRExC_state, RExC_parse,
13236                                           TRUE); /* means recognize comments */
13237             switch (*RExC_parse) {
13238                 case '?':
13239                     if (RExC_parse[1] == '[') depth++, RExC_parse++;
13240                     /* FALLTHROUGH */
13241                 default:
13242                     break;
13243                 case '\\':
13244                     /* Skip the next byte (which could cause us to end up in
13245                      * the middle of a UTF-8 character, but since none of those
13246                      * are confusable with anything we currently handle in this
13247                      * switch (invariants all), it's safe.  We'll just hit the
13248                      * default: case next time and keep on incrementing until
13249                      * we find one of the invariants we do handle. */
13250                     RExC_parse++;
13251                     break;
13252                 case '[':
13253                 {
13254                     /* If this looks like it is a [:posix:] class, leave the
13255                      * parse pointer at the '[' to fool regclass() into
13256                      * thinking it is part of a '[[:posix:]]'.  That function
13257                      * will use strict checking to force a syntax error if it
13258                      * doesn't work out to a legitimate class */
13259                     bool is_posix_class
13260                                     = could_it_be_a_POSIX_class(pRExC_state);
13261                     if (! is_posix_class) {
13262                         RExC_parse++;
13263                     }
13264
13265                     /* regclass() can only return RESTART_UTF8 if multi-char
13266                        folds are allowed.  */
13267                     if (!regclass(pRExC_state, flagp,depth+1,
13268                                   is_posix_class, /* parse the whole char
13269                                                      class only if not a
13270                                                      posix class */
13271                                   FALSE, /* don't allow multi-char folds */
13272                                   TRUE, /* silence non-portable warnings. */
13273                                   TRUE, /* strict */
13274                                   &current
13275                                  ))
13276                         FAIL2("panic: regclass returned NULL to handle_sets, flags=%#"UVxf"",
13277                               (UV) *flagp);
13278
13279                     /* function call leaves parse pointing to the ']', except
13280                      * if we faked it */
13281                     if (is_posix_class) {
13282                         RExC_parse--;
13283                     }
13284
13285                     SvREFCNT_dec(current);   /* In case it returned something */
13286                     break;
13287                 }
13288
13289                 case ']':
13290                     if (depth--) break;
13291                     RExC_parse++;
13292                     if (RExC_parse < RExC_end
13293                         && *RExC_parse == ')')
13294                     {
13295                         node = reganode(pRExC_state, ANYOF, 0);
13296                         RExC_size += ANYOF_SKIP;
13297                         nextchar(pRExC_state);
13298                         Set_Node_Length(node,
13299                                 RExC_parse - oregcomp_parse + 1); /* MJD */
13300                         return node;
13301                     }
13302                     goto no_close;
13303             }
13304             RExC_parse++;
13305         }
13306
13307       no_close:
13308         FAIL("Syntax error in (?[...])");
13309     }
13310
13311     /* Pass 2 only after this.  Everything in this construct is a
13312      * metacharacter.  Operands begin with either a '\' (for an escape
13313      * sequence), or a '[' for a bracketed character class.  Any other
13314      * character should be an operator, or parenthesis for grouping.  Both
13315      * types of operands are handled by calling regclass() to parse them.  It
13316      * is called with a parameter to indicate to return the computed inversion
13317      * list.  The parsing here is implemented via a stack.  Each entry on the
13318      * stack is a single character representing one of the operators, or the
13319      * '('; or else a pointer to an operand inversion list. */
13320
13321 #define IS_OPERAND(a)  (! SvIOK(a))
13322
13323     /* The stack starts empty.  It is a syntax error if the first thing parsed
13324      * is a binary operator; everything else is pushed on the stack.  When an
13325      * operand is parsed, the top of the stack is examined.  If it is a binary
13326      * operator, the item before it should be an operand, and both are replaced
13327      * by the result of doing that operation on the new operand and the one on
13328      * the stack.   Thus a sequence of binary operands is reduced to a single
13329      * one before the next one is parsed.
13330      *
13331      * A unary operator may immediately follow a binary in the input, for
13332      * example
13333      *      [a] + ! [b]
13334      * When an operand is parsed and the top of the stack is a unary operator,
13335      * the operation is performed, and then the stack is rechecked to see if
13336      * this new operand is part of a binary operation; if so, it is handled as
13337      * above.
13338      *
13339      * A '(' is simply pushed on the stack; it is valid only if the stack is
13340      * empty, or the top element of the stack is an operator or another '('
13341      * (for which the parenthesized expression will become an operand).  By the
13342      * time the corresponding ')' is parsed everything in between should have
13343      * been parsed and evaluated to a single operand (or else is a syntax
13344      * error), and is handled as a regular operand */
13345
13346     sv_2mortal((SV *)(stack = newAV()));
13347
13348     while (RExC_parse < RExC_end) {
13349         I32 top_index = av_tindex(stack);
13350         SV** top_ptr;
13351         SV* current = NULL;
13352
13353         /* Skip white space */
13354         RExC_parse = regpatws(pRExC_state, RExC_parse,
13355                                          TRUE /* means recognize comments */ );
13356         if (RExC_parse >= RExC_end) {
13357             Perl_croak(aTHX_ "panic: Read past end of '(?[ ])'");
13358         }
13359         if ((curchar = UCHARAT(RExC_parse)) == ']') {
13360             break;
13361         }
13362
13363         switch (curchar) {
13364
13365             case '?':
13366                 if (av_tindex(stack) >= 0   /* This makes sure that we can
13367                                                safely subtract 1 from
13368                                                RExC_parse in the next clause.
13369                                                If we have something on the
13370                                                stack, we have parsed something
13371                                              */
13372                     && UCHARAT(RExC_parse - 1) == '('
13373                     && RExC_parse < RExC_end)
13374                 {
13375                     /* If is a '(?', could be an embedded '(?flags:(?[...])'.
13376                      * This happens when we have some thing like
13377                      *
13378                      *   my $thai_or_lao = qr/(?[ \p{Thai} + \p{Lao} ])/;
13379                      *   ...
13380                      *   qr/(?[ \p{Digit} & $thai_or_lao ])/;
13381                      *
13382                      * Here we would be handling the interpolated
13383                      * '$thai_or_lao'.  We handle this by a recursive call to
13384                      * ourselves which returns the inversion list the
13385                      * interpolated expression evaluates to.  We use the flags
13386                      * from the interpolated pattern. */
13387                     U32 save_flags = RExC_flags;
13388                     const char * const save_parse = ++RExC_parse;
13389
13390                     parse_lparen_question_flags(pRExC_state);
13391
13392                     if (RExC_parse == save_parse  /* Makes sure there was at
13393                                                      least one flag (or this
13394                                                      embedding wasn't compiled)
13395                                                    */
13396                         || RExC_parse >= RExC_end - 4
13397                         || UCHARAT(RExC_parse) != ':'
13398                         || UCHARAT(++RExC_parse) != '('
13399                         || UCHARAT(++RExC_parse) != '?'
13400                         || UCHARAT(++RExC_parse) != '[')
13401                     {
13402
13403                         /* In combination with the above, this moves the
13404                          * pointer to the point just after the first erroneous
13405                          * character (or if there are no flags, to where they
13406                          * should have been) */
13407                         if (RExC_parse >= RExC_end - 4) {
13408                             RExC_parse = RExC_end;
13409                         }
13410                         else if (RExC_parse != save_parse) {
13411                             RExC_parse += (UTF) ? UTF8SKIP(RExC_parse) : 1;
13412                         }
13413                         vFAIL("Expecting '(?flags:(?[...'");
13414                     }
13415                     RExC_parse++;
13416                     (void) handle_regex_sets(pRExC_state, &current, flagp,
13417                                                     depth+1, oregcomp_parse);
13418
13419                     /* Here, 'current' contains the embedded expression's
13420                      * inversion list, and RExC_parse points to the trailing
13421                      * ']'; the next character should be the ')' which will be
13422                      * paired with the '(' that has been put on the stack, so
13423                      * the whole embedded expression reduces to '(operand)' */
13424                     RExC_parse++;
13425
13426                     RExC_flags = save_flags;
13427                     goto handle_operand;
13428                 }
13429                 /* FALLTHROUGH */
13430
13431             default:
13432                 RExC_parse += (UTF) ? UTF8SKIP(RExC_parse) : 1;
13433                 vFAIL("Unexpected character");
13434
13435             case '\\':
13436                 /* regclass() can only return RESTART_UTF8 if multi-char
13437                    folds are allowed.  */
13438                 if (!regclass(pRExC_state, flagp,depth+1,
13439                               TRUE, /* means parse just the next thing */
13440                               FALSE, /* don't allow multi-char folds */
13441                               FALSE, /* don't silence non-portable warnings.  */
13442                               TRUE,  /* strict */
13443                               &current
13444                              ))
13445                     FAIL2("panic: regclass returned NULL to handle_sets, flags=%#"UVxf"",
13446                           (UV) *flagp);
13447                 /* regclass() will return with parsing just the \ sequence,
13448                  * leaving the parse pointer at the next thing to parse */
13449                 RExC_parse--;
13450                 goto handle_operand;
13451
13452             case '[':   /* Is a bracketed character class */
13453             {
13454                 bool is_posix_class = could_it_be_a_POSIX_class(pRExC_state);
13455
13456                 if (! is_posix_class) {
13457                     RExC_parse++;
13458                 }
13459
13460                 /* regclass() can only return RESTART_UTF8 if multi-char
13461                    folds are allowed.  */
13462                 if(!regclass(pRExC_state, flagp,depth+1,
13463                              is_posix_class, /* parse the whole char class
13464                                                 only if not a posix class */
13465                              FALSE, /* don't allow multi-char folds */
13466                              FALSE, /* don't silence non-portable warnings.  */
13467                              TRUE,   /* strict */
13468                              &current
13469                             ))
13470                     FAIL2("panic: regclass returned NULL to handle_sets, flags=%#"UVxf"",
13471                           (UV) *flagp);
13472                 /* function call leaves parse pointing to the ']', except if we
13473                  * faked it */
13474                 if (is_posix_class) {
13475                     RExC_parse--;
13476                 }
13477
13478                 goto handle_operand;
13479             }
13480
13481             case '&':
13482             case '|':
13483             case '+':
13484             case '-':
13485             case '^':
13486                 if (top_index < 0
13487                     || ( ! (top_ptr = av_fetch(stack, top_index, FALSE)))
13488                     || ! IS_OPERAND(*top_ptr))
13489                 {
13490                     RExC_parse++;
13491                     vFAIL2("Unexpected binary operator '%c' with no preceding operand", curchar);
13492                 }
13493                 av_push(stack, newSVuv(curchar));
13494                 break;
13495
13496             case '!':
13497                 av_push(stack, newSVuv(curchar));
13498                 break;
13499
13500             case '(':
13501                 if (top_index >= 0) {
13502                     top_ptr = av_fetch(stack, top_index, FALSE);
13503                     assert(top_ptr);
13504                     if (IS_OPERAND(*top_ptr)) {
13505                         RExC_parse++;
13506                         vFAIL("Unexpected '(' with no preceding operator");
13507                     }
13508                 }
13509                 av_push(stack, newSVuv(curchar));
13510                 break;
13511
13512             case ')':
13513             {
13514                 SV* lparen;
13515                 if (top_index < 1
13516                     || ! (current = av_pop(stack))
13517                     || ! IS_OPERAND(current)
13518                     || ! (lparen = av_pop(stack))
13519                     || IS_OPERAND(lparen)
13520                     || SvUV(lparen) != '(')
13521                 {
13522                     SvREFCNT_dec(current);
13523                     RExC_parse++;
13524                     vFAIL("Unexpected ')'");
13525                 }
13526                 top_index -= 2;
13527                 SvREFCNT_dec_NN(lparen);
13528
13529                 /* FALLTHROUGH */
13530             }
13531
13532               handle_operand:
13533
13534                 /* Here, we have an operand to process, in 'current' */
13535
13536                 if (top_index < 0) {    /* Just push if stack is empty */
13537                     av_push(stack, current);
13538                 }
13539                 else {
13540                     SV* top = av_pop(stack);
13541                     SV *prev = NULL;
13542                     char current_operator;
13543
13544                     if (IS_OPERAND(top)) {
13545                         SvREFCNT_dec_NN(top);
13546                         SvREFCNT_dec_NN(current);
13547                         vFAIL("Operand with no preceding operator");
13548                     }
13549                     current_operator = (char) SvUV(top);
13550                     switch (current_operator) {
13551                         case '(':   /* Push the '(' back on followed by the new
13552                                        operand */
13553                             av_push(stack, top);
13554                             av_push(stack, current);
13555                             SvREFCNT_inc(top);  /* Counters the '_dec' done
13556                                                    just after the 'break', so
13557                                                    it doesn't get wrongly freed
13558                                                  */
13559                             break;
13560
13561                         case '!':
13562                             _invlist_invert(current);
13563
13564                             /* Unlike binary operators, the top of the stack,
13565                              * now that this unary one has been popped off, may
13566                              * legally be an operator, and we now have operand
13567                              * for it. */
13568                             top_index--;
13569                             SvREFCNT_dec_NN(top);
13570                             goto handle_operand;
13571
13572                         case '&':
13573                             prev = av_pop(stack);
13574                             _invlist_intersection(prev,
13575                                                    current,
13576                                                    &current);
13577                             av_push(stack, current);
13578                             break;
13579
13580                         case '|':
13581                         case '+':
13582                             prev = av_pop(stack);
13583                             _invlist_union(prev, current, &current);
13584                             av_push(stack, current);
13585                             break;
13586
13587                         case '-':
13588                             prev = av_pop(stack);;
13589                             _invlist_subtract(prev, current, &current);
13590                             av_push(stack, current);
13591                             break;
13592
13593                         case '^':   /* The union minus the intersection */
13594                         {
13595                             SV* i = NULL;
13596                             SV* u = NULL;
13597                             SV* element;
13598
13599                             prev = av_pop(stack);
13600                             _invlist_union(prev, current, &u);
13601                             _invlist_intersection(prev, current, &i);
13602                             /* _invlist_subtract will overwrite current
13603                                 without freeing what it already contains */
13604                             element = current;
13605                             _invlist_subtract(u, i, &current);
13606                             av_push(stack, current);
13607                             SvREFCNT_dec_NN(i);
13608                             SvREFCNT_dec_NN(u);
13609                             SvREFCNT_dec_NN(element);
13610                             break;
13611                         }
13612
13613                         default:
13614                             Perl_croak(aTHX_ "panic: Unexpected item on '(?[ ])' stack");
13615                 }
13616                 SvREFCNT_dec_NN(top);
13617                 SvREFCNT_dec(prev);
13618             }
13619         }
13620
13621         RExC_parse += (UTF) ? UTF8SKIP(RExC_parse) : 1;
13622     }
13623
13624     if (av_tindex(stack) < 0   /* Was empty */
13625         || ((final = av_pop(stack)) == NULL)
13626         || ! IS_OPERAND(final)
13627         || av_tindex(stack) >= 0)  /* More left on stack */
13628     {
13629         vFAIL("Incomplete expression within '(?[ ])'");
13630     }
13631
13632     /* Here, 'final' is the resultant inversion list from evaluating the
13633      * expression.  Return it if so requested */
13634     if (return_invlist) {
13635         *return_invlist = final;
13636         return END;
13637     }
13638
13639     /* Otherwise generate a resultant node, based on 'final'.  regclass() is
13640      * expecting a string of ranges and individual code points */
13641     invlist_iterinit(final);
13642     result_string = newSVpvs("");
13643     while (invlist_iternext(final, &start, &end)) {
13644         if (start == end) {
13645             Perl_sv_catpvf(aTHX_ result_string, "\\x{%"UVXf"}", start);
13646         }
13647         else {
13648             Perl_sv_catpvf(aTHX_ result_string, "\\x{%"UVXf"}-\\x{%"UVXf"}",
13649                                                      start,          end);
13650         }
13651     }
13652
13653     save_parse = RExC_parse;
13654     RExC_parse = SvPV(result_string, len);
13655     save_end = RExC_end;
13656     RExC_end = RExC_parse + len;
13657
13658     /* We turn off folding around the call, as the class we have constructed
13659      * already has all folding taken into consideration, and we don't want
13660      * regclass() to add to that */
13661     RExC_flags &= ~RXf_PMf_FOLD;
13662     /* regclass() can only return RESTART_UTF8 if multi-char folds are allowed.
13663      */
13664     node = regclass(pRExC_state, flagp,depth+1,
13665                     FALSE, /* means parse the whole char class */
13666                     FALSE, /* don't allow multi-char folds */
13667                     TRUE, /* silence non-portable warnings.  The above may very
13668                              well have generated non-portable code points, but
13669                              they're valid on this machine */
13670                     FALSE, /* similarly, no need for strict */
13671                     NULL
13672                 );
13673     if (!node)
13674         FAIL2("panic: regclass returned NULL to handle_sets, flags=%#"UVxf,
13675                     PTR2UV(flagp));
13676     if (save_fold) {
13677         RExC_flags |= RXf_PMf_FOLD;
13678     }
13679     RExC_parse = save_parse + 1;
13680     RExC_end = save_end;
13681     SvREFCNT_dec_NN(final);
13682     SvREFCNT_dec_NN(result_string);
13683
13684     nextchar(pRExC_state);
13685     Set_Node_Length(node, RExC_parse - oregcomp_parse + 1); /* MJD */
13686     return node;
13687 }
13688 #undef IS_OPERAND
13689
13690 STATIC void
13691 S_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist)
13692 {
13693     /* This hard-codes the Latin1/above-Latin1 folding rules, so that an
13694      * innocent-looking character class, like /[ks]/i won't have to go out to
13695      * disk to find the possible matches.
13696      *
13697      * This should be called only for a Latin1-range code points, cp, which is
13698      * known to be involved in a simple fold with other code points above
13699      * Latin1.  It would give false results if /aa has been specified.
13700      * Multi-char folds are outside the scope of this, and must be handled
13701      * specially.
13702      *
13703      * XXX It would be better to generate these via regen, in case a new
13704      * version of the Unicode standard adds new mappings, though that is not
13705      * really likely, and may be caught by the default: case of the switch
13706      * below. */
13707
13708     PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS;
13709
13710     assert(HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(cp));
13711
13712     switch (cp) {
13713         case 'k':
13714         case 'K':
13715           *invlist =
13716              add_cp_to_invlist(*invlist, KELVIN_SIGN);
13717             break;
13718         case 's':
13719         case 'S':
13720           *invlist = add_cp_to_invlist(*invlist, LATIN_SMALL_LETTER_LONG_S);
13721             break;
13722         case MICRO_SIGN:
13723           *invlist = add_cp_to_invlist(*invlist, GREEK_CAPITAL_LETTER_MU);
13724           *invlist = add_cp_to_invlist(*invlist, GREEK_SMALL_LETTER_MU);
13725             break;
13726         case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE:
13727         case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE:
13728           *invlist = add_cp_to_invlist(*invlist, ANGSTROM_SIGN);
13729             break;
13730         case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS:
13731           *invlist = add_cp_to_invlist(*invlist,
13732                                         LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS);
13733             break;
13734         case LATIN_SMALL_LETTER_SHARP_S:
13735           *invlist = add_cp_to_invlist(*invlist, LATIN_CAPITAL_LETTER_SHARP_S);
13736             break;
13737         default:
13738             /* Use deprecated warning to increase the chances of this being
13739              * output */
13740             if (PASS2) {
13741                 ckWARN2reg_d(RExC_parse, "Perl folding rules are not up-to-date for 0x%02X; please use the perlbug utility to report;", cp);
13742             }
13743             break;
13744     }
13745 }
13746
13747 STATIC AV *
13748 S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN cp_count)
13749 {
13750     /* This adds the string scalar <multi_string> to the array
13751      * <multi_char_matches>.  <multi_string> is known to have exactly
13752      * <cp_count> code points in it.  This is used when constructing a
13753      * bracketed character class and we find something that needs to match more
13754      * than a single character.
13755      *
13756      * <multi_char_matches> is actually an array of arrays.  Each top-level
13757      * element is an array that contains all the strings known so far that are
13758      * the same length.  And that length (in number of code points) is the same
13759      * as the index of the top-level array.  Hence, the [2] element is an
13760      * array, each element thereof is a string containing TWO code points;
13761      * while element [3] is for strings of THREE characters, and so on.  Since
13762      * this is for multi-char strings there can never be a [0] nor [1] element.
13763      *
13764      * When we rewrite the character class below, we will do so such that the
13765      * longest strings are written first, so that it prefers the longest
13766      * matching strings first.  This is done even if it turns out that any
13767      * quantifier is non-greedy, out of this programmer's (khw) laziness.  Tom
13768      * Christiansen has agreed that this is ok.  This makes the test for the
13769      * ligature 'ffi' come before the test for 'ff', for example */
13770
13771     AV* this_array;
13772     AV** this_array_ptr;
13773
13774     PERL_ARGS_ASSERT_ADD_MULTI_MATCH;
13775
13776     if (! multi_char_matches) {
13777         multi_char_matches = newAV();
13778     }
13779
13780     if (av_exists(multi_char_matches, cp_count)) {
13781         this_array_ptr = (AV**) av_fetch(multi_char_matches, cp_count, FALSE);
13782         this_array = *this_array_ptr;
13783     }
13784     else {
13785         this_array = newAV();
13786         av_store(multi_char_matches, cp_count,
13787                  (SV*) this_array);
13788     }
13789     av_push(this_array, multi_string);
13790
13791     return multi_char_matches;
13792 }
13793
13794 /* The names of properties whose definitions are not known at compile time are
13795  * stored in this SV, after a constant heading.  So if the length has been
13796  * changed since initialization, then there is a run-time definition. */
13797 #define HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION                            \
13798                                         (SvCUR(listsv) != initial_listsv_len)
13799
13800 STATIC regnode *
13801 S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
13802                  const bool stop_at_1,  /* Just parse the next thing, don't
13803                                            look for a full character class */
13804                  bool allow_multi_folds,
13805                  const bool silence_non_portable,   /* Don't output warnings
13806                                                        about too large
13807                                                        characters */
13808                  const bool strict,
13809                  SV** ret_invlist  /* Return an inversion list, not a node */
13810           )
13811 {
13812     /* parse a bracketed class specification.  Most of these will produce an
13813      * ANYOF node; but something like [a] will produce an EXACT node; [aA], an
13814      * EXACTFish node; [[:ascii:]], a POSIXA node; etc.  It is more complex
13815      * under /i with multi-character folds: it will be rewritten following the
13816      * paradigm of this example, where the <multi-fold>s are characters which
13817      * fold to multiple character sequences:
13818      *      /[abc\x{multi-fold1}def\x{multi-fold2}ghi]/i
13819      * gets effectively rewritten as:
13820      *      /(?:\x{multi-fold1}|\x{multi-fold2}|[abcdefghi]/i
13821      * reg() gets called (recursively) on the rewritten version, and this
13822      * function will return what it constructs.  (Actually the <multi-fold>s
13823      * aren't physically removed from the [abcdefghi], it's just that they are
13824      * ignored in the recursion by means of a flag:
13825      * <RExC_in_multi_char_class>.)
13826      *
13827      * ANYOF nodes contain a bit map for the first NUM_ANYOF_CODE_POINTS
13828      * characters, with the corresponding bit set if that character is in the
13829      * list.  For characters above this, a range list or swash is used.  There
13830      * are extra bits for \w, etc. in locale ANYOFs, as what these match is not
13831      * determinable at compile time
13832      *
13833      * Returns NULL, setting *flagp to RESTART_UTF8 if the sizing scan needs
13834      * to be restarted.  This can only happen if ret_invlist is non-NULL.
13835      */
13836
13837     UV prevvalue = OOB_UNICODE, save_prevvalue = OOB_UNICODE;
13838     IV range = 0;
13839     UV value = OOB_UNICODE, save_value = OOB_UNICODE;
13840     regnode *ret;
13841     STRLEN numlen;
13842     IV namedclass = OOB_NAMEDCLASS;
13843     char *rangebegin = NULL;
13844     bool need_class = 0;
13845     SV *listsv = NULL;
13846     STRLEN initial_listsv_len = 0; /* Kind of a kludge to see if it is more
13847                                       than just initialized.  */
13848     SV* properties = NULL;    /* Code points that match \p{} \P{} */
13849     SV* posixes = NULL;     /* Code points that match classes like [:word:],
13850                                extended beyond the Latin1 range.  These have to
13851                                be kept separate from other code points for much
13852                                of this function because their handling  is
13853                                different under /i, and for most classes under
13854                                /d as well */
13855     SV* nposixes = NULL;    /* Similarly for [:^word:].  These are kept
13856                                separate for a while from the non-complemented
13857                                versions because of complications with /d
13858                                matching */
13859     SV* simple_posixes = NULL; /* But under some conditions, the classes can be
13860                                   treated more simply than the general case,
13861                                   leading to less compilation and execution
13862                                   work */
13863     UV element_count = 0;   /* Number of distinct elements in the class.
13864                                Optimizations may be possible if this is tiny */
13865     AV * multi_char_matches = NULL; /* Code points that fold to more than one
13866                                        character; used under /i */
13867     UV n;
13868     char * stop_ptr = RExC_end;    /* where to stop parsing */
13869     const bool skip_white = cBOOL(ret_invlist); /* ignore unescaped white
13870                                                    space? */
13871
13872     /* Unicode properties are stored in a swash; this holds the current one
13873      * being parsed.  If this swash is the only above-latin1 component of the
13874      * character class, an optimization is to pass it directly on to the
13875      * execution engine.  Otherwise, it is set to NULL to indicate that there
13876      * are other things in the class that have to be dealt with at execution
13877      * time */
13878     SV* swash = NULL;           /* Code points that match \p{} \P{} */
13879
13880     /* Set if a component of this character class is user-defined; just passed
13881      * on to the engine */
13882     bool has_user_defined_property = FALSE;
13883
13884     /* inversion list of code points this node matches only when the target
13885      * string is in UTF-8.  (Because is under /d) */
13886     SV* depends_list = NULL;
13887
13888     /* Inversion list of code points this node matches regardless of things
13889      * like locale, folding, utf8ness of the target string */
13890     SV* cp_list = NULL;
13891
13892     /* Like cp_list, but code points on this list need to be checked for things
13893      * that fold to/from them under /i */
13894     SV* cp_foldable_list = NULL;
13895
13896     /* Like cp_list, but code points on this list are valid only when the
13897      * runtime locale is UTF-8 */
13898     SV* only_utf8_locale_list = NULL;
13899
13900     /* In a range, if one of the endpoints is non-character-set portable,
13901      * meaning that it hard-codes a code point that may mean a different
13902      * charactger in ASCII vs. EBCDIC, as opposed to, say, a literal 'A' or a
13903      * mnemonic '\t' which each mean the same character no matter which
13904      * character set the platform is on. */
13905     unsigned int non_portable_endpoint = 0;
13906
13907     /* Is the range unicode? which means on a platform that isn't 1-1 native
13908      * to Unicode (i.e. non-ASCII), each code point in it should be considered
13909      * to be a Unicode value.  */
13910     bool unicode_range = FALSE;
13911     bool invert = FALSE;    /* Is this class to be complemented */
13912
13913     bool warn_super = ALWAYS_WARN_SUPER;
13914
13915     regnode * const orig_emit = RExC_emit; /* Save the original RExC_emit in
13916         case we need to change the emitted regop to an EXACT. */
13917     const char * orig_parse = RExC_parse;
13918     const SSize_t orig_size = RExC_size;
13919     bool posixl_matches_all = FALSE; /* Does /l class have both e.g. \W,\w ? */
13920     GET_RE_DEBUG_FLAGS_DECL;
13921
13922     PERL_ARGS_ASSERT_REGCLASS;
13923 #ifndef DEBUGGING
13924     PERL_UNUSED_ARG(depth);
13925 #endif
13926
13927     DEBUG_PARSE("clas");
13928
13929     /* Assume we are going to generate an ANYOF node. */
13930     ret = reganode(pRExC_state,
13931                    (LOC)
13932                     ? ANYOFL
13933                     : ANYOF,
13934                    0);
13935
13936     if (SIZE_ONLY) {
13937         RExC_size += ANYOF_SKIP;
13938         listsv = &PL_sv_undef; /* For code scanners: listsv always non-NULL. */
13939     }
13940     else {
13941         ANYOF_FLAGS(ret) = 0;
13942
13943         RExC_emit += ANYOF_SKIP;
13944         listsv = newSVpvs_flags("# comment\n", SVs_TEMP);
13945         initial_listsv_len = SvCUR(listsv);
13946         SvTEMP_off(listsv); /* Grr, TEMPs and mortals are conflated.  */
13947     }
13948
13949     if (skip_white) {
13950         RExC_parse = regpatws(pRExC_state, RExC_parse,
13951                               FALSE /* means don't recognize comments */ );
13952     }
13953
13954     if (UCHARAT(RExC_parse) == '^') {   /* Complement of range. */
13955         RExC_parse++;
13956         invert = TRUE;
13957         allow_multi_folds = FALSE;
13958         MARK_NAUGHTY(1);
13959         if (skip_white) {
13960             RExC_parse = regpatws(pRExC_state, RExC_parse,
13961                                   FALSE /* means don't recognize comments */ );
13962         }
13963     }
13964
13965     /* Check that they didn't say [:posix:] instead of [[:posix:]] */
13966     if (!SIZE_ONLY && RExC_parse < RExC_end && POSIXCC(UCHARAT(RExC_parse))) {
13967         const char *s = RExC_parse;
13968         const char  c = *s++;
13969
13970         if (*s == '^') {
13971             s++;
13972         }
13973         while (isWORDCHAR(*s))
13974             s++;
13975         if (*s && c == *s && s[1] == ']') {
13976             SAVEFREESV(RExC_rx_sv);
13977             ckWARN3reg(s+2,
13978                        "POSIX syntax [%c %c] belongs inside character classes",
13979                        c, c);
13980             (void)ReREFCNT_inc(RExC_rx_sv);
13981         }
13982     }
13983
13984     /* If the caller wants us to just parse a single element, accomplish this
13985      * by faking the loop ending condition */
13986     if (stop_at_1 && RExC_end > RExC_parse) {
13987         stop_ptr = RExC_parse + 1;
13988     }
13989
13990     /* allow 1st char to be ']' (allowing it to be '-' is dealt with later) */
13991     if (UCHARAT(RExC_parse) == ']')
13992         goto charclassloop;
13993
13994     while (1) {
13995         if  (RExC_parse >= stop_ptr) {
13996             break;
13997         }
13998
13999         if (skip_white) {
14000             RExC_parse = regpatws(pRExC_state, RExC_parse,
14001                                   FALSE /* means don't recognize comments */ );
14002         }
14003
14004         if  (UCHARAT(RExC_parse) == ']') {
14005             break;
14006         }
14007
14008       charclassloop:
14009
14010         namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
14011         save_value = value;
14012         save_prevvalue = prevvalue;
14013
14014         if (!range) {
14015             rangebegin = RExC_parse;
14016             element_count++;
14017             non_portable_endpoint = 0;
14018         }
14019         if (UTF) {
14020             value = utf8n_to_uvchr((U8*)RExC_parse,
14021                                    RExC_end - RExC_parse,
14022                                    &numlen, UTF8_ALLOW_DEFAULT);
14023             RExC_parse += numlen;
14024         }
14025         else
14026             value = UCHARAT(RExC_parse++);
14027
14028         if (value == '['
14029             && RExC_parse < RExC_end
14030             && POSIXCC(UCHARAT(RExC_parse)))
14031         {
14032             namedclass = regpposixcc(pRExC_state, value, strict);
14033         }
14034         else if (value == '\\') {
14035             /* Is a backslash; get the code point of the char after it */
14036             if (UTF && ! UTF8_IS_INVARIANT(UCHARAT(RExC_parse))) {
14037                 value = utf8n_to_uvchr((U8*)RExC_parse,
14038                                    RExC_end - RExC_parse,
14039                                    &numlen, UTF8_ALLOW_DEFAULT);
14040                 RExC_parse += numlen;
14041             }
14042             else
14043                 value = UCHARAT(RExC_parse++);
14044
14045             /* Some compilers cannot handle switching on 64-bit integer
14046              * values, therefore value cannot be an UV.  Yes, this will
14047              * be a problem later if we want switch on Unicode.
14048              * A similar issue a little bit later when switching on
14049              * namedclass. --jhi */
14050
14051             /* If the \ is escaping white space when white space is being
14052              * skipped, it means that that white space is wanted literally, and
14053              * is already in 'value'.  Otherwise, need to translate the escape
14054              * into what it signifies. */
14055             if (! skip_white || ! is_PATWS_cp(value)) switch ((I32)value) {
14056
14057             case 'w':   namedclass = ANYOF_WORDCHAR;    break;
14058             case 'W':   namedclass = ANYOF_NWORDCHAR;   break;
14059             case 's':   namedclass = ANYOF_SPACE;       break;
14060             case 'S':   namedclass = ANYOF_NSPACE;      break;
14061             case 'd':   namedclass = ANYOF_DIGIT;       break;
14062             case 'D':   namedclass = ANYOF_NDIGIT;      break;
14063             case 'v':   namedclass = ANYOF_VERTWS;      break;
14064             case 'V':   namedclass = ANYOF_NVERTWS;     break;
14065             case 'h':   namedclass = ANYOF_HORIZWS;     break;
14066             case 'H':   namedclass = ANYOF_NHORIZWS;    break;
14067             case 'N':  /* Handle \N{NAME} in class */
14068                 {
14069                     SV *as_text;
14070                     STRLEN cp_count = grok_bslash_N(pRExC_state, NULL, &value,
14071                                                     flagp, depth, &as_text);
14072                     if (*flagp & RESTART_UTF8)
14073                         FAIL("panic: grok_bslash_N set RESTART_UTF8");
14074                     if (cp_count != 1) {    /* The typical case drops through */
14075                         assert(cp_count != (STRLEN) -1);
14076                         if (cp_count == 0) {
14077                             if (strict) {
14078                                 RExC_parse++;   /* Position after the "}" */
14079                                 vFAIL("Zero length \\N{}");
14080                             }
14081                             else if (PASS2) {
14082                                 ckWARNreg(RExC_parse,
14083                                         "Ignoring zero length \\N{} in character class");
14084                             }
14085                         }
14086                         else { /* cp_count > 1 */
14087                             if (! RExC_in_multi_char_class) {
14088                                 if (invert || range || *RExC_parse == '-') {
14089                                     if (strict) {
14090                                         RExC_parse--;
14091                                         vFAIL("\\N{} in inverted character class or as a range end-point is restricted to one character");
14092                                     }
14093                                     else if (PASS2) {
14094                                         ckWARNreg(RExC_parse, "Using just the first character returned by \\N{} in character class");
14095                                     }
14096                                 }
14097                                 else {
14098                                     multi_char_matches
14099                                         = add_multi_match(multi_char_matches,
14100                                                           as_text,
14101                                                           cp_count);
14102                                 }
14103                                 break; /* <value> contains the first code
14104                                           point. Drop out of the switch to
14105                                           process it */
14106                             }
14107                         } /* End of cp_count != 1 */
14108
14109                         /* This element should not be processed further in this
14110                          * class */
14111                         element_count--;
14112                         value = save_value;
14113                         prevvalue = save_prevvalue;
14114                         continue;   /* Back to top of loop to get next char */
14115                     }
14116
14117                     /* Here, is a single code point, and <value> contains it */
14118                     unicode_range = TRUE;   /* \N{} are Unicode */
14119                 }
14120                 break;
14121             case 'p':
14122             case 'P':
14123                 {
14124                 char *e;
14125
14126                 /* We will handle any undefined properties ourselves */
14127                 U8 swash_init_flags = _CORE_SWASH_INIT_RETURN_IF_UNDEF
14128                                        /* And we actually would prefer to get
14129                                         * the straight inversion list of the
14130                                         * swash, since we will be accessing it
14131                                         * anyway, to save a little time */
14132                                       |_CORE_SWASH_INIT_ACCEPT_INVLIST;
14133
14134                 if (RExC_parse >= RExC_end)
14135                     vFAIL2("Empty \\%c{}", (U8)value);
14136                 if (*RExC_parse == '{') {
14137                     const U8 c = (U8)value;
14138                     e = strchr(RExC_parse++, '}');
14139                     if (!e)
14140                         vFAIL2("Missing right brace on \\%c{}", c);
14141                     while (isSPACE(*RExC_parse))
14142                         RExC_parse++;
14143                     if (e == RExC_parse)
14144                         vFAIL2("Empty \\%c{}", c);
14145                     n = e - RExC_parse;
14146                     while (isSPACE(*(RExC_parse + n - 1)))
14147                         n--;
14148                 }
14149                 else {
14150                     e = RExC_parse;
14151                     n = 1;
14152                 }
14153                 if (!SIZE_ONLY) {
14154                     SV* invlist;
14155                     char* name;
14156
14157                     if (UCHARAT(RExC_parse) == '^') {
14158                          RExC_parse++;
14159                          n--;
14160                          /* toggle.  (The rhs xor gets the single bit that
14161                           * differs between P and p; the other xor inverts just
14162                           * that bit) */
14163                          value ^= 'P' ^ 'p';
14164
14165                          while (isSPACE(*RExC_parse)) {
14166                               RExC_parse++;
14167                               n--;
14168                          }
14169                     }
14170                     /* Try to get the definition of the property into
14171                      * <invlist>.  If /i is in effect, the effective property
14172                      * will have its name be <__NAME_i>.  The design is
14173                      * discussed in commit
14174                      * 2f833f5208e26b208886e51e09e2c072b5eabb46 */
14175                     name = savepv(Perl_form(aTHX_
14176                                           "%s%.*s%s\n",
14177                                           (FOLD) ? "__" : "",
14178                                           (int)n,
14179                                           RExC_parse,
14180                                           (FOLD) ? "_i" : ""
14181                                 ));
14182
14183                     /* Look up the property name, and get its swash and
14184                      * inversion list, if the property is found  */
14185                     if (swash) {
14186                         SvREFCNT_dec_NN(swash);
14187                     }
14188                     swash = _core_swash_init("utf8", name, &PL_sv_undef,
14189                                              1, /* binary */
14190                                              0, /* not tr/// */
14191                                              NULL, /* No inversion list */
14192                                              &swash_init_flags
14193                                             );
14194                     if (! swash || ! (invlist = _get_swash_invlist(swash))) {
14195                         HV* curpkg = (IN_PERL_COMPILETIME)
14196                                       ? PL_curstash
14197                                       : CopSTASH(PL_curcop);
14198                         if (swash) {
14199                             SvREFCNT_dec_NN(swash);
14200                             swash = NULL;
14201                         }
14202
14203                         /* Here didn't find it.  It could be a user-defined
14204                          * property that will be available at run-time.  If we
14205                          * accept only compile-time properties, is an error;
14206                          * otherwise add it to the list for run-time look up */
14207                         if (ret_invlist) {
14208                             RExC_parse = e + 1;
14209                             vFAIL2utf8f(
14210                                 "Property '%"UTF8f"' is unknown",
14211                                 UTF8fARG(UTF, n, name));
14212                         }
14213
14214                         /* If the property name doesn't already have a package
14215                          * name, add the current one to it so that it can be
14216                          * referred to outside it. [perl #121777] */
14217                         if (curpkg && ! instr(name, "::")) {
14218                             char* pkgname = HvNAME(curpkg);
14219                             if (strNE(pkgname, "main")) {
14220                                 char* full_name = Perl_form(aTHX_
14221                                                             "%s::%s",
14222                                                             pkgname,
14223                                                             name);
14224                                 n = strlen(full_name);
14225                                 Safefree(name);
14226                                 name = savepvn(full_name, n);
14227                             }
14228                         }
14229                         Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%"UTF8f"\n",
14230                                         (value == 'p' ? '+' : '!'),
14231                                         UTF8fARG(UTF, n, name));
14232                         has_user_defined_property = TRUE;
14233
14234                         /* We don't know yet, so have to assume that the
14235                          * property could match something in the Latin1 range,
14236                          * hence something that isn't utf8.  Note that this
14237                          * would cause things in <depends_list> to match
14238                          * inappropriately, except that any \p{}, including
14239                          * this one forces Unicode semantics, which means there
14240                          * is no <depends_list> */
14241                         ANYOF_FLAGS(ret)
14242                                       |= ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES;
14243                     }
14244                     else {
14245
14246                         /* Here, did get the swash and its inversion list.  If
14247                          * the swash is from a user-defined property, then this
14248                          * whole character class should be regarded as such */
14249                         if (swash_init_flags
14250                             & _CORE_SWASH_INIT_USER_DEFINED_PROPERTY)
14251                         {
14252                             has_user_defined_property = TRUE;
14253                         }
14254                         else if
14255                             /* We warn on matching an above-Unicode code point
14256                              * if the match would return true, except don't
14257                              * warn for \p{All}, which has exactly one element
14258                              * = 0 */
14259                             (_invlist_contains_cp(invlist, 0x110000)
14260                                 && (! (_invlist_len(invlist) == 1
14261                                        && *invlist_array(invlist) == 0)))
14262                         {
14263                             warn_super = TRUE;
14264                         }
14265
14266
14267                         /* Invert if asking for the complement */
14268                         if (value == 'P') {
14269                             _invlist_union_complement_2nd(properties,
14270                                                           invlist,
14271                                                           &properties);
14272
14273                             /* The swash can't be used as-is, because we've
14274                              * inverted things; delay removing it to here after
14275                              * have copied its invlist above */
14276                             SvREFCNT_dec_NN(swash);
14277                             swash = NULL;
14278                         }
14279                         else {
14280                             _invlist_union(properties, invlist, &properties);
14281                         }
14282                     }
14283                     Safefree(name);
14284                 }
14285                 RExC_parse = e + 1;
14286                 namedclass = ANYOF_UNIPROP;  /* no official name, but it's
14287                                                 named */
14288
14289                 /* \p means they want Unicode semantics */
14290                 RExC_uni_semantics = 1;
14291                 }
14292                 break;
14293             case 'n':   value = '\n';                   break;
14294             case 'r':   value = '\r';                   break;
14295             case 't':   value = '\t';                   break;
14296             case 'f':   value = '\f';                   break;
14297             case 'b':   value = '\b';                   break;
14298             case 'e':   value = ESC_NATIVE;             break;
14299             case 'a':   value = '\a';                   break;
14300             case 'o':
14301                 RExC_parse--;   /* function expects to be pointed at the 'o' */
14302                 {
14303                     const char* error_msg;
14304                     bool valid = grok_bslash_o(&RExC_parse,
14305                                                &value,
14306                                                &error_msg,
14307                                                PASS2,   /* warnings only in
14308                                                            pass 2 */
14309                                                strict,
14310                                                silence_non_portable,
14311                                                UTF);
14312                     if (! valid) {
14313                         vFAIL(error_msg);
14314                     }
14315                 }
14316                 non_portable_endpoint++;
14317                 if (IN_ENCODING && value < 0x100) {
14318                     goto recode_encoding;
14319                 }
14320                 break;
14321             case 'x':
14322                 RExC_parse--;   /* function expects to be pointed at the 'x' */
14323                 {
14324                     const char* error_msg;
14325                     bool valid = grok_bslash_x(&RExC_parse,
14326                                                &value,
14327                                                &error_msg,
14328                                                PASS2, /* Output warnings */
14329                                                strict,
14330                                                silence_non_portable,
14331                                                UTF);
14332                     if (! valid) {
14333                         vFAIL(error_msg);
14334                     }
14335                 }
14336                 non_portable_endpoint++;
14337                 if (IN_ENCODING && value < 0x100)
14338                     goto recode_encoding;
14339                 break;
14340             case 'c':
14341                 value = grok_bslash_c(*RExC_parse++, PASS2);
14342                 non_portable_endpoint++;
14343                 break;
14344             case '0': case '1': case '2': case '3': case '4':
14345             case '5': case '6': case '7':
14346                 {
14347                     /* Take 1-3 octal digits */
14348                     I32 flags = PERL_SCAN_SILENT_ILLDIGIT;
14349                     numlen = (strict) ? 4 : 3;
14350                     value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
14351                     RExC_parse += numlen;
14352                     if (numlen != 3) {
14353                         if (strict) {
14354                             RExC_parse += (UTF) ? UTF8SKIP(RExC_parse) : 1;
14355                             vFAIL("Need exactly 3 octal digits");
14356                         }
14357                         else if (! SIZE_ONLY /* like \08, \178 */
14358                                  && numlen < 3
14359                                  && RExC_parse < RExC_end
14360                                  && isDIGIT(*RExC_parse)
14361                                  && ckWARN(WARN_REGEXP))
14362                         {
14363                             SAVEFREESV(RExC_rx_sv);
14364                             reg_warn_non_literal_string(
14365                                  RExC_parse + 1,
14366                                  form_short_octal_warning(RExC_parse, numlen));
14367                             (void)ReREFCNT_inc(RExC_rx_sv);
14368                         }
14369                     }
14370                     non_portable_endpoint++;
14371                     if (IN_ENCODING && value < 0x100)
14372                         goto recode_encoding;
14373                     break;
14374                 }
14375               recode_encoding:
14376                 if (! RExC_override_recoding) {
14377                     SV* enc = _get_encoding();
14378                     value = reg_recode((const char)(U8)value, &enc);
14379                     if (!enc) {
14380                         if (strict) {
14381                             vFAIL("Invalid escape in the specified encoding");
14382                         }
14383                         else if (PASS2) {
14384                             ckWARNreg(RExC_parse,
14385                                   "Invalid escape in the specified encoding");
14386                         }
14387                     }
14388                     break;
14389                 }
14390             default:
14391                 /* Allow \_ to not give an error */
14392                 if (!SIZE_ONLY && isWORDCHAR(value) && value != '_') {
14393                     if (strict) {
14394                         vFAIL2("Unrecognized escape \\%c in character class",
14395                                (int)value);
14396                     }
14397                     else {
14398                         SAVEFREESV(RExC_rx_sv);
14399                         ckWARN2reg(RExC_parse,
14400                             "Unrecognized escape \\%c in character class passed through",
14401                             (int)value);
14402                         (void)ReREFCNT_inc(RExC_rx_sv);
14403                     }
14404                 }
14405                 break;
14406             }   /* End of switch on char following backslash */
14407         } /* end of handling backslash escape sequences */
14408
14409         /* Here, we have the current token in 'value' */
14410
14411         if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
14412             U8 classnum;
14413
14414             /* a bad range like a-\d, a-[:digit:].  The '-' is taken as a
14415              * literal, as is the character that began the false range, i.e.
14416              * the 'a' in the examples */
14417             if (range) {
14418                 if (!SIZE_ONLY) {
14419                     const int w = (RExC_parse >= rangebegin)
14420                                   ? RExC_parse - rangebegin
14421                                   : 0;
14422                     if (strict) {
14423                         vFAIL2utf8f(
14424                             "False [] range \"%"UTF8f"\"",
14425                             UTF8fARG(UTF, w, rangebegin));
14426                     }
14427                     else {
14428                         SAVEFREESV(RExC_rx_sv); /* in case of fatal warnings */
14429                         ckWARN2reg(RExC_parse,
14430                             "False [] range \"%"UTF8f"\"",
14431                             UTF8fARG(UTF, w, rangebegin));
14432                         (void)ReREFCNT_inc(RExC_rx_sv);
14433                         cp_list = add_cp_to_invlist(cp_list, '-');
14434                         cp_foldable_list = add_cp_to_invlist(cp_foldable_list,
14435                                                              prevvalue);
14436                     }
14437                 }
14438
14439                 range = 0; /* this was not a true range */
14440                 element_count += 2; /* So counts for three values */
14441             }
14442
14443             classnum = namedclass_to_classnum(namedclass);
14444
14445             if (LOC && namedclass < ANYOF_POSIXL_MAX
14446 #ifndef HAS_ISASCII
14447                 && classnum != _CC_ASCII
14448 #endif
14449             ) {
14450                 /* What the Posix classes (like \w, [:space:]) match in locale
14451                  * isn't knowable under locale until actual match time.  Room
14452                  * must be reserved (one time per outer bracketed class) to
14453                  * store such classes.  The space will contain a bit for each
14454                  * named class that is to be matched against.  This isn't
14455                  * needed for \p{} and pseudo-classes, as they are not affected
14456                  * by locale, and hence are dealt with separately */
14457                 if (! need_class) {
14458                     need_class = 1;
14459                     if (SIZE_ONLY) {
14460                         RExC_size += ANYOF_POSIXL_SKIP - ANYOF_SKIP;
14461                     }
14462                     else {
14463                         RExC_emit += ANYOF_POSIXL_SKIP - ANYOF_SKIP;
14464                     }
14465                     ANYOF_FLAGS(ret) |= ANYOF_MATCHES_POSIXL;
14466                     ANYOF_POSIXL_ZERO(ret);
14467                 }
14468
14469                 /* Coverity thinks it is possible for this to be negative; both
14470                  * jhi and khw think it's not, but be safer */
14471                 assert(! (ANYOF_FLAGS(ret) & ANYOF_MATCHES_POSIXL)
14472                        || (namedclass + ((namedclass % 2) ? -1 : 1)) >= 0);
14473
14474                 /* See if it already matches the complement of this POSIX
14475                  * class */
14476                 if ((ANYOF_FLAGS(ret) & ANYOF_MATCHES_POSIXL)
14477                     && ANYOF_POSIXL_TEST(ret, namedclass + ((namedclass % 2)
14478                                                             ? -1
14479                                                             : 1)))
14480                 {
14481                     posixl_matches_all = TRUE;
14482                     break;  /* No need to continue.  Since it matches both
14483                                e.g., \w and \W, it matches everything, and the
14484                                bracketed class can be optimized into qr/./s */
14485                 }
14486
14487                 /* Add this class to those that should be checked at runtime */
14488                 ANYOF_POSIXL_SET(ret, namedclass);
14489
14490                 /* The above-Latin1 characters are not subject to locale rules.
14491                  * Just add them, in the second pass, to the
14492                  * unconditionally-matched list */
14493                 if (! SIZE_ONLY) {
14494                     SV* scratch_list = NULL;
14495
14496                     /* Get the list of the above-Latin1 code points this
14497                      * matches */
14498                     _invlist_intersection_maybe_complement_2nd(PL_AboveLatin1,
14499                                           PL_XPosix_ptrs[classnum],
14500
14501                                           /* Odd numbers are complements, like
14502                                            * NDIGIT, NASCII, ... */
14503                                           namedclass % 2 != 0,
14504                                           &scratch_list);
14505                     /* Checking if 'cp_list' is NULL first saves an extra
14506                      * clone.  Its reference count will be decremented at the
14507                      * next union, etc, or if this is the only instance, at the
14508                      * end of the routine */
14509                     if (! cp_list) {
14510                         cp_list = scratch_list;
14511                     }
14512                     else {
14513                         _invlist_union(cp_list, scratch_list, &cp_list);
14514                         SvREFCNT_dec_NN(scratch_list);
14515                     }
14516                     continue;   /* Go get next character */
14517                 }
14518             }
14519             else if (! SIZE_ONLY) {
14520
14521                 /* Here, not in pass1 (in that pass we skip calculating the
14522                  * contents of this class), and is /l, or is a POSIX class for
14523                  * which /l doesn't matter (or is a Unicode property, which is
14524                  * skipped here). */
14525                 if (namedclass >= ANYOF_POSIXL_MAX) {  /* If a special class */
14526                     if (namedclass != ANYOF_UNIPROP) { /* UNIPROP = \p and \P */
14527
14528                         /* Here, should be \h, \H, \v, or \V.  None of /d, /i
14529                          * nor /l make a difference in what these match,
14530                          * therefore we just add what they match to cp_list. */
14531                         if (classnum != _CC_VERTSPACE) {
14532                             assert(   namedclass == ANYOF_HORIZWS
14533                                    || namedclass == ANYOF_NHORIZWS);
14534
14535                             /* It turns out that \h is just a synonym for
14536                              * XPosixBlank */
14537                             classnum = _CC_BLANK;
14538                         }
14539
14540                         _invlist_union_maybe_complement_2nd(
14541                                 cp_list,
14542                                 PL_XPosix_ptrs[classnum],
14543                                 namedclass % 2 != 0,    /* Complement if odd
14544                                                           (NHORIZWS, NVERTWS)
14545                                                         */
14546                                 &cp_list);
14547                     }
14548                 }
14549                 else if (UNI_SEMANTICS
14550                         || classnum == _CC_ASCII
14551                         || (DEPENDS_SEMANTICS && (classnum == _CC_DIGIT
14552                                                   || classnum == _CC_XDIGIT)))
14553                 {
14554                     /* We usually have to worry about /d and /a affecting what
14555                      * POSIX classes match, with special code needed for /d
14556                      * because we won't know until runtime what all matches.
14557                      * But there is no extra work needed under /u, and
14558                      * [:ascii:] is unaffected by /a and /d; and :digit: and
14559                      * :xdigit: don't have runtime differences under /d.  So we
14560                      * can special case these, and avoid some extra work below,
14561                      * and at runtime. */
14562                     _invlist_union_maybe_complement_2nd(
14563                                                      simple_posixes,
14564                                                      PL_XPosix_ptrs[classnum],
14565                                                      namedclass % 2 != 0,
14566                                                      &simple_posixes);
14567                 }
14568                 else {  /* Garden variety class.  If is NUPPER, NALPHA, ...
14569                            complement and use nposixes */
14570                     SV** posixes_ptr = namedclass % 2 == 0
14571                                        ? &posixes
14572                                        : &nposixes;
14573                     _invlist_union_maybe_complement_2nd(
14574                                                      *posixes_ptr,
14575                                                      PL_XPosix_ptrs[classnum],
14576                                                      namedclass % 2 != 0,
14577                                                      posixes_ptr);
14578                 }
14579             }
14580         } /* end of namedclass \blah */
14581
14582         if (skip_white) {
14583             RExC_parse = regpatws(pRExC_state, RExC_parse,
14584                                 FALSE /* means don't recognize comments */ );
14585         }
14586
14587         /* If 'range' is set, 'value' is the ending of a range--check its
14588          * validity.  (If value isn't a single code point in the case of a
14589          * range, we should have figured that out above in the code that
14590          * catches false ranges).  Later, we will handle each individual code
14591          * point in the range.  If 'range' isn't set, this could be the
14592          * beginning of a range, so check for that by looking ahead to see if
14593          * the next real character to be processed is the range indicator--the
14594          * minus sign */
14595
14596         if (range) {
14597 #ifdef EBCDIC
14598             /* For unicode ranges, we have to test that the Unicode as opposed
14599              * to the native values are not decreasing.  (Above 255, there is
14600              * no difference between native and Unicode) */
14601             if (unicode_range && prevvalue < 255 && value < 255) {
14602                 if (NATIVE_TO_LATIN1(prevvalue) > NATIVE_TO_LATIN1(value)) {
14603                     goto backwards_range;
14604                 }
14605             }
14606             else
14607 #endif
14608             if (prevvalue > value) /* b-a */ {
14609                 int w;
14610 #ifdef EBCDIC
14611               backwards_range:
14612 #endif
14613                 w = RExC_parse - rangebegin;
14614                 vFAIL2utf8f(
14615                     "Invalid [] range \"%"UTF8f"\"",
14616                     UTF8fARG(UTF, w, rangebegin));
14617                 NOT_REACHED; /* NOTREACHED */
14618             }
14619         }
14620         else {
14621             prevvalue = value; /* save the beginning of the potential range */
14622             if (! stop_at_1     /* Can't be a range if parsing just one thing */
14623                 && *RExC_parse == '-')
14624             {
14625                 char* next_char_ptr = RExC_parse + 1;
14626                 if (skip_white) {   /* Get the next real char after the '-' */
14627                     next_char_ptr = regpatws(pRExC_state,
14628                                              RExC_parse + 1,
14629                                              FALSE); /* means don't recognize
14630                                                         comments */
14631                 }
14632
14633                 /* If the '-' is at the end of the class (just before the ']',
14634                  * it is a literal minus; otherwise it is a range */
14635                 if (next_char_ptr < RExC_end && *next_char_ptr != ']') {
14636                     RExC_parse = next_char_ptr;
14637
14638                     /* a bad range like \w-, [:word:]- ? */
14639                     if (namedclass > OOB_NAMEDCLASS) {
14640                         if (strict || (PASS2 && ckWARN(WARN_REGEXP))) {
14641                             const int w = RExC_parse >= rangebegin
14642                                           ?  RExC_parse - rangebegin
14643                                           : 0;
14644                             if (strict) {
14645                                 vFAIL4("False [] range \"%*.*s\"",
14646                                     w, w, rangebegin);
14647                             }
14648                             else if (PASS2) {
14649                                 vWARN4(RExC_parse,
14650                                     "False [] range \"%*.*s\"",
14651                                     w, w, rangebegin);
14652                             }
14653                         }
14654                         if (!SIZE_ONLY) {
14655                             cp_list = add_cp_to_invlist(cp_list, '-');
14656                         }
14657                         element_count++;
14658                     } else
14659                         range = 1;      /* yeah, it's a range! */
14660                     continue;   /* but do it the next time */
14661                 }
14662             }
14663         }
14664
14665         if (namedclass > OOB_NAMEDCLASS) {
14666             continue;
14667         }
14668
14669         /* Here, we have a single value this time through the loop, and
14670          * <prevvalue> is the beginning of the range, if any; or <value> if
14671          * not. */
14672
14673         /* non-Latin1 code point implies unicode semantics.  Must be set in
14674          * pass1 so is there for the whole of pass 2 */
14675         if (value > 255) {
14676             RExC_uni_semantics = 1;
14677         }
14678
14679         /* Ready to process either the single value, or the completed range.
14680          * For single-valued non-inverted ranges, we consider the possibility
14681          * of multi-char folds.  (We made a conscious decision to not do this
14682          * for the other cases because it can often lead to non-intuitive
14683          * results.  For example, you have the peculiar case that:
14684          *  "s s" =~ /^[^\xDF]+$/i => Y
14685          *  "ss"  =~ /^[^\xDF]+$/i => N
14686          *
14687          * See [perl #89750] */
14688         if (FOLD && allow_multi_folds && value == prevvalue) {
14689             if (value == LATIN_SMALL_LETTER_SHARP_S
14690                 || (value > 255 && _invlist_contains_cp(PL_HasMultiCharFold,
14691                                                         value)))
14692             {
14693                 /* Here <value> is indeed a multi-char fold.  Get what it is */
14694
14695                 U8 foldbuf[UTF8_MAXBYTES_CASE];
14696                 STRLEN foldlen;
14697
14698                 UV folded = _to_uni_fold_flags(
14699                                 value,
14700                                 foldbuf,
14701                                 &foldlen,
14702                                 FOLD_FLAGS_FULL | (ASCII_FOLD_RESTRICTED
14703                                                    ? FOLD_FLAGS_NOMIX_ASCII
14704                                                    : 0)
14705                                 );
14706
14707                 /* Here, <folded> should be the first character of the
14708                  * multi-char fold of <value>, with <foldbuf> containing the
14709                  * whole thing.  But, if this fold is not allowed (because of
14710                  * the flags), <fold> will be the same as <value>, and should
14711                  * be processed like any other character, so skip the special
14712                  * handling */
14713                 if (folded != value) {
14714
14715                     /* Skip if we are recursed, currently parsing the class
14716                      * again.  Otherwise add this character to the list of
14717                      * multi-char folds. */
14718                     if (! RExC_in_multi_char_class) {
14719                         STRLEN cp_count = utf8_length(foldbuf,
14720                                                       foldbuf + foldlen);
14721                         SV* multi_fold = sv_2mortal(newSVpvs(""));
14722
14723                         Perl_sv_catpvf(aTHX_ multi_fold, "\\x{%"UVXf"}", value);
14724
14725                         multi_char_matches
14726                                         = add_multi_match(multi_char_matches,
14727                                                           multi_fold,
14728                                                           cp_count);
14729
14730                     }
14731
14732                     /* This element should not be processed further in this
14733                      * class */
14734                     element_count--;
14735                     value = save_value;
14736                     prevvalue = save_prevvalue;
14737                     continue;
14738                 }
14739             }
14740         }
14741
14742         if (strict && PASS2 && ckWARN(WARN_REGEXP)) {
14743             if (range) {
14744
14745                 /* If the range starts above 255, everything is portable and
14746                  * likely to be so for any forseeable character set, so don't
14747                  * warn. */
14748                 if (unicode_range && non_portable_endpoint && prevvalue < 256) {
14749                     vWARN(RExC_parse, "Both or neither range ends should be Unicode");
14750                 }
14751                 else if (prevvalue != value) {
14752
14753                     /* Under strict, ranges that stop and/or end in an ASCII
14754                      * printable should have each end point be a portable value
14755                      * for it (preferably like 'A', but we don't warn if it is
14756                      * a (portable) Unicode name or code point), and the range
14757                      * must be be all digits or all letters of the same case.
14758                      * Otherwise, the range is non-portable and unclear as to
14759                      * what it contains */
14760                     if ((isPRINT_A(prevvalue) || isPRINT_A(value))
14761                         && (non_portable_endpoint
14762                             || ! ((isDIGIT_A(prevvalue) && isDIGIT_A(value))
14763                                    || (isLOWER_A(prevvalue) && isLOWER_A(value))
14764                                    || (isUPPER_A(prevvalue) && isUPPER_A(value)))))
14765                     {
14766                         vWARN(RExC_parse, "Ranges of ASCII printables should be some subset of \"0-9\", \"A-Z\", or \"a-z\"");
14767                     }
14768                     else if (prevvalue >= 0x660) { /* ARABIC_INDIC_DIGIT_ZERO */
14769
14770                         /* But the nature of Unicode and languages mean we
14771                          * can't do the same checks for above-ASCII ranges,
14772                          * except in the case of digit ones.  These should
14773                          * contain only digits from the same group of 10.  The
14774                          * ASCII case is handled just above.  0x660 is the
14775                          * first digit character beyond ASCII.  Hence here, the
14776                          * range could be a range of digits.  Find out.  */
14777                         IV index_start = _invlist_search(PL_XPosix_ptrs[_CC_DIGIT],
14778                                                          prevvalue);
14779                         IV index_final = _invlist_search(PL_XPosix_ptrs[_CC_DIGIT],
14780                                                          value);
14781
14782                         /* If the range start and final points are in the same
14783                          * inversion list element, it means that either both
14784                          * are not digits, or both are digits in a consecutive
14785                          * sequence of digits.  (So far, Unicode has kept all
14786                          * such sequences as distinct groups of 10, but assert
14787                          * to make sure).  If the end points are not in the
14788                          * same element, neither should be a digit. */
14789                         if (index_start == index_final) {
14790                             assert(! ELEMENT_RANGE_MATCHES_INVLIST(index_start)
14791                             || invlist_array(PL_XPosix_ptrs[_CC_DIGIT])[index_start+1]
14792                             - invlist_array(PL_XPosix_ptrs[_CC_DIGIT])[index_start]
14793                             == 10);
14794                         }
14795                         else if ((index_start >= 0
14796                                   && ELEMENT_RANGE_MATCHES_INVLIST(index_start))
14797                                  || (index_final >= 0
14798                                      && ELEMENT_RANGE_MATCHES_INVLIST(index_final)))
14799                         {
14800                             vWARN(RExC_parse, "Ranges of digits should be from the same group of 10");
14801                         }
14802                     }
14803                 }
14804             }
14805             if ((! range || prevvalue == value) && non_portable_endpoint) {
14806                 if (isPRINT_A(value)) {
14807                     char literal[3];
14808                     unsigned d = 0;
14809                     if (isBACKSLASHED_PUNCT(value)) {
14810                         literal[d++] = '\\';
14811                     }
14812                     literal[d++] = (char) value;
14813                     literal[d++] = '\0';
14814
14815                     vWARN4(RExC_parse,
14816                            "\"%.*s\" is more clearly written simply as \"%s\"",
14817                            (int) (RExC_parse - rangebegin),
14818                            rangebegin,
14819                            literal
14820                         );
14821                 }
14822                 else if isMNEMONIC_CNTRL(value) {
14823                     vWARN4(RExC_parse,
14824                            "\"%.*s\" is more clearly written simply as \"%s\"",
14825                            (int) (RExC_parse - rangebegin),
14826                            rangebegin,
14827                            cntrl_to_mnemonic((char) value)
14828                         );
14829                 }
14830             }
14831         }
14832
14833         /* Deal with this element of the class */
14834         if (! SIZE_ONLY) {
14835
14836 #ifndef EBCDIC
14837             cp_foldable_list = _add_range_to_invlist(cp_foldable_list,
14838                                                      prevvalue, value);
14839 #else
14840             /* On non-ASCII platforms, for ranges that span all of 0..255, and
14841              * ones that don't require special handling, we can just add the
14842              * range like we do for ASCII platforms */
14843             if ((UNLIKELY(prevvalue == 0) && value >= 255)
14844                 || ! (prevvalue < 256
14845                       && (unicode_range
14846                           || (! non_portable_endpoint
14847                               && ((isLOWER_A(prevvalue) && isLOWER_A(value))
14848                                   || (isUPPER_A(prevvalue)
14849                                       && isUPPER_A(value)))))))
14850             {
14851                 cp_foldable_list = _add_range_to_invlist(cp_foldable_list,
14852                                                          prevvalue, value);
14853             }
14854             else {
14855                 /* Here, requires special handling.  This can be because it is
14856                  * a range whose code points are considered to be Unicode, and
14857                  * so must be individually translated into native, or because
14858                  * its a subrange of 'A-Z' or 'a-z' which each aren't
14859                  * contiguous in EBCDIC, but we have defined them to include
14860                  * only the "expected" upper or lower case ASCII alphabetics.
14861                  * Subranges above 255 are the same in native and Unicode, so
14862                  * can be added as a range */
14863                 U8 start = NATIVE_TO_LATIN1(prevvalue);
14864                 unsigned j;
14865                 U8 end = (value < 256) ? NATIVE_TO_LATIN1(value) : 255;
14866                 for (j = start; j <= end; j++) {
14867                     cp_foldable_list = add_cp_to_invlist(cp_foldable_list, LATIN1_TO_NATIVE(j));
14868                 }
14869                 if (value > 255) {
14870                     cp_foldable_list = _add_range_to_invlist(cp_foldable_list,
14871                                                              256, value);
14872                 }
14873             }
14874 #endif
14875         }
14876
14877         range = 0; /* this range (if it was one) is done now */
14878     } /* End of loop through all the text within the brackets */
14879
14880     /* If anything in the class expands to more than one character, we have to
14881      * deal with them by building up a substitute parse string, and recursively
14882      * calling reg() on it, instead of proceeding */
14883     if (multi_char_matches) {
14884         SV * substitute_parse = newSVpvn_flags("?:", 2, SVs_TEMP);
14885         I32 cp_count;
14886         STRLEN len;
14887         char *save_end = RExC_end;
14888         char *save_parse = RExC_parse;
14889         bool first_time = TRUE;     /* First multi-char occurrence doesn't get
14890                                        a "|" */
14891         I32 reg_flags;
14892
14893         assert(! invert);
14894 #if 0   /* Have decided not to deal with multi-char folds in inverted classes,
14895            because too confusing */
14896         if (invert) {
14897             sv_catpv(substitute_parse, "(?:");
14898         }
14899 #endif
14900
14901         /* Look at the longest folds first */
14902         for (cp_count = av_tindex(multi_char_matches); cp_count > 0; cp_count--) {
14903
14904             if (av_exists(multi_char_matches, cp_count)) {
14905                 AV** this_array_ptr;
14906                 SV* this_sequence;
14907
14908                 this_array_ptr = (AV**) av_fetch(multi_char_matches,
14909                                                  cp_count, FALSE);
14910                 while ((this_sequence = av_pop(*this_array_ptr)) !=
14911                                                                 &PL_sv_undef)
14912                 {
14913                     if (! first_time) {
14914                         sv_catpv(substitute_parse, "|");
14915                     }
14916                     first_time = FALSE;
14917
14918                     sv_catpv(substitute_parse, SvPVX(this_sequence));
14919                 }
14920             }
14921         }
14922
14923         /* If the character class contains anything else besides these
14924          * multi-character folds, have to include it in recursive parsing */
14925         if (element_count) {
14926             sv_catpv(substitute_parse, "|[");
14927             sv_catpvn(substitute_parse, orig_parse, RExC_parse - orig_parse);
14928             sv_catpv(substitute_parse, "]");
14929         }
14930
14931         sv_catpv(substitute_parse, ")");
14932 #if 0
14933         if (invert) {
14934             /* This is a way to get the parse to skip forward a whole named
14935              * sequence instead of matching the 2nd character when it fails the
14936              * first */
14937             sv_catpv(substitute_parse, "(*THEN)(*SKIP)(*FAIL)|.)");
14938         }
14939 #endif
14940
14941         RExC_parse = SvPV(substitute_parse, len);
14942         RExC_end = RExC_parse + len;
14943         RExC_in_multi_char_class = 1;
14944         RExC_override_recoding = 1;
14945         RExC_emit = (regnode *)orig_emit;
14946
14947         ret = reg(pRExC_state, 1, &reg_flags, depth+1);
14948
14949         *flagp |= reg_flags&(HASWIDTH|SIMPLE|SPSTART|POSTPONED|RESTART_UTF8);
14950
14951         RExC_parse = save_parse;
14952         RExC_end = save_end;
14953         RExC_in_multi_char_class = 0;
14954         RExC_override_recoding = 0;
14955         SvREFCNT_dec_NN(multi_char_matches);
14956         return ret;
14957     }
14958
14959     /* Here, we've gone through the entire class and dealt with multi-char
14960      * folds.  We are now in a position that we can do some checks to see if we
14961      * can optimize this ANYOF node into a simpler one, even in Pass 1.
14962      * Currently we only do two checks:
14963      * 1) is in the unlikely event that the user has specified both, eg. \w and
14964      *    \W under /l, then the class matches everything.  (This optimization
14965      *    is done only to make the optimizer code run later work.)
14966      * 2) if the character class contains only a single element (including a
14967      *    single range), we see if there is an equivalent node for it.
14968      * Other checks are possible */
14969     if (! ret_invlist   /* Can't optimize if returning the constructed
14970                            inversion list */
14971         && (UNLIKELY(posixl_matches_all) || element_count == 1))
14972     {
14973         U8 op = END;
14974         U8 arg = 0;
14975
14976         if (UNLIKELY(posixl_matches_all)) {
14977             op = SANY;
14978         }
14979         else if (namedclass > OOB_NAMEDCLASS) { /* this is a named class, like
14980                                                    \w or [:digit:] or \p{foo}
14981                                                  */
14982
14983             /* All named classes are mapped into POSIXish nodes, with its FLAG
14984              * argument giving which class it is */
14985             switch ((I32)namedclass) {
14986                 case ANYOF_UNIPROP:
14987                     break;
14988
14989                 /* These don't depend on the charset modifiers.  They always
14990                  * match under /u rules */
14991                 case ANYOF_NHORIZWS:
14992                 case ANYOF_HORIZWS:
14993                     namedclass = ANYOF_BLANK + namedclass - ANYOF_HORIZWS;
14994                     /* FALLTHROUGH */
14995
14996                 case ANYOF_NVERTWS:
14997                 case ANYOF_VERTWS:
14998                     op = POSIXU;
14999                     goto join_posix;
15000
15001                 /* The actual POSIXish node for all the rest depends on the
15002                  * charset modifier.  The ones in the first set depend only on
15003                  * ASCII or, if available on this platform, also locale */
15004                 case ANYOF_ASCII:
15005                 case ANYOF_NASCII:
15006 #ifdef HAS_ISASCII
15007                     op = (LOC) ? POSIXL : POSIXA;
15008 #else
15009                     op = POSIXA;
15010 #endif
15011                     goto join_posix;
15012
15013                 /* The following don't have any matches in the upper Latin1
15014                  * range, hence /d is equivalent to /u for them.  Making it /u
15015                  * saves some branches at runtime */
15016                 case ANYOF_DIGIT:
15017                 case ANYOF_NDIGIT:
15018                 case ANYOF_XDIGIT:
15019                 case ANYOF_NXDIGIT:
15020                     if (! DEPENDS_SEMANTICS) {
15021                         goto treat_as_default;
15022                     }
15023
15024                     op = POSIXU;
15025                     goto join_posix;
15026
15027                 /* The following change to CASED under /i */
15028                 case ANYOF_LOWER:
15029                 case ANYOF_NLOWER:
15030                 case ANYOF_UPPER:
15031                 case ANYOF_NUPPER:
15032                     if (FOLD) {
15033                         namedclass = ANYOF_CASED + (namedclass % 2);
15034                     }
15035                     /* FALLTHROUGH */
15036
15037                 /* The rest have more possibilities depending on the charset.
15038                  * We take advantage of the enum ordering of the charset
15039                  * modifiers to get the exact node type, */
15040                 default:
15041                   treat_as_default:
15042                     op = POSIXD + get_regex_charset(RExC_flags);
15043                     if (op > POSIXA) { /* /aa is same as /a */
15044                         op = POSIXA;
15045                     }
15046
15047                   join_posix:
15048                     /* The odd numbered ones are the complements of the
15049                      * next-lower even number one */
15050                     if (namedclass % 2 == 1) {
15051                         invert = ! invert;
15052                         namedclass--;
15053                     }
15054                     arg = namedclass_to_classnum(namedclass);
15055                     break;
15056             }
15057         }
15058         else if (value == prevvalue) {
15059
15060             /* Here, the class consists of just a single code point */
15061
15062             if (invert) {
15063                 if (! LOC && value == '\n') {
15064                     op = REG_ANY; /* Optimize [^\n] */
15065                     *flagp |= HASWIDTH|SIMPLE;
15066                     MARK_NAUGHTY(1);
15067                 }
15068             }
15069             else if (value < 256 || UTF) {
15070
15071                 /* Optimize a single value into an EXACTish node, but not if it
15072                  * would require converting the pattern to UTF-8. */
15073                 op = compute_EXACTish(pRExC_state);
15074             }
15075         } /* Otherwise is a range */
15076         else if (! LOC) {   /* locale could vary these */
15077             if (prevvalue == '0') {
15078                 if (value == '9') {
15079                     arg = _CC_DIGIT;
15080                     op = POSIXA;
15081                 }
15082             }
15083             else if (AT_LEAST_ASCII_RESTRICTED || ! FOLD) {
15084                 /* We can optimize A-Z or a-z, but not if they could match
15085                  * something like the KELVIN SIGN under /i (/a means they
15086                  * can't) */
15087                 if (prevvalue == 'A') {
15088                     if (value == 'Z'
15089 #ifdef EBCDIC
15090                         && ! non_portable_endpoint
15091 #endif
15092                     ) {
15093                         arg = (FOLD) ? _CC_ALPHA : _CC_UPPER;
15094                         op = POSIXA;
15095                     }
15096                 }
15097                 else if (prevvalue == 'a') {
15098                     if (value == 'z'
15099 #ifdef EBCDIC
15100                         && ! non_portable_endpoint
15101 #endif
15102                     ) {
15103                         arg = (FOLD) ? _CC_ALPHA : _CC_LOWER;
15104                         op = POSIXA;
15105                     }
15106                 }
15107             }
15108         }
15109
15110         /* Here, we have changed <op> away from its initial value iff we found
15111          * an optimization */
15112         if (op != END) {
15113
15114             /* Throw away this ANYOF regnode, and emit the calculated one,
15115              * which should correspond to the beginning, not current, state of
15116              * the parse */
15117             const char * cur_parse = RExC_parse;
15118             RExC_parse = (char *)orig_parse;
15119             if ( SIZE_ONLY) {
15120                 if (! LOC) {
15121
15122                     /* To get locale nodes to not use the full ANYOF size would
15123                      * require moving the code above that writes the portions
15124                      * of it that aren't in other nodes to after this point.
15125                      * e.g.  ANYOF_POSIXL_SET */
15126                     RExC_size = orig_size;
15127                 }
15128             }
15129             else {
15130                 RExC_emit = (regnode *)orig_emit;
15131                 if (PL_regkind[op] == POSIXD) {
15132                     if (op == POSIXL) {
15133                         RExC_contains_locale = 1;
15134                     }
15135                     if (invert) {
15136                         op += NPOSIXD - POSIXD;
15137                     }
15138                 }
15139             }
15140
15141             ret = reg_node(pRExC_state, op);
15142
15143             if (PL_regkind[op] == POSIXD || PL_regkind[op] == NPOSIXD) {
15144                 if (! SIZE_ONLY) {
15145                     FLAGS(ret) = arg;
15146                 }
15147                 *flagp |= HASWIDTH|SIMPLE;
15148             }
15149             else if (PL_regkind[op] == EXACT) {
15150                 alloc_maybe_populate_EXACT(pRExC_state, ret, flagp, 0, value,
15151                                            TRUE /* downgradable to EXACT */
15152                                            );
15153             }
15154
15155             RExC_parse = (char *) cur_parse;
15156
15157             SvREFCNT_dec(posixes);
15158             SvREFCNT_dec(nposixes);
15159             SvREFCNT_dec(simple_posixes);
15160             SvREFCNT_dec(cp_list);
15161             SvREFCNT_dec(cp_foldable_list);
15162             return ret;
15163         }
15164     }
15165
15166     if (SIZE_ONLY)
15167         return ret;
15168     /****** !SIZE_ONLY (Pass 2) AFTER HERE *********/
15169
15170     /* If folding, we calculate all characters that could fold to or from the
15171      * ones already on the list */
15172     if (cp_foldable_list) {
15173         if (FOLD) {
15174             UV start, end;      /* End points of code point ranges */
15175
15176             SV* fold_intersection = NULL;
15177             SV** use_list;
15178
15179             /* Our calculated list will be for Unicode rules.  For locale
15180              * matching, we have to keep a separate list that is consulted at
15181              * runtime only when the locale indicates Unicode rules.  For
15182              * non-locale, we just use to the general list */
15183             if (LOC) {
15184                 use_list = &only_utf8_locale_list;
15185             }
15186             else {
15187                 use_list = &cp_list;
15188             }
15189
15190             /* Only the characters in this class that participate in folds need
15191              * be checked.  Get the intersection of this class and all the
15192              * possible characters that are foldable.  This can quickly narrow
15193              * down a large class */
15194             _invlist_intersection(PL_utf8_foldable, cp_foldable_list,
15195                                   &fold_intersection);
15196
15197             /* The folds for all the Latin1 characters are hard-coded into this
15198              * program, but we have to go out to disk to get the others. */
15199             if (invlist_highest(cp_foldable_list) >= 256) {
15200
15201                 /* This is a hash that for a particular fold gives all
15202                  * characters that are involved in it */
15203                 if (! PL_utf8_foldclosures) {
15204                     _load_PL_utf8_foldclosures();
15205                 }
15206             }
15207
15208             /* Now look at the foldable characters in this class individually */
15209             invlist_iterinit(fold_intersection);
15210             while (invlist_iternext(fold_intersection, &start, &end)) {
15211                 UV j;
15212
15213                 /* Look at every character in the range */
15214                 for (j = start; j <= end; j++) {
15215                     U8 foldbuf[UTF8_MAXBYTES_CASE+1];
15216                     STRLEN foldlen;
15217                     SV** listp;
15218
15219                     if (j < 256) {
15220
15221                         if (IS_IN_SOME_FOLD_L1(j)) {
15222
15223                             /* ASCII is always matched; non-ASCII is matched
15224                              * only under Unicode rules (which could happen
15225                              * under /l if the locale is a UTF-8 one */
15226                             if (isASCII(j) || ! DEPENDS_SEMANTICS) {
15227                                 *use_list = add_cp_to_invlist(*use_list,
15228                                                             PL_fold_latin1[j]);
15229                             }
15230                             else {
15231                                 depends_list =
15232                                  add_cp_to_invlist(depends_list,
15233                                                    PL_fold_latin1[j]);
15234                             }
15235                         }
15236
15237                         if (HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(j)
15238                             && (! isASCII(j) || ! ASCII_FOLD_RESTRICTED))
15239                         {
15240                             add_above_Latin1_folds(pRExC_state,
15241                                                    (U8) j,
15242                                                    use_list);
15243                         }
15244                         continue;
15245                     }
15246
15247                     /* Here is an above Latin1 character.  We don't have the
15248                      * rules hard-coded for it.  First, get its fold.  This is
15249                      * the simple fold, as the multi-character folds have been
15250                      * handled earlier and separated out */
15251                     _to_uni_fold_flags(j, foldbuf, &foldlen,
15252                                                         (ASCII_FOLD_RESTRICTED)
15253                                                         ? FOLD_FLAGS_NOMIX_ASCII
15254                                                         : 0);
15255
15256                     /* Single character fold of above Latin1.  Add everything in
15257                     * its fold closure to the list that this node should match.
15258                     * The fold closures data structure is a hash with the keys
15259                     * being the UTF-8 of every character that is folded to, like
15260                     * 'k', and the values each an array of all code points that
15261                     * fold to its key.  e.g. [ 'k', 'K', KELVIN_SIGN ].
15262                     * Multi-character folds are not included */
15263                     if ((listp = hv_fetch(PL_utf8_foldclosures,
15264                                         (char *) foldbuf, foldlen, FALSE)))
15265                     {
15266                         AV* list = (AV*) *listp;
15267                         IV k;
15268                         for (k = 0; k <= av_tindex(list); k++) {
15269                             SV** c_p = av_fetch(list, k, FALSE);
15270                             UV c;
15271                             assert(c_p);
15272
15273                             c = SvUV(*c_p);
15274
15275                             /* /aa doesn't allow folds between ASCII and non- */
15276                             if ((ASCII_FOLD_RESTRICTED
15277                                 && (isASCII(c) != isASCII(j))))
15278                             {
15279                                 continue;
15280                             }
15281
15282                             /* Folds under /l which cross the 255/256 boundary
15283                              * are added to a separate list.  (These are valid
15284                              * only when the locale is UTF-8.) */
15285                             if (c < 256 && LOC) {
15286                                 *use_list = add_cp_to_invlist(*use_list, c);
15287                                 continue;
15288                             }
15289
15290                             if (isASCII(c) || c > 255 || AT_LEAST_UNI_SEMANTICS)
15291                             {
15292                                 cp_list = add_cp_to_invlist(cp_list, c);
15293                             }
15294                             else {
15295                                 /* Similarly folds involving non-ascii Latin1
15296                                 * characters under /d are added to their list */
15297                                 depends_list = add_cp_to_invlist(depends_list,
15298                                                                  c);
15299                             }
15300                         }
15301                     }
15302                 }
15303             }
15304             SvREFCNT_dec_NN(fold_intersection);
15305         }
15306
15307         /* Now that we have finished adding all the folds, there is no reason
15308          * to keep the foldable list separate */
15309         _invlist_union(cp_list, cp_foldable_list, &cp_list);
15310         SvREFCNT_dec_NN(cp_foldable_list);
15311     }
15312
15313     /* And combine the result (if any) with any inversion list from posix
15314      * classes.  The lists are kept separate up to now because we don't want to
15315      * fold the classes (folding of those is automatically handled by the swash
15316      * fetching code) */
15317     if (simple_posixes) {
15318         _invlist_union(cp_list, simple_posixes, &cp_list);
15319         SvREFCNT_dec_NN(simple_posixes);
15320     }
15321     if (posixes || nposixes) {
15322         if (posixes && AT_LEAST_ASCII_RESTRICTED) {
15323             /* Under /a and /aa, nothing above ASCII matches these */
15324             _invlist_intersection(posixes,
15325                                   PL_XPosix_ptrs[_CC_ASCII],
15326                                   &posixes);
15327         }
15328         if (nposixes) {
15329             if (DEPENDS_SEMANTICS) {
15330                 /* Under /d, everything in the upper half of the Latin1 range
15331                  * matches these complements */
15332                 ANYOF_FLAGS(ret) |= ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII;
15333             }
15334             else if (AT_LEAST_ASCII_RESTRICTED) {
15335                 /* Under /a and /aa, everything above ASCII matches these
15336                  * complements */
15337                 _invlist_union_complement_2nd(nposixes,
15338                                               PL_XPosix_ptrs[_CC_ASCII],
15339                                               &nposixes);
15340             }
15341             if (posixes) {
15342                 _invlist_union(posixes, nposixes, &posixes);
15343                 SvREFCNT_dec_NN(nposixes);
15344             }
15345             else {
15346                 posixes = nposixes;
15347             }
15348         }
15349         if (! DEPENDS_SEMANTICS) {
15350             if (cp_list) {
15351                 _invlist_union(cp_list, posixes, &cp_list);
15352                 SvREFCNT_dec_NN(posixes);
15353             }
15354             else {
15355                 cp_list = posixes;
15356             }
15357         }
15358         else {
15359             /* Under /d, we put into a separate list the Latin1 things that
15360              * match only when the target string is utf8 */
15361             SV* nonascii_but_latin1_properties = NULL;
15362             _invlist_intersection(posixes, PL_UpperLatin1,
15363                                   &nonascii_but_latin1_properties);
15364             _invlist_subtract(posixes, nonascii_but_latin1_properties,
15365                               &posixes);
15366             if (cp_list) {
15367                 _invlist_union(cp_list, posixes, &cp_list);
15368                 SvREFCNT_dec_NN(posixes);
15369             }
15370             else {
15371                 cp_list = posixes;
15372             }
15373
15374             if (depends_list) {
15375                 _invlist_union(depends_list, nonascii_but_latin1_properties,
15376                                &depends_list);
15377                 SvREFCNT_dec_NN(nonascii_but_latin1_properties);
15378             }
15379             else {
15380                 depends_list = nonascii_but_latin1_properties;
15381             }
15382         }
15383     }
15384
15385     /* And combine the result (if any) with any inversion list from properties.
15386      * The lists are kept separate up to now so that we can distinguish the two
15387      * in regards to matching above-Unicode.  A run-time warning is generated
15388      * if a Unicode property is matched against a non-Unicode code point. But,
15389      * we allow user-defined properties to match anything, without any warning,
15390      * and we also suppress the warning if there is a portion of the character
15391      * class that isn't a Unicode property, and which matches above Unicode, \W
15392      * or [\x{110000}] for example.
15393      * (Note that in this case, unlike the Posix one above, there is no
15394      * <depends_list>, because having a Unicode property forces Unicode
15395      * semantics */
15396     if (properties) {
15397         if (cp_list) {
15398
15399             /* If it matters to the final outcome, see if a non-property
15400              * component of the class matches above Unicode.  If so, the
15401              * warning gets suppressed.  This is true even if just a single
15402              * such code point is specified, as though not strictly correct if
15403              * another such code point is matched against, the fact that they
15404              * are using above-Unicode code points indicates they should know
15405              * the issues involved */
15406             if (warn_super) {
15407                 warn_super = ! (invert
15408                                ^ (invlist_highest(cp_list) > PERL_UNICODE_MAX));
15409             }
15410
15411             _invlist_union(properties, cp_list, &cp_list);
15412             SvREFCNT_dec_NN(properties);
15413         }
15414         else {
15415             cp_list = properties;
15416         }
15417
15418         if (warn_super) {
15419             ANYOF_FLAGS(ret) |= ANYOF_WARN_SUPER;
15420         }
15421     }
15422
15423     /* Here, we have calculated what code points should be in the character
15424      * class.
15425      *
15426      * Now we can see about various optimizations.  Fold calculation (which we
15427      * did above) needs to take place before inversion.  Otherwise /[^k]/i
15428      * would invert to include K, which under /i would match k, which it
15429      * shouldn't.  Therefore we can't invert folded locale now, as it won't be
15430      * folded until runtime */
15431
15432     /* If we didn't do folding, it's because some information isn't available
15433      * until runtime; set the run-time fold flag for these.  (We don't have to
15434      * worry about properties folding, as that is taken care of by the swash
15435      * fetching).  We know to set the flag if we have a non-NULL list for UTF-8
15436      * locales, or the class matches at least one 0-255 range code point */
15437     if (LOC && FOLD) {
15438         if (only_utf8_locale_list) {
15439             ANYOF_FLAGS(ret) |= ANYOF_LOC_FOLD;
15440         }
15441         else if (cp_list) { /* Look to see if there a 0-255 code point is in
15442                                the list */
15443             UV start, end;
15444             invlist_iterinit(cp_list);
15445             if (invlist_iternext(cp_list, &start, &end) && start < 256) {
15446                 ANYOF_FLAGS(ret) |= ANYOF_LOC_FOLD;
15447             }
15448             invlist_iterfinish(cp_list);
15449         }
15450     }
15451
15452     /* Optimize inverted simple patterns (e.g. [^a-z]) when everything is known
15453      * at compile time.  Besides not inverting folded locale now, we can't
15454      * invert if there are things such as \w, which aren't known until runtime
15455      * */
15456     if (cp_list
15457         && invert
15458         && ! (ANYOF_FLAGS(ret) & (ANYOF_LOCALE_FLAGS))
15459         && ! depends_list
15460         && ! HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION)
15461     {
15462         _invlist_invert(cp_list);
15463
15464         /* Any swash can't be used as-is, because we've inverted things */
15465         if (swash) {
15466             SvREFCNT_dec_NN(swash);
15467             swash = NULL;
15468         }
15469
15470         /* Clear the invert flag since have just done it here */
15471         invert = FALSE;
15472     }
15473
15474     if (ret_invlist) {
15475         assert(cp_list);
15476
15477         *ret_invlist = cp_list;
15478         SvREFCNT_dec(swash);
15479
15480         /* Discard the generated node */
15481         if (SIZE_ONLY) {
15482             RExC_size = orig_size;
15483         }
15484         else {
15485             RExC_emit = orig_emit;
15486         }
15487         return orig_emit;
15488     }
15489
15490     /* Some character classes are equivalent to other nodes.  Such nodes take
15491      * up less room and generally fewer operations to execute than ANYOF nodes.
15492      * Above, we checked for and optimized into some such equivalents for
15493      * certain common classes that are easy to test.  Getting to this point in
15494      * the code means that the class didn't get optimized there.  Since this
15495      * code is only executed in Pass 2, it is too late to save space--it has
15496      * been allocated in Pass 1, and currently isn't given back.  But turning
15497      * things into an EXACTish node can allow the optimizer to join it to any
15498      * adjacent such nodes.  And if the class is equivalent to things like /./,
15499      * expensive run-time swashes can be avoided.  Now that we have more
15500      * complete information, we can find things necessarily missed by the
15501      * earlier code.  I (khw) am not sure how much to look for here.  It would
15502      * be easy, but perhaps too slow, to check any candidates against all the
15503      * node types they could possibly match using _invlistEQ(). */
15504
15505     if (cp_list
15506         && ! invert
15507         && ! depends_list
15508         && ! (ANYOF_FLAGS(ret) & (ANYOF_LOCALE_FLAGS))
15509         && ! HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION
15510
15511            /* We don't optimize if we are supposed to make sure all non-Unicode
15512             * code points raise a warning, as only ANYOF nodes have this check.
15513             * */
15514         && ! ((ANYOF_FLAGS(ret) & ANYOF_WARN_SUPER) && ALWAYS_WARN_SUPER))
15515     {
15516         UV start, end;
15517         U8 op = END;  /* The optimzation node-type */
15518         const char * cur_parse= RExC_parse;
15519
15520         invlist_iterinit(cp_list);
15521         if (! invlist_iternext(cp_list, &start, &end)) {
15522
15523             /* Here, the list is empty.  This happens, for example, when a
15524              * Unicode property is the only thing in the character class, and
15525              * it doesn't match anything.  (perluniprops.pod notes such
15526              * properties) */
15527             op = OPFAIL;
15528             *flagp |= HASWIDTH|SIMPLE;
15529         }
15530         else if (start == end) {    /* The range is a single code point */
15531             if (! invlist_iternext(cp_list, &start, &end)
15532
15533                     /* Don't do this optimization if it would require changing
15534                      * the pattern to UTF-8 */
15535                 && (start < 256 || UTF))
15536             {
15537                 /* Here, the list contains a single code point.  Can optimize
15538                  * into an EXACTish node */
15539
15540                 value = start;
15541
15542                 if (! FOLD) {
15543                     op = (LOC)
15544                          ? EXACTL
15545                          : EXACT;
15546                 }
15547                 else if (LOC) {
15548
15549                     /* A locale node under folding with one code point can be
15550                      * an EXACTFL, as its fold won't be calculated until
15551                      * runtime */
15552                     op = EXACTFL;
15553                 }
15554                 else {
15555
15556                     /* Here, we are generally folding, but there is only one
15557                      * code point to match.  If we have to, we use an EXACT
15558                      * node, but it would be better for joining with adjacent
15559                      * nodes in the optimization pass if we used the same
15560                      * EXACTFish node that any such are likely to be.  We can
15561                      * do this iff the code point doesn't participate in any
15562                      * folds.  For example, an EXACTF of a colon is the same as
15563                      * an EXACT one, since nothing folds to or from a colon. */
15564                     if (value < 256) {
15565                         if (IS_IN_SOME_FOLD_L1(value)) {
15566                             op = EXACT;
15567                         }
15568                     }
15569                     else {
15570                         if (_invlist_contains_cp(PL_utf8_foldable, value)) {
15571                             op = EXACT;
15572                         }
15573                     }
15574
15575                     /* If we haven't found the node type, above, it means we
15576                      * can use the prevailing one */
15577                     if (op == END) {
15578                         op = compute_EXACTish(pRExC_state);
15579                     }
15580                 }
15581             }
15582         }
15583         else if (start == 0) {
15584             if (end == UV_MAX) {
15585                 op = SANY;
15586                 *flagp |= HASWIDTH|SIMPLE;
15587                 MARK_NAUGHTY(1);
15588             }
15589             else if (end == '\n' - 1
15590                     && invlist_iternext(cp_list, &start, &end)
15591                     && start == '\n' + 1 && end == UV_MAX)
15592             {
15593                 op = REG_ANY;
15594                 *flagp |= HASWIDTH|SIMPLE;
15595                 MARK_NAUGHTY(1);
15596             }
15597         }
15598         invlist_iterfinish(cp_list);
15599
15600         if (op != END) {
15601             RExC_parse = (char *)orig_parse;
15602             RExC_emit = (regnode *)orig_emit;
15603
15604             ret = reg_node(pRExC_state, op);
15605
15606             RExC_parse = (char *)cur_parse;
15607
15608             if (PL_regkind[op] == EXACT) {
15609                 alloc_maybe_populate_EXACT(pRExC_state, ret, flagp, 0, value,
15610                                            TRUE /* downgradable to EXACT */
15611                                           );
15612             }
15613
15614             SvREFCNT_dec_NN(cp_list);
15615             return ret;
15616         }
15617     }
15618
15619     /* Here, <cp_list> contains all the code points we can determine at
15620      * compile time that match under all conditions.  Go through it, and
15621      * for things that belong in the bitmap, put them there, and delete from
15622      * <cp_list>.  While we are at it, see if everything above 255 is in the
15623      * list, and if so, set a flag to speed up execution */
15624
15625     populate_ANYOF_from_invlist(ret, &cp_list);
15626
15627     if (invert) {
15628         ANYOF_FLAGS(ret) |= ANYOF_INVERT;
15629     }
15630
15631     /* Here, the bitmap has been populated with all the Latin1 code points that
15632      * always match.  Can now add to the overall list those that match only
15633      * when the target string is UTF-8 (<depends_list>). */
15634     if (depends_list) {
15635         if (cp_list) {
15636             _invlist_union(cp_list, depends_list, &cp_list);
15637             SvREFCNT_dec_NN(depends_list);
15638         }
15639         else {
15640             cp_list = depends_list;
15641         }
15642         ANYOF_FLAGS(ret) |= ANYOF_HAS_UTF8_NONBITMAP_MATCHES;
15643     }
15644
15645     /* If there is a swash and more than one element, we can't use the swash in
15646      * the optimization below. */
15647     if (swash && element_count > 1) {
15648         SvREFCNT_dec_NN(swash);
15649         swash = NULL;
15650     }
15651
15652     /* Note that the optimization of using 'swash' if it is the only thing in
15653      * the class doesn't have us change swash at all, so it can include things
15654      * that are also in the bitmap; otherwise we have purposely deleted that
15655      * duplicate information */
15656     set_ANYOF_arg(pRExC_state, ret, cp_list,
15657                   (HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION)
15658                    ? listsv : NULL,
15659                   only_utf8_locale_list,
15660                   swash, has_user_defined_property);
15661
15662     *flagp |= HASWIDTH|SIMPLE;
15663
15664     if (ANYOF_FLAGS(ret) & ANYOF_LOCALE_FLAGS) {
15665         RExC_contains_locale = 1;
15666     }
15667
15668     return ret;
15669 }
15670
15671 #undef HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION
15672
15673 STATIC void
15674 S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state,
15675                 regnode* const node,
15676                 SV* const cp_list,
15677                 SV* const runtime_defns,
15678                 SV* const only_utf8_locale_list,
15679                 SV* const swash,
15680                 const bool has_user_defined_property)
15681 {
15682     /* Sets the arg field of an ANYOF-type node 'node', using information about
15683      * the node passed-in.  If there is nothing outside the node's bitmap, the
15684      * arg is set to ANYOF_ONLY_HAS_BITMAP.  Otherwise, it sets the argument to
15685      * the count returned by add_data(), having allocated and stored an array,
15686      * av, that that count references, as follows:
15687      *  av[0] stores the character class description in its textual form.
15688      *        This is used later (regexec.c:Perl_regclass_swash()) to
15689      *        initialize the appropriate swash, and is also useful for dumping
15690      *        the regnode.  This is set to &PL_sv_undef if the textual
15691      *        description is not needed at run-time (as happens if the other
15692      *        elements completely define the class)
15693      *  av[1] if &PL_sv_undef, is a placeholder to later contain the swash
15694      *        computed from av[0].  But if no further computation need be done,
15695      *        the swash is stored here now (and av[0] is &PL_sv_undef).
15696      *  av[2] stores the inversion list of code points that match only if the
15697      *        current locale is UTF-8
15698      *  av[3] stores the cp_list inversion list for use in addition or instead
15699      *        of av[0]; used only if cp_list exists and av[1] is &PL_sv_undef.
15700      *        (Otherwise everything needed is already in av[0] and av[1])
15701      *  av[4] is set if any component of the class is from a user-defined
15702      *        property; used only if av[3] exists */
15703
15704     UV n;
15705
15706     PERL_ARGS_ASSERT_SET_ANYOF_ARG;
15707
15708     if (! cp_list && ! runtime_defns && ! only_utf8_locale_list) {
15709         assert(! (ANYOF_FLAGS(node)
15710                   & (ANYOF_HAS_UTF8_NONBITMAP_MATCHES
15711                      |ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES)));
15712         ARG_SET(node, ANYOF_ONLY_HAS_BITMAP);
15713     }
15714     else {
15715         AV * const av = newAV();
15716         SV *rv;
15717
15718         assert(ANYOF_FLAGS(node)
15719                & (ANYOF_HAS_UTF8_NONBITMAP_MATCHES
15720                   |ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES|ANYOF_LOC_FOLD));
15721
15722         av_store(av, 0, (runtime_defns)
15723                         ? SvREFCNT_inc(runtime_defns) : &PL_sv_undef);
15724         if (swash) {
15725             assert(cp_list);
15726             av_store(av, 1, swash);
15727             SvREFCNT_dec_NN(cp_list);
15728         }
15729         else {
15730             av_store(av, 1, &PL_sv_undef);
15731             if (cp_list) {
15732                 av_store(av, 3, cp_list);
15733                 av_store(av, 4, newSVuv(has_user_defined_property));
15734             }
15735         }
15736
15737         if (only_utf8_locale_list) {
15738             av_store(av, 2, only_utf8_locale_list);
15739         }
15740         else {
15741             av_store(av, 2, &PL_sv_undef);
15742         }
15743
15744         rv = newRV_noinc(MUTABLE_SV(av));
15745         n = add_data(pRExC_state, STR_WITH_LEN("s"));
15746         RExC_rxi->data->data[n] = (void*)rv;
15747         ARG_SET(node, n);
15748     }
15749 }
15750
15751 #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
15752 SV *
15753 Perl__get_regclass_nonbitmap_data(pTHX_ const regexp *prog,
15754                                         const regnode* node,
15755                                         bool doinit,
15756                                         SV** listsvp,
15757                                         SV** only_utf8_locale_ptr,
15758                                         SV*  exclude_list)
15759
15760 {
15761     /* For internal core use only.
15762      * Returns the swash for the input 'node' in the regex 'prog'.
15763      * If <doinit> is 'true', will attempt to create the swash if not already
15764      *    done.
15765      * If <listsvp> is non-null, will return the printable contents of the
15766      *    swash.  This can be used to get debugging information even before the
15767      *    swash exists, by calling this function with 'doinit' set to false, in
15768      *    which case the components that will be used to eventually create the
15769      *    swash are returned  (in a printable form).
15770      * If <exclude_list> is not NULL, it is an inversion list of things to
15771      *    exclude from what's returned in <listsvp>.
15772      * Tied intimately to how S_set_ANYOF_arg sets up the data structure.  Note
15773      * that, in spite of this function's name, the swash it returns may include
15774      * the bitmap data as well */
15775
15776     SV *sw  = NULL;
15777     SV *si  = NULL;         /* Input swash initialization string */
15778     SV*  invlist = NULL;
15779
15780     RXi_GET_DECL(prog,progi);
15781     const struct reg_data * const data = prog ? progi->data : NULL;
15782
15783     PERL_ARGS_ASSERT__GET_REGCLASS_NONBITMAP_DATA;
15784
15785     assert(ANYOF_FLAGS(node)
15786         & (ANYOF_HAS_UTF8_NONBITMAP_MATCHES
15787            |ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES|ANYOF_LOC_FOLD));
15788
15789     if (data && data->count) {
15790         const U32 n = ARG(node);
15791
15792         if (data->what[n] == 's') {
15793             SV * const rv = MUTABLE_SV(data->data[n]);
15794             AV * const av = MUTABLE_AV(SvRV(rv));
15795             SV **const ary = AvARRAY(av);
15796             U8 swash_init_flags = _CORE_SWASH_INIT_ACCEPT_INVLIST;
15797
15798             si = *ary;  /* ary[0] = the string to initialize the swash with */
15799
15800             /* Elements 3 and 4 are either both present or both absent. [3] is
15801              * any inversion list generated at compile time; [4] indicates if
15802              * that inversion list has any user-defined properties in it. */
15803             if (av_tindex(av) >= 2) {
15804                 if (only_utf8_locale_ptr
15805                     && ary[2]
15806                     && ary[2] != &PL_sv_undef)
15807                 {
15808                     *only_utf8_locale_ptr = ary[2];
15809                 }
15810                 else {
15811                     assert(only_utf8_locale_ptr);
15812                     *only_utf8_locale_ptr = NULL;
15813                 }
15814
15815                 if (av_tindex(av) >= 3) {
15816                     invlist = ary[3];
15817                     if (SvUV(ary[4])) {
15818                         swash_init_flags |= _CORE_SWASH_INIT_USER_DEFINED_PROPERTY;
15819                     }
15820                 }
15821                 else {
15822                     invlist = NULL;
15823                 }
15824             }
15825
15826             /* Element [1] is reserved for the set-up swash.  If already there,
15827              * return it; if not, create it and store it there */
15828             if (ary[1] && SvROK(ary[1])) {
15829                 sw = ary[1];
15830             }
15831             else if (doinit && ((si && si != &PL_sv_undef)
15832                                  || (invlist && invlist != &PL_sv_undef))) {
15833                 assert(si);
15834                 sw = _core_swash_init("utf8", /* the utf8 package */
15835                                       "", /* nameless */
15836                                       si,
15837                                       1, /* binary */
15838                                       0, /* not from tr/// */
15839                                       invlist,
15840                                       &swash_init_flags);
15841                 (void)av_store(av, 1, sw);
15842             }
15843         }
15844     }
15845
15846     /* If requested, return a printable version of what this swash matches */
15847     if (listsvp) {
15848         SV* matches_string = newSVpvs("");
15849
15850         /* The swash should be used, if possible, to get the data, as it
15851          * contains the resolved data.  But this function can be called at
15852          * compile-time, before everything gets resolved, in which case we
15853          * return the currently best available information, which is the string
15854          * that will eventually be used to do that resolving, 'si' */
15855         if ((! sw || (invlist = _get_swash_invlist(sw)) == NULL)
15856             && (si && si != &PL_sv_undef))
15857         {
15858             sv_catsv(matches_string, si);
15859         }
15860
15861         /* Add the inversion list to whatever we have.  This may have come from
15862          * the swash, or from an input parameter */
15863         if (invlist) {
15864             if (exclude_list) {
15865                 SV* clone = invlist_clone(invlist);
15866                 _invlist_subtract(clone, exclude_list, &clone);
15867                 sv_catsv(matches_string, _invlist_contents(clone));
15868                 SvREFCNT_dec_NN(clone);
15869             }
15870             else {
15871                 sv_catsv(matches_string, _invlist_contents(invlist));
15872             }
15873         }
15874         *listsvp = matches_string;
15875     }
15876
15877     return sw;
15878 }
15879 #endif /* !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) */
15880
15881 /* reg_skipcomment()
15882
15883    Absorbs an /x style # comment from the input stream,
15884    returning a pointer to the first character beyond the comment, or if the
15885    comment terminates the pattern without anything following it, this returns
15886    one past the final character of the pattern (in other words, RExC_end) and
15887    sets the REG_RUN_ON_COMMENT_SEEN flag.
15888
15889    Note it's the callers responsibility to ensure that we are
15890    actually in /x mode
15891
15892 */
15893
15894 PERL_STATIC_INLINE char*
15895 S_reg_skipcomment(RExC_state_t *pRExC_state, char* p)
15896 {
15897     PERL_ARGS_ASSERT_REG_SKIPCOMMENT;
15898
15899     assert(*p == '#');
15900
15901     while (p < RExC_end) {
15902         if (*(++p) == '\n') {
15903             return p+1;
15904         }
15905     }
15906
15907     /* we ran off the end of the pattern without ending the comment, so we have
15908      * to add an \n when wrapping */
15909     RExC_seen |= REG_RUN_ON_COMMENT_SEEN;
15910     return p;
15911 }
15912
15913 /* nextchar()
15914
15915    Advances the parse position, and optionally absorbs
15916    "whitespace" from the inputstream.
15917
15918    Without /x "whitespace" means (?#...) style comments only,
15919    with /x this means (?#...) and # comments and whitespace proper.
15920
15921    Returns the RExC_parse point from BEFORE the scan occurs.
15922
15923    This is the /x friendly way of saying RExC_parse++.
15924 */
15925
15926 STATIC char*
15927 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
15928 {
15929     char* const retval = RExC_parse++;
15930
15931     PERL_ARGS_ASSERT_NEXTCHAR;
15932
15933     for (;;) {
15934         if (RExC_end - RExC_parse >= 3
15935             && *RExC_parse == '('
15936             && RExC_parse[1] == '?'
15937             && RExC_parse[2] == '#')
15938         {
15939             while (*RExC_parse != ')') {
15940                 if (RExC_parse == RExC_end)
15941                     FAIL("Sequence (?#... not terminated");
15942                 RExC_parse++;
15943             }
15944             RExC_parse++;
15945             continue;
15946         }
15947         if (RExC_flags & RXf_PMf_EXTENDED) {
15948             char * p = regpatws(pRExC_state, RExC_parse,
15949                                           TRUE); /* means recognize comments */
15950             if (p != RExC_parse) {
15951                 RExC_parse = p;
15952                 continue;
15953             }
15954         }
15955         return retval;
15956     }
15957 }
15958
15959 STATIC regnode *
15960 S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_size, const char* const name)
15961 {
15962     /* Allocate a regnode for 'op' and returns it, with 'extra_size' extra
15963      * space.  In pass1, it aligns and increments RExC_size; in pass2,
15964      * RExC_emit */
15965
15966     regnode * const ret = RExC_emit;
15967     GET_RE_DEBUG_FLAGS_DECL;
15968
15969     PERL_ARGS_ASSERT_REGNODE_GUTS;
15970
15971     assert(extra_size >= regarglen[op]);
15972
15973     if (SIZE_ONLY) {
15974         SIZE_ALIGN(RExC_size);
15975         RExC_size += 1 + extra_size;
15976         return(ret);
15977     }
15978     if (RExC_emit >= RExC_emit_bound)
15979         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d, %p>=%p",
15980                    op, (void*)RExC_emit, (void*)RExC_emit_bound);
15981
15982     NODE_ALIGN_FILL(ret);
15983 #ifndef RE_TRACK_PATTERN_OFFSETS
15984     PERL_UNUSED_ARG(name);
15985 #else
15986     if (RExC_offsets) {         /* MJD */
15987         MJD_OFFSET_DEBUG(
15988               ("%s:%d: (op %s) %s %"UVuf" (len %"UVuf") (max %"UVuf").\n",
15989               name, __LINE__,
15990               PL_reg_name[op],
15991               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0]
15992                 ? "Overwriting end of array!\n" : "OK",
15993               (UV)(RExC_emit - RExC_emit_start),
15994               (UV)(RExC_parse - RExC_start),
15995               (UV)RExC_offsets[0]));
15996         Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
15997     }
15998 #endif
15999     return(ret);
16000 }
16001
16002 /*
16003 - reg_node - emit a node
16004 */
16005 STATIC regnode *                        /* Location. */
16006 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
16007 {
16008     regnode * const ret = regnode_guts(pRExC_state, op, regarglen[op], "reg_node");
16009
16010     PERL_ARGS_ASSERT_REG_NODE;
16011
16012     assert(regarglen[op] == 0);
16013
16014     if (PASS2) {
16015         regnode *ptr = ret;
16016         FILL_ADVANCE_NODE(ptr, op);
16017         RExC_emit = ptr;
16018     }
16019     return(ret);
16020 }
16021
16022 /*
16023 - reganode - emit a node with an argument
16024 */
16025 STATIC regnode *                        /* Location. */
16026 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
16027 {
16028     regnode * const ret = regnode_guts(pRExC_state, op, regarglen[op], "reganode");
16029
16030     PERL_ARGS_ASSERT_REGANODE;
16031
16032     assert(regarglen[op] == 1);
16033
16034     if (PASS2) {
16035         regnode *ptr = ret;
16036         FILL_ADVANCE_NODE_ARG(ptr, op, arg);
16037         RExC_emit = ptr;
16038     }
16039     return(ret);
16040 }
16041
16042 STATIC regnode *
16043 S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2)
16044 {
16045     /* emit a node with U32 and I32 arguments */
16046
16047     regnode * const ret = regnode_guts(pRExC_state, op, regarglen[op], "reg2Lanode");
16048
16049     PERL_ARGS_ASSERT_REG2LANODE;
16050
16051     assert(regarglen[op] == 2);
16052
16053     if (PASS2) {
16054         regnode *ptr = ret;
16055         FILL_ADVANCE_NODE_2L_ARG(ptr, op, arg1, arg2);
16056         RExC_emit = ptr;
16057     }
16058     return(ret);
16059 }
16060
16061 /*
16062 - reginsert - insert an operator in front of already-emitted operand
16063 *
16064 * Means relocating the operand.
16065 */
16066 STATIC void
16067 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
16068 {
16069     regnode *src;
16070     regnode *dst;
16071     regnode *place;
16072     const int offset = regarglen[(U8)op];
16073     const int size = NODE_STEP_REGNODE + offset;
16074     GET_RE_DEBUG_FLAGS_DECL;
16075
16076     PERL_ARGS_ASSERT_REGINSERT;
16077     PERL_UNUSED_CONTEXT;
16078     PERL_UNUSED_ARG(depth);
16079 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
16080     DEBUG_PARSE_FMT("inst"," - %s",PL_reg_name[op]);
16081     if (SIZE_ONLY) {
16082         RExC_size += size;
16083         return;
16084     }
16085
16086     src = RExC_emit;
16087     RExC_emit += size;
16088     dst = RExC_emit;
16089     if (RExC_open_parens) {
16090         int paren;
16091         /*DEBUG_PARSE_FMT("inst"," - %"IVdf, (IV)RExC_npar);*/
16092         for ( paren=0 ; paren < RExC_npar ; paren++ ) {
16093             if ( RExC_open_parens[paren] >= opnd ) {
16094                 /*DEBUG_PARSE_FMT("open"," - %d",size);*/
16095                 RExC_open_parens[paren] += size;
16096             } else {
16097                 /*DEBUG_PARSE_FMT("open"," - %s","ok");*/
16098             }
16099             if ( RExC_close_parens[paren] >= opnd ) {
16100                 /*DEBUG_PARSE_FMT("close"," - %d",size);*/
16101                 RExC_close_parens[paren] += size;
16102             } else {
16103                 /*DEBUG_PARSE_FMT("close"," - %s","ok");*/
16104             }
16105         }
16106     }
16107
16108     while (src > opnd) {
16109         StructCopy(--src, --dst, regnode);
16110 #ifdef RE_TRACK_PATTERN_OFFSETS
16111         if (RExC_offsets) {     /* MJD 20010112 */
16112             MJD_OFFSET_DEBUG(
16113                  ("%s(%d): (op %s) %s copy %"UVuf" -> %"UVuf" (max %"UVuf").\n",
16114                   "reg_insert",
16115                   __LINE__,
16116                   PL_reg_name[op],
16117                   (UV)(dst - RExC_emit_start) > RExC_offsets[0]
16118                     ? "Overwriting end of array!\n" : "OK",
16119                   (UV)(src - RExC_emit_start),
16120                   (UV)(dst - RExC_emit_start),
16121                   (UV)RExC_offsets[0]));
16122             Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
16123             Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
16124         }
16125 #endif
16126     }
16127
16128
16129     place = opnd;               /* Op node, where operand used to be. */
16130 #ifdef RE_TRACK_PATTERN_OFFSETS
16131     if (RExC_offsets) {         /* MJD */
16132         MJD_OFFSET_DEBUG(
16133               ("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n",
16134               "reginsert",
16135               __LINE__,
16136               PL_reg_name[op],
16137               (UV)(place - RExC_emit_start) > RExC_offsets[0]
16138               ? "Overwriting end of array!\n" : "OK",
16139               (UV)(place - RExC_emit_start),
16140               (UV)(RExC_parse - RExC_start),
16141               (UV)RExC_offsets[0]));
16142         Set_Node_Offset(place, RExC_parse);
16143         Set_Node_Length(place, 1);
16144     }
16145 #endif
16146     src = NEXTOPER(place);
16147     FILL_ADVANCE_NODE(place, op);
16148     Zero(src, offset, regnode);
16149 }
16150
16151 /*
16152 - regtail - set the next-pointer at the end of a node chain of p to val.
16153 - SEE ALSO: regtail_study
16154 */
16155 /* TODO: All three parms should be const */
16156 STATIC void
16157 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p,
16158                 const regnode *val,U32 depth)
16159 {
16160     regnode *scan;
16161     GET_RE_DEBUG_FLAGS_DECL;
16162
16163     PERL_ARGS_ASSERT_REGTAIL;
16164 #ifndef DEBUGGING
16165     PERL_UNUSED_ARG(depth);
16166 #endif
16167
16168     if (SIZE_ONLY)
16169         return;
16170
16171     /* Find last node. */
16172     scan = p;
16173     for (;;) {
16174         regnode * const temp = regnext(scan);
16175         DEBUG_PARSE_r({
16176             DEBUG_PARSE_MSG((scan==p ? "tail" : ""));
16177             regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state);
16178             PerlIO_printf(Perl_debug_log, "~ %s (%d) %s %s\n",
16179                 SvPV_nolen_const(RExC_mysv), REG_NODE_NUM(scan),
16180                     (temp == NULL ? "->" : ""),
16181                     (temp == NULL ? PL_reg_name[OP(val)] : "")
16182             );
16183         });
16184         if (temp == NULL)
16185             break;
16186         scan = temp;
16187     }
16188
16189     if (reg_off_by_arg[OP(scan)]) {
16190         ARG_SET(scan, val - scan);
16191     }
16192     else {
16193         NEXT_OFF(scan) = val - scan;
16194     }
16195 }
16196
16197 #ifdef DEBUGGING
16198 /*
16199 - regtail_study - set the next-pointer at the end of a node chain of p to val.
16200 - Look for optimizable sequences at the same time.
16201 - currently only looks for EXACT chains.
16202
16203 This is experimental code. The idea is to use this routine to perform
16204 in place optimizations on branches and groups as they are constructed,
16205 with the long term intention of removing optimization from study_chunk so
16206 that it is purely analytical.
16207
16208 Currently only used when in DEBUG mode. The macro REGTAIL_STUDY() is used
16209 to control which is which.
16210
16211 */
16212 /* TODO: All four parms should be const */
16213
16214 STATIC U8
16215 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p,
16216                       const regnode *val,U32 depth)
16217 {
16218     regnode *scan;
16219     U8 exact = PSEUDO;
16220 #ifdef EXPERIMENTAL_INPLACESCAN
16221     I32 min = 0;
16222 #endif
16223     GET_RE_DEBUG_FLAGS_DECL;
16224
16225     PERL_ARGS_ASSERT_REGTAIL_STUDY;
16226
16227
16228     if (SIZE_ONLY)
16229         return exact;
16230
16231     /* Find last node. */
16232
16233     scan = p;
16234     for (;;) {
16235         regnode * const temp = regnext(scan);
16236 #ifdef EXPERIMENTAL_INPLACESCAN
16237         if (PL_regkind[OP(scan)] == EXACT) {
16238             bool unfolded_multi_char;   /* Unexamined in this routine */
16239             if (join_exact(pRExC_state, scan, &min,
16240                            &unfolded_multi_char, 1, val, depth+1))
16241                 return EXACT;
16242         }
16243 #endif
16244         if ( exact ) {
16245             switch (OP(scan)) {
16246                 case EXACT:
16247                 case EXACTL:
16248                 case EXACTF:
16249                 case EXACTFA_NO_TRIE:
16250                 case EXACTFA:
16251                 case EXACTFU:
16252                 case EXACTFLU8:
16253                 case EXACTFU_SS:
16254                 case EXACTFL:
16255                         if( exact == PSEUDO )
16256                             exact= OP(scan);
16257                         else if ( exact != OP(scan) )
16258                             exact= 0;
16259                 case NOTHING:
16260                     break;
16261                 default:
16262                     exact= 0;
16263             }
16264         }
16265         DEBUG_PARSE_r({
16266             DEBUG_PARSE_MSG((scan==p ? "tsdy" : ""));
16267             regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state);
16268             PerlIO_printf(Perl_debug_log, "~ %s (%d) -> %s\n",
16269                 SvPV_nolen_const(RExC_mysv),
16270                 REG_NODE_NUM(scan),
16271                 PL_reg_name[exact]);
16272         });
16273         if (temp == NULL)
16274             break;
16275         scan = temp;
16276     }
16277     DEBUG_PARSE_r({
16278         DEBUG_PARSE_MSG("");
16279         regprop(RExC_rx, RExC_mysv, val, NULL, pRExC_state);
16280         PerlIO_printf(Perl_debug_log,
16281                       "~ attach to %s (%"IVdf") offset to %"IVdf"\n",
16282                       SvPV_nolen_const(RExC_mysv),
16283                       (IV)REG_NODE_NUM(val),
16284                       (IV)(val - scan)
16285         );
16286     });
16287     if (reg_off_by_arg[OP(scan)]) {
16288         ARG_SET(scan, val - scan);
16289     }
16290     else {
16291         NEXT_OFF(scan) = val - scan;
16292     }
16293
16294     return exact;
16295 }
16296 #endif
16297
16298 /*
16299  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
16300  */
16301 #ifdef DEBUGGING
16302
16303 static void
16304 S_regdump_intflags(pTHX_ const char *lead, const U32 flags)
16305 {
16306     int bit;
16307     int set=0;
16308
16309     ASSUME(REG_INTFLAGS_NAME_SIZE <= sizeof(flags)*8);
16310
16311     for (bit=0; bit<REG_INTFLAGS_NAME_SIZE; bit++) {
16312         if (flags & (1<<bit)) {
16313             if (!set++ && lead)
16314                 PerlIO_printf(Perl_debug_log, "%s",lead);
16315             PerlIO_printf(Perl_debug_log, "%s ",PL_reg_intflags_name[bit]);
16316         }
16317     }
16318     if (lead)  {
16319         if (set)
16320             PerlIO_printf(Perl_debug_log, "\n");
16321         else
16322             PerlIO_printf(Perl_debug_log, "%s[none-set]\n",lead);
16323     }
16324 }
16325
16326 static void
16327 S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
16328 {
16329     int bit;
16330     int set=0;
16331     regex_charset cs;
16332
16333     ASSUME(REG_EXTFLAGS_NAME_SIZE <= sizeof(flags)*8);
16334
16335     for (bit=0; bit<REG_EXTFLAGS_NAME_SIZE; bit++) {
16336         if (flags & (1<<bit)) {
16337             if ((1<<bit) & RXf_PMf_CHARSET) {   /* Output separately, below */
16338                 continue;
16339             }
16340             if (!set++ && lead)
16341                 PerlIO_printf(Perl_debug_log, "%s",lead);
16342             PerlIO_printf(Perl_debug_log, "%s ",PL_reg_extflags_name[bit]);
16343         }
16344     }
16345     if ((cs = get_regex_charset(flags)) != REGEX_DEPENDS_CHARSET) {
16346             if (!set++ && lead) {
16347                 PerlIO_printf(Perl_debug_log, "%s",lead);
16348             }
16349             switch (cs) {
16350                 case REGEX_UNICODE_CHARSET:
16351                     PerlIO_printf(Perl_debug_log, "UNICODE");
16352                     break;
16353                 case REGEX_LOCALE_CHARSET:
16354                     PerlIO_printf(Perl_debug_log, "LOCALE");
16355                     break;
16356                 case REGEX_ASCII_RESTRICTED_CHARSET:
16357                     PerlIO_printf(Perl_debug_log, "ASCII-RESTRICTED");
16358                     break;
16359                 case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
16360                     PerlIO_printf(Perl_debug_log, "ASCII-MORE_RESTRICTED");
16361                     break;
16362                 default:
16363                     PerlIO_printf(Perl_debug_log, "UNKNOWN CHARACTER SET");
16364                     break;
16365             }
16366     }
16367     if (lead)  {
16368         if (set)
16369             PerlIO_printf(Perl_debug_log, "\n");
16370         else
16371             PerlIO_printf(Perl_debug_log, "%s[none-set]\n",lead);
16372     }
16373 }
16374 #endif
16375
16376 void
16377 Perl_regdump(pTHX_ const regexp *r)
16378 {
16379 #ifdef DEBUGGING
16380     SV * const sv = sv_newmortal();
16381     SV *dsv= sv_newmortal();
16382     RXi_GET_DECL(r,ri);
16383     GET_RE_DEBUG_FLAGS_DECL;
16384
16385     PERL_ARGS_ASSERT_REGDUMP;
16386
16387     (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
16388
16389     /* Header fields of interest. */
16390     if (r->anchored_substr) {
16391         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->anchored_substr),
16392             RE_SV_DUMPLEN(r->anchored_substr), 30);
16393         PerlIO_printf(Perl_debug_log,
16394                       "anchored %s%s at %"IVdf" ",
16395                       s, RE_SV_TAIL(r->anchored_substr),
16396                       (IV)r->anchored_offset);
16397     } else if (r->anchored_utf8) {
16398         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->anchored_utf8),
16399             RE_SV_DUMPLEN(r->anchored_utf8), 30);
16400         PerlIO_printf(Perl_debug_log,
16401                       "anchored utf8 %s%s at %"IVdf" ",
16402                       s, RE_SV_TAIL(r->anchored_utf8),
16403                       (IV)r->anchored_offset);
16404     }
16405     if (r->float_substr) {
16406         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->float_substr),
16407             RE_SV_DUMPLEN(r->float_substr), 30);
16408         PerlIO_printf(Perl_debug_log,
16409                       "floating %s%s at %"IVdf"..%"UVuf" ",
16410                       s, RE_SV_TAIL(r->float_substr),
16411                       (IV)r->float_min_offset, (UV)r->float_max_offset);
16412     } else if (r->float_utf8) {
16413         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->float_utf8),
16414             RE_SV_DUMPLEN(r->float_utf8), 30);
16415         PerlIO_printf(Perl_debug_log,
16416                       "floating utf8 %s%s at %"IVdf"..%"UVuf" ",
16417                       s, RE_SV_TAIL(r->float_utf8),
16418                       (IV)r->float_min_offset, (UV)r->float_max_offset);
16419     }
16420     if (r->check_substr || r->check_utf8)
16421         PerlIO_printf(Perl_debug_log,
16422                       (const char *)
16423                       (r->check_substr == r->float_substr
16424                        && r->check_utf8 == r->float_utf8
16425                        ? "(checking floating" : "(checking anchored"));
16426     if (r->intflags & PREGf_NOSCAN)
16427         PerlIO_printf(Perl_debug_log, " noscan");
16428     if (r->extflags & RXf_CHECK_ALL)
16429         PerlIO_printf(Perl_debug_log, " isall");
16430     if (r->check_substr || r->check_utf8)
16431         PerlIO_printf(Perl_debug_log, ") ");
16432
16433     if (ri->regstclass) {
16434         regprop(r, sv, ri->regstclass, NULL, NULL);
16435         PerlIO_printf(Perl_debug_log, "stclass %s ", SvPVX_const(sv));
16436     }
16437     if (r->intflags & PREGf_ANCH) {
16438         PerlIO_printf(Perl_debug_log, "anchored");
16439         if (r->intflags & PREGf_ANCH_MBOL)
16440             PerlIO_printf(Perl_debug_log, "(MBOL)");
16441         if (r->intflags & PREGf_ANCH_SBOL)
16442             PerlIO_printf(Perl_debug_log, "(SBOL)");
16443         if (r->intflags & PREGf_ANCH_GPOS)
16444             PerlIO_printf(Perl_debug_log, "(GPOS)");
16445         PerlIO_putc(Perl_debug_log, ' ');
16446     }
16447     if (r->intflags & PREGf_GPOS_SEEN)
16448         PerlIO_printf(Perl_debug_log, "GPOS:%"UVuf" ", (UV)r->gofs);
16449     if (r->intflags & PREGf_SKIP)
16450         PerlIO_printf(Perl_debug_log, "plus ");
16451     if (r->intflags & PREGf_IMPLICIT)
16452         PerlIO_printf(Perl_debug_log, "implicit ");
16453     PerlIO_printf(Perl_debug_log, "minlen %"IVdf" ", (IV)r->minlen);
16454     if (r->extflags & RXf_EVAL_SEEN)
16455         PerlIO_printf(Perl_debug_log, "with eval ");
16456     PerlIO_printf(Perl_debug_log, "\n");
16457     DEBUG_FLAGS_r({
16458         regdump_extflags("r->extflags: ",r->extflags);
16459         regdump_intflags("r->intflags: ",r->intflags);
16460     });
16461 #else
16462     PERL_ARGS_ASSERT_REGDUMP;
16463     PERL_UNUSED_CONTEXT;
16464     PERL_UNUSED_ARG(r);
16465 #endif  /* DEBUGGING */
16466 }
16467
16468 /*
16469 - regprop - printable representation of opcode, with run time support
16470 */
16471
16472 void
16473 Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state)
16474 {
16475 #ifdef DEBUGGING
16476     int k;
16477
16478     /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */
16479     static const char * const anyofs[] = {
16480 #if _CC_WORDCHAR != 0 || _CC_DIGIT != 1 || _CC_ALPHA != 2 || _CC_LOWER != 3 \
16481     || _CC_UPPER != 4 || _CC_PUNCT != 5 || _CC_PRINT != 6                   \
16482     || _CC_ALPHANUMERIC != 7 || _CC_GRAPH != 8 || _CC_CASED != 9            \
16483     || _CC_SPACE != 10 || _CC_BLANK != 11 || _CC_XDIGIT != 12               \
16484     || _CC_CNTRL != 13 || _CC_ASCII != 14 || _CC_VERTSPACE != 15
16485   #error Need to adjust order of anyofs[]
16486 #endif
16487         "\\w",
16488         "\\W",
16489         "\\d",
16490         "\\D",
16491         "[:alpha:]",
16492         "[:^alpha:]",
16493         "[:lower:]",
16494         "[:^lower:]",
16495         "[:upper:]",
16496         "[:^upper:]",
16497         "[:punct:]",
16498         "[:^punct:]",
16499         "[:print:]",
16500         "[:^print:]",
16501         "[:alnum:]",
16502         "[:^alnum:]",
16503         "[:graph:]",
16504         "[:^graph:]",
16505         "[:cased:]",
16506         "[:^cased:]",
16507         "\\s",
16508         "\\S",
16509         "[:blank:]",
16510         "[:^blank:]",
16511         "[:xdigit:]",
16512         "[:^xdigit:]",
16513         "[:cntrl:]",
16514         "[:^cntrl:]",
16515         "[:ascii:]",
16516         "[:^ascii:]",
16517         "\\v",
16518         "\\V"
16519     };
16520     RXi_GET_DECL(prog,progi);
16521     GET_RE_DEBUG_FLAGS_DECL;
16522
16523     PERL_ARGS_ASSERT_REGPROP;
16524
16525     sv_setpvn(sv, "", 0);
16526
16527     if (OP(o) > REGNODE_MAX)            /* regnode.type is unsigned */
16528         /* It would be nice to FAIL() here, but this may be called from
16529            regexec.c, and it would be hard to supply pRExC_state. */
16530         Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d",
16531                                               (int)OP(o), (int)REGNODE_MAX);
16532     sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */
16533
16534     k = PL_regkind[OP(o)];
16535
16536     if (k == EXACT) {
16537         sv_catpvs(sv, " ");
16538         /* Using is_utf8_string() (via PERL_PV_UNI_DETECT)
16539          * is a crude hack but it may be the best for now since
16540          * we have no flag "this EXACTish node was UTF-8"
16541          * --jhi */
16542         pv_pretty(sv, STRING(o), STR_LEN(o), 60, PL_colors[0], PL_colors[1],
16543                   PERL_PV_ESCAPE_UNI_DETECT |
16544                   PERL_PV_ESCAPE_NONASCII   |
16545                   PERL_PV_PRETTY_ELLIPSES   |
16546                   PERL_PV_PRETTY_LTGT       |
16547                   PERL_PV_PRETTY_NOCLEAR
16548                   );
16549     } else if (k == TRIE) {
16550         /* print the details of the trie in dumpuntil instead, as
16551          * progi->data isn't available here */
16552         const char op = OP(o);
16553         const U32 n = ARG(o);
16554         const reg_ac_data * const ac = IS_TRIE_AC(op) ?
16555                (reg_ac_data *)progi->data->data[n] :
16556                NULL;
16557         const reg_trie_data * const trie
16558             = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
16559
16560         Perl_sv_catpvf(aTHX_ sv, "-%s",PL_reg_name[o->flags]);
16561         DEBUG_TRIE_COMPILE_r(
16562           Perl_sv_catpvf(aTHX_ sv,
16563             "<S:%"UVuf"/%"IVdf" W:%"UVuf" L:%"UVuf"/%"UVuf" C:%"UVuf"/%"UVuf">",
16564             (UV)trie->startstate,
16565             (IV)trie->statecount-1, /* -1 because of the unused 0 element */
16566             (UV)trie->wordcount,
16567             (UV)trie->minlen,
16568             (UV)trie->maxlen,
16569             (UV)TRIE_CHARCOUNT(trie),
16570             (UV)trie->uniquecharcount
16571           );
16572         );
16573         if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
16574             sv_catpvs(sv, "[");
16575             (void) put_charclass_bitmap_innards(sv,
16576                                                 (IS_ANYOF_TRIE(op))
16577                                                  ? ANYOF_BITMAP(o)
16578                                                  : TRIE_BITMAP(trie),
16579                                                 NULL);
16580             sv_catpvs(sv, "]");
16581         }
16582
16583     } else if (k == CURLY) {
16584         if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
16585             Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
16586         Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
16587     }
16588     else if (k == WHILEM && o->flags)                   /* Ordinal/of */
16589         Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
16590     else if (k == REF || k == OPEN || k == CLOSE
16591              || k == GROUPP || OP(o)==ACCEPT)
16592     {
16593         AV *name_list= NULL;
16594         Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o));    /* Parenth number */
16595         if ( RXp_PAREN_NAMES(prog) ) {
16596             name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
16597         } else if ( pRExC_state ) {
16598             name_list= RExC_paren_name_list;
16599         }
16600         if (name_list) {
16601             if ( k != REF || (OP(o) < NREF)) {
16602                 SV **name= av_fetch(name_list, ARG(o), 0 );
16603                 if (name)
16604                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
16605             }
16606             else {
16607                 SV *sv_dat= MUTABLE_SV(progi->data->data[ ARG( o ) ]);
16608                 I32 *nums=(I32*)SvPVX(sv_dat);
16609                 SV **name= av_fetch(name_list, nums[0], 0 );
16610                 I32 n;
16611                 if (name) {
16612                     for ( n=0; n<SvIVX(sv_dat); n++ ) {
16613                         Perl_sv_catpvf(aTHX_ sv, "%s%"IVdf,
16614                                     (n ? "," : ""), (IV)nums[n]);
16615                     }
16616                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
16617                 }
16618             }
16619         }
16620         if ( k == REF && reginfo) {
16621             U32 n = ARG(o);  /* which paren pair */
16622             I32 ln = prog->offs[n].start;
16623             if (prog->lastparen < n || ln == -1)
16624                 Perl_sv_catpvf(aTHX_ sv, ": FAIL");
16625             else if (ln == prog->offs[n].end)
16626                 Perl_sv_catpvf(aTHX_ sv, ": ACCEPT - EMPTY STRING");
16627             else {
16628                 const char *s = reginfo->strbeg + ln;
16629                 Perl_sv_catpvf(aTHX_ sv, ": ");
16630                 Perl_pv_pretty( aTHX_ sv, s, prog->offs[n].end - prog->offs[n].start, 32, 0, 0,
16631                     PERL_PV_ESCAPE_UNI_DETECT|PERL_PV_PRETTY_NOCLEAR|PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE );
16632             }
16633         }
16634     } else if (k == GOSUB) {
16635         AV *name_list= NULL;
16636         if ( RXp_PAREN_NAMES(prog) ) {
16637             name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
16638         } else if ( pRExC_state ) {
16639             name_list= RExC_paren_name_list;
16640         }
16641
16642         /* Paren and offset */
16643         Perl_sv_catpvf(aTHX_ sv, "%d[%+d]", (int)ARG(o),(int)ARG2L(o));
16644         if (name_list) {
16645             SV **name= av_fetch(name_list, ARG(o), 0 );
16646             if (name)
16647                 Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
16648         }
16649     }
16650     else if (k == VERB) {
16651         if (!o->flags)
16652             Perl_sv_catpvf(aTHX_ sv, ":%"SVf,
16653                            SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ]))));
16654     } else if (k == LOGICAL)
16655         /* 2: embedded, otherwise 1 */
16656         Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);
16657     else if (k == ANYOF) {
16658         const U8 flags = ANYOF_FLAGS(o);
16659         int do_sep = 0;
16660         SV* bitmap_invlist;  /* Will hold what the bit map contains */
16661
16662
16663         if (OP(o) == ANYOFL)
16664             sv_catpvs(sv, "{loc}");
16665         if (flags & ANYOF_LOC_FOLD)
16666             sv_catpvs(sv, "{i}");
16667         Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
16668         if (flags & ANYOF_INVERT)
16669             sv_catpvs(sv, "^");
16670
16671         /* output what the standard cp 0-NUM_ANYOF_CODE_POINTS-1 bitmap matches
16672          * */
16673         do_sep = put_charclass_bitmap_innards(sv, ANYOF_BITMAP(o),
16674                                                             &bitmap_invlist);
16675
16676         /* output any special charclass tests (used entirely under use
16677          * locale) * */
16678         if (ANYOF_POSIXL_TEST_ANY_SET(o)) {
16679             int i;
16680             for (i = 0; i < ANYOF_POSIXL_MAX; i++) {
16681                 if (ANYOF_POSIXL_TEST(o,i)) {
16682                     sv_catpv(sv, anyofs[i]);
16683                     do_sep = 1;
16684                 }
16685             }
16686         }
16687
16688         if ((flags & (ANYOF_MATCHES_ALL_ABOVE_BITMAP
16689                       |ANYOF_HAS_UTF8_NONBITMAP_MATCHES
16690                       |ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES
16691                       |ANYOF_LOC_FOLD)))
16692         {
16693             if (do_sep) {
16694                 Perl_sv_catpvf(aTHX_ sv,"%s][%s",PL_colors[1],PL_colors[0]);
16695                 if (flags & ANYOF_INVERT)
16696                     /*make sure the invert info is in each */
16697                     sv_catpvs(sv, "^");
16698             }
16699
16700             if (flags & ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII) {
16701                 sv_catpvs(sv, "{non-utf8-latin1-all}");
16702             }
16703
16704             if (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP)
16705                 sv_catpvs(sv, "{above_bitmap_all}");
16706
16707             if (ARG(o) != ANYOF_ONLY_HAS_BITMAP) {
16708                 SV *lv; /* Set if there is something outside the bit map. */
16709                 bool byte_output = FALSE;   /* If something has been output */
16710                 SV *only_utf8_locale;
16711
16712                 /* Get the stuff that wasn't in the bitmap.  'bitmap_invlist'
16713                  * is used to guarantee that nothing in the bitmap gets
16714                  * returned */
16715                 (void) _get_regclass_nonbitmap_data(prog, o, FALSE,
16716                                                     &lv, &only_utf8_locale,
16717                                                     bitmap_invlist);
16718                 if (lv && lv != &PL_sv_undef) {
16719                     char *s = savesvpv(lv);
16720                     char * const origs = s;
16721
16722                     while (*s && *s != '\n')
16723                         s++;
16724
16725                     if (*s == '\n') {
16726                         const char * const t = ++s;
16727
16728                         if (flags & ANYOF_HAS_NONBITMAP_NON_UTF8_MATCHES) {
16729                             sv_catpvs(sv, "{outside bitmap}");
16730                         }
16731                         else {
16732                             sv_catpvs(sv, "{utf8}");
16733                         }
16734
16735                         if (byte_output) {
16736                             sv_catpvs(sv, " ");
16737                         }
16738
16739                         while (*s) {
16740                             if (*s == '\n') {
16741
16742                                 /* Truncate very long output */
16743                                 if (s - origs > 256) {
16744                                     Perl_sv_catpvf(aTHX_ sv,
16745                                                 "%.*s...",
16746                                                 (int) (s - origs - 1),
16747                                                 t);
16748                                     goto out_dump;
16749                                 }
16750                                 *s = ' ';
16751                             }
16752                             else if (*s == '\t') {
16753                                 *s = '-';
16754                             }
16755                             s++;
16756                         }
16757                         if (s[-1] == ' ')
16758                             s[-1] = 0;
16759
16760                         sv_catpv(sv, t);
16761                     }
16762
16763                   out_dump:
16764
16765                     Safefree(origs);
16766                     SvREFCNT_dec_NN(lv);
16767                 }
16768
16769                 if ((flags & ANYOF_LOC_FOLD)
16770                      && only_utf8_locale
16771                      && only_utf8_locale != &PL_sv_undef)
16772                 {
16773                     UV start, end;
16774                     int max_entries = 256;
16775
16776                     sv_catpvs(sv, "{utf8 locale}");
16777                     invlist_iterinit(only_utf8_locale);
16778                     while (invlist_iternext(only_utf8_locale,
16779                                             &start, &end)) {
16780                         put_range(sv, start, end, FALSE);
16781                         max_entries --;
16782                         if (max_entries < 0) {
16783                             sv_catpvs(sv, "...");
16784                             break;
16785                         }
16786                     }
16787                     invlist_iterfinish(only_utf8_locale);
16788                 }
16789             }
16790         }
16791         SvREFCNT_dec(bitmap_invlist);
16792
16793
16794         Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
16795     }
16796     else if (k == POSIXD || k == NPOSIXD) {
16797         U8 index = FLAGS(o) * 2;
16798         if (index < C_ARRAY_LENGTH(anyofs)) {
16799             if (*anyofs[index] != '[')  {
16800                 sv_catpv(sv, "[");
16801             }
16802             sv_catpv(sv, anyofs[index]);
16803             if (*anyofs[index] != '[')  {
16804                 sv_catpv(sv, "]");
16805             }
16806         }
16807         else {
16808             Perl_sv_catpvf(aTHX_ sv, "[illegal type=%d])", index);
16809         }
16810     }
16811     else if (k == BOUND || k == NBOUND) {
16812         /* Must be synced with order of 'bound_type' in regcomp.h */
16813         const char * const bounds[] = {
16814             "",      /* Traditional */
16815             "{gcb}",
16816             "{sb}",
16817             "{wb}"
16818         };
16819         sv_catpv(sv, bounds[FLAGS(o)]);
16820     }
16821     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
16822         Perl_sv_catpvf(aTHX_ sv, "[%d]", -(o->flags));
16823     else if (OP(o) == SBOL)
16824         Perl_sv_catpvf(aTHX_ sv, " /%s/", o->flags ? "\\A" : "^");
16825 #else
16826     PERL_UNUSED_CONTEXT;
16827     PERL_UNUSED_ARG(sv);
16828     PERL_UNUSED_ARG(o);
16829     PERL_UNUSED_ARG(prog);
16830     PERL_UNUSED_ARG(reginfo);
16831     PERL_UNUSED_ARG(pRExC_state);
16832 #endif  /* DEBUGGING */
16833 }
16834
16835
16836
16837 SV *
16838 Perl_re_intuit_string(pTHX_ REGEXP * const r)
16839 {                               /* Assume that RE_INTUIT is set */
16840     struct regexp *const prog = ReANY(r);
16841     GET_RE_DEBUG_FLAGS_DECL;
16842
16843     PERL_ARGS_ASSERT_RE_INTUIT_STRING;
16844     PERL_UNUSED_CONTEXT;
16845
16846     DEBUG_COMPILE_r(
16847         {
16848             const char * const s = SvPV_nolen_const(RX_UTF8(r)
16849                       ? prog->check_utf8 : prog->check_substr);
16850
16851             if (!PL_colorset) reginitcolors();
16852             PerlIO_printf(Perl_debug_log,
16853                       "%sUsing REx %ssubstr:%s \"%s%.60s%s%s\"\n",
16854                       PL_colors[4],
16855                       RX_UTF8(r) ? "utf8 " : "",
16856                       PL_colors[5],PL_colors[0],
16857                       s,
16858                       PL_colors[1],
16859                       (strlen(s) > 60 ? "..." : ""));
16860         } );
16861
16862     /* use UTF8 check substring if regexp pattern itself is in UTF8 */
16863     return RX_UTF8(r) ? prog->check_utf8 : prog->check_substr;
16864 }
16865
16866 /*
16867    pregfree()
16868
16869    handles refcounting and freeing the perl core regexp structure. When
16870    it is necessary to actually free the structure the first thing it
16871    does is call the 'free' method of the regexp_engine associated to
16872    the regexp, allowing the handling of the void *pprivate; member
16873    first. (This routine is not overridable by extensions, which is why
16874    the extensions free is called first.)
16875
16876    See regdupe and regdupe_internal if you change anything here.
16877 */
16878 #ifndef PERL_IN_XSUB_RE
16879 void
16880 Perl_pregfree(pTHX_ REGEXP *r)
16881 {
16882     SvREFCNT_dec(r);
16883 }
16884
16885 void
16886 Perl_pregfree2(pTHX_ REGEXP *rx)
16887 {
16888     struct regexp *const r = ReANY(rx);
16889     GET_RE_DEBUG_FLAGS_DECL;
16890
16891     PERL_ARGS_ASSERT_PREGFREE2;
16892
16893     if (r->mother_re) {
16894         ReREFCNT_dec(r->mother_re);
16895     } else {
16896         CALLREGFREE_PVT(rx); /* free the private data */
16897         SvREFCNT_dec(RXp_PAREN_NAMES(r));
16898         Safefree(r->xpv_len_u.xpvlenu_pv);
16899     }
16900     if (r->substrs) {
16901         SvREFCNT_dec(r->anchored_substr);
16902         SvREFCNT_dec(r->anchored_utf8);
16903         SvREFCNT_dec(r->float_substr);
16904         SvREFCNT_dec(r->float_utf8);
16905         Safefree(r->substrs);
16906     }
16907     RX_MATCH_COPY_FREE(rx);
16908 #ifdef PERL_ANY_COW
16909     SvREFCNT_dec(r->saved_copy);
16910 #endif
16911     Safefree(r->offs);
16912     SvREFCNT_dec(r->qr_anoncv);
16913     rx->sv_u.svu_rx = 0;
16914 }
16915
16916 /*  reg_temp_copy()
16917
16918     This is a hacky workaround to the structural issue of match results
16919     being stored in the regexp structure which is in turn stored in
16920     PL_curpm/PL_reg_curpm. The problem is that due to qr// the pattern
16921     could be PL_curpm in multiple contexts, and could require multiple
16922     result sets being associated with the pattern simultaneously, such
16923     as when doing a recursive match with (??{$qr})
16924
16925     The solution is to make a lightweight copy of the regexp structure
16926     when a qr// is returned from the code executed by (??{$qr}) this
16927     lightweight copy doesn't actually own any of its data except for
16928     the starp/end and the actual regexp structure itself.
16929
16930 */
16931
16932
16933 REGEXP *
16934 Perl_reg_temp_copy (pTHX_ REGEXP *ret_x, REGEXP *rx)
16935 {
16936     struct regexp *ret;
16937     struct regexp *const r = ReANY(rx);
16938     const bool islv = ret_x && SvTYPE(ret_x) == SVt_PVLV;
16939
16940     PERL_ARGS_ASSERT_REG_TEMP_COPY;
16941
16942     if (!ret_x)
16943         ret_x = (REGEXP*) newSV_type(SVt_REGEXP);
16944     else {
16945         SvOK_off((SV *)ret_x);
16946         if (islv) {
16947             /* For PVLVs, SvANY points to the xpvlv body while sv_u points
16948                to the regexp.  (For SVt_REGEXPs, sv_upgrade has already
16949                made both spots point to the same regexp body.) */
16950             REGEXP *temp = (REGEXP *)newSV_type(SVt_REGEXP);
16951             assert(!SvPVX(ret_x));
16952             ret_x->sv_u.svu_rx = temp->sv_any;
16953             temp->sv_any = NULL;
16954             SvFLAGS(temp) = (SvFLAGS(temp) & ~SVTYPEMASK) | SVt_NULL;
16955             SvREFCNT_dec_NN(temp);
16956             /* SvCUR still resides in the xpvlv struct, so the regexp copy-
16957                ing below will not set it. */
16958             SvCUR_set(ret_x, SvCUR(rx));
16959         }
16960     }
16961     /* This ensures that SvTHINKFIRST(sv) is true, and hence that
16962        sv_force_normal(sv) is called.  */
16963     SvFAKE_on(ret_x);
16964     ret = ReANY(ret_x);
16965
16966     SvFLAGS(ret_x) |= SvUTF8(rx);
16967     /* We share the same string buffer as the original regexp, on which we
16968        hold a reference count, incremented when mother_re is set below.
16969        The string pointer is copied here, being part of the regexp struct.
16970      */
16971     memcpy(&(ret->xpv_cur), &(r->xpv_cur),
16972            sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur));
16973     if (r->offs) {
16974         const I32 npar = r->nparens+1;
16975         Newx(ret->offs, npar, regexp_paren_pair);
16976         Copy(r->offs, ret->offs, npar, regexp_paren_pair);
16977     }
16978     if (r->substrs) {
16979         Newx(ret->substrs, 1, struct reg_substr_data);
16980         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
16981
16982         SvREFCNT_inc_void(ret->anchored_substr);
16983         SvREFCNT_inc_void(ret->anchored_utf8);
16984         SvREFCNT_inc_void(ret->float_substr);
16985         SvREFCNT_inc_void(ret->float_utf8);
16986
16987         /* check_substr and check_utf8, if non-NULL, point to either their
16988            anchored or float namesakes, and don't hold a second reference.  */
16989     }
16990     RX_MATCH_COPIED_off(ret_x);
16991 #ifdef PERL_ANY_COW
16992     ret->saved_copy = NULL;
16993 #endif
16994     ret->mother_re = ReREFCNT_inc(r->mother_re ? r->mother_re : rx);
16995     SvREFCNT_inc_void(ret->qr_anoncv);
16996
16997     return ret_x;
16998 }
16999 #endif
17000
17001 /* regfree_internal()
17002
17003    Free the private data in a regexp. This is overloadable by
17004    extensions. Perl takes care of the regexp structure in pregfree(),
17005    this covers the *pprivate pointer which technically perl doesn't
17006    know about, however of course we have to handle the
17007    regexp_internal structure when no extension is in use.
17008
17009    Note this is called before freeing anything in the regexp
17010    structure.
17011  */
17012
17013 void
17014 Perl_regfree_internal(pTHX_ REGEXP * const rx)
17015 {
17016     struct regexp *const r = ReANY(rx);
17017     RXi_GET_DECL(r,ri);
17018     GET_RE_DEBUG_FLAGS_DECL;
17019
17020     PERL_ARGS_ASSERT_REGFREE_INTERNAL;
17021
17022     DEBUG_COMPILE_r({
17023         if (!PL_colorset)
17024             reginitcolors();
17025         {
17026             SV *dsv= sv_newmortal();
17027             RE_PV_QUOTED_DECL(s, RX_UTF8(rx),
17028                 dsv, RX_PRECOMP(rx), RX_PRELEN(rx), 60);
17029             PerlIO_printf(Perl_debug_log,"%sFreeing REx:%s %s\n",
17030                 PL_colors[4],PL_colors[5],s);
17031         }
17032     });
17033 #ifdef RE_TRACK_PATTERN_OFFSETS
17034     if (ri->u.offsets)
17035         Safefree(ri->u.offsets);             /* 20010421 MJD */
17036 #endif
17037     if (ri->code_blocks) {
17038         int n;
17039         for (n = 0; n < ri->num_code_blocks; n++)
17040             SvREFCNT_dec(ri->code_blocks[n].src_regex);
17041         Safefree(ri->code_blocks);
17042     }
17043
17044     if (ri->data) {
17045         int n = ri->data->count;
17046
17047         while (--n >= 0) {
17048           /* If you add a ->what type here, update the comment in regcomp.h */
17049             switch (ri->data->what[n]) {
17050             case 'a':
17051             case 'r':
17052             case 's':
17053             case 'S':
17054             case 'u':
17055                 SvREFCNT_dec(MUTABLE_SV(ri->data->data[n]));
17056                 break;
17057             case 'f':
17058                 Safefree(ri->data->data[n]);
17059                 break;
17060             case 'l':
17061             case 'L':
17062                 break;
17063             case 'T':
17064                 { /* Aho Corasick add-on structure for a trie node.
17065                      Used in stclass optimization only */
17066                     U32 refcount;
17067                     reg_ac_data *aho=(reg_ac_data*)ri->data->data[n];
17068 #ifdef USE_ITHREADS
17069                     dVAR;
17070 #endif
17071                     OP_REFCNT_LOCK;
17072                     refcount = --aho->refcount;
17073                     OP_REFCNT_UNLOCK;
17074                     if ( !refcount ) {
17075                         PerlMemShared_free(aho->states);
17076                         PerlMemShared_free(aho->fail);
17077                          /* do this last!!!! */
17078                         PerlMemShared_free(ri->data->data[n]);
17079                         /* we should only ever get called once, so
17080                          * assert as much, and also guard the free
17081                          * which /might/ happen twice. At the least
17082                          * it will make code anlyzers happy and it
17083                          * doesn't cost much. - Yves */
17084                         assert(ri->regstclass);
17085                         if (ri->regstclass) {
17086                             PerlMemShared_free(ri->regstclass);
17087                             ri->regstclass = 0;
17088                         }
17089                     }
17090                 }
17091                 break;
17092             case 't':
17093                 {
17094                     /* trie structure. */
17095                     U32 refcount;
17096                     reg_trie_data *trie=(reg_trie_data*)ri->data->data[n];
17097 #ifdef USE_ITHREADS
17098                     dVAR;
17099 #endif
17100                     OP_REFCNT_LOCK;
17101                     refcount = --trie->refcount;
17102                     OP_REFCNT_UNLOCK;
17103                     if ( !refcount ) {
17104                         PerlMemShared_free(trie->charmap);
17105                         PerlMemShared_free(trie->states);
17106                         PerlMemShared_free(trie->trans);
17107                         if (trie->bitmap)
17108                             PerlMemShared_free(trie->bitmap);
17109                         if (trie->jump)
17110                             PerlMemShared_free(trie->jump);
17111                         PerlMemShared_free(trie->wordinfo);
17112                         /* do this last!!!! */
17113                         PerlMemShared_free(ri->data->data[n]);
17114                     }
17115                 }
17116                 break;
17117             default:
17118                 Perl_croak(aTHX_ "panic: regfree data code '%c'",
17119                                                     ri->data->what[n]);
17120             }
17121         }
17122         Safefree(ri->data->what);
17123         Safefree(ri->data);
17124     }
17125
17126     Safefree(ri);
17127 }
17128
17129 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
17130 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
17131 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
17132
17133 /*
17134    re_dup - duplicate a regexp.
17135
17136    This routine is expected to clone a given regexp structure. It is only
17137    compiled under USE_ITHREADS.
17138
17139    After all of the core data stored in struct regexp is duplicated
17140    the regexp_engine.dupe method is used to copy any private data
17141    stored in the *pprivate pointer. This allows extensions to handle
17142    any duplication it needs to do.
17143
17144    See pregfree() and regfree_internal() if you change anything here.
17145 */
17146 #if defined(USE_ITHREADS)
17147 #ifndef PERL_IN_XSUB_RE
17148 void
17149 Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param)
17150 {
17151     dVAR;
17152     I32 npar;
17153     const struct regexp *r = ReANY(sstr);
17154     struct regexp *ret = ReANY(dstr);
17155
17156     PERL_ARGS_ASSERT_RE_DUP_GUTS;
17157
17158     npar = r->nparens+1;
17159     Newx(ret->offs, npar, regexp_paren_pair);
17160     Copy(r->offs, ret->offs, npar, regexp_paren_pair);
17161
17162     if (ret->substrs) {
17163         /* Do it this way to avoid reading from *r after the StructCopy().
17164            That way, if any of the sv_dup_inc()s dislodge *r from the L1
17165            cache, it doesn't matter.  */
17166         const bool anchored = r->check_substr
17167             ? r->check_substr == r->anchored_substr
17168             : r->check_utf8 == r->anchored_utf8;
17169         Newx(ret->substrs, 1, struct reg_substr_data);
17170         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
17171
17172         ret->anchored_substr = sv_dup_inc(ret->anchored_substr, param);
17173         ret->anchored_utf8 = sv_dup_inc(ret->anchored_utf8, param);
17174         ret->float_substr = sv_dup_inc(ret->float_substr, param);
17175         ret->float_utf8 = sv_dup_inc(ret->float_utf8, param);
17176
17177         /* check_substr and check_utf8, if non-NULL, point to either their
17178            anchored or float namesakes, and don't hold a second reference.  */
17179
17180         if (ret->check_substr) {
17181             if (anchored) {
17182                 assert(r->check_utf8 == r->anchored_utf8);
17183                 ret->check_substr = ret->anchored_substr;
17184                 ret->check_utf8 = ret->anchored_utf8;
17185             } else {
17186                 assert(r->check_substr == r->float_substr);
17187                 assert(r->check_utf8 == r->float_utf8);
17188                 ret->check_substr = ret->float_substr;
17189                 ret->check_utf8 = ret->float_utf8;
17190             }
17191         } else if (ret->check_utf8) {
17192             if (anchored) {
17193                 ret->check_utf8 = ret->anchored_utf8;
17194             } else {
17195                 ret->check_utf8 = ret->float_utf8;
17196             }
17197         }
17198     }
17199
17200     RXp_PAREN_NAMES(ret) = hv_dup_inc(RXp_PAREN_NAMES(ret), param);
17201     ret->qr_anoncv = MUTABLE_CV(sv_dup_inc((const SV *)ret->qr_anoncv, param));
17202
17203     if (ret->pprivate)
17204         RXi_SET(ret,CALLREGDUPE_PVT(dstr,param));
17205
17206     if (RX_MATCH_COPIED(dstr))
17207         ret->subbeg  = SAVEPVN(ret->subbeg, ret->sublen);
17208     else
17209         ret->subbeg = NULL;
17210 #ifdef PERL_ANY_COW
17211     ret->saved_copy = NULL;
17212 #endif
17213
17214     /* Whether mother_re be set or no, we need to copy the string.  We
17215        cannot refrain from copying it when the storage points directly to
17216        our mother regexp, because that's
17217                1: a buffer in a different thread
17218                2: something we no longer hold a reference on
17219                so we need to copy it locally.  */
17220     RX_WRAPPED(dstr) = SAVEPVN(RX_WRAPPED(sstr), SvCUR(sstr)+1);
17221     ret->mother_re   = NULL;
17222 }
17223 #endif /* PERL_IN_XSUB_RE */
17224
17225 /*
17226    regdupe_internal()
17227
17228    This is the internal complement to regdupe() which is used to copy
17229    the structure pointed to by the *pprivate pointer in the regexp.
17230    This is the core version of the extension overridable cloning hook.
17231    The regexp structure being duplicated will be copied by perl prior
17232    to this and will be provided as the regexp *r argument, however
17233    with the /old/ structures pprivate pointer value. Thus this routine
17234    may override any copying normally done by perl.
17235
17236    It returns a pointer to the new regexp_internal structure.
17237 */
17238
17239 void *
17240 Perl_regdupe_internal(pTHX_ REGEXP * const rx, CLONE_PARAMS *param)
17241 {
17242     dVAR;
17243     struct regexp *const r = ReANY(rx);
17244     regexp_internal *reti;
17245     int len;
17246     RXi_GET_DECL(r,ri);
17247
17248     PERL_ARGS_ASSERT_REGDUPE_INTERNAL;
17249
17250     len = ProgLen(ri);
17251
17252     Newxc(reti, sizeof(regexp_internal) + len*sizeof(regnode),
17253           char, regexp_internal);
17254     Copy(ri->program, reti->program, len+1, regnode);
17255
17256     reti->num_code_blocks = ri->num_code_blocks;
17257     if (ri->code_blocks) {
17258         int n;
17259         Newxc(reti->code_blocks, ri->num_code_blocks, struct reg_code_block,
17260                 struct reg_code_block);
17261         Copy(ri->code_blocks, reti->code_blocks, ri->num_code_blocks,
17262                 struct reg_code_block);
17263         for (n = 0; n < ri->num_code_blocks; n++)
17264              reti->code_blocks[n].src_regex = (REGEXP*)
17265                     sv_dup_inc((SV*)(ri->code_blocks[n].src_regex), param);
17266     }
17267     else
17268         reti->code_blocks = NULL;
17269
17270     reti->regstclass = NULL;
17271
17272     if (ri->data) {
17273         struct reg_data *d;
17274         const int count = ri->data->count;
17275         int i;
17276
17277         Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
17278                 char, struct reg_data);
17279         Newx(d->what, count, U8);
17280
17281         d->count = count;
17282         for (i = 0; i < count; i++) {
17283             d->what[i] = ri->data->what[i];
17284             switch (d->what[i]) {
17285                 /* see also regcomp.h and regfree_internal() */
17286             case 'a': /* actually an AV, but the dup function is identical.  */
17287             case 'r':
17288             case 's':
17289             case 'S':
17290             case 'u': /* actually an HV, but the dup function is identical.  */
17291                 d->data[i] = sv_dup_inc((const SV *)ri->data->data[i], param);
17292                 break;
17293             case 'f':
17294                 /* This is cheating. */
17295                 Newx(d->data[i], 1, regnode_ssc);
17296                 StructCopy(ri->data->data[i], d->data[i], regnode_ssc);
17297                 reti->regstclass = (regnode*)d->data[i];
17298                 break;
17299             case 'T':
17300                 /* Trie stclasses are readonly and can thus be shared
17301                  * without duplication. We free the stclass in pregfree
17302                  * when the corresponding reg_ac_data struct is freed.
17303                  */
17304                 reti->regstclass= ri->regstclass;
17305                 /* FALLTHROUGH */
17306             case 't':
17307                 OP_REFCNT_LOCK;
17308                 ((reg_trie_data*)ri->data->data[i])->refcount++;
17309                 OP_REFCNT_UNLOCK;
17310                 /* FALLTHROUGH */
17311             case 'l':
17312             case 'L':
17313                 d->data[i] = ri->data->data[i];
17314                 break;
17315             default:
17316                 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'",
17317                                                            ri->data->what[i]);
17318             }
17319         }
17320
17321         reti->data = d;
17322     }
17323     else
17324         reti->data = NULL;
17325
17326     reti->name_list_idx = ri->name_list_idx;
17327
17328 #ifdef RE_TRACK_PATTERN_OFFSETS
17329     if (ri->u.offsets) {
17330         Newx(reti->u.offsets, 2*len+1, U32);
17331         Copy(ri->u.offsets, reti->u.offsets, 2*len+1, U32);
17332     }
17333 #else
17334     SetProgLen(reti,len);
17335 #endif
17336
17337     return (void*)reti;
17338 }
17339
17340 #endif    /* USE_ITHREADS */
17341
17342 #ifndef PERL_IN_XSUB_RE
17343
17344 /*
17345  - regnext - dig the "next" pointer out of a node
17346  */
17347 regnode *
17348 Perl_regnext(pTHX_ regnode *p)
17349 {
17350     I32 offset;
17351
17352     if (!p)
17353         return(NULL);
17354
17355     if (OP(p) > REGNODE_MAX) {          /* regnode.type is unsigned */
17356         Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d",
17357                                                 (int)OP(p), (int)REGNODE_MAX);
17358     }
17359
17360     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
17361     if (offset == 0)
17362         return(NULL);
17363
17364     return(p+offset);
17365 }
17366 #endif
17367
17368 STATIC void
17369 S_re_croak2(pTHX_ bool utf8, const char* pat1,const char* pat2,...)
17370 {
17371     va_list args;
17372     STRLEN l1 = strlen(pat1);
17373     STRLEN l2 = strlen(pat2);
17374     char buf[512];
17375     SV *msv;
17376     const char *message;
17377
17378     PERL_ARGS_ASSERT_RE_CROAK2;
17379
17380     if (l1 > 510)
17381         l1 = 510;
17382     if (l1 + l2 > 510)
17383         l2 = 510 - l1;
17384     Copy(pat1, buf, l1 , char);
17385     Copy(pat2, buf + l1, l2 , char);
17386     buf[l1 + l2] = '\n';
17387     buf[l1 + l2 + 1] = '\0';
17388     va_start(args, pat2);
17389     msv = vmess(buf, &args);
17390     va_end(args);
17391     message = SvPV_const(msv,l1);
17392     if (l1 > 512)
17393         l1 = 512;
17394     Copy(message, buf, l1 , char);
17395     /* l1-1 to avoid \n */
17396     Perl_croak(aTHX_ "%"UTF8f, UTF8fARG(utf8, l1-1, buf));
17397 }
17398
17399 #ifdef DEBUGGING
17400
17401 STATIC void
17402 S_put_code_point(pTHX_ SV *sv, UV c)
17403 {
17404     PERL_ARGS_ASSERT_PUT_CODE_POINT;
17405
17406     if (c > 255) {
17407         Perl_sv_catpvf(aTHX_ sv, "\\x{%04"UVXf"}", c);
17408     }
17409     else if (isPRINT(c)) {
17410         const char string = (char) c;
17411         if (isBACKSLASHED_PUNCT(c))
17412             sv_catpvs(sv, "\\");
17413         sv_catpvn(sv, &string, 1);
17414     }
17415     else {
17416         const char * const mnemonic = cntrl_to_mnemonic((char) c);
17417         if (mnemonic) {
17418             Perl_sv_catpvf(aTHX_ sv, "%s", mnemonic);
17419         }
17420         else {
17421             Perl_sv_catpvf(aTHX_ sv, "\\x{%02X}", (U8) c);
17422         }
17423     }
17424 }
17425
17426 #define MAX_PRINT_A MAX_PRINT_A_FOR_USE_ONLY_BY_REGCOMP_DOT_C
17427
17428 STATIC void
17429 S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals)
17430 {
17431     /* Appends to 'sv' a displayable version of the range of code points from
17432      * 'start' to 'end'.  It assumes that only ASCII printables are displayable
17433      * as-is (though some of these will be escaped by put_code_point()). */
17434
17435     const unsigned int min_range_count = 3;
17436
17437     assert(start <= end);
17438
17439     PERL_ARGS_ASSERT_PUT_RANGE;
17440
17441     while (start <= end) {
17442         UV this_end;
17443         const char * format;
17444
17445         if (end - start < min_range_count) {
17446
17447             /* Individual chars in short ranges */
17448             for (; start <= end; start++) {
17449                 put_code_point(sv, start);
17450             }
17451             break;
17452         }
17453
17454         /* If permitted by the input options, and there is a possibility that
17455          * this range contains a printable literal, look to see if there is
17456          * one.  */
17457         if (allow_literals && start <= MAX_PRINT_A) {
17458
17459             /* If the range begin isn't an ASCII printable, effectively split
17460              * the range into two parts:
17461              *  1) the portion before the first such printable,
17462              *  2) the rest
17463              * and output them separately. */
17464             if (! isPRINT_A(start)) {
17465                 UV temp_end = start + 1;
17466
17467                 /* There is no point looking beyond the final possible
17468                  * printable, in MAX_PRINT_A */
17469                 UV max = MIN(end, MAX_PRINT_A);
17470
17471                 while (temp_end <= max && ! isPRINT_A(temp_end)) {
17472                     temp_end++;
17473                 }
17474
17475                 /* Here, temp_end points to one beyond the first printable if
17476                  * found, or to one beyond 'max' if not.  If none found, make
17477                  * sure that we use the entire range */
17478                 if (temp_end > MAX_PRINT_A) {
17479                     temp_end = end + 1;
17480                 }
17481
17482                 /* Output the first part of the split range, the part that
17483                  * doesn't have printables, with no looking for literals
17484                  * (otherwise we would infinitely recurse) */
17485                 put_range(sv, start, temp_end - 1, FALSE);
17486
17487                 /* The 2nd part of the range (if any) starts here. */
17488                 start = temp_end;
17489
17490                 /* We continue instead of dropping down because even if the 2nd
17491                  * part is non-empty, it could be so short that we want to
17492                  * output it specially, as tested for at the top of this loop.
17493                  * */
17494                 continue;
17495             }
17496
17497             /* Here, 'start' is a printable ASCII.  If it is an alphanumeric,
17498              * output a sub-range of just the digits or letters, then process
17499              * the remaining portion as usual. */
17500             if (isALPHANUMERIC_A(start)) {
17501                 UV mask = (isDIGIT_A(start))
17502                            ? _CC_DIGIT
17503                              : isUPPER_A(start)
17504                                ? _CC_UPPER
17505                                : _CC_LOWER;
17506                 UV temp_end = start + 1;
17507
17508                 /* Find the end of the sub-range that includes just the
17509                  * characters in the same class as the first character in it */
17510                 while (temp_end <= end && _generic_isCC_A(temp_end, mask)) {
17511                     temp_end++;
17512                 }
17513                 temp_end--;
17514
17515                 /* For short ranges, don't duplicate the code above to output
17516                  * them; just call recursively */
17517                 if (temp_end - start < min_range_count) {
17518                     put_range(sv, start, temp_end, FALSE);
17519                 }
17520                 else {  /* Output as a range */
17521                     put_code_point(sv, start);
17522                     sv_catpvs(sv, "-");
17523                     put_code_point(sv, temp_end);
17524                 }
17525                 start = temp_end + 1;
17526                 continue;
17527             }
17528
17529             /* We output any other printables as individual characters */
17530             if (isPUNCT_A(start) || isSPACE_A(start)) {
17531                 while (start <= end && (isPUNCT_A(start)
17532                                         || isSPACE_A(start)))
17533                 {
17534                     put_code_point(sv, start);
17535                     start++;
17536                 }
17537                 continue;
17538             }
17539         } /* End of looking for literals */
17540
17541         /* Here is not to output as a literal.  Some control characters have
17542          * mnemonic names.  Split off any of those at the beginning and end of
17543          * the range to print mnemonically.  It isn't possible for many of
17544          * these to be in a row, so this won't overwhelm with output */
17545         while (isMNEMONIC_CNTRL(start) && start <= end) {
17546             put_code_point(sv, start);
17547             start++;
17548         }
17549         if (start < end && isMNEMONIC_CNTRL(end)) {
17550
17551             /* Here, the final character in the range has a mnemonic name.
17552              * Work backwards from the end to find the final non-mnemonic */
17553             UV temp_end = end - 1;
17554             while (isMNEMONIC_CNTRL(temp_end)) {
17555                 temp_end--;
17556             }
17557
17558             /* And separately output the range that doesn't have mnemonics */
17559             put_range(sv, start, temp_end, FALSE);
17560
17561             /* Then output the mnemonic trailing controls */
17562             start = temp_end + 1;
17563             while (start <= end) {
17564                 put_code_point(sv, start);
17565                 start++;
17566             }
17567             break;
17568         }
17569
17570         /* As a final resort, output the range or subrange as hex. */
17571
17572         this_end = (end < NUM_ANYOF_CODE_POINTS)
17573                     ? end
17574                     : NUM_ANYOF_CODE_POINTS - 1;
17575         format = (this_end < 256)
17576                  ? "\\x{%02"UVXf"}-\\x{%02"UVXf"}"
17577                  : "\\x{%04"UVXf"}-\\x{%04"UVXf"}";
17578         GCC_DIAG_IGNORE(-Wformat-nonliteral);
17579         Perl_sv_catpvf(aTHX_ sv, format, start, this_end);
17580         GCC_DIAG_RESTORE;
17581         break;
17582     }
17583 }
17584
17585 STATIC bool
17586 S_put_charclass_bitmap_innards(pTHX_ SV *sv, char *bitmap, SV** bitmap_invlist)
17587 {
17588     /* Appends to 'sv' a displayable version of the innards of the bracketed
17589      * character class whose bitmap is 'bitmap';  Returns 'TRUE' if it actually
17590      * output anything, and bitmap_invlist, if not NULL, will point to an
17591      * inversion list of what is in the bit map */
17592
17593     int i;
17594     UV start, end;
17595     unsigned int punct_count = 0;
17596     SV* invlist = NULL;
17597     SV** invlist_ptr;   /* Temporary, in case bitmap_invlist is NULL */
17598     bool allow_literals = TRUE;
17599
17600     PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS;
17601
17602     invlist_ptr = (bitmap_invlist) ? bitmap_invlist : &invlist;
17603
17604     /* Worst case is exactly every-other code point is in the list */
17605     *invlist_ptr = _new_invlist(NUM_ANYOF_CODE_POINTS / 2);
17606
17607     /* Convert the bit map to an inversion list, keeping track of how many
17608      * ASCII puncts are set, including an extra amount for the backslashed
17609      * ones.  */
17610     for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
17611         if (BITMAP_TEST(bitmap, i)) {
17612             *invlist_ptr = add_cp_to_invlist(*invlist_ptr, i);
17613             if (isPUNCT_A(i)) {
17614                 punct_count++;
17615                 if isBACKSLASHED_PUNCT(i) {
17616                     punct_count++;
17617                 }
17618             }
17619         }
17620     }
17621
17622     /* Nothing to output */
17623     if (_invlist_len(*invlist_ptr) == 0) {
17624         SvREFCNT_dec(invlist);
17625         return FALSE;
17626     }
17627
17628     /* Generally, it is more readable if printable characters are output as
17629      * literals, but if a range (nearly) spans all of them, it's best to output
17630      * it as a single range.  This code will use a single range if all but 2
17631      * printables are in it */
17632     invlist_iterinit(*invlist_ptr);
17633     while (invlist_iternext(*invlist_ptr, &start, &end)) {
17634
17635         /* If range starts beyond final printable, it doesn't have any in it */
17636         if (start > MAX_PRINT_A) {
17637             break;
17638         }
17639
17640         /* In both ASCII and EBCDIC, a SPACE is the lowest printable.  To span
17641          * all but two, the range must start and end no later than 2 from
17642          * either end */
17643         if (start < ' ' + 2 && end > MAX_PRINT_A - 2) {
17644             if (end > MAX_PRINT_A) {
17645                 end = MAX_PRINT_A;
17646             }
17647             if (start < ' ') {
17648                 start = ' ';
17649             }
17650             if (end - start >= MAX_PRINT_A - ' ' - 2) {
17651                 allow_literals = FALSE;
17652             }
17653             break;
17654         }
17655     }
17656     invlist_iterfinish(*invlist_ptr);
17657
17658     /* The legibility of the output depends mostly on how many punctuation
17659      * characters are output.  There are 32 possible ASCII ones, and some have
17660      * an additional backslash, bringing it to currently 36, so if any more
17661      * than 18 are to be output, we can instead output it as its complement,
17662      * yielding fewer puncts, and making it more legible.  But give some weight
17663      * to the fact that outputting it as a complement is less legible than a
17664      * straight output, so don't complement unless we are somewhat over the 18
17665      * mark */
17666     if (allow_literals && punct_count > 22) {
17667         sv_catpvs(sv, "^");
17668
17669         /* Add everything remaining to the list, so when we invert it just
17670          * below, it will be excluded */
17671         _invlist_union_complement_2nd(*invlist_ptr, PL_InBitmap, invlist_ptr);
17672         _invlist_invert(*invlist_ptr);
17673     }
17674
17675     /* Here we have figured things out.  Output each range */
17676     invlist_iterinit(*invlist_ptr);
17677     while (invlist_iternext(*invlist_ptr, &start, &end)) {
17678         if (start >= NUM_ANYOF_CODE_POINTS) {
17679             break;
17680         }
17681         put_range(sv, start, end, allow_literals);
17682     }
17683     invlist_iterfinish(*invlist_ptr);
17684
17685     return TRUE;
17686 }
17687
17688 #define CLEAR_OPTSTART \
17689     if (optstart) STMT_START {                                               \
17690         DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log,                       \
17691                               " (%"IVdf" nodes)\n", (IV)(node - optstart))); \
17692         optstart=NULL;                                                       \
17693     } STMT_END
17694
17695 #define DUMPUNTIL(b,e)                                                       \
17696                     CLEAR_OPTSTART;                                          \
17697                     node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
17698
17699 STATIC const regnode *
17700 S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
17701             const regnode *last, const regnode *plast,
17702             SV* sv, I32 indent, U32 depth)
17703 {
17704     U8 op = PSEUDO;     /* Arbitrary non-END op. */
17705     const regnode *next;
17706     const regnode *optstart= NULL;
17707
17708     RXi_GET_DECL(r,ri);
17709     GET_RE_DEBUG_FLAGS_DECL;
17710
17711     PERL_ARGS_ASSERT_DUMPUNTIL;
17712
17713 #ifdef DEBUG_DUMPUNTIL
17714     PerlIO_printf(Perl_debug_log, "--- %d : %d - %d - %d\n",indent,node-start,
17715         last ? last-start : 0,plast ? plast-start : 0);
17716 #endif
17717
17718     if (plast && plast < last)
17719         last= plast;
17720
17721     while (PL_regkind[op] != END && (!last || node < last)) {
17722         assert(node);
17723         /* While that wasn't END last time... */
17724         NODE_ALIGN(node);
17725         op = OP(node);
17726         if (op == CLOSE || op == WHILEM)
17727             indent--;
17728         next = regnext((regnode *)node);
17729
17730         /* Where, what. */
17731         if (OP(node) == OPTIMIZED) {
17732             if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
17733                 optstart = node;
17734             else
17735                 goto after_print;
17736         } else
17737             CLEAR_OPTSTART;
17738
17739         regprop(r, sv, node, NULL, NULL);
17740         PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
17741                       (int)(2*indent + 1), "", SvPVX_const(sv));
17742
17743         if (OP(node) != OPTIMIZED) {
17744             if (next == NULL)           /* Next ptr. */
17745                 PerlIO_printf(Perl_debug_log, " (0)");
17746             else if (PL_regkind[(U8)op] == BRANCH
17747                      && PL_regkind[OP(next)] != BRANCH )
17748                 PerlIO_printf(Perl_debug_log, " (FAIL)");
17749             else
17750                 PerlIO_printf(Perl_debug_log, " (%"IVdf")", (IV)(next - start));
17751             (void)PerlIO_putc(Perl_debug_log, '\n');
17752         }
17753
17754       after_print:
17755         if (PL_regkind[(U8)op] == BRANCHJ) {
17756             assert(next);
17757             {
17758                 const regnode *nnode = (OP(next) == LONGJMP
17759                                        ? regnext((regnode *)next)
17760                                        : next);
17761                 if (last && nnode > last)
17762                     nnode = last;
17763                 DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
17764             }
17765         }
17766         else if (PL_regkind[(U8)op] == BRANCH) {
17767             assert(next);
17768             DUMPUNTIL(NEXTOPER(node), next);
17769         }
17770         else if ( PL_regkind[(U8)op]  == TRIE ) {
17771             const regnode *this_trie = node;
17772             const char op = OP(node);
17773             const U32 n = ARG(node);
17774             const reg_ac_data * const ac = op>=AHOCORASICK ?
17775                (reg_ac_data *)ri->data->data[n] :
17776                NULL;
17777             const reg_trie_data * const trie =
17778                 (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
17779 #ifdef DEBUGGING
17780             AV *const trie_words
17781                            = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]);
17782 #endif
17783             const regnode *nextbranch= NULL;
17784             I32 word_idx;
17785             sv_setpvs(sv, "");
17786             for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
17787                 SV ** const elem_ptr = av_fetch(trie_words,word_idx,0);
17788
17789                 PerlIO_printf(Perl_debug_log, "%*s%s ",
17790                    (int)(2*(indent+3)), "",
17791                     elem_ptr
17792                     ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr),
17793                                 SvCUR(*elem_ptr), 60,
17794                                 PL_colors[0], PL_colors[1],
17795                                 (SvUTF8(*elem_ptr)
17796                                  ? PERL_PV_ESCAPE_UNI
17797                                  : 0)
17798                                 | PERL_PV_PRETTY_ELLIPSES
17799                                 | PERL_PV_PRETTY_LTGT
17800                             )
17801                     : "???"
17802                 );
17803                 if (trie->jump) {
17804                     U16 dist= trie->jump[word_idx+1];
17805                     PerlIO_printf(Perl_debug_log, "(%"UVuf")\n",
17806                                (UV)((dist ? this_trie + dist : next) - start));
17807                     if (dist) {
17808                         if (!nextbranch)
17809                             nextbranch= this_trie + trie->jump[0];
17810                         DUMPUNTIL(this_trie + dist, nextbranch);
17811                     }
17812                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
17813                         nextbranch= regnext((regnode *)nextbranch);
17814                 } else {
17815                     PerlIO_printf(Perl_debug_log, "\n");
17816                 }
17817             }
17818             if (last && next > last)
17819                 node= last;
17820             else
17821                 node= next;
17822         }
17823         else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
17824             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
17825                     NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
17826         }
17827         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
17828             assert(next);
17829             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
17830         }
17831         else if ( op == PLUS || op == STAR) {
17832             DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
17833         }
17834         else if (PL_regkind[(U8)op] == ANYOF) {
17835             /* arglen 1 + class block */
17836             node += 1 + ((ANYOF_FLAGS(node) & ANYOF_MATCHES_POSIXL)
17837                           ? ANYOF_POSIXL_SKIP
17838                           : ANYOF_SKIP);
17839             node = NEXTOPER(node);
17840         }
17841         else if (PL_regkind[(U8)op] == EXACT) {
17842             /* Literal string, where present. */
17843             node += NODE_SZ_STR(node) - 1;
17844             node = NEXTOPER(node);
17845         }
17846         else {
17847             node = NEXTOPER(node);
17848             node += regarglen[(U8)op];
17849         }
17850         if (op == CURLYX || op == OPEN)
17851             indent++;
17852     }
17853     CLEAR_OPTSTART;
17854 #ifdef DEBUG_DUMPUNTIL
17855     PerlIO_printf(Perl_debug_log, "--- %d\n", (int)indent);
17856 #endif
17857     return node;
17858 }
17859
17860 #endif  /* DEBUGGING */
17861
17862 /*
17863  * Local variables:
17864  * c-indentation-style: bsd
17865  * c-basic-offset: 4
17866  * indent-tabs-mode: nil
17867  * End:
17868  *
17869  * ex: set ts=8 sts=4 sw=4 et:
17870  */