This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Reorder two switch cases
[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 "charclass_invlists.h"
91 #include "inline_invlist.c"
92 #include "unicode_constants.h"
93
94 #define HAS_NONLATIN1_FOLD_CLOSURE(i) \
95  _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)
96 #define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(i) \
97  _HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)
98 #define IS_NON_FINAL_FOLD(c) _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
99 #define IS_IN_SOME_FOLD_L1(c) _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
100
101 #ifndef STATIC
102 #define STATIC  static
103 #endif
104
105 #ifndef MIN
106 #define MIN(a,b) ((a) < (b) ? (a) : (b))
107 #endif
108
109 /* this is a chain of data about sub patterns we are processing that
110    need to be handled separately/specially in study_chunk. Its so
111    we can simulate recursion without losing state.  */
112 struct scan_frame;
113 typedef struct scan_frame {
114     regnode *last_regnode;      /* last node to process in this frame */
115     regnode *next_regnode;      /* next node to process when last is reached */
116     U32 prev_recursed_depth;
117     I32 stopparen;              /* what stopparen do we use */
118     U32 is_top_frame;           /* what flags do we use? */
119
120     struct scan_frame *this_prev_frame; /* this previous frame */
121     struct scan_frame *prev_frame;      /* previous frame */
122     struct scan_frame *next_frame;      /* next frame */
123 } scan_frame;
124
125 /* Certain characters are output as a sequence with the first being a
126  * backslash. */
127 #define isBACKSLASHED_PUNCT(c)                                              \
128                     ((c) == '-' || (c) == ']' || (c) == '\\' || (c) == '^')
129
130
131 struct RExC_state_t {
132     U32         flags;                  /* RXf_* are we folding, multilining? */
133     U32         pm_flags;               /* PMf_* stuff from the calling PMOP */
134     char        *precomp;               /* uncompiled string. */
135     REGEXP      *rx_sv;                 /* The SV that is the regexp. */
136     regexp      *rx;                    /* perl core regexp structure */
137     regexp_internal     *rxi;           /* internal data for regexp object
138                                            pprivate field */
139     char        *start;                 /* Start of input for compile */
140     char        *end;                   /* End of input for compile */
141     char        *parse;                 /* Input-scan pointer. */
142     SSize_t     whilem_seen;            /* number of WHILEM in this expr */
143     regnode     *emit_start;            /* Start of emitted-code area */
144     regnode     *emit_bound;            /* First regnode outside of the
145                                            allocated space */
146     regnode     *emit;                  /* Code-emit pointer; if = &emit_dummy,
147                                            implies compiling, so don't emit */
148     regnode_ssc emit_dummy;             /* placeholder for emit to point to;
149                                            large enough for the largest
150                                            non-EXACTish node, so can use it as
151                                            scratch in pass1 */
152     I32         naughty;                /* How bad is this pattern? */
153     I32         sawback;                /* Did we see \1, ...? */
154     U32         seen;
155     SSize_t     size;                   /* Code size. */
156     I32                npar;            /* Capture buffer count, (OPEN) plus
157                                            one. ("par" 0 is the whole
158                                            pattern)*/
159     I32         nestroot;               /* root parens we are in - used by
160                                            accept */
161     I32         extralen;
162     I32         seen_zerolen;
163     regnode     **open_parens;          /* pointers to open parens */
164     regnode     **close_parens;         /* pointers to close parens */
165     regnode     *opend;                 /* END node in program */
166     I32         utf8;           /* whether the pattern is utf8 or not */
167     I32         orig_utf8;      /* whether the pattern was originally in utf8 */
168                                 /* XXX use this for future optimisation of case
169                                  * where pattern must be upgraded to utf8. */
170     I32         uni_semantics;  /* If a d charset modifier should use unicode
171                                    rules, even if the pattern is not in
172                                    utf8 */
173     HV          *paren_names;           /* Paren names */
174
175     regnode     **recurse;              /* Recurse regops */
176     I32         recurse_count;          /* Number of recurse regops */
177     U8          *study_chunk_recursed;  /* bitmap of which subs we have moved
178                                            through */
179     U32         study_chunk_recursed_bytes;  /* bytes in bitmap */
180     I32         in_lookbehind;
181     I32         contains_locale;
182     I32         contains_i;
183     I32         override_recoding;
184     I32         in_multi_char_class;
185     struct reg_code_block *code_blocks; /* positions of literal (?{})
186                                             within pattern */
187     int         num_code_blocks;        /* size of code_blocks[] */
188     int         code_index;             /* next code_blocks[] slot */
189     SSize_t     maxlen;                        /* mininum possible number of chars in string to match */
190     scan_frame *frame_head;
191     scan_frame *frame_last;
192     U32         frame_count;
193     U32         strict;
194 #ifdef ADD_TO_REGEXEC
195     char        *starttry;              /* -Dr: where regtry was called. */
196 #define RExC_starttry   (pRExC_state->starttry)
197 #endif
198     SV          *runtime_code_qr;       /* qr with the runtime code blocks */
199 #ifdef DEBUGGING
200     const char  *lastparse;
201     I32         lastnum;
202     AV          *paren_name_list;       /* idx -> name */
203     U32         study_chunk_recursed_count;
204     SV          *mysv1;
205     SV          *mysv2;
206 #define RExC_lastparse  (pRExC_state->lastparse)
207 #define RExC_lastnum    (pRExC_state->lastnum)
208 #define RExC_paren_name_list    (pRExC_state->paren_name_list)
209 #define RExC_study_chunk_recursed_count    (pRExC_state->study_chunk_recursed_count)
210 #define RExC_mysv       (pRExC_state->mysv1)
211 #define RExC_mysv1      (pRExC_state->mysv1)
212 #define RExC_mysv2      (pRExC_state->mysv2)
213
214 #endif
215 };
216
217 #define RExC_flags      (pRExC_state->flags)
218 #define RExC_pm_flags   (pRExC_state->pm_flags)
219 #define RExC_precomp    (pRExC_state->precomp)
220 #define RExC_rx_sv      (pRExC_state->rx_sv)
221 #define RExC_rx         (pRExC_state->rx)
222 #define RExC_rxi        (pRExC_state->rxi)
223 #define RExC_start      (pRExC_state->start)
224 #define RExC_end        (pRExC_state->end)
225 #define RExC_parse      (pRExC_state->parse)
226 #define RExC_whilem_seen        (pRExC_state->whilem_seen)
227 #ifdef RE_TRACK_PATTERN_OFFSETS
228 #define RExC_offsets    (pRExC_state->rxi->u.offsets) /* I am not like the
229                                                          others */
230 #endif
231 #define RExC_emit       (pRExC_state->emit)
232 #define RExC_emit_dummy (pRExC_state->emit_dummy)
233 #define RExC_emit_start (pRExC_state->emit_start)
234 #define RExC_emit_bound (pRExC_state->emit_bound)
235 #define RExC_sawback    (pRExC_state->sawback)
236 #define RExC_seen       (pRExC_state->seen)
237 #define RExC_size       (pRExC_state->size)
238 #define RExC_maxlen        (pRExC_state->maxlen)
239 #define RExC_npar       (pRExC_state->npar)
240 #define RExC_nestroot   (pRExC_state->nestroot)
241 #define RExC_extralen   (pRExC_state->extralen)
242 #define RExC_seen_zerolen       (pRExC_state->seen_zerolen)
243 #define RExC_utf8       (pRExC_state->utf8)
244 #define RExC_uni_semantics      (pRExC_state->uni_semantics)
245 #define RExC_orig_utf8  (pRExC_state->orig_utf8)
246 #define RExC_open_parens        (pRExC_state->open_parens)
247 #define RExC_close_parens       (pRExC_state->close_parens)
248 #define RExC_opend      (pRExC_state->opend)
249 #define RExC_paren_names        (pRExC_state->paren_names)
250 #define RExC_recurse    (pRExC_state->recurse)
251 #define RExC_recurse_count      (pRExC_state->recurse_count)
252 #define RExC_study_chunk_recursed        (pRExC_state->study_chunk_recursed)
253 #define RExC_study_chunk_recursed_bytes  \
254                                    (pRExC_state->study_chunk_recursed_bytes)
255 #define RExC_in_lookbehind      (pRExC_state->in_lookbehind)
256 #define RExC_contains_locale    (pRExC_state->contains_locale)
257 #define RExC_contains_i (pRExC_state->contains_i)
258 #define RExC_override_recoding (pRExC_state->override_recoding)
259 #define RExC_in_multi_char_class (pRExC_state->in_multi_char_class)
260 #define RExC_frame_head (pRExC_state->frame_head)
261 #define RExC_frame_last (pRExC_state->frame_last)
262 #define RExC_frame_count (pRExC_state->frame_count)
263 #define RExC_strict (pRExC_state->strict)
264
265 /* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set
266  * a flag to disable back-off on the fixed/floating substrings - if it's
267  * a high complexity pattern we assume the benefit of avoiding a full match
268  * is worth the cost of checking for the substrings even if they rarely help.
269  */
270 #define RExC_naughty    (pRExC_state->naughty)
271 #define TOO_NAUGHTY (10)
272 #define MARK_NAUGHTY(add) \
273     if (RExC_naughty < TOO_NAUGHTY) \
274         RExC_naughty += (add)
275 #define MARK_NAUGHTY_EXP(exp, add) \
276     if (RExC_naughty < TOO_NAUGHTY) \
277         RExC_naughty += RExC_naughty / (exp) + (add)
278
279 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
280 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
281         ((*s) == '{' && regcurly(s)))
282
283 /*
284  * Flags to be passed up and down.
285  */
286 #define WORST           0       /* Worst case. */
287 #define HASWIDTH        0x01    /* Known to match non-null strings. */
288
289 /* Simple enough to be STAR/PLUS operand; in an EXACTish node must be a single
290  * character.  (There needs to be a case: in the switch statement in regexec.c
291  * for any node marked SIMPLE.)  Note that this is not the same thing as
292  * REGNODE_SIMPLE */
293 #define SIMPLE          0x02
294 #define SPSTART         0x04    /* Starts with * or + */
295 #define POSTPONED       0x08    /* (?1),(?&name), (??{...}) or similar */
296 #define TRYAGAIN        0x10    /* Weeded out a declaration. */
297 #define RESTART_UTF8    0x20    /* Restart, need to calcuate sizes as UTF-8 */
298
299 #define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1)
300
301 /* whether trie related optimizations are enabled */
302 #if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
303 #define TRIE_STUDY_OPT
304 #define FULL_TRIE_STUDY
305 #define TRIE_STCLASS
306 #endif
307
308
309
310 #define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3]
311 #define PBITVAL(paren) (1 << ((paren) & 7))
312 #define PAREN_TEST(u8str,paren) ( PBYTE(u8str,paren) & PBITVAL(paren))
313 #define PAREN_SET(u8str,paren) PBYTE(u8str,paren) |= PBITVAL(paren)
314 #define PAREN_UNSET(u8str,paren) PBYTE(u8str,paren) &= (~PBITVAL(paren))
315
316 #define REQUIRE_UTF8    STMT_START {                                       \
317                                      if (!UTF) {                           \
318                                          *flagp = RESTART_UTF8;            \
319                                          return NULL;                      \
320                                      }                                     \
321                         } STMT_END
322
323 /* This converts the named class defined in regcomp.h to its equivalent class
324  * number defined in handy.h. */
325 #define namedclass_to_classnum(class)  ((int) ((class) / 2))
326 #define classnum_to_namedclass(classnum)  ((classnum) * 2)
327
328 #define _invlist_union_complement_2nd(a, b, output) \
329                         _invlist_union_maybe_complement_2nd(a, b, TRUE, output)
330 #define _invlist_intersection_complement_2nd(a, b, output) \
331                  _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output)
332
333 /* About scan_data_t.
334
335   During optimisation we recurse through the regexp program performing
336   various inplace (keyhole style) optimisations. In addition study_chunk
337   and scan_commit populate this data structure with information about
338   what strings MUST appear in the pattern. We look for the longest
339   string that must appear at a fixed location, and we look for the
340   longest string that may appear at a floating location. So for instance
341   in the pattern:
342
343     /FOO[xX]A.*B[xX]BAR/
344
345   Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating
346   strings (because they follow a .* construct). study_chunk will identify
347   both FOO and BAR as being the longest fixed and floating strings respectively.
348
349   The strings can be composites, for instance
350
351      /(f)(o)(o)/
352
353   will result in a composite fixed substring 'foo'.
354
355   For each string some basic information is maintained:
356
357   - offset or min_offset
358     This is the position the string must appear at, or not before.
359     It also implicitly (when combined with minlenp) tells us how many
360     characters must match before the string we are searching for.
361     Likewise when combined with minlenp and the length of the string it
362     tells us how many characters must appear after the string we have
363     found.
364
365   - max_offset
366     Only used for floating strings. This is the rightmost point that
367     the string can appear at. If set to SSize_t_MAX it indicates that the
368     string can occur infinitely far to the right.
369
370   - minlenp
371     A pointer to the minimum number of characters of the pattern that the
372     string was found inside. This is important as in the case of positive
373     lookahead or positive lookbehind we can have multiple patterns
374     involved. Consider
375
376     /(?=FOO).*F/
377
378     The minimum length of the pattern overall is 3, the minimum length
379     of the lookahead part is 3, but the minimum length of the part that
380     will actually match is 1. So 'FOO's minimum length is 3, but the
381     minimum length for the F is 1. This is important as the minimum length
382     is used to determine offsets in front of and behind the string being
383     looked for.  Since strings can be composites this is the length of the
384     pattern at the time it was committed with a scan_commit. Note that
385     the length is calculated by study_chunk, so that the minimum lengths
386     are not known until the full pattern has been compiled, thus the
387     pointer to the value.
388
389   - lookbehind
390
391     In the case of lookbehind the string being searched for can be
392     offset past the start point of the final matching string.
393     If this value was just blithely removed from the min_offset it would
394     invalidate some of the calculations for how many chars must match
395     before or after (as they are derived from min_offset and minlen and
396     the length of the string being searched for).
397     When the final pattern is compiled and the data is moved from the
398     scan_data_t structure into the regexp structure the information
399     about lookbehind is factored in, with the information that would
400     have been lost precalculated in the end_shift field for the
401     associated string.
402
403   The fields pos_min and pos_delta are used to store the minimum offset
404   and the delta to the maximum offset at the current point in the pattern.
405
406 */
407
408 typedef struct scan_data_t {
409     /*I32 len_min;      unused */
410     /*I32 len_delta;    unused */
411     SSize_t pos_min;
412     SSize_t pos_delta;
413     SV *last_found;
414     SSize_t last_end;       /* min value, <0 unless valid. */
415     SSize_t last_start_min;
416     SSize_t last_start_max;
417     SV **longest;           /* Either &l_fixed, or &l_float. */
418     SV *longest_fixed;      /* longest fixed string found in pattern */
419     SSize_t offset_fixed;   /* offset where it starts */
420     SSize_t *minlen_fixed;  /* pointer to the minlen relevant to the string */
421     I32 lookbehind_fixed;   /* is the position of the string modfied by LB */
422     SV *longest_float;      /* longest floating string found in pattern */
423     SSize_t offset_float_min; /* earliest point in string it can appear */
424     SSize_t offset_float_max; /* latest point in string it can appear */
425     SSize_t *minlen_float;  /* pointer to the minlen relevant to the string */
426     SSize_t lookbehind_float; /* is the pos of the string modified by LB */
427     I32 flags;
428     I32 whilem_c;
429     SSize_t *last_closep;
430     regnode_ssc *start_class;
431 } scan_data_t;
432
433 /*
434  * Forward declarations for pregcomp()'s friends.
435  */
436
437 static const scan_data_t zero_scan_data =
438   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
439
440 #define SF_BEFORE_EOL           (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
441 #define SF_BEFORE_SEOL          0x0001
442 #define SF_BEFORE_MEOL          0x0002
443 #define SF_FIX_BEFORE_EOL       (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
444 #define SF_FL_BEFORE_EOL        (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
445
446 #define SF_FIX_SHIFT_EOL        (+2)
447 #define SF_FL_SHIFT_EOL         (+4)
448
449 #define SF_FIX_BEFORE_SEOL      (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
450 #define SF_FIX_BEFORE_MEOL      (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
451
452 #define SF_FL_BEFORE_SEOL       (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
453 #define SF_FL_BEFORE_MEOL       (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
454 #define SF_IS_INF               0x0040
455 #define SF_HAS_PAR              0x0080
456 #define SF_IN_PAR               0x0100
457 #define SF_HAS_EVAL             0x0200
458 #define SCF_DO_SUBSTR           0x0400
459 #define SCF_DO_STCLASS_AND      0x0800
460 #define SCF_DO_STCLASS_OR       0x1000
461 #define SCF_DO_STCLASS          (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
462 #define SCF_WHILEM_VISITED_POS  0x2000
463
464 #define SCF_TRIE_RESTUDY        0x4000 /* Do restudy? */
465 #define SCF_SEEN_ACCEPT         0x8000
466 #define SCF_TRIE_DOING_RESTUDY 0x10000
467 #define SCF_IN_DEFINE          0x20000
468
469
470
471
472 #define UTF cBOOL(RExC_utf8)
473
474 /* The enums for all these are ordered so things work out correctly */
475 #define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET)
476 #define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags)                    \
477                                                      == REGEX_DEPENDS_CHARSET)
478 #define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET)
479 #define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags)                \
480                                                      >= REGEX_UNICODE_CHARSET)
481 #define ASCII_RESTRICTED (get_regex_charset(RExC_flags)                      \
482                                             == REGEX_ASCII_RESTRICTED_CHARSET)
483 #define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags)             \
484                                             >= REGEX_ASCII_RESTRICTED_CHARSET)
485 #define ASCII_FOLD_RESTRICTED (get_regex_charset(RExC_flags)                 \
486                                         == REGEX_ASCII_MORE_RESTRICTED_CHARSET)
487
488 #define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD)
489
490 /* For programs that want to be strictly Unicode compatible by dying if any
491  * attempt is made to match a non-Unicode code point against a Unicode
492  * property.  */
493 #define ALWAYS_WARN_SUPER  ckDEAD(packWARN(WARN_NON_UNICODE))
494
495 #define OOB_NAMEDCLASS          -1
496
497 /* There is no code point that is out-of-bounds, so this is problematic.  But
498  * its only current use is to initialize a variable that is always set before
499  * looked at. */
500 #define OOB_UNICODE             0xDEADBEEF
501
502 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
503 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
504
505
506 /* length of regex to show in messages that don't mark a position within */
507 #define RegexLengthToShowInErrorMessages 127
508
509 /*
510  * If MARKER[12] are adjusted, be sure to adjust the constants at the top
511  * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
512  * op/pragma/warn/regcomp.
513  */
514 #define MARKER1 "<-- HERE"    /* marker as it appears in the description */
515 #define MARKER2 " <-- HERE "  /* marker as it appears within the regex */
516
517 #define REPORT_LOCATION " in regex; marked by " MARKER1    \
518                         " in m/%"UTF8f MARKER2 "%"UTF8f"/"
519
520 #define REPORT_LOCATION_ARGS(offset)            \
521                 UTF8fARG(UTF, offset, RExC_precomp), \
522                 UTF8fARG(UTF, RExC_end - RExC_precomp - offset, RExC_precomp + offset)
523
524 /*
525  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
526  * arg. Show regex, up to a maximum length. If it's too long, chop and add
527  * "...".
528  */
529 #define _FAIL(code) STMT_START {                                        \
530     const char *ellipses = "";                                          \
531     IV len = RExC_end - RExC_precomp;                                   \
532                                                                         \
533     if (!SIZE_ONLY)                                                     \
534         SAVEFREESV(RExC_rx_sv);                                         \
535     if (len > RegexLengthToShowInErrorMessages) {                       \
536         /* chop 10 shorter than the max, to ensure meaning of "..." */  \
537         len = RegexLengthToShowInErrorMessages - 10;                    \
538         ellipses = "...";                                               \
539     }                                                                   \
540     code;                                                               \
541 } STMT_END
542
543 #define FAIL(msg) _FAIL(                            \
544     Perl_croak(aTHX_ "%s in regex m/%"UTF8f"%s/",           \
545             msg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
546
547 #define FAIL2(msg,arg) _FAIL(                       \
548     Perl_croak(aTHX_ msg " in regex m/%"UTF8f"%s/",         \
549             arg, UTF8fARG(UTF, len, RExC_precomp), ellipses))
550
551 /*
552  * Simple_vFAIL -- like FAIL, but marks the current location in the scan
553  */
554 #define Simple_vFAIL(m) STMT_START {                                    \
555     const IV offset =                                                   \
556         (RExC_parse > RExC_end ? RExC_end : RExC_parse) - RExC_precomp; \
557     Perl_croak(aTHX_ "%s" REPORT_LOCATION,                              \
558             m, REPORT_LOCATION_ARGS(offset));   \
559 } STMT_END
560
561 /*
562  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
563  */
564 #define vFAIL(m) STMT_START {                           \
565     if (!SIZE_ONLY)                                     \
566         SAVEFREESV(RExC_rx_sv);                         \
567     Simple_vFAIL(m);                                    \
568 } STMT_END
569
570 /*
571  * Like Simple_vFAIL(), but accepts two arguments.
572  */
573 #define Simple_vFAIL2(m,a1) STMT_START {                        \
574     const IV offset = RExC_parse - RExC_precomp;                        \
575     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1,                      \
576                       REPORT_LOCATION_ARGS(offset));    \
577 } STMT_END
578
579 /*
580  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
581  */
582 #define vFAIL2(m,a1) STMT_START {                       \
583     if (!SIZE_ONLY)                                     \
584         SAVEFREESV(RExC_rx_sv);                         \
585     Simple_vFAIL2(m, a1);                               \
586 } STMT_END
587
588
589 /*
590  * Like Simple_vFAIL(), but accepts three arguments.
591  */
592 #define Simple_vFAIL3(m, a1, a2) STMT_START {                   \
593     const IV offset = RExC_parse - RExC_precomp;                \
594     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, a2,          \
595             REPORT_LOCATION_ARGS(offset));      \
596 } STMT_END
597
598 /*
599  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
600  */
601 #define vFAIL3(m,a1,a2) STMT_START {                    \
602     if (!SIZE_ONLY)                                     \
603         SAVEFREESV(RExC_rx_sv);                         \
604     Simple_vFAIL3(m, a1, a2);                           \
605 } STMT_END
606
607 /*
608  * Like Simple_vFAIL(), but accepts four arguments.
609  */
610 #define Simple_vFAIL4(m, a1, a2, a3) STMT_START {               \
611     const IV offset = RExC_parse - RExC_precomp;                \
612     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, a2, a3,              \
613             REPORT_LOCATION_ARGS(offset));      \
614 } STMT_END
615
616 #define vFAIL4(m,a1,a2,a3) STMT_START {                 \
617     if (!SIZE_ONLY)                                     \
618         SAVEFREESV(RExC_rx_sv);                         \
619     Simple_vFAIL4(m, a1, a2, a3);                       \
620 } STMT_END
621
622 /* A specialized version of vFAIL2 that works with UTF8f */
623 #define vFAIL2utf8f(m, a1) STMT_START { \
624     const IV offset = RExC_parse - RExC_precomp;   \
625     if (!SIZE_ONLY)                                \
626         SAVEFREESV(RExC_rx_sv);                    \
627     S_re_croak2(aTHX_ UTF, m, REPORT_LOCATION, a1, \
628             REPORT_LOCATION_ARGS(offset));         \
629 } STMT_END
630
631 /* These have asserts in them because of [perl #122671] Many warnings in
632  * regcomp.c can occur twice.  If they get output in pass1 and later in that
633  * pass, the pattern has to be converted to UTF-8 and the pass restarted, they
634  * would get output again.  So they should be output in pass2, and these
635  * asserts make sure new warnings follow that paradigm. */
636
637 /* m is not necessarily a "literal string", in this macro */
638 #define reg_warn_non_literal_string(loc, m) STMT_START {                \
639     const IV offset = loc - RExC_precomp;                               \
640     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s" REPORT_LOCATION,      \
641             m, REPORT_LOCATION_ARGS(offset));       \
642 } STMT_END
643
644 #define ckWARNreg(loc,m) STMT_START {                                   \
645     const IV offset = loc - RExC_precomp;                               \
646     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
647             REPORT_LOCATION_ARGS(offset));              \
648 } STMT_END
649
650 #define vWARN(loc, m) STMT_START {                                      \
651     const IV offset = loc - RExC_precomp;                               \
652     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,        \
653             REPORT_LOCATION_ARGS(offset));              \
654 } STMT_END
655
656 #define vWARN_dep(loc, m) STMT_START {                                  \
657     const IV offset = loc - RExC_precomp;                               \
658     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), m REPORT_LOCATION,    \
659             REPORT_LOCATION_ARGS(offset));              \
660 } STMT_END
661
662 #define ckWARNdep(loc,m) STMT_START {                                   \
663     const IV offset = loc - RExC_precomp;                               \
664     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),                  \
665             m REPORT_LOCATION,                                          \
666             REPORT_LOCATION_ARGS(offset));              \
667 } STMT_END
668
669 #define ckWARNregdep(loc,m) STMT_START {                                \
670     const IV offset = loc - RExC_precomp;                               \
671     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP),    \
672             m REPORT_LOCATION,                                          \
673             REPORT_LOCATION_ARGS(offset));              \
674 } STMT_END
675
676 #define ckWARN2reg_d(loc,m, a1) STMT_START {                            \
677     const IV offset = loc - RExC_precomp;                               \
678     __ASSERT_(PASS2) Perl_ck_warner_d(aTHX_ packWARN(WARN_REGEXP),                      \
679             m REPORT_LOCATION,                                          \
680             a1, REPORT_LOCATION_ARGS(offset));  \
681 } STMT_END
682
683 #define ckWARN2reg(loc, m, a1) STMT_START {                             \
684     const IV offset = loc - RExC_precomp;                               \
685     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
686             a1, REPORT_LOCATION_ARGS(offset));  \
687 } STMT_END
688
689 #define vWARN3(loc, m, a1, a2) STMT_START {                             \
690     const IV offset = loc - RExC_precomp;                               \
691     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
692             a1, a2, REPORT_LOCATION_ARGS(offset));      \
693 } STMT_END
694
695 #define ckWARN3reg(loc, m, a1, a2) STMT_START {                         \
696     const IV offset = loc - RExC_precomp;                               \
697     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
698             a1, a2, REPORT_LOCATION_ARGS(offset));      \
699 } STMT_END
700
701 #define vWARN4(loc, m, a1, a2, a3) STMT_START {                         \
702     const IV offset = loc - RExC_precomp;                               \
703     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
704             a1, a2, a3, REPORT_LOCATION_ARGS(offset)); \
705 } STMT_END
706
707 #define ckWARN4reg(loc, m, a1, a2, a3) STMT_START {                     \
708     const IV offset = loc - RExC_precomp;                               \
709     __ASSERT_(PASS2) Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,     \
710             a1, a2, a3, REPORT_LOCATION_ARGS(offset)); \
711 } STMT_END
712
713 #define vWARN5(loc, m, a1, a2, a3, a4) STMT_START {                     \
714     const IV offset = loc - RExC_precomp;                               \
715     __ASSERT_(PASS2) Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,                \
716             a1, a2, a3, a4, REPORT_LOCATION_ARGS(offset)); \
717 } STMT_END
718
719 /* Macros for recording node offsets.   20001227 mjd@plover.com
720  * Nodes are numbered 1, 2, 3, 4.  Node #n's position is recorded in
721  * element 2*n-1 of the array.  Element #2n holds the byte length node #n.
722  * Element 0 holds the number n.
723  * Position is 1 indexed.
724  */
725 #ifndef RE_TRACK_PATTERN_OFFSETS
726 #define Set_Node_Offset_To_R(node,byte)
727 #define Set_Node_Offset(node,byte)
728 #define Set_Cur_Node_Offset
729 #define Set_Node_Length_To_R(node,len)
730 #define Set_Node_Length(node,len)
731 #define Set_Node_Cur_Length(node,start)
732 #define Node_Offset(n)
733 #define Node_Length(n)
734 #define Set_Node_Offset_Length(node,offset,len)
735 #define ProgLen(ri) ri->u.proglen
736 #define SetProgLen(ri,x) ri->u.proglen = x
737 #else
738 #define ProgLen(ri) ri->u.offsets[0]
739 #define SetProgLen(ri,x) ri->u.offsets[0] = x
740 #define Set_Node_Offset_To_R(node,byte) STMT_START {                    \
741     if (! SIZE_ONLY) {                                                  \
742         MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n",         \
743                     __LINE__, (int)(node), (int)(byte)));               \
744         if((node) < 0) {                                                \
745             Perl_croak(aTHX_ "value of node is %d in Offset macro",     \
746                                          (int)(node));                  \
747         } else {                                                        \
748             RExC_offsets[2*(node)-1] = (byte);                          \
749         }                                                               \
750     }                                                                   \
751 } STMT_END
752
753 #define Set_Node_Offset(node,byte) \
754     Set_Node_Offset_To_R((node)-RExC_emit_start, (byte)-RExC_start)
755 #define Set_Cur_Node_Offset Set_Node_Offset(RExC_emit, RExC_parse)
756
757 #define Set_Node_Length_To_R(node,len) STMT_START {                     \
758     if (! SIZE_ONLY) {                                                  \
759         MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n",           \
760                 __LINE__, (int)(node), (int)(len)));                    \
761         if((node) < 0) {                                                \
762             Perl_croak(aTHX_ "value of node is %d in Length macro",     \
763                                          (int)(node));                  \
764         } else {                                                        \
765             RExC_offsets[2*(node)] = (len);                             \
766         }                                                               \
767     }                                                                   \
768 } STMT_END
769
770 #define Set_Node_Length(node,len) \
771     Set_Node_Length_To_R((node)-RExC_emit_start, len)
772 #define Set_Node_Cur_Length(node, start)                \
773     Set_Node_Length(node, RExC_parse - start)
774
775 /* Get offsets and lengths */
776 #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1])
777 #define Node_Length(n) (RExC_offsets[2*((n)-RExC_emit_start)])
778
779 #define Set_Node_Offset_Length(node,offset,len) STMT_START {    \
780     Set_Node_Offset_To_R((node)-RExC_emit_start, (offset));     \
781     Set_Node_Length_To_R((node)-RExC_emit_start, (len));        \
782 } STMT_END
783 #endif
784
785 #if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
786 #define EXPERIMENTAL_INPLACESCAN
787 #endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/
788
789 #define DEBUG_RExC_seen() \
790         DEBUG_OPTIMISE_MORE_r({                                             \
791             PerlIO_printf(Perl_debug_log,"RExC_seen: ");                    \
792                                                                             \
793             if (RExC_seen & REG_ZERO_LEN_SEEN)                              \
794                 PerlIO_printf(Perl_debug_log,"REG_ZERO_LEN_SEEN ");         \
795                                                                             \
796             if (RExC_seen & REG_LOOKBEHIND_SEEN)                            \
797                 PerlIO_printf(Perl_debug_log,"REG_LOOKBEHIND_SEEN ");       \
798                                                                             \
799             if (RExC_seen & REG_GPOS_SEEN)                                  \
800                 PerlIO_printf(Perl_debug_log,"REG_GPOS_SEEN ");             \
801                                                                             \
802             if (RExC_seen & REG_CANY_SEEN)                                  \
803                 PerlIO_printf(Perl_debug_log,"REG_CANY_SEEN ");             \
804                                                                             \
805             if (RExC_seen & REG_RECURSE_SEEN)                               \
806                 PerlIO_printf(Perl_debug_log,"REG_RECURSE_SEEN ");          \
807                                                                             \
808             if (RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)                         \
809                 PerlIO_printf(Perl_debug_log,"REG_TOP_LEVEL_BRANCHES_SEEN ");    \
810                                                                             \
811             if (RExC_seen & REG_VERBARG_SEEN)                               \
812                 PerlIO_printf(Perl_debug_log,"REG_VERBARG_SEEN ");          \
813                                                                             \
814             if (RExC_seen & REG_CUTGROUP_SEEN)                              \
815                 PerlIO_printf(Perl_debug_log,"REG_CUTGROUP_SEEN ");         \
816                                                                             \
817             if (RExC_seen & REG_RUN_ON_COMMENT_SEEN)                        \
818                 PerlIO_printf(Perl_debug_log,"REG_RUN_ON_COMMENT_SEEN ");   \
819                                                                             \
820             if (RExC_seen & REG_UNFOLDED_MULTI_SEEN)                        \
821                 PerlIO_printf(Perl_debug_log,"REG_UNFOLDED_MULTI_SEEN ");   \
822                                                                             \
823             if (RExC_seen & REG_GOSTART_SEEN)                               \
824                 PerlIO_printf(Perl_debug_log,"REG_GOSTART_SEEN ");          \
825                                                                             \
826             if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)                               \
827                 PerlIO_printf(Perl_debug_log,"REG_UNBOUNDED_QUANTIFIER_SEEN ");          \
828                                                                             \
829             PerlIO_printf(Perl_debug_log,"\n");                             \
830         });
831
832 #define DEBUG_SHOW_STUDY_FLAG(flags,flag) \
833   if ((flags) & flag) PerlIO_printf(Perl_debug_log, "%s ", #flag)
834
835 #define DEBUG_SHOW_STUDY_FLAGS(flags,open_str,close_str)                    \
836     if ( ( flags ) ) {                                                      \
837         PerlIO_printf(Perl_debug_log, "%s", open_str);                      \
838         DEBUG_SHOW_STUDY_FLAG(flags,SF_FL_BEFORE_SEOL);                     \
839         DEBUG_SHOW_STUDY_FLAG(flags,SF_FL_BEFORE_MEOL);                     \
840         DEBUG_SHOW_STUDY_FLAG(flags,SF_IS_INF);                             \
841         DEBUG_SHOW_STUDY_FLAG(flags,SF_HAS_PAR);                            \
842         DEBUG_SHOW_STUDY_FLAG(flags,SF_IN_PAR);                             \
843         DEBUG_SHOW_STUDY_FLAG(flags,SF_HAS_EVAL);                           \
844         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_SUBSTR);                         \
845         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS_AND);                    \
846         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS_OR);                     \
847         DEBUG_SHOW_STUDY_FLAG(flags,SCF_DO_STCLASS);                        \
848         DEBUG_SHOW_STUDY_FLAG(flags,SCF_WHILEM_VISITED_POS);                \
849         DEBUG_SHOW_STUDY_FLAG(flags,SCF_TRIE_RESTUDY);                      \
850         DEBUG_SHOW_STUDY_FLAG(flags,SCF_SEEN_ACCEPT);                       \
851         DEBUG_SHOW_STUDY_FLAG(flags,SCF_TRIE_DOING_RESTUDY);                \
852         DEBUG_SHOW_STUDY_FLAG(flags,SCF_IN_DEFINE);                         \
853         PerlIO_printf(Perl_debug_log, "%s", close_str);                     \
854     }
855
856
857 #define DEBUG_STUDYDATA(str,data,depth)                              \
858 DEBUG_OPTIMISE_MORE_r(if(data){                                      \
859     PerlIO_printf(Perl_debug_log,                                    \
860         "%*s" str "Pos:%"IVdf"/%"IVdf                                \
861         " Flags: 0x%"UVXf,                                           \
862         (int)(depth)*2, "",                                          \
863         (IV)((data)->pos_min),                                       \
864         (IV)((data)->pos_delta),                                     \
865         (UV)((data)->flags)                                          \
866     );                                                               \
867     DEBUG_SHOW_STUDY_FLAGS((data)->flags," [ ","]");                 \
868     PerlIO_printf(Perl_debug_log,                                    \
869         " Whilem_c: %"IVdf" Lcp: %"IVdf" %s",                        \
870         (IV)((data)->whilem_c),                                      \
871         (IV)((data)->last_closep ? *((data)->last_closep) : -1),     \
872         is_inf ? "INF " : ""                                         \
873     );                                                               \
874     if ((data)->last_found)                                          \
875         PerlIO_printf(Perl_debug_log,                                \
876             "Last:'%s' %"IVdf":%"IVdf"/%"IVdf" %sFixed:'%s' @ %"IVdf \
877             " %sFloat: '%s' @ %"IVdf"/%"IVdf"",                      \
878             SvPVX_const((data)->last_found),                         \
879             (IV)((data)->last_end),                                  \
880             (IV)((data)->last_start_min),                            \
881             (IV)((data)->last_start_max),                            \
882             ((data)->longest &&                                      \
883              (data)->longest==&((data)->longest_fixed)) ? "*" : "",  \
884             SvPVX_const((data)->longest_fixed),                      \
885             (IV)((data)->offset_fixed),                              \
886             ((data)->longest &&                                      \
887              (data)->longest==&((data)->longest_float)) ? "*" : "",  \
888             SvPVX_const((data)->longest_float),                      \
889             (IV)((data)->offset_float_min),                          \
890             (IV)((data)->offset_float_max)                           \
891         );                                                           \
892     PerlIO_printf(Perl_debug_log,"\n");                              \
893 });
894
895 /* is c a control character for which we have a mnemonic? */
896 #define isMNEMONIC_CNTRL(c) _IS_MNEMONIC_CNTRL_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c)
897
898 STATIC const char *
899 S_cntrl_to_mnemonic(const U8 c)
900 {
901     /* Returns the mnemonic string that represents character 'c', if one
902      * exists; NULL otherwise.  The only ones that exist for the purposes of
903      * this routine are a few control characters */
904
905     switch (c) {
906         case '\a':       return "\\a";
907         case '\b':       return "\\b";
908         case ESC_NATIVE: return "\\e";
909         case '\f':       return "\\f";
910         case '\n':       return "\\n";
911         case '\r':       return "\\r";
912         case '\t':       return "\\t";
913     }
914
915     return NULL;
916 }
917
918 /* Mark that we cannot extend a found fixed substring at this point.
919    Update the longest found anchored substring and the longest found
920    floating substrings if needed. */
921
922 STATIC void
923 S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data,
924                     SSize_t *minlenp, int is_inf)
925 {
926     const STRLEN l = CHR_SVLEN(data->last_found);
927     const STRLEN old_l = CHR_SVLEN(*data->longest);
928     GET_RE_DEBUG_FLAGS_DECL;
929
930     PERL_ARGS_ASSERT_SCAN_COMMIT;
931
932     if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
933         SvSetMagicSV(*data->longest, data->last_found);
934         if (*data->longest == data->longest_fixed) {
935             data->offset_fixed = l ? data->last_start_min : data->pos_min;
936             if (data->flags & SF_BEFORE_EOL)
937                 data->flags
938                     |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
939             else
940                 data->flags &= ~SF_FIX_BEFORE_EOL;
941             data->minlen_fixed=minlenp;
942             data->lookbehind_fixed=0;
943         }
944         else { /* *data->longest == data->longest_float */
945             data->offset_float_min = l ? data->last_start_min : data->pos_min;
946             data->offset_float_max = (l
947                           ? data->last_start_max
948                           : (data->pos_delta > SSize_t_MAX - data->pos_min
949                                          ? SSize_t_MAX
950                                          : data->pos_min + data->pos_delta));
951             if (is_inf
952                  || (STRLEN)data->offset_float_max > (STRLEN)SSize_t_MAX)
953                 data->offset_float_max = SSize_t_MAX;
954             if (data->flags & SF_BEFORE_EOL)
955                 data->flags
956                     |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
957             else
958                 data->flags &= ~SF_FL_BEFORE_EOL;
959             data->minlen_float=minlenp;
960             data->lookbehind_float=0;
961         }
962     }
963     SvCUR_set(data->last_found, 0);
964     {
965         SV * const sv = data->last_found;
966         if (SvUTF8(sv) && SvMAGICAL(sv)) {
967             MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8);
968             if (mg)
969                 mg->mg_len = 0;
970         }
971     }
972     data->last_end = -1;
973     data->flags &= ~SF_BEFORE_EOL;
974     DEBUG_STUDYDATA("commit: ",data,0);
975 }
976
977 /* An SSC is just a regnode_charclass_posix with an extra field: the inversion
978  * list that describes which code points it matches */
979
980 STATIC void
981 S_ssc_anything(pTHX_ regnode_ssc *ssc)
982 {
983     /* Set the SSC 'ssc' to match an empty string or any code point */
984
985     PERL_ARGS_ASSERT_SSC_ANYTHING;
986
987     assert(is_ANYOF_SYNTHETIC(ssc));
988
989     ssc->invlist = sv_2mortal(_new_invlist(2)); /* mortalize so won't leak */
990     _append_range_to_invlist(ssc->invlist, 0, UV_MAX);
991     ANYOF_FLAGS(ssc) |= SSC_MATCHES_EMPTY_STRING;  /* Plus matches empty */
992 }
993
994 STATIC int
995 S_ssc_is_anything(const regnode_ssc *ssc)
996 {
997     /* Returns TRUE if the SSC 'ssc' can match the empty string and any code
998      * point; FALSE otherwise.  Thus, this is used to see if using 'ssc' buys
999      * us anything: if the function returns TRUE, 'ssc' hasn't been restricted
1000      * in any way, so there's no point in using it */
1001
1002     UV start, end;
1003     bool ret;
1004
1005     PERL_ARGS_ASSERT_SSC_IS_ANYTHING;
1006
1007     assert(is_ANYOF_SYNTHETIC(ssc));
1008
1009     if (! (ANYOF_FLAGS(ssc) & SSC_MATCHES_EMPTY_STRING)) {
1010         return FALSE;
1011     }
1012
1013     /* See if the list consists solely of the range 0 - Infinity */
1014     invlist_iterinit(ssc->invlist);
1015     ret = invlist_iternext(ssc->invlist, &start, &end)
1016           && start == 0
1017           && end == UV_MAX;
1018
1019     invlist_iterfinish(ssc->invlist);
1020
1021     if (ret) {
1022         return TRUE;
1023     }
1024
1025     /* If e.g., both \w and \W are set, matches everything */
1026     if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1027         int i;
1028         for (i = 0; i < ANYOF_POSIXL_MAX; i += 2) {
1029             if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i+1)) {
1030                 return TRUE;
1031             }
1032         }
1033     }
1034
1035     return FALSE;
1036 }
1037
1038 STATIC void
1039 S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc)
1040 {
1041     /* Initializes the SSC 'ssc'.  This includes setting it to match an empty
1042      * string, any code point, or any posix class under locale */
1043
1044     PERL_ARGS_ASSERT_SSC_INIT;
1045
1046     Zero(ssc, 1, regnode_ssc);
1047     set_ANYOF_SYNTHETIC(ssc);
1048     ARG_SET(ssc, ANYOF_ONLY_HAS_BITMAP);
1049     ssc_anything(ssc);
1050
1051     /* If any portion of the regex is to operate under locale rules that aren't
1052      * fully known at compile time, initialization includes it.  The reason
1053      * this isn't done for all regexes is that the optimizer was written under
1054      * the assumption that locale was all-or-nothing.  Given the complexity and
1055      * lack of documentation in the optimizer, and that there are inadequate
1056      * test cases for locale, many parts of it may not work properly, it is
1057      * safest to avoid locale unless necessary. */
1058     if (RExC_contains_locale) {
1059         ANYOF_POSIXL_SETALL(ssc);
1060     }
1061     else {
1062         ANYOF_POSIXL_ZERO(ssc);
1063     }
1064 }
1065
1066 STATIC int
1067 S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state,
1068                         const regnode_ssc *ssc)
1069 {
1070     /* Returns TRUE if the SSC 'ssc' is in its initial state with regard only
1071      * to the list of code points matched, and locale posix classes; hence does
1072      * not check its flags) */
1073
1074     UV start, end;
1075     bool ret;
1076
1077     PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT;
1078
1079     assert(is_ANYOF_SYNTHETIC(ssc));
1080
1081     invlist_iterinit(ssc->invlist);
1082     ret = invlist_iternext(ssc->invlist, &start, &end)
1083           && start == 0
1084           && end == UV_MAX;
1085
1086     invlist_iterfinish(ssc->invlist);
1087
1088     if (! ret) {
1089         return FALSE;
1090     }
1091
1092     if (RExC_contains_locale && ! ANYOF_POSIXL_SSC_TEST_ALL_SET(ssc)) {
1093         return FALSE;
1094     }
1095
1096     return TRUE;
1097 }
1098
1099 STATIC SV*
1100 S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
1101                                const regnode_charclass* const node)
1102 {
1103     /* Returns a mortal inversion list defining which code points are matched
1104      * by 'node', which is of type ANYOF.  Handles complementing the result if
1105      * appropriate.  If some code points aren't knowable at this time, the
1106      * returned list must, and will, contain every code point that is a
1107      * possibility. */
1108
1109     SV* invlist = sv_2mortal(_new_invlist(0));
1110     SV* only_utf8_locale_invlist = NULL;
1111     unsigned int i;
1112     const U32 n = ARG(node);
1113     bool new_node_has_latin1 = FALSE;
1114
1115     PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC;
1116
1117     /* Look at the data structure created by S_set_ANYOF_arg() */
1118     if (n != ANYOF_ONLY_HAS_BITMAP) {
1119         SV * const rv = MUTABLE_SV(RExC_rxi->data->data[n]);
1120         AV * const av = MUTABLE_AV(SvRV(rv));
1121         SV **const ary = AvARRAY(av);
1122         assert(RExC_rxi->data->what[n] == 's');
1123
1124         if (ary[1] && ary[1] != &PL_sv_undef) { /* Has compile-time swash */
1125             invlist = sv_2mortal(invlist_clone(_get_swash_invlist(ary[1])));
1126         }
1127         else if (ary[0] && ary[0] != &PL_sv_undef) {
1128
1129             /* Here, no compile-time swash, and there are things that won't be
1130              * known until runtime -- we have to assume it could be anything */
1131             return _add_range_to_invlist(invlist, 0, UV_MAX);
1132         }
1133         else if (ary[3] && ary[3] != &PL_sv_undef) {
1134
1135             /* Here no compile-time swash, and no run-time only data.  Use the
1136              * node's inversion list */
1137             invlist = sv_2mortal(invlist_clone(ary[3]));
1138         }
1139
1140         /* Get the code points valid only under UTF-8 locales */
1141         if ((ANYOF_FLAGS(node) & ANYOF_LOC_FOLD)
1142             && ary[2] && ary[2] != &PL_sv_undef)
1143         {
1144             only_utf8_locale_invlist = ary[2];
1145         }
1146     }
1147
1148     /* An ANYOF node contains a bitmap for the first NUM_ANYOF_CODE_POINTS
1149      * code points, and an inversion list for the others, but if there are code
1150      * points that should match only conditionally on the target string being
1151      * UTF-8, those are placed in the inversion list, and not the bitmap.
1152      * Since there are circumstances under which they could match, they are
1153      * included in the SSC.  But if the ANYOF node is to be inverted, we have
1154      * to exclude them here, so that when we invert below, the end result
1155      * actually does include them.  (Think about "\xe0" =~ /[^\xc0]/di;).  We
1156      * have to do this here before we add the unconditionally matched code
1157      * points */
1158     if (ANYOF_FLAGS(node) & ANYOF_INVERT) {
1159         _invlist_intersection_complement_2nd(invlist,
1160                                              PL_UpperLatin1,
1161                                              &invlist);
1162     }
1163
1164     /* Add in the points from the bit map */
1165     for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
1166         if (ANYOF_BITMAP_TEST(node, i)) {
1167             invlist = add_cp_to_invlist(invlist, i);
1168             new_node_has_latin1 = TRUE;
1169         }
1170     }
1171
1172     /* If this can match all upper Latin1 code points, have to add them
1173      * as well */
1174     if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII) {
1175         _invlist_union(invlist, PL_UpperLatin1, &invlist);
1176     }
1177
1178     /* Similarly for these */
1179     if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_ABOVE_BITMAP) {
1180         _invlist_union_complement_2nd(invlist, PL_InBitmap, &invlist);
1181     }
1182
1183     if (ANYOF_FLAGS(node) & ANYOF_INVERT) {
1184         _invlist_invert(invlist);
1185     }
1186     else if (new_node_has_latin1 && ANYOF_FLAGS(node) & ANYOF_LOC_FOLD) {
1187
1188         /* Under /li, any 0-255 could fold to any other 0-255, depending on the
1189          * locale.  We can skip this if there are no 0-255 at all. */
1190         _invlist_union(invlist, PL_Latin1, &invlist);
1191     }
1192
1193     /* Similarly add the UTF-8 locale possible matches.  These have to be
1194      * deferred until after the non-UTF-8 locale ones are taken care of just
1195      * above, or it leads to wrong results under ANYOF_INVERT */
1196     if (only_utf8_locale_invlist) {
1197         _invlist_union_maybe_complement_2nd(invlist,
1198                                             only_utf8_locale_invlist,
1199                                             ANYOF_FLAGS(node) & ANYOF_INVERT,
1200                                             &invlist);
1201     }
1202
1203     return invlist;
1204 }
1205
1206 /* These two functions currently do the exact same thing */
1207 #define ssc_init_zero           ssc_init
1208
1209 #define ssc_add_cp(ssc, cp)   ssc_add_range((ssc), (cp), (cp))
1210 #define ssc_match_all_cp(ssc) ssc_add_range(ssc, 0, UV_MAX)
1211
1212 /* 'AND' a given class with another one.  Can create false positives.  'ssc'
1213  * should not be inverted.  'and_with->flags & ANYOF_MATCHES_POSIXL' should be
1214  * 0 if 'and_with' is a regnode_charclass instead of a regnode_ssc. */
1215
1216 STATIC void
1217 S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
1218                 const regnode_charclass *and_with)
1219 {
1220     /* Accumulate into SSC 'ssc' its 'AND' with 'and_with', which is either
1221      * another SSC or a regular ANYOF class.  Can create false positives. */
1222
1223     SV* anded_cp_list;
1224     U8  anded_flags;
1225
1226     PERL_ARGS_ASSERT_SSC_AND;
1227
1228     assert(is_ANYOF_SYNTHETIC(ssc));
1229
1230     /* 'and_with' is used as-is if it too is an SSC; otherwise have to extract
1231      * the code point inversion list and just the relevant flags */
1232     if (is_ANYOF_SYNTHETIC(and_with)) {
1233         anded_cp_list = ((regnode_ssc *)and_with)->invlist;
1234         anded_flags = ANYOF_FLAGS(and_with);
1235
1236         /* XXX This is a kludge around what appears to be deficiencies in the
1237          * optimizer.  If we make S_ssc_anything() add in the WARN_SUPER flag,
1238          * there are paths through the optimizer where it doesn't get weeded
1239          * out when it should.  And if we don't make some extra provision for
1240          * it like the code just below, it doesn't get added when it should.
1241          * This solution is to add it only when AND'ing, which is here, and
1242          * only when what is being AND'ed is the pristine, original node
1243          * matching anything.  Thus it is like adding it to ssc_anything() but
1244          * only when the result is to be AND'ed.  Probably the same solution
1245          * could be adopted for the same problem we have with /l matching,
1246          * which is solved differently in S_ssc_init(), and that would lead to
1247          * fewer false positives than that solution has.  But if this solution
1248          * creates bugs, the consequences are only that a warning isn't raised
1249          * that should be; while the consequences for having /l bugs is
1250          * incorrect matches */
1251         if (ssc_is_anything((regnode_ssc *)and_with)) {
1252             anded_flags |= ANYOF_WARN_SUPER;
1253         }
1254     }
1255     else {
1256         anded_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, and_with);
1257         anded_flags = ANYOF_FLAGS(and_with) & ANYOF_COMMON_FLAGS;
1258     }
1259
1260     ANYOF_FLAGS(ssc) &= anded_flags;
1261
1262     /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
1263      * C2 is the list of code points in 'and-with'; P2, its posix classes.
1264      * 'and_with' may be inverted.  When not inverted, we have the situation of
1265      * computing:
1266      *  (C1 | P1) & (C2 | P2)
1267      *                     =  (C1 & (C2 | P2)) | (P1 & (C2 | P2))
1268      *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
1269      *                    <=  ((C1 & C2) |       P2)) | ( P1       | (P1 & P2))
1270      *                    <=  ((C1 & C2) | P1 | P2)
1271      * Alternatively, the last few steps could be:
1272      *                     =  ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2))
1273      *                    <=  ((C1 & C2) |  C1      ) | (      C2  | (P1 & P2))
1274      *                    <=  (C1 | C2 | (P1 & P2))
1275      * We favor the second approach if either P1 or P2 is non-empty.  This is
1276      * because these components are a barrier to doing optimizations, as what
1277      * they match cannot be known until the moment of matching as they are
1278      * dependent on the current locale, 'AND"ing them likely will reduce or
1279      * eliminate them.
1280      * But we can do better if we know that C1,P1 are in their initial state (a
1281      * frequent occurrence), each matching everything:
1282      *  (<everything>) & (C2 | P2) =  C2 | P2
1283      * Similarly, if C2,P2 are in their initial state (again a frequent
1284      * occurrence), the result is a no-op
1285      *  (C1 | P1) & (<everything>) =  C1 | P1
1286      *
1287      * Inverted, we have
1288      *  (C1 | P1) & ~(C2 | P2)  =  (C1 | P1) & (~C2 & ~P2)
1289      *                          =  (C1 & (~C2 & ~P2)) | (P1 & (~C2 & ~P2))
1290      *                         <=  (C1 & ~C2) | (P1 & ~P2)
1291      * */
1292
1293     if ((ANYOF_FLAGS(and_with) & ANYOF_INVERT)
1294         && ! is_ANYOF_SYNTHETIC(and_with))
1295     {
1296         unsigned int i;
1297
1298         ssc_intersection(ssc,
1299                          anded_cp_list,
1300                          FALSE /* Has already been inverted */
1301                          );
1302
1303         /* If either P1 or P2 is empty, the intersection will be also; can skip
1304          * the loop */
1305         if (! (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL)) {
1306             ANYOF_POSIXL_ZERO(ssc);
1307         }
1308         else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1309
1310             /* Note that the Posix class component P from 'and_with' actually
1311              * looks like:
1312              *      P = Pa | Pb | ... | Pn
1313              * where each component is one posix class, such as in [\w\s].
1314              * Thus
1315              *      ~P = ~(Pa | Pb | ... | Pn)
1316              *         = ~Pa & ~Pb & ... & ~Pn
1317              *        <= ~Pa | ~Pb | ... | ~Pn
1318              * The last is something we can easily calculate, but unfortunately
1319              * is likely to have many false positives.  We could do better
1320              * in some (but certainly not all) instances if two classes in
1321              * P have known relationships.  For example
1322              *      :lower: <= :alpha: <= :alnum: <= \w <= :graph: <= :print:
1323              * So
1324              *      :lower: & :print: = :lower:
1325              * And similarly for classes that must be disjoint.  For example,
1326              * since \s and \w can have no elements in common based on rules in
1327              * the POSIX standard,
1328              *      \w & ^\S = nothing
1329              * Unfortunately, some vendor locales do not meet the Posix
1330              * standard, in particular almost everything by Microsoft.
1331              * The loop below just changes e.g., \w into \W and vice versa */
1332
1333             regnode_charclass_posixl temp;
1334             int add = 1;    /* To calculate the index of the complement */
1335
1336             ANYOF_POSIXL_ZERO(&temp);
1337             for (i = 0; i < ANYOF_MAX; i++) {
1338                 assert(i % 2 != 0
1339                        || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)
1340                        || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i + 1));
1341
1342                 if (ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)) {
1343                     ANYOF_POSIXL_SET(&temp, i + add);
1344                 }
1345                 add = 0 - add; /* 1 goes to -1; -1 goes to 1 */
1346             }
1347             ANYOF_POSIXL_AND(&temp, ssc);
1348
1349         } /* else ssc already has no posixes */
1350     } /* else: Not inverted.  This routine is a no-op if 'and_with' is an SSC
1351          in its initial state */
1352     else if (! is_ANYOF_SYNTHETIC(and_with)
1353              || ! ssc_is_cp_posixl_init(pRExC_state, (regnode_ssc *)and_with))
1354     {
1355         /* But if 'ssc' is in its initial state, the result is just 'and_with';
1356          * copy it over 'ssc' */
1357         if (ssc_is_cp_posixl_init(pRExC_state, ssc)) {
1358             if (is_ANYOF_SYNTHETIC(and_with)) {
1359                 StructCopy(and_with, ssc, regnode_ssc);
1360             }
1361             else {
1362                 ssc->invlist = anded_cp_list;
1363                 ANYOF_POSIXL_ZERO(ssc);
1364                 if (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL) {
1365                     ANYOF_POSIXL_OR((regnode_charclass_posixl*) and_with, ssc);
1366                 }
1367             }
1368         }
1369         else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)
1370                  || (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL))
1371         {
1372             /* One or the other of P1, P2 is non-empty. */
1373             if (ANYOF_FLAGS(and_with) & ANYOF_MATCHES_POSIXL) {
1374                 ANYOF_POSIXL_AND((regnode_charclass_posixl*) and_with, ssc);
1375             }
1376             ssc_union(ssc, anded_cp_list, FALSE);
1377         }
1378         else { /* P1 = P2 = empty */
1379             ssc_intersection(ssc, anded_cp_list, FALSE);
1380         }
1381     }
1382 }
1383
1384 STATIC void
1385 S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
1386                const regnode_charclass *or_with)
1387 {
1388     /* Accumulate into SSC 'ssc' its 'OR' with 'or_with', which is either
1389      * another SSC or a regular ANYOF class.  Can create false positives if
1390      * 'or_with' is to be inverted. */
1391
1392     SV* ored_cp_list;
1393     U8 ored_flags;
1394
1395     PERL_ARGS_ASSERT_SSC_OR;
1396
1397     assert(is_ANYOF_SYNTHETIC(ssc));
1398
1399     /* 'or_with' is used as-is if it too is an SSC; otherwise have to extract
1400      * the code point inversion list and just the relevant flags */
1401     if (is_ANYOF_SYNTHETIC(or_with)) {
1402         ored_cp_list = ((regnode_ssc*) or_with)->invlist;
1403         ored_flags = ANYOF_FLAGS(or_with);
1404     }
1405     else {
1406         ored_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, or_with);
1407         ored_flags = ANYOF_FLAGS(or_with) & ANYOF_COMMON_FLAGS;
1408     }
1409
1410     ANYOF_FLAGS(ssc) |= ored_flags;
1411
1412     /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes.
1413      * C2 is the list of code points in 'or-with'; P2, its posix classes.
1414      * 'or_with' may be inverted.  When not inverted, we have the simple
1415      * situation of computing:
1416      *  (C1 | P1) | (C2 | P2)  =  (C1 | C2) | (P1 | P2)
1417      * If P1|P2 yields a situation with both a class and its complement are
1418      * set, like having both \w and \W, this matches all code points, and we
1419      * can delete these from the P component of the ssc going forward.  XXX We
1420      * might be able to delete all the P components, but I (khw) am not certain
1421      * about this, and it is better to be safe.
1422      *
1423      * Inverted, we have
1424      *  (C1 | P1) | ~(C2 | P2)  =  (C1 | P1) | (~C2 & ~P2)
1425      *                         <=  (C1 | P1) | ~C2
1426      *                         <=  (C1 | ~C2) | P1
1427      * (which results in actually simpler code than the non-inverted case)
1428      * */
1429
1430     if ((ANYOF_FLAGS(or_with) & ANYOF_INVERT)
1431         && ! is_ANYOF_SYNTHETIC(or_with))
1432     {
1433         /* We ignore P2, leaving P1 going forward */
1434     }   /* else  Not inverted */
1435     else if (ANYOF_FLAGS(or_with) & ANYOF_MATCHES_POSIXL) {
1436         ANYOF_POSIXL_OR((regnode_charclass_posixl*)or_with, ssc);
1437         if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1438             unsigned int i;
1439             for (i = 0; i < ANYOF_MAX; i += 2) {
1440                 if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i + 1))
1441                 {
1442                     ssc_match_all_cp(ssc);
1443                     ANYOF_POSIXL_CLEAR(ssc, i);
1444                     ANYOF_POSIXL_CLEAR(ssc, i+1);
1445                 }
1446             }
1447         }
1448     }
1449
1450     ssc_union(ssc,
1451               ored_cp_list,
1452               FALSE /* Already has been inverted */
1453               );
1454 }
1455
1456 PERL_STATIC_INLINE void
1457 S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert2nd)
1458 {
1459     PERL_ARGS_ASSERT_SSC_UNION;
1460
1461     assert(is_ANYOF_SYNTHETIC(ssc));
1462
1463     _invlist_union_maybe_complement_2nd(ssc->invlist,
1464                                         invlist,
1465                                         invert2nd,
1466                                         &ssc->invlist);
1467 }
1468
1469 PERL_STATIC_INLINE void
1470 S_ssc_intersection(pTHX_ regnode_ssc *ssc,
1471                          SV* const invlist,
1472                          const bool invert2nd)
1473 {
1474     PERL_ARGS_ASSERT_SSC_INTERSECTION;
1475
1476     assert(is_ANYOF_SYNTHETIC(ssc));
1477
1478     _invlist_intersection_maybe_complement_2nd(ssc->invlist,
1479                                                invlist,
1480                                                invert2nd,
1481                                                &ssc->invlist);
1482 }
1483
1484 PERL_STATIC_INLINE void
1485 S_ssc_add_range(pTHX_ regnode_ssc *ssc, const UV start, const UV end)
1486 {
1487     PERL_ARGS_ASSERT_SSC_ADD_RANGE;
1488
1489     assert(is_ANYOF_SYNTHETIC(ssc));
1490
1491     ssc->invlist = _add_range_to_invlist(ssc->invlist, start, end);
1492 }
1493
1494 PERL_STATIC_INLINE void
1495 S_ssc_cp_and(pTHX_ regnode_ssc *ssc, const UV cp)
1496 {
1497     /* AND just the single code point 'cp' into the SSC 'ssc' */
1498
1499     SV* cp_list = _new_invlist(2);
1500
1501     PERL_ARGS_ASSERT_SSC_CP_AND;
1502
1503     assert(is_ANYOF_SYNTHETIC(ssc));
1504
1505     cp_list = add_cp_to_invlist(cp_list, cp);
1506     ssc_intersection(ssc, cp_list,
1507                      FALSE /* Not inverted */
1508                      );
1509     SvREFCNT_dec_NN(cp_list);
1510 }
1511
1512 PERL_STATIC_INLINE void
1513 S_ssc_clear_locale(regnode_ssc *ssc)
1514 {
1515     /* Set the SSC 'ssc' to not match any locale things */
1516     PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE;
1517
1518     assert(is_ANYOF_SYNTHETIC(ssc));
1519
1520     ANYOF_POSIXL_ZERO(ssc);
1521     ANYOF_FLAGS(ssc) &= ~ANYOF_LOCALE_FLAGS;
1522 }
1523
1524 #define NON_OTHER_COUNT   NON_OTHER_COUNT_FOR_USE_ONLY_BY_REGCOMP_DOT_C
1525
1526 STATIC bool
1527 S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc)
1528 {
1529     /* The synthetic start class is used to hopefully quickly winnow down
1530      * places where a pattern could start a match in the target string.  If it
1531      * doesn't really narrow things down that much, there isn't much point to
1532      * having the overhead of using it.  This function uses some very crude
1533      * heuristics to decide if to use the ssc or not.
1534      *
1535      * It returns TRUE if 'ssc' rules out more than half what it considers to
1536      * be the "likely" possible matches, but of course it doesn't know what the
1537      * actual things being matched are going to be; these are only guesses
1538      *
1539      * For /l matches, it assumes that the only likely matches are going to be
1540      *      in the 0-255 range, uniformly distributed, so half of that is 127
1541      * For /a and /d matches, it assumes that the likely matches will be just
1542      *      the ASCII range, so half of that is 63
1543      * For /u and there isn't anything matching above the Latin1 range, it
1544      *      assumes that that is the only range likely to be matched, and uses
1545      *      half that as the cut-off: 127.  If anything matches above Latin1,
1546      *      it assumes that all of Unicode could match (uniformly), except for
1547      *      non-Unicode code points and things in the General Category "Other"
1548      *      (unassigned, private use, surrogates, controls and formats).  This
1549      *      is a much large number. */
1550
1551     const U32 max_match = (LOC)
1552                           ? 127
1553                           : (! UNI_SEMANTICS)
1554                             ? 63
1555                             : (invlist_highest(ssc->invlist) < 256)
1556                               ? 127
1557                               : ((NON_OTHER_COUNT + 1) / 2) - 1;
1558     U32 count = 0;      /* Running total of number of code points matched by
1559                            'ssc' */
1560     UV start, end;      /* Start and end points of current range in inversion
1561                            list */
1562
1563     PERL_ARGS_ASSERT_IS_SSC_WORTH_IT;
1564
1565     invlist_iterinit(ssc->invlist);
1566     while (invlist_iternext(ssc->invlist, &start, &end)) {
1567
1568         /* /u is the only thing that we expect to match above 255; so if not /u
1569          * and even if there are matches above 255, ignore them.  This catches
1570          * things like \d under /d which does match the digits above 255, but
1571          * since the pattern is /d, it is not likely to be expecting them */
1572         if (! UNI_SEMANTICS) {
1573             if (start > 255) {
1574                 break;
1575             }
1576             end = MIN(end, 255);
1577         }
1578         count += end - start + 1;
1579         if (count > max_match) {
1580             invlist_iterfinish(ssc->invlist);
1581             return FALSE;
1582         }
1583     }
1584
1585     return TRUE;
1586 }
1587
1588
1589 STATIC void
1590 S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc)
1591 {
1592     /* The inversion list in the SSC is marked mortal; now we need a more
1593      * permanent copy, which is stored the same way that is done in a regular
1594      * ANYOF node, with the first NUM_ANYOF_CODE_POINTS code points in a bit
1595      * map */
1596
1597     SV* invlist = invlist_clone(ssc->invlist);
1598
1599     PERL_ARGS_ASSERT_SSC_FINALIZE;
1600
1601     assert(is_ANYOF_SYNTHETIC(ssc));
1602
1603     /* The code in this file assumes that all but these flags aren't relevant
1604      * to the SSC, except SSC_MATCHES_EMPTY_STRING, which should be cleared
1605      * by the time we reach here */
1606     assert(! (ANYOF_FLAGS(ssc) & ~ANYOF_COMMON_FLAGS));
1607
1608     populate_ANYOF_from_invlist( (regnode *) ssc, &invlist);
1609
1610     set_ANYOF_arg(pRExC_state, (regnode *) ssc, invlist,
1611                                 NULL, NULL, NULL, FALSE);
1612
1613     /* Make sure is clone-safe */
1614     ssc->invlist = NULL;
1615
1616     if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) {
1617         ANYOF_FLAGS(ssc) |= ANYOF_MATCHES_POSIXL;
1618     }
1619
1620     assert(! (ANYOF_FLAGS(ssc) & ANYOF_LOCALE_FLAGS) || RExC_contains_locale);
1621 }
1622
1623 #define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ]
1624 #define TRIE_LIST_CUR(state)  ( TRIE_LIST_ITEM( state, 0 ).forid )
1625 #define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate )
1626 #define TRIE_LIST_USED(idx)  ( trie->states[state].trans.list         \
1627                                ? (TRIE_LIST_CUR( idx ) - 1)           \
1628                                : 0 )
1629
1630
1631 #ifdef DEBUGGING
1632 /*
1633    dump_trie(trie,widecharmap,revcharmap)
1634    dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc)
1635    dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc)
1636
1637    These routines dump out a trie in a somewhat readable format.
1638    The _interim_ variants are used for debugging the interim
1639    tables that are used to generate the final compressed
1640    representation which is what dump_trie expects.
1641
1642    Part of the reason for their existence is to provide a form
1643    of documentation as to how the different representations function.
1644
1645 */
1646
1647 /*
1648   Dumps the final compressed table form of the trie to Perl_debug_log.
1649   Used for debugging make_trie().
1650 */
1651
1652 STATIC void
1653 S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap,
1654             AV *revcharmap, U32 depth)
1655 {
1656     U32 state;
1657     SV *sv=sv_newmortal();
1658     int colwidth= widecharmap ? 6 : 4;
1659     U16 word;
1660     GET_RE_DEBUG_FLAGS_DECL;
1661
1662     PERL_ARGS_ASSERT_DUMP_TRIE;
1663
1664     PerlIO_printf( Perl_debug_log, "%*sChar : %-6s%-6s%-4s ",
1665         (int)depth * 2 + 2,"",
1666         "Match","Base","Ofs" );
1667
1668     for( state = 0 ; state < trie->uniquecharcount ; state++ ) {
1669         SV ** const tmp = av_fetch( revcharmap, state, 0);
1670         if ( tmp ) {
1671             PerlIO_printf( Perl_debug_log, "%*s",
1672                 colwidth,
1673                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1674                             PL_colors[0], PL_colors[1],
1675                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1676                             PERL_PV_ESCAPE_FIRSTCHAR
1677                 )
1678             );
1679         }
1680     }
1681     PerlIO_printf( Perl_debug_log, "\n%*sState|-----------------------",
1682         (int)depth * 2 + 2,"");
1683
1684     for( state = 0 ; state < trie->uniquecharcount ; state++ )
1685         PerlIO_printf( Perl_debug_log, "%.*s", colwidth, "--------");
1686     PerlIO_printf( Perl_debug_log, "\n");
1687
1688     for( state = 1 ; state < trie->statecount ; state++ ) {
1689         const U32 base = trie->states[ state ].trans.base;
1690
1691         PerlIO_printf( Perl_debug_log, "%*s#%4"UVXf"|",
1692                                        (int)depth * 2 + 2,"", (UV)state);
1693
1694         if ( trie->states[ state ].wordnum ) {
1695             PerlIO_printf( Perl_debug_log, " W%4X",
1696                                            trie->states[ state ].wordnum );
1697         } else {
1698             PerlIO_printf( Perl_debug_log, "%6s", "" );
1699         }
1700
1701         PerlIO_printf( Perl_debug_log, " @%4"UVXf" ", (UV)base );
1702
1703         if ( base ) {
1704             U32 ofs = 0;
1705
1706             while( ( base + ofs  < trie->uniquecharcount ) ||
1707                    ( base + ofs - trie->uniquecharcount < trie->lasttrans
1708                      && trie->trans[ base + ofs - trie->uniquecharcount ].check
1709                                                                     != state))
1710                     ofs++;
1711
1712             PerlIO_printf( Perl_debug_log, "+%2"UVXf"[ ", (UV)ofs);
1713
1714             for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
1715                 if ( ( base + ofs >= trie->uniquecharcount )
1716                         && ( base + ofs - trie->uniquecharcount
1717                                                         < trie->lasttrans )
1718                         && trie->trans[ base + ofs
1719                                     - trie->uniquecharcount ].check == state )
1720                 {
1721                    PerlIO_printf( Perl_debug_log, "%*"UVXf,
1722                     colwidth,
1723                     (UV)trie->trans[ base + ofs
1724                                              - trie->uniquecharcount ].next );
1725                 } else {
1726                     PerlIO_printf( Perl_debug_log, "%*s",colwidth,"   ." );
1727                 }
1728             }
1729
1730             PerlIO_printf( Perl_debug_log, "]");
1731
1732         }
1733         PerlIO_printf( Perl_debug_log, "\n" );
1734     }
1735     PerlIO_printf(Perl_debug_log, "%*sword_info N:(prev,len)=",
1736                                 (int)depth*2, "");
1737     for (word=1; word <= trie->wordcount; word++) {
1738         PerlIO_printf(Perl_debug_log, " %d:(%d,%d)",
1739             (int)word, (int)(trie->wordinfo[word].prev),
1740             (int)(trie->wordinfo[word].len));
1741     }
1742     PerlIO_printf(Perl_debug_log, "\n" );
1743 }
1744 /*
1745   Dumps a fully constructed but uncompressed trie in list form.
1746   List tries normally only are used for construction when the number of
1747   possible chars (trie->uniquecharcount) is very high.
1748   Used for debugging make_trie().
1749 */
1750 STATIC void
1751 S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie,
1752                          HV *widecharmap, AV *revcharmap, U32 next_alloc,
1753                          U32 depth)
1754 {
1755     U32 state;
1756     SV *sv=sv_newmortal();
1757     int colwidth= widecharmap ? 6 : 4;
1758     GET_RE_DEBUG_FLAGS_DECL;
1759
1760     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST;
1761
1762     /* print out the table precompression.  */
1763     PerlIO_printf( Perl_debug_log, "%*sState :Word | Transition Data\n%*s%s",
1764         (int)depth * 2 + 2,"", (int)depth * 2 + 2,"",
1765         "------:-----+-----------------\n" );
1766
1767     for( state=1 ; state < next_alloc ; state ++ ) {
1768         U16 charid;
1769
1770         PerlIO_printf( Perl_debug_log, "%*s %4"UVXf" :",
1771             (int)depth * 2 + 2,"", (UV)state  );
1772         if ( ! trie->states[ state ].wordnum ) {
1773             PerlIO_printf( Perl_debug_log, "%5s| ","");
1774         } else {
1775             PerlIO_printf( Perl_debug_log, "W%4x| ",
1776                 trie->states[ state ].wordnum
1777             );
1778         }
1779         for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) {
1780             SV ** const tmp = av_fetch( revcharmap,
1781                                         TRIE_LIST_ITEM(state,charid).forid, 0);
1782             if ( tmp ) {
1783                 PerlIO_printf( Perl_debug_log, "%*s:%3X=%4"UVXf" | ",
1784                     colwidth,
1785                     pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp),
1786                               colwidth,
1787                               PL_colors[0], PL_colors[1],
1788                               (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0)
1789                               | PERL_PV_ESCAPE_FIRSTCHAR
1790                     ) ,
1791                     TRIE_LIST_ITEM(state,charid).forid,
1792                     (UV)TRIE_LIST_ITEM(state,charid).newstate
1793                 );
1794                 if (!(charid % 10))
1795                     PerlIO_printf(Perl_debug_log, "\n%*s| ",
1796                         (int)((depth * 2) + 14), "");
1797             }
1798         }
1799         PerlIO_printf( Perl_debug_log, "\n");
1800     }
1801 }
1802
1803 /*
1804   Dumps a fully constructed but uncompressed trie in table form.
1805   This is the normal DFA style state transition table, with a few
1806   twists to facilitate compression later.
1807   Used for debugging make_trie().
1808 */
1809 STATIC void
1810 S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie,
1811                           HV *widecharmap, AV *revcharmap, U32 next_alloc,
1812                           U32 depth)
1813 {
1814     U32 state;
1815     U16 charid;
1816     SV *sv=sv_newmortal();
1817     int colwidth= widecharmap ? 6 : 4;
1818     GET_RE_DEBUG_FLAGS_DECL;
1819
1820     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE;
1821
1822     /*
1823        print out the table precompression so that we can do a visual check
1824        that they are identical.
1825      */
1826
1827     PerlIO_printf( Perl_debug_log, "%*sChar : ",(int)depth * 2 + 2,"" );
1828
1829     for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1830         SV ** const tmp = av_fetch( revcharmap, charid, 0);
1831         if ( tmp ) {
1832             PerlIO_printf( Perl_debug_log, "%*s",
1833                 colwidth,
1834                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1835                             PL_colors[0], PL_colors[1],
1836                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1837                             PERL_PV_ESCAPE_FIRSTCHAR
1838                 )
1839             );
1840         }
1841     }
1842
1843     PerlIO_printf( Perl_debug_log, "\n%*sState+-",(int)depth * 2 + 2,"" );
1844
1845     for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) {
1846         PerlIO_printf( Perl_debug_log, "%.*s", colwidth,"--------");
1847     }
1848
1849     PerlIO_printf( Perl_debug_log, "\n" );
1850
1851     for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) {
1852
1853         PerlIO_printf( Perl_debug_log, "%*s%4"UVXf" : ",
1854             (int)depth * 2 + 2,"",
1855             (UV)TRIE_NODENUM( state ) );
1856
1857         for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1858             UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next );
1859             if (v)
1860                 PerlIO_printf( Perl_debug_log, "%*"UVXf, colwidth, v );
1861             else
1862                 PerlIO_printf( Perl_debug_log, "%*s", colwidth, "." );
1863         }
1864         if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) {
1865             PerlIO_printf( Perl_debug_log, " (%4"UVXf")\n",
1866                                             (UV)trie->trans[ state ].check );
1867         } else {
1868             PerlIO_printf( Perl_debug_log, " (%4"UVXf") W%4X\n",
1869                                             (UV)trie->trans[ state ].check,
1870             trie->states[ TRIE_NODENUM( state ) ].wordnum );
1871         }
1872     }
1873 }
1874
1875 #endif
1876
1877
1878 /* make_trie(startbranch,first,last,tail,word_count,flags,depth)
1879   startbranch: the first branch in the whole branch sequence
1880   first      : start branch of sequence of branch-exact nodes.
1881                May be the same as startbranch
1882   last       : Thing following the last branch.
1883                May be the same as tail.
1884   tail       : item following the branch sequence
1885   count      : words in the sequence
1886   flags      : currently the OP() type we will be building one of /EXACT(|F|FA|FU|FU_SS|L|FLU8)/
1887   depth      : indent depth
1888
1889 Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node.
1890
1891 A trie is an N'ary tree where the branches are determined by digital
1892 decomposition of the key. IE, at the root node you look up the 1st character and
1893 follow that branch repeat until you find the end of the branches. Nodes can be
1894 marked as "accepting" meaning they represent a complete word. Eg:
1895
1896   /he|she|his|hers/
1897
1898 would convert into the following structure. Numbers represent states, letters
1899 following numbers represent valid transitions on the letter from that state, if
1900 the number is in square brackets it represents an accepting state, otherwise it
1901 will be in parenthesis.
1902
1903       +-h->+-e->[3]-+-r->(8)-+-s->[9]
1904       |    |
1905       |   (2)
1906       |    |
1907      (1)   +-i->(6)-+-s->[7]
1908       |
1909       +-s->(3)-+-h->(4)-+-e->[5]
1910
1911       Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers)
1912
1913 This shows that when matching against the string 'hers' we will begin at state 1
1914 read 'h' and move to state 2, read 'e' and move to state 3 which is accepting,
1915 then read 'r' and go to state 8 followed by 's' which takes us to state 9 which
1916 is also accepting. Thus we know that we can match both 'he' and 'hers' with a
1917 single traverse. We store a mapping from accepting to state to which word was
1918 matched, and then when we have multiple possibilities we try to complete the
1919 rest of the regex in the order in which they occured in the alternation.
1920
1921 The only prior NFA like behaviour that would be changed by the TRIE support is
1922 the silent ignoring of duplicate alternations which are of the form:
1923
1924  / (DUPE|DUPE) X? (?{ ... }) Y /x
1925
1926 Thus EVAL blocks following a trie may be called a different number of times with
1927 and without the optimisation. With the optimisations dupes will be silently
1928 ignored. This inconsistent behaviour of EVAL type nodes is well established as
1929 the following demonstrates:
1930
1931  'words'=~/(word|word|word)(?{ print $1 })[xyz]/
1932
1933 which prints out 'word' three times, but
1934
1935  'words'=~/(word|word|word)(?{ print $1 })S/
1936
1937 which doesnt print it out at all. This is due to other optimisations kicking in.
1938
1939 Example of what happens on a structural level:
1940
1941 The regexp /(ac|ad|ab)+/ will produce the following debug output:
1942
1943    1: CURLYM[1] {1,32767}(18)
1944    5:   BRANCH(8)
1945    6:     EXACT <ac>(16)
1946    8:   BRANCH(11)
1947    9:     EXACT <ad>(16)
1948   11:   BRANCH(14)
1949   12:     EXACT <ab>(16)
1950   16:   SUCCEED(0)
1951   17:   NOTHING(18)
1952   18: END(0)
1953
1954 This would be optimizable with startbranch=5, first=5, last=16, tail=16
1955 and should turn into:
1956
1957    1: CURLYM[1] {1,32767}(18)
1958    5:   TRIE(16)
1959         [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1]
1960           <ac>
1961           <ad>
1962           <ab>
1963   16:   SUCCEED(0)
1964   17:   NOTHING(18)
1965   18: END(0)
1966
1967 Cases where tail != last would be like /(?foo|bar)baz/:
1968
1969    1: BRANCH(4)
1970    2:   EXACT <foo>(8)
1971    4: BRANCH(7)
1972    5:   EXACT <bar>(8)
1973    7: TAIL(8)
1974    8: EXACT <baz>(10)
1975   10: END(0)
1976
1977 which would be optimizable with startbranch=1, first=1, last=7, tail=8
1978 and would end up looking like:
1979
1980     1: TRIE(8)
1981       [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1]
1982         <foo>
1983         <bar>
1984    7: TAIL(8)
1985    8: EXACT <baz>(10)
1986   10: END(0)
1987
1988     d = uvchr_to_utf8_flags(d, uv, 0);
1989
1990 is the recommended Unicode-aware way of saying
1991
1992     *(d++) = uv;
1993 */
1994
1995 #define TRIE_STORE_REVCHAR(val)                                            \
1996     STMT_START {                                                           \
1997         if (UTF) {                                                         \
1998             SV *zlopp = newSV(7); /* XXX: optimize me */                   \
1999             unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp);      \
2000             unsigned const char *const kapow = uvchr_to_utf8(flrbbbbb, val); \
2001             SvCUR_set(zlopp, kapow - flrbbbbb);                            \
2002             SvPOK_on(zlopp);                                               \
2003             SvUTF8_on(zlopp);                                              \
2004             av_push(revcharmap, zlopp);                                    \
2005         } else {                                                           \
2006             char ooooff = (char)val;                                           \
2007             av_push(revcharmap, newSVpvn(&ooooff, 1));                     \
2008         }                                                                  \
2009         } STMT_END
2010
2011 /* This gets the next character from the input, folding it if not already
2012  * folded. */
2013 #define TRIE_READ_CHAR STMT_START {                                           \
2014     wordlen++;                                                                \
2015     if ( UTF ) {                                                              \
2016         /* if it is UTF then it is either already folded, or does not need    \
2017          * folding */                                                         \
2018         uvc = valid_utf8_to_uvchr( (const U8*) uc, &len);                     \
2019     }                                                                         \
2020     else if (folder == PL_fold_latin1) {                                      \
2021         /* This folder implies Unicode rules, which in the range expressible  \
2022          *  by not UTF is the lower case, with the two exceptions, one of     \
2023          *  which should have been taken care of before calling this */       \
2024         assert(*uc != LATIN_SMALL_LETTER_SHARP_S);                            \
2025         uvc = toLOWER_L1(*uc);                                                \
2026         if (UNLIKELY(uvc == MICRO_SIGN)) uvc = GREEK_SMALL_LETTER_MU;         \
2027         len = 1;                                                              \
2028     } else {                                                                  \
2029         /* raw data, will be folded later if needed */                        \
2030         uvc = (U32)*uc;                                                       \
2031         len = 1;                                                              \
2032     }                                                                         \
2033 } STMT_END
2034
2035
2036
2037 #define TRIE_LIST_PUSH(state,fid,ns) STMT_START {               \
2038     if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) {    \
2039         U32 ging = TRIE_LIST_LEN( state ) *= 2;                 \
2040         Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \
2041     }                                                           \
2042     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid;     \
2043     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns;   \
2044     TRIE_LIST_CUR( state )++;                                   \
2045 } STMT_END
2046
2047 #define TRIE_LIST_NEW(state) STMT_START {                       \
2048     Newxz( trie->states[ state ].trans.list,               \
2049         4, reg_trie_trans_le );                                 \
2050      TRIE_LIST_CUR( state ) = 1;                                \
2051      TRIE_LIST_LEN( state ) = 4;                                \
2052 } STMT_END
2053
2054 #define TRIE_HANDLE_WORD(state) STMT_START {                    \
2055     U16 dupe= trie->states[ state ].wordnum;                    \
2056     regnode * const noper_next = regnext( noper );              \
2057                                                                 \
2058     DEBUG_r({                                                   \
2059         /* store the word for dumping */                        \
2060         SV* tmp;                                                \
2061         if (OP(noper) != NOTHING)                               \
2062             tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF);    \
2063         else                                                    \
2064             tmp = newSVpvn_utf8( "", 0, UTF );                  \
2065         av_push( trie_words, tmp );                             \
2066     });                                                         \
2067                                                                 \
2068     curword++;                                                  \
2069     trie->wordinfo[curword].prev   = 0;                         \
2070     trie->wordinfo[curword].len    = wordlen;                   \
2071     trie->wordinfo[curword].accept = state;                     \
2072                                                                 \
2073     if ( noper_next < tail ) {                                  \
2074         if (!trie->jump)                                        \
2075             trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, \
2076                                                  sizeof(U16) ); \
2077         trie->jump[curword] = (U16)(noper_next - convert);      \
2078         if (!jumper)                                            \
2079             jumper = noper_next;                                \
2080         if (!nextbranch)                                        \
2081             nextbranch= regnext(cur);                           \
2082     }                                                           \
2083                                                                 \
2084     if ( dupe ) {                                               \
2085         /* It's a dupe. Pre-insert into the wordinfo[].prev   */\
2086         /* chain, so that when the bits of chain are later    */\
2087         /* linked together, the dups appear in the chain      */\
2088         trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \
2089         trie->wordinfo[dupe].prev = curword;                    \
2090     } else {                                                    \
2091         /* we haven't inserted this word yet.                */ \
2092         trie->states[ state ].wordnum = curword;                \
2093     }                                                           \
2094 } STMT_END
2095
2096
2097 #define TRIE_TRANS_STATE(state,base,ucharcount,charid,special)          \
2098      ( ( base + charid >=  ucharcount                                   \
2099          && base + charid < ubound                                      \
2100          && state == trie->trans[ base - ucharcount + charid ].check    \
2101          && trie->trans[ base - ucharcount + charid ].next )            \
2102            ? trie->trans[ base - ucharcount + charid ].next             \
2103            : ( state==1 ? special : 0 )                                 \
2104       )
2105
2106 #define MADE_TRIE       1
2107 #define MADE_JUMP_TRIE  2
2108 #define MADE_EXACT_TRIE 4
2109
2110 STATIC I32
2111 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
2112                   regnode *first, regnode *last, regnode *tail,
2113                   U32 word_count, U32 flags, U32 depth)
2114 {
2115     /* first pass, loop through and scan words */
2116     reg_trie_data *trie;
2117     HV *widecharmap = NULL;
2118     AV *revcharmap = newAV();
2119     regnode *cur;
2120     STRLEN len = 0;
2121     UV uvc = 0;
2122     U16 curword = 0;
2123     U32 next_alloc = 0;
2124     regnode *jumper = NULL;
2125     regnode *nextbranch = NULL;
2126     regnode *convert = NULL;
2127     U32 *prev_states; /* temp array mapping each state to previous one */
2128     /* we just use folder as a flag in utf8 */
2129     const U8 * folder = NULL;
2130
2131 #ifdef DEBUGGING
2132     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tuuu"));
2133     AV *trie_words = NULL;
2134     /* along with revcharmap, this only used during construction but both are
2135      * useful during debugging so we store them in the struct when debugging.
2136      */
2137 #else
2138     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tu"));
2139     STRLEN trie_charcount=0;
2140 #endif
2141     SV *re_trie_maxbuff;
2142     GET_RE_DEBUG_FLAGS_DECL;
2143
2144     PERL_ARGS_ASSERT_MAKE_TRIE;
2145 #ifndef DEBUGGING
2146     PERL_UNUSED_ARG(depth);
2147 #endif
2148
2149     switch (flags) {
2150         case EXACT: case EXACTL: break;
2151         case EXACTFA:
2152         case EXACTFU_SS:
2153         case EXACTFU:
2154         case EXACTFLU8: folder = PL_fold_latin1; break;
2155         case EXACTF:  folder = PL_fold; break;
2156         default: Perl_croak( aTHX_ "panic! In trie construction, unknown node type %u %s", (unsigned) flags, PL_reg_name[flags] );
2157     }
2158
2159     trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) );
2160     trie->refcount = 1;
2161     trie->startstate = 1;
2162     trie->wordcount = word_count;
2163     RExC_rxi->data->data[ data_slot ] = (void*)trie;
2164     trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) );
2165     if (flags == EXACT || flags == EXACTL)
2166         trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 );
2167     trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc(
2168                        trie->wordcount+1, sizeof(reg_trie_wordinfo));
2169
2170     DEBUG_r({
2171         trie_words = newAV();
2172     });
2173
2174     re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
2175     assert(re_trie_maxbuff);
2176     if (!SvIOK(re_trie_maxbuff)) {
2177         sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
2178     }
2179     DEBUG_TRIE_COMPILE_r({
2180         PerlIO_printf( Perl_debug_log,
2181           "%*smake_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n",
2182           (int)depth * 2 + 2, "",
2183           REG_NODE_NUM(startbranch),REG_NODE_NUM(first),
2184           REG_NODE_NUM(last), REG_NODE_NUM(tail), (int)depth);
2185     });
2186
2187    /* Find the node we are going to overwrite */
2188     if ( first == startbranch && OP( last ) != BRANCH ) {
2189         /* whole branch chain */
2190         convert = first;
2191     } else {
2192         /* branch sub-chain */
2193         convert = NEXTOPER( first );
2194     }
2195
2196     /*  -- First loop and Setup --
2197
2198        We first traverse the branches and scan each word to determine if it
2199        contains widechars, and how many unique chars there are, this is
2200        important as we have to build a table with at least as many columns as we
2201        have unique chars.
2202
2203        We use an array of integers to represent the character codes 0..255
2204        (trie->charmap) and we use a an HV* to store Unicode characters. We use
2205        the native representation of the character value as the key and IV's for
2206        the coded index.
2207
2208        *TODO* If we keep track of how many times each character is used we can
2209        remap the columns so that the table compression later on is more
2210        efficient in terms of memory by ensuring the most common value is in the
2211        middle and the least common are on the outside.  IMO this would be better
2212        than a most to least common mapping as theres a decent chance the most
2213        common letter will share a node with the least common, meaning the node
2214        will not be compressible. With a middle is most common approach the worst
2215        case is when we have the least common nodes twice.
2216
2217      */
2218
2219     for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2220         regnode *noper = NEXTOPER( cur );
2221         const U8 *uc = (U8*)STRING( noper );
2222         const U8 *e  = uc + STR_LEN( noper );
2223         int foldlen = 0;
2224         U32 wordlen      = 0;         /* required init */
2225         STRLEN minchars = 0;
2226         STRLEN maxchars = 0;
2227         bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the
2228                                                bitmap?*/
2229
2230         if (OP(noper) == NOTHING) {
2231             regnode *noper_next= regnext(noper);
2232             if (noper_next != tail && OP(noper_next) == flags) {
2233                 noper = noper_next;
2234                 uc= (U8*)STRING(noper);
2235                 e= uc + STR_LEN(noper);
2236                 trie->minlen= STR_LEN(noper);
2237             } else {
2238                 trie->minlen= 0;
2239                 continue;
2240             }
2241         }
2242
2243         if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */
2244             TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
2245                                           regardless of encoding */
2246             if (OP( noper ) == EXACTFU_SS) {
2247                 /* false positives are ok, so just set this */
2248                 TRIE_BITMAP_SET(trie, LATIN_SMALL_LETTER_SHARP_S);
2249             }
2250         }
2251         for ( ; uc < e ; uc += len ) {  /* Look at each char in the current
2252                                            branch */
2253             TRIE_CHARCOUNT(trie)++;
2254             TRIE_READ_CHAR;
2255
2256             /* TRIE_READ_CHAR returns the current character, or its fold if /i
2257              * is in effect.  Under /i, this character can match itself, or
2258              * anything that folds to it.  If not under /i, it can match just
2259              * itself.  Most folds are 1-1, for example k, K, and KELVIN SIGN
2260              * all fold to k, and all are single characters.   But some folds
2261              * expand to more than one character, so for example LATIN SMALL
2262              * LIGATURE FFI folds to the three character sequence 'ffi'.  If
2263              * the string beginning at 'uc' is 'ffi', it could be matched by
2264              * three characters, or just by the one ligature character. (It
2265              * could also be matched by two characters: LATIN SMALL LIGATURE FF
2266              * followed by 'i', or by 'f' followed by LATIN SMALL LIGATURE FI).
2267              * (Of course 'I' and/or 'F' instead of 'i' and 'f' can also
2268              * match.)  The trie needs to know the minimum and maximum number
2269              * of characters that could match so that it can use size alone to
2270              * quickly reject many match attempts.  The max is simple: it is
2271              * the number of folded characters in this branch (since a fold is
2272              * never shorter than what folds to it. */
2273
2274             maxchars++;
2275
2276             /* And the min is equal to the max if not under /i (indicated by
2277              * 'folder' being NULL), or there are no multi-character folds.  If
2278              * there is a multi-character fold, the min is incremented just
2279              * once, for the character that folds to the sequence.  Each
2280              * character in the sequence needs to be added to the list below of
2281              * characters in the trie, but we count only the first towards the
2282              * min number of characters needed.  This is done through the
2283              * variable 'foldlen', which is returned by the macros that look
2284              * for these sequences as the number of bytes the sequence
2285              * occupies.  Each time through the loop, we decrement 'foldlen' by
2286              * how many bytes the current char occupies.  Only when it reaches
2287              * 0 do we increment 'minchars' or look for another multi-character
2288              * sequence. */
2289             if (folder == NULL) {
2290                 minchars++;
2291             }
2292             else if (foldlen > 0) {
2293                 foldlen -= (UTF) ? UTF8SKIP(uc) : 1;
2294             }
2295             else {
2296                 minchars++;
2297
2298                 /* See if *uc is the beginning of a multi-character fold.  If
2299                  * so, we decrement the length remaining to look at, to account
2300                  * for the current character this iteration.  (We can use 'uc'
2301                  * instead of the fold returned by TRIE_READ_CHAR because for
2302                  * non-UTF, the latin1_safe macro is smart enough to account
2303                  * for all the unfolded characters, and because for UTF, the
2304                  * string will already have been folded earlier in the
2305                  * compilation process */
2306                 if (UTF) {
2307                     if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) {
2308                         foldlen -= UTF8SKIP(uc);
2309                     }
2310                 }
2311                 else if ((foldlen = is_MULTI_CHAR_FOLD_latin1_safe(uc, e))) {
2312                     foldlen--;
2313                 }
2314             }
2315
2316             /* The current character (and any potential folds) should be added
2317              * to the possible matching characters for this position in this
2318              * branch */
2319             if ( uvc < 256 ) {
2320                 if ( folder ) {
2321                     U8 folded= folder[ (U8) uvc ];
2322                     if ( !trie->charmap[ folded ] ) {
2323                         trie->charmap[ folded ]=( ++trie->uniquecharcount );
2324                         TRIE_STORE_REVCHAR( folded );
2325                     }
2326                 }
2327                 if ( !trie->charmap[ uvc ] ) {
2328                     trie->charmap[ uvc ]=( ++trie->uniquecharcount );
2329                     TRIE_STORE_REVCHAR( uvc );
2330                 }
2331                 if ( set_bit ) {
2332                     /* store the codepoint in the bitmap, and its folded
2333                      * equivalent. */
2334                     TRIE_BITMAP_SET(trie, uvc);
2335
2336                     /* store the folded codepoint */
2337                     if ( folder ) TRIE_BITMAP_SET(trie, folder[(U8) uvc ]);
2338
2339                     if ( !UTF ) {
2340                         /* store first byte of utf8 representation of
2341                            variant codepoints */
2342                         if (! UVCHR_IS_INVARIANT(uvc)) {
2343                             TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc));
2344                         }
2345                     }
2346                     set_bit = 0; /* We've done our bit :-) */
2347                 }
2348             } else {
2349
2350                 /* XXX We could come up with the list of code points that fold
2351                  * to this using PL_utf8_foldclosures, except not for
2352                  * multi-char folds, as there may be multiple combinations
2353                  * there that could work, which needs to wait until runtime to
2354                  * resolve (The comment about LIGATURE FFI above is such an
2355                  * example */
2356
2357                 SV** svpp;
2358                 if ( !widecharmap )
2359                     widecharmap = newHV();
2360
2361                 svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 );
2362
2363                 if ( !svpp )
2364                     Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%"UVXf, uvc );
2365
2366                 if ( !SvTRUE( *svpp ) ) {
2367                     sv_setiv( *svpp, ++trie->uniquecharcount );
2368                     TRIE_STORE_REVCHAR(uvc);
2369                 }
2370             }
2371         } /* end loop through characters in this branch of the trie */
2372
2373         /* We take the min and max for this branch and combine to find the min
2374          * and max for all branches processed so far */
2375         if( cur == first ) {
2376             trie->minlen = minchars;
2377             trie->maxlen = maxchars;
2378         } else if (minchars < trie->minlen) {
2379             trie->minlen = minchars;
2380         } else if (maxchars > trie->maxlen) {
2381             trie->maxlen = maxchars;
2382         }
2383     } /* end first pass */
2384     DEBUG_TRIE_COMPILE_r(
2385         PerlIO_printf( Perl_debug_log,
2386                 "%*sTRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n",
2387                 (int)depth * 2 + 2,"",
2388                 ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count,
2389                 (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount,
2390                 (int)trie->minlen, (int)trie->maxlen )
2391     );
2392
2393     /*
2394         We now know what we are dealing with in terms of unique chars and
2395         string sizes so we can calculate how much memory a naive
2396         representation using a flat table  will take. If it's over a reasonable
2397         limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory
2398         conservative but potentially much slower representation using an array
2399         of lists.
2400
2401         At the end we convert both representations into the same compressed
2402         form that will be used in regexec.c for matching with. The latter
2403         is a form that cannot be used to construct with but has memory
2404         properties similar to the list form and access properties similar
2405         to the table form making it both suitable for fast searches and
2406         small enough that its feasable to store for the duration of a program.
2407
2408         See the comment in the code where the compressed table is produced
2409         inplace from the flat tabe representation for an explanation of how
2410         the compression works.
2411
2412     */
2413
2414
2415     Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32);
2416     prev_states[1] = 0;
2417
2418     if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1)
2419                                                     > SvIV(re_trie_maxbuff) )
2420     {
2421         /*
2422             Second Pass -- Array Of Lists Representation
2423
2424             Each state will be represented by a list of charid:state records
2425             (reg_trie_trans_le) the first such element holds the CUR and LEN
2426             points of the allocated array. (See defines above).
2427
2428             We build the initial structure using the lists, and then convert
2429             it into the compressed table form which allows faster lookups
2430             (but cant be modified once converted).
2431         */
2432
2433         STRLEN transcount = 1;
2434
2435         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
2436             "%*sCompiling trie using list compiler\n",
2437             (int)depth * 2 + 2, ""));
2438
2439         trie->states = (reg_trie_state *)
2440             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
2441                                   sizeof(reg_trie_state) );
2442         TRIE_LIST_NEW(1);
2443         next_alloc = 2;
2444
2445         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2446
2447             regnode *noper   = NEXTOPER( cur );
2448             U8 *uc           = (U8*)STRING( noper );
2449             const U8 *e      = uc + STR_LEN( noper );
2450             U32 state        = 1;         /* required init */
2451             U16 charid       = 0;         /* sanity init */
2452             U32 wordlen      = 0;         /* required init */
2453
2454             if (OP(noper) == NOTHING) {
2455                 regnode *noper_next= regnext(noper);
2456                 if (noper_next != tail && OP(noper_next) == flags) {
2457                     noper = noper_next;
2458                     uc= (U8*)STRING(noper);
2459                     e= uc + STR_LEN(noper);
2460                 }
2461             }
2462
2463             if (OP(noper) != NOTHING) {
2464                 for ( ; uc < e ; uc += len ) {
2465
2466                     TRIE_READ_CHAR;
2467
2468                     if ( uvc < 256 ) {
2469                         charid = trie->charmap[ uvc ];
2470                     } else {
2471                         SV** const svpp = hv_fetch( widecharmap,
2472                                                     (char*)&uvc,
2473                                                     sizeof( UV ),
2474                                                     0);
2475                         if ( !svpp ) {
2476                             charid = 0;
2477                         } else {
2478                             charid=(U16)SvIV( *svpp );
2479                         }
2480                     }
2481                     /* charid is now 0 if we dont know the char read, or
2482                      * nonzero if we do */
2483                     if ( charid ) {
2484
2485                         U16 check;
2486                         U32 newstate = 0;
2487
2488                         charid--;
2489                         if ( !trie->states[ state ].trans.list ) {
2490                             TRIE_LIST_NEW( state );
2491                         }
2492                         for ( check = 1;
2493                               check <= TRIE_LIST_USED( state );
2494                               check++ )
2495                         {
2496                             if ( TRIE_LIST_ITEM( state, check ).forid
2497                                                                     == charid )
2498                             {
2499                                 newstate = TRIE_LIST_ITEM( state, check ).newstate;
2500                                 break;
2501                             }
2502                         }
2503                         if ( ! newstate ) {
2504                             newstate = next_alloc++;
2505                             prev_states[newstate] = state;
2506                             TRIE_LIST_PUSH( state, charid, newstate );
2507                             transcount++;
2508                         }
2509                         state = newstate;
2510                     } else {
2511                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
2512                     }
2513                 }
2514             }
2515             TRIE_HANDLE_WORD(state);
2516
2517         } /* end second pass */
2518
2519         /* next alloc is the NEXT state to be allocated */
2520         trie->statecount = next_alloc;
2521         trie->states = (reg_trie_state *)
2522             PerlMemShared_realloc( trie->states,
2523                                    next_alloc
2524                                    * sizeof(reg_trie_state) );
2525
2526         /* and now dump it out before we compress it */
2527         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap,
2528                                                          revcharmap, next_alloc,
2529                                                          depth+1)
2530         );
2531
2532         trie->trans = (reg_trie_trans *)
2533             PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) );
2534         {
2535             U32 state;
2536             U32 tp = 0;
2537             U32 zp = 0;
2538
2539
2540             for( state=1 ; state < next_alloc ; state ++ ) {
2541                 U32 base=0;
2542
2543                 /*
2544                 DEBUG_TRIE_COMPILE_MORE_r(
2545                     PerlIO_printf( Perl_debug_log, "tp: %d zp: %d ",tp,zp)
2546                 );
2547                 */
2548
2549                 if (trie->states[state].trans.list) {
2550                     U16 minid=TRIE_LIST_ITEM( state, 1).forid;
2551                     U16 maxid=minid;
2552                     U16 idx;
2553
2554                     for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
2555                         const U16 forid = TRIE_LIST_ITEM( state, idx).forid;
2556                         if ( forid < minid ) {
2557                             minid=forid;
2558                         } else if ( forid > maxid ) {
2559                             maxid=forid;
2560                         }
2561                     }
2562                     if ( transcount < tp + maxid - minid + 1) {
2563                         transcount *= 2;
2564                         trie->trans = (reg_trie_trans *)
2565                             PerlMemShared_realloc( trie->trans,
2566                                                      transcount
2567                                                      * sizeof(reg_trie_trans) );
2568                         Zero( trie->trans + (transcount / 2),
2569                               transcount / 2,
2570                               reg_trie_trans );
2571                     }
2572                     base = trie->uniquecharcount + tp - minid;
2573                     if ( maxid == minid ) {
2574                         U32 set = 0;
2575                         for ( ; zp < tp ; zp++ ) {
2576                             if ( ! trie->trans[ zp ].next ) {
2577                                 base = trie->uniquecharcount + zp - minid;
2578                                 trie->trans[ zp ].next = TRIE_LIST_ITEM( state,
2579                                                                    1).newstate;
2580                                 trie->trans[ zp ].check = state;
2581                                 set = 1;
2582                                 break;
2583                             }
2584                         }
2585                         if ( !set ) {
2586                             trie->trans[ tp ].next = TRIE_LIST_ITEM( state,
2587                                                                    1).newstate;
2588                             trie->trans[ tp ].check = state;
2589                             tp++;
2590                             zp = tp;
2591                         }
2592                     } else {
2593                         for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
2594                             const U32 tid = base
2595                                            - trie->uniquecharcount
2596                                            + TRIE_LIST_ITEM( state, idx ).forid;
2597                             trie->trans[ tid ].next = TRIE_LIST_ITEM( state,
2598                                                                 idx ).newstate;
2599                             trie->trans[ tid ].check = state;
2600                         }
2601                         tp += ( maxid - minid + 1 );
2602                     }
2603                     Safefree(trie->states[ state ].trans.list);
2604                 }
2605                 /*
2606                 DEBUG_TRIE_COMPILE_MORE_r(
2607                     PerlIO_printf( Perl_debug_log, " base: %d\n",base);
2608                 );
2609                 */
2610                 trie->states[ state ].trans.base=base;
2611             }
2612             trie->lasttrans = tp + 1;
2613         }
2614     } else {
2615         /*
2616            Second Pass -- Flat Table Representation.
2617
2618            we dont use the 0 slot of either trans[] or states[] so we add 1 to
2619            each.  We know that we will need Charcount+1 trans at most to store
2620            the data (one row per char at worst case) So we preallocate both
2621            structures assuming worst case.
2622
2623            We then construct the trie using only the .next slots of the entry
2624            structs.
2625
2626            We use the .check field of the first entry of the node temporarily
2627            to make compression both faster and easier by keeping track of how
2628            many non zero fields are in the node.
2629
2630            Since trans are numbered from 1 any 0 pointer in the table is a FAIL
2631            transition.
2632
2633            There are two terms at use here: state as a TRIE_NODEIDX() which is
2634            a number representing the first entry of the node, and state as a
2635            TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1)
2636            and TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3)
2637            if there are 2 entrys per node. eg:
2638
2639              A B       A B
2640           1. 2 4    1. 3 7
2641           2. 0 3    3. 0 5
2642           3. 0 0    5. 0 0
2643           4. 0 0    7. 0 0
2644
2645            The table is internally in the right hand, idx form. However as we
2646            also have to deal with the states array which is indexed by nodenum
2647            we have to use TRIE_NODENUM() to convert.
2648
2649         */
2650         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
2651             "%*sCompiling trie using table compiler\n",
2652             (int)depth * 2 + 2, ""));
2653
2654         trie->trans = (reg_trie_trans *)
2655             PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 )
2656                                   * trie->uniquecharcount + 1,
2657                                   sizeof(reg_trie_trans) );
2658         trie->states = (reg_trie_state *)
2659             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
2660                                   sizeof(reg_trie_state) );
2661         next_alloc = trie->uniquecharcount + 1;
2662
2663
2664         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
2665
2666             regnode *noper   = NEXTOPER( cur );
2667             const U8 *uc     = (U8*)STRING( noper );
2668             const U8 *e      = uc + STR_LEN( noper );
2669
2670             U32 state        = 1;         /* required init */
2671
2672             U16 charid       = 0;         /* sanity init */
2673             U32 accept_state = 0;         /* sanity init */
2674
2675             U32 wordlen      = 0;         /* required init */
2676
2677             if (OP(noper) == NOTHING) {
2678                 regnode *noper_next= regnext(noper);
2679                 if (noper_next != tail && OP(noper_next) == flags) {
2680                     noper = noper_next;
2681                     uc= (U8*)STRING(noper);
2682                     e= uc + STR_LEN(noper);
2683                 }
2684             }
2685
2686             if ( OP(noper) != NOTHING ) {
2687                 for ( ; uc < e ; uc += len ) {
2688
2689                     TRIE_READ_CHAR;
2690
2691                     if ( uvc < 256 ) {
2692                         charid = trie->charmap[ uvc ];
2693                     } else {
2694                         SV* const * const svpp = hv_fetch( widecharmap,
2695                                                            (char*)&uvc,
2696                                                            sizeof( UV ),
2697                                                            0);
2698                         charid = svpp ? (U16)SvIV(*svpp) : 0;
2699                     }
2700                     if ( charid ) {
2701                         charid--;
2702                         if ( !trie->trans[ state + charid ].next ) {
2703                             trie->trans[ state + charid ].next = next_alloc;
2704                             trie->trans[ state ].check++;
2705                             prev_states[TRIE_NODENUM(next_alloc)]
2706                                     = TRIE_NODENUM(state);
2707                             next_alloc += trie->uniquecharcount;
2708                         }
2709                         state = trie->trans[ state + charid ].next;
2710                     } else {
2711                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
2712                     }
2713                     /* charid is now 0 if we dont know the char read, or
2714                      * nonzero if we do */
2715                 }
2716             }
2717             accept_state = TRIE_NODENUM( state );
2718             TRIE_HANDLE_WORD(accept_state);
2719
2720         } /* end second pass */
2721
2722         /* and now dump it out before we compress it */
2723         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap,
2724                                                           revcharmap,
2725                                                           next_alloc, depth+1));
2726
2727         {
2728         /*
2729            * Inplace compress the table.*
2730
2731            For sparse data sets the table constructed by the trie algorithm will
2732            be mostly 0/FAIL transitions or to put it another way mostly empty.
2733            (Note that leaf nodes will not contain any transitions.)
2734
2735            This algorithm compresses the tables by eliminating most such
2736            transitions, at the cost of a modest bit of extra work during lookup:
2737
2738            - Each states[] entry contains a .base field which indicates the
2739            index in the state[] array wheres its transition data is stored.
2740
2741            - If .base is 0 there are no valid transitions from that node.
2742
2743            - If .base is nonzero then charid is added to it to find an entry in
2744            the trans array.
2745
2746            -If trans[states[state].base+charid].check!=state then the
2747            transition is taken to be a 0/Fail transition. Thus if there are fail
2748            transitions at the front of the node then the .base offset will point
2749            somewhere inside the previous nodes data (or maybe even into a node
2750            even earlier), but the .check field determines if the transition is
2751            valid.
2752
2753            XXX - wrong maybe?
2754            The following process inplace converts the table to the compressed
2755            table: We first do not compress the root node 1,and mark all its
2756            .check pointers as 1 and set its .base pointer as 1 as well. This
2757            allows us to do a DFA construction from the compressed table later,
2758            and ensures that any .base pointers we calculate later are greater
2759            than 0.
2760
2761            - We set 'pos' to indicate the first entry of the second node.
2762
2763            - We then iterate over the columns of the node, finding the first and
2764            last used entry at l and m. We then copy l..m into pos..(pos+m-l),
2765            and set the .check pointers accordingly, and advance pos
2766            appropriately and repreat for the next node. Note that when we copy
2767            the next pointers we have to convert them from the original
2768            NODEIDX form to NODENUM form as the former is not valid post
2769            compression.
2770
2771            - If a node has no transitions used we mark its base as 0 and do not
2772            advance the pos pointer.
2773
2774            - If a node only has one transition we use a second pointer into the
2775            structure to fill in allocated fail transitions from other states.
2776            This pointer is independent of the main pointer and scans forward
2777            looking for null transitions that are allocated to a state. When it
2778            finds one it writes the single transition into the "hole".  If the
2779            pointer doesnt find one the single transition is appended as normal.
2780
2781            - Once compressed we can Renew/realloc the structures to release the
2782            excess space.
2783
2784            See "Table-Compression Methods" in sec 3.9 of the Red Dragon,
2785            specifically Fig 3.47 and the associated pseudocode.
2786
2787            demq
2788         */
2789         const U32 laststate = TRIE_NODENUM( next_alloc );
2790         U32 state, charid;
2791         U32 pos = 0, zp=0;
2792         trie->statecount = laststate;
2793
2794         for ( state = 1 ; state < laststate ; state++ ) {
2795             U8 flag = 0;
2796             const U32 stateidx = TRIE_NODEIDX( state );
2797             const U32 o_used = trie->trans[ stateidx ].check;
2798             U32 used = trie->trans[ stateidx ].check;
2799             trie->trans[ stateidx ].check = 0;
2800
2801             for ( charid = 0;
2802                   used && charid < trie->uniquecharcount;
2803                   charid++ )
2804             {
2805                 if ( flag || trie->trans[ stateidx + charid ].next ) {
2806                     if ( trie->trans[ stateidx + charid ].next ) {
2807                         if (o_used == 1) {
2808                             for ( ; zp < pos ; zp++ ) {
2809                                 if ( ! trie->trans[ zp ].next ) {
2810                                     break;
2811                                 }
2812                             }
2813                             trie->states[ state ].trans.base
2814                                                     = zp
2815                                                       + trie->uniquecharcount
2816                                                       - charid ;
2817                             trie->trans[ zp ].next
2818                                 = SAFE_TRIE_NODENUM( trie->trans[ stateidx
2819                                                              + charid ].next );
2820                             trie->trans[ zp ].check = state;
2821                             if ( ++zp > pos ) pos = zp;
2822                             break;
2823                         }
2824                         used--;
2825                     }
2826                     if ( !flag ) {
2827                         flag = 1;
2828                         trie->states[ state ].trans.base
2829                                        = pos + trie->uniquecharcount - charid ;
2830                     }
2831                     trie->trans[ pos ].next
2832                         = SAFE_TRIE_NODENUM(
2833                                        trie->trans[ stateidx + charid ].next );
2834                     trie->trans[ pos ].check = state;
2835                     pos++;
2836                 }
2837             }
2838         }
2839         trie->lasttrans = pos + 1;
2840         trie->states = (reg_trie_state *)
2841             PerlMemShared_realloc( trie->states, laststate
2842                                    * sizeof(reg_trie_state) );
2843         DEBUG_TRIE_COMPILE_MORE_r(
2844             PerlIO_printf( Perl_debug_log,
2845                 "%*sAlloc: %d Orig: %"IVdf" elements, Final:%"IVdf". Savings of %%%5.2f\n",
2846                 (int)depth * 2 + 2,"",
2847                 (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount
2848                        + 1 ),
2849                 (IV)next_alloc,
2850                 (IV)pos,
2851                 ( ( next_alloc - pos ) * 100 ) / (double)next_alloc );
2852             );
2853
2854         } /* end table compress */
2855     }
2856     DEBUG_TRIE_COMPILE_MORE_r(
2857             PerlIO_printf(Perl_debug_log,
2858                 "%*sStatecount:%"UVxf" Lasttrans:%"UVxf"\n",
2859                 (int)depth * 2 + 2, "",
2860                 (UV)trie->statecount,
2861                 (UV)trie->lasttrans)
2862     );
2863     /* resize the trans array to remove unused space */
2864     trie->trans = (reg_trie_trans *)
2865         PerlMemShared_realloc( trie->trans, trie->lasttrans
2866                                * sizeof(reg_trie_trans) );
2867
2868     {   /* Modify the program and insert the new TRIE node */
2869         U8 nodetype =(U8)(flags & 0xFF);
2870         char *str=NULL;
2871
2872 #ifdef DEBUGGING
2873         regnode *optimize = NULL;
2874 #ifdef RE_TRACK_PATTERN_OFFSETS
2875
2876         U32 mjd_offset = 0;
2877         U32 mjd_nodelen = 0;
2878 #endif /* RE_TRACK_PATTERN_OFFSETS */
2879 #endif /* DEBUGGING */
2880         /*
2881            This means we convert either the first branch or the first Exact,
2882            depending on whether the thing following (in 'last') is a branch
2883            or not and whther first is the startbranch (ie is it a sub part of
2884            the alternation or is it the whole thing.)
2885            Assuming its a sub part we convert the EXACT otherwise we convert
2886            the whole branch sequence, including the first.
2887          */
2888         /* Find the node we are going to overwrite */
2889         if ( first != startbranch || OP( last ) == BRANCH ) {
2890             /* branch sub-chain */
2891             NEXT_OFF( first ) = (U16)(last - first);
2892 #ifdef RE_TRACK_PATTERN_OFFSETS
2893             DEBUG_r({
2894                 mjd_offset= Node_Offset((convert));
2895                 mjd_nodelen= Node_Length((convert));
2896             });
2897 #endif
2898             /* whole branch chain */
2899         }
2900 #ifdef RE_TRACK_PATTERN_OFFSETS
2901         else {
2902             DEBUG_r({
2903                 const  regnode *nop = NEXTOPER( convert );
2904                 mjd_offset= Node_Offset((nop));
2905                 mjd_nodelen= Node_Length((nop));
2906             });
2907         }
2908         DEBUG_OPTIMISE_r(
2909             PerlIO_printf(Perl_debug_log,
2910                 "%*sMJD offset:%"UVuf" MJD length:%"UVuf"\n",
2911                 (int)depth * 2 + 2, "",
2912                 (UV)mjd_offset, (UV)mjd_nodelen)
2913         );
2914 #endif
2915         /* But first we check to see if there is a common prefix we can
2916            split out as an EXACT and put in front of the TRIE node.  */
2917         trie->startstate= 1;
2918         if ( trie->bitmap && !widecharmap && !trie->jump  ) {
2919             U32 state;
2920             for ( state = 1 ; state < trie->statecount-1 ; state++ ) {
2921                 U32 ofs = 0;
2922                 I32 idx = -1;
2923                 U32 count = 0;
2924                 const U32 base = trie->states[ state ].trans.base;
2925
2926                 if ( trie->states[state].wordnum )
2927                         count = 1;
2928
2929                 for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
2930                     if ( ( base + ofs >= trie->uniquecharcount ) &&
2931                          ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
2932                          trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
2933                     {
2934                         if ( ++count > 1 ) {
2935                             SV **tmp = av_fetch( revcharmap, ofs, 0);
2936                             const U8 *ch = (U8*)SvPV_nolen_const( *tmp );
2937                             if ( state == 1 ) break;
2938                             if ( count == 2 ) {
2939                                 Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char);
2940                                 DEBUG_OPTIMISE_r(
2941                                     PerlIO_printf(Perl_debug_log,
2942                                         "%*sNew Start State=%"UVuf" Class: [",
2943                                         (int)depth * 2 + 2, "",
2944                                         (UV)state));
2945                                 if (idx >= 0) {
2946                                     SV ** const tmp = av_fetch( revcharmap, idx, 0);
2947                                     const U8 * const ch = (U8*)SvPV_nolen_const( *tmp );
2948
2949                                     TRIE_BITMAP_SET(trie,*ch);
2950                                     if ( folder )
2951                                         TRIE_BITMAP_SET(trie, folder[ *ch ]);
2952                                     DEBUG_OPTIMISE_r(
2953                                         PerlIO_printf(Perl_debug_log, "%s", (char*)ch)
2954                                     );
2955                                 }
2956                             }
2957                             TRIE_BITMAP_SET(trie,*ch);
2958                             if ( folder )
2959                                 TRIE_BITMAP_SET(trie,folder[ *ch ]);
2960                             DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"%s", ch));
2961                         }
2962                         idx = ofs;
2963                     }
2964                 }
2965                 if ( count == 1 ) {
2966                     SV **tmp = av_fetch( revcharmap, idx, 0);
2967                     STRLEN len;
2968                     char *ch = SvPV( *tmp, len );
2969                     DEBUG_OPTIMISE_r({
2970                         SV *sv=sv_newmortal();
2971                         PerlIO_printf( Perl_debug_log,
2972                             "%*sPrefix State: %"UVuf" Idx:%"UVuf" Char='%s'\n",
2973                             (int)depth * 2 + 2, "",
2974                             (UV)state, (UV)idx,
2975                             pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6,
2976                                 PL_colors[0], PL_colors[1],
2977                                 (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
2978                                 PERL_PV_ESCAPE_FIRSTCHAR
2979                             )
2980                         );
2981                     });
2982                     if ( state==1 ) {
2983                         OP( convert ) = nodetype;
2984                         str=STRING(convert);
2985                         STR_LEN(convert)=0;
2986                     }
2987                     STR_LEN(convert) += len;
2988                     while (len--)
2989                         *str++ = *ch++;
2990                 } else {
2991 #ifdef DEBUGGING
2992                     if (state>1)
2993                         DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"]\n"));
2994 #endif
2995                     break;
2996                 }
2997             }
2998             trie->prefixlen = (state-1);
2999             if (str) {
3000                 regnode *n = convert+NODE_SZ_STR(convert);
3001                 NEXT_OFF(convert) = NODE_SZ_STR(convert);
3002                 trie->startstate = state;
3003                 trie->minlen -= (state - 1);
3004                 trie->maxlen -= (state - 1);
3005 #ifdef DEBUGGING
3006                /* At least the UNICOS C compiler choked on this
3007                 * being argument to DEBUG_r(), so let's just have
3008                 * it right here. */
3009                if (
3010 #ifdef PERL_EXT_RE_BUILD
3011                    1
3012 #else
3013                    DEBUG_r_TEST
3014 #endif
3015                    ) {
3016                    regnode *fix = convert;
3017                    U32 word = trie->wordcount;
3018                    mjd_nodelen++;
3019                    Set_Node_Offset_Length(convert, mjd_offset, state - 1);
3020                    while( ++fix < n ) {
3021                        Set_Node_Offset_Length(fix, 0, 0);
3022                    }
3023                    while (word--) {
3024                        SV ** const tmp = av_fetch( trie_words, word, 0 );
3025                        if (tmp) {
3026                            if ( STR_LEN(convert) <= SvCUR(*tmp) )
3027                                sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert));
3028                            else
3029                                sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp));
3030                        }
3031                    }
3032                }
3033 #endif
3034                 if (trie->maxlen) {
3035                     convert = n;
3036                 } else {
3037                     NEXT_OFF(convert) = (U16)(tail - convert);
3038                     DEBUG_r(optimize= n);
3039                 }
3040             }
3041         }
3042         if (!jumper)
3043             jumper = last;
3044         if ( trie->maxlen ) {
3045             NEXT_OFF( convert ) = (U16)(tail - convert);
3046             ARG_SET( convert, data_slot );
3047             /* Store the offset to the first unabsorbed branch in
3048                jump[0], which is otherwise unused by the jump logic.
3049                We use this when dumping a trie and during optimisation. */
3050             if (trie->jump)
3051                 trie->jump[0] = (U16)(nextbranch - convert);
3052
3053             /* If the start state is not accepting (meaning there is no empty string/NOTHING)
3054              *   and there is a bitmap
3055              *   and the first "jump target" node we found leaves enough room
3056              * then convert the TRIE node into a TRIEC node, with the bitmap
3057              * embedded inline in the opcode - this is hypothetically faster.
3058              */
3059             if ( !trie->states[trie->startstate].wordnum
3060                  && trie->bitmap
3061                  && ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) )
3062             {
3063                 OP( convert ) = TRIEC;
3064                 Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char);
3065                 PerlMemShared_free(trie->bitmap);
3066                 trie->bitmap= NULL;
3067             } else
3068                 OP( convert ) = TRIE;
3069
3070             /* store the type in the flags */
3071             convert->flags = nodetype;
3072             DEBUG_r({
3073             optimize = convert
3074                       + NODE_STEP_REGNODE
3075                       + regarglen[ OP( convert ) ];
3076             });
3077             /* XXX We really should free up the resource in trie now,
3078                    as we won't use them - (which resources?) dmq */
3079         }
3080         /* needed for dumping*/
3081         DEBUG_r(if (optimize) {
3082             regnode *opt = convert;
3083
3084             while ( ++opt < optimize) {
3085                 Set_Node_Offset_Length(opt,0,0);
3086             }
3087             /*
3088                 Try to clean up some of the debris left after the
3089                 optimisation.
3090              */
3091             while( optimize < jumper ) {
3092                 mjd_nodelen += Node_Length((optimize));
3093                 OP( optimize ) = OPTIMIZED;
3094                 Set_Node_Offset_Length(optimize,0,0);
3095                 optimize++;
3096             }
3097             Set_Node_Offset_Length(convert,mjd_offset,mjd_nodelen);
3098         });
3099     } /* end node insert */
3100
3101     /*  Finish populating the prev field of the wordinfo array.  Walk back
3102      *  from each accept state until we find another accept state, and if
3103      *  so, point the first word's .prev field at the second word. If the
3104      *  second already has a .prev field set, stop now. This will be the
3105      *  case either if we've already processed that word's accept state,
3106      *  or that state had multiple words, and the overspill words were
3107      *  already linked up earlier.
3108      */
3109     {
3110         U16 word;
3111         U32 state;
3112         U16 prev;
3113
3114         for (word=1; word <= trie->wordcount; word++) {
3115             prev = 0;
3116             if (trie->wordinfo[word].prev)
3117                 continue;
3118             state = trie->wordinfo[word].accept;
3119             while (state) {
3120                 state = prev_states[state];
3121                 if (!state)
3122                     break;
3123                 prev = trie->states[state].wordnum;
3124                 if (prev)
3125                     break;
3126             }
3127             trie->wordinfo[word].prev = prev;
3128         }
3129         Safefree(prev_states);
3130     }
3131
3132
3133     /* and now dump out the compressed format */
3134     DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1));
3135
3136     RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap;
3137 #ifdef DEBUGGING
3138     RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words;
3139     RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap;
3140 #else
3141     SvREFCNT_dec_NN(revcharmap);
3142 #endif
3143     return trie->jump
3144            ? MADE_JUMP_TRIE
3145            : trie->startstate>1
3146              ? MADE_EXACT_TRIE
3147              : MADE_TRIE;
3148 }
3149
3150 STATIC regnode *
3151 S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth)
3152 {
3153 /* The Trie is constructed and compressed now so we can build a fail array if
3154  * it's needed
3155
3156    This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and
3157    3.32 in the
3158    "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi,
3159    Ullman 1985/88
3160    ISBN 0-201-10088-6
3161
3162    We find the fail state for each state in the trie, this state is the longest
3163    proper suffix of the current state's 'word' that is also a proper prefix of
3164    another word in our trie. State 1 represents the word '' and is thus the
3165    default fail state. This allows the DFA not to have to restart after its
3166    tried and failed a word at a given point, it simply continues as though it
3167    had been matching the other word in the first place.
3168    Consider
3169       'abcdgu'=~/abcdefg|cdgu/
3170    When we get to 'd' we are still matching the first word, we would encounter
3171    'g' which would fail, which would bring us to the state representing 'd' in
3172    the second word where we would try 'g' and succeed, proceeding to match
3173    'cdgu'.
3174  */
3175  /* add a fail transition */
3176     const U32 trie_offset = ARG(source);
3177     reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset];
3178     U32 *q;
3179     const U32 ucharcount = trie->uniquecharcount;
3180     const U32 numstates = trie->statecount;
3181     const U32 ubound = trie->lasttrans + ucharcount;
3182     U32 q_read = 0;
3183     U32 q_write = 0;
3184     U32 charid;
3185     U32 base = trie->states[ 1 ].trans.base;
3186     U32 *fail;
3187     reg_ac_data *aho;
3188     const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("T"));
3189     regnode *stclass;
3190     GET_RE_DEBUG_FLAGS_DECL;
3191
3192     PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE;
3193     PERL_UNUSED_CONTEXT;
3194 #ifndef DEBUGGING
3195     PERL_UNUSED_ARG(depth);
3196 #endif
3197
3198     if ( OP(source) == TRIE ) {
3199         struct regnode_1 *op = (struct regnode_1 *)
3200             PerlMemShared_calloc(1, sizeof(struct regnode_1));
3201         StructCopy(source,op,struct regnode_1);
3202         stclass = (regnode *)op;
3203     } else {
3204         struct regnode_charclass *op = (struct regnode_charclass *)
3205             PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
3206         StructCopy(source,op,struct regnode_charclass);
3207         stclass = (regnode *)op;
3208     }
3209     OP(stclass)+=2; /* convert the TRIE type to its AHO-CORASICK equivalent */
3210
3211     ARG_SET( stclass, data_slot );
3212     aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) );
3213     RExC_rxi->data->data[ data_slot ] = (void*)aho;
3214     aho->trie=trie_offset;
3215     aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) );
3216     Copy( trie->states, aho->states, numstates, reg_trie_state );
3217     Newxz( q, numstates, U32);
3218     aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) );
3219     aho->refcount = 1;
3220     fail = aho->fail;
3221     /* initialize fail[0..1] to be 1 so that we always have
3222        a valid final fail state */
3223     fail[ 0 ] = fail[ 1 ] = 1;
3224
3225     for ( charid = 0; charid < ucharcount ; charid++ ) {
3226         const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 );
3227         if ( newstate ) {
3228             q[ q_write ] = newstate;
3229             /* set to point at the root */
3230             fail[ q[ q_write++ ] ]=1;
3231         }
3232     }
3233     while ( q_read < q_write) {
3234         const U32 cur = q[ q_read++ % numstates ];
3235         base = trie->states[ cur ].trans.base;
3236
3237         for ( charid = 0 ; charid < ucharcount ; charid++ ) {
3238             const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 );
3239             if (ch_state) {
3240                 U32 fail_state = cur;
3241                 U32 fail_base;
3242                 do {
3243                     fail_state = fail[ fail_state ];
3244                     fail_base = aho->states[ fail_state ].trans.base;
3245                 } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) );
3246
3247                 fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 );
3248                 fail[ ch_state ] = fail_state;
3249                 if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum )
3250                 {
3251                         aho->states[ ch_state ].wordnum =  aho->states[ fail_state ].wordnum;
3252                 }
3253                 q[ q_write++ % numstates] = ch_state;
3254             }
3255         }
3256     }
3257     /* restore fail[0..1] to 0 so that we "fall out" of the AC loop
3258        when we fail in state 1, this allows us to use the
3259        charclass scan to find a valid start char. This is based on the principle
3260        that theres a good chance the string being searched contains lots of stuff
3261        that cant be a start char.
3262      */
3263     fail[ 0 ] = fail[ 1 ] = 0;
3264     DEBUG_TRIE_COMPILE_r({
3265         PerlIO_printf(Perl_debug_log,
3266                       "%*sStclass Failtable (%"UVuf" states): 0",
3267                       (int)(depth * 2), "", (UV)numstates
3268         );
3269         for( q_read=1; q_read<numstates; q_read++ ) {
3270             PerlIO_printf(Perl_debug_log, ", %"UVuf, (UV)fail[q_read]);
3271         }
3272         PerlIO_printf(Perl_debug_log, "\n");
3273     });
3274     Safefree(q);
3275     /*RExC_seen |= REG_TRIEDFA_SEEN;*/
3276     return stclass;
3277 }
3278
3279
3280 #define DEBUG_PEEP(str,scan,depth) \
3281     DEBUG_OPTIMISE_r({if (scan){ \
3282        regnode *Next = regnext(scan); \
3283        regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state); \
3284        PerlIO_printf(Perl_debug_log, "%*s" str ">%3d: %s (%d)", \
3285            (int)depth*2, "", REG_NODE_NUM(scan), SvPV_nolen_const(RExC_mysv),\
3286            Next ? (REG_NODE_NUM(Next)) : 0 ); \
3287        DEBUG_SHOW_STUDY_FLAGS(flags," [ ","]");\
3288        PerlIO_printf(Perl_debug_log, "\n"); \
3289    }});
3290
3291 /* The below joins as many adjacent EXACTish nodes as possible into a single
3292  * one.  The regop may be changed if the node(s) contain certain sequences that
3293  * require special handling.  The joining is only done if:
3294  * 1) there is room in the current conglomerated node to entirely contain the
3295  *    next one.
3296  * 2) they are the exact same node type
3297  *
3298  * The adjacent nodes actually may be separated by NOTHING-kind nodes, and
3299  * these get optimized out
3300  *
3301  * If a node is to match under /i (folded), the number of characters it matches
3302  * can be different than its character length if it contains a multi-character
3303  * fold.  *min_subtract is set to the total delta number of characters of the
3304  * input nodes.
3305  *
3306  * And *unfolded_multi_char is set to indicate whether or not the node contains
3307  * an unfolded multi-char fold.  This happens when whether the fold is valid or
3308  * not won't be known until runtime; namely for EXACTF nodes that contain LATIN
3309  * SMALL LETTER SHARP S, as only if the target string being matched against
3310  * turns out to be UTF-8 is that fold valid; and also for EXACTFL nodes whose
3311  * folding rules depend on the locale in force at runtime.  (Multi-char folds
3312  * whose components are all above the Latin1 range are not run-time locale
3313  * dependent, and have already been folded by the time this function is
3314  * called.)
3315  *
3316  * This is as good a place as any to discuss the design of handling these
3317  * multi-character fold sequences.  It's been wrong in Perl for a very long
3318  * time.  There are three code points in Unicode whose multi-character folds
3319  * were long ago discovered to mess things up.  The previous designs for
3320  * dealing with these involved assigning a special node for them.  This
3321  * approach doesn't always work, as evidenced by this example:
3322  *      "\xDFs" =~ /s\xDF/ui    # Used to fail before these patches
3323  * Both sides fold to "sss", but if the pattern is parsed to create a node that
3324  * would match just the \xDF, it won't be able to handle the case where a
3325  * successful match would have to cross the node's boundary.  The new approach
3326  * that hopefully generally solves the problem generates an EXACTFU_SS node
3327  * that is "sss" in this case.
3328  *
3329  * It turns out that there are problems with all multi-character folds, and not
3330  * just these three.  Now the code is general, for all such cases.  The
3331  * approach taken is:
3332  * 1)   This routine examines each EXACTFish node that could contain multi-
3333  *      character folded sequences.  Since a single character can fold into
3334  *      such a sequence, the minimum match length for this node is less than
3335  *      the number of characters in the node.  This routine returns in
3336  *      *min_subtract how many characters to subtract from the the actual
3337  *      length of the string to get a real minimum match length; it is 0 if
3338  *      there are no multi-char foldeds.  This delta is used by the caller to
3339  *      adjust the min length of the match, and the delta between min and max,
3340  *      so that the optimizer doesn't reject these possibilities based on size
3341  *      constraints.
3342  * 2)   For the sequence involving the Sharp s (\xDF), the node type EXACTFU_SS
3343  *      is used for an EXACTFU node that contains at least one "ss" sequence in
3344  *      it.  For non-UTF-8 patterns and strings, this is the only case where
3345  *      there is a possible fold length change.  That means that a regular
3346  *      EXACTFU node without UTF-8 involvement doesn't have to concern itself
3347  *      with length changes, and so can be processed faster.  regexec.c takes
3348  *      advantage of this.  Generally, an EXACTFish node that is in UTF-8 is
3349  *      pre-folded by regcomp.c (except EXACTFL, some of whose folds aren't
3350  *      known until runtime).  This saves effort in regex matching.  However,
3351  *      the pre-folding isn't done for non-UTF8 patterns because the fold of
3352  *      the MICRO SIGN requires UTF-8, and we don't want to slow things down by
3353  *      forcing the pattern into UTF8 unless necessary.  Also what EXACTF (and,
3354  *      again, EXACTFL) nodes fold to isn't known until runtime.  The fold
3355  *      possibilities for the non-UTF8 patterns are quite simple, except for
3356  *      the sharp s.  All the ones that don't involve a UTF-8 target string are
3357  *      members of a fold-pair, and arrays are set up for all of them so that
3358  *      the other member of the pair can be found quickly.  Code elsewhere in
3359  *      this file makes sure that in EXACTFU nodes, the sharp s gets folded to
3360  *      'ss', even if the pattern isn't UTF-8.  This avoids the issues
3361  *      described in the next item.
3362  * 3)   A problem remains for unfolded multi-char folds. (These occur when the
3363  *      validity of the fold won't be known until runtime, and so must remain
3364  *      unfolded for now.  This happens for the sharp s in EXACTF and EXACTFA
3365  *      nodes when the pattern isn't in UTF-8.  (Note, BTW, that there cannot
3366  *      be an EXACTF node with a UTF-8 pattern.)  They also occur for various
3367  *      folds in EXACTFL nodes, regardless of the UTF-ness of the pattern.)
3368  *      The reason this is a problem is that the optimizer part of regexec.c
3369  *      (probably unwittingly, in Perl_regexec_flags()) makes an assumption
3370  *      that a character in the pattern corresponds to at most a single
3371  *      character in the target string.  (And I do mean character, and not byte
3372  *      here, unlike other parts of the documentation that have never been
3373  *      updated to account for multibyte Unicode.)  sharp s in EXACTF and
3374  *      EXACTFL nodes can match the two character string 'ss'; in EXACTFA nodes
3375  *      it can match "\x{17F}\x{17F}".  These, along with other ones in EXACTFL
3376  *      nodes, violate the assumption, and they are the only instances where it
3377  *      is violated.  I'm reluctant to try to change the assumption, as the
3378  *      code involved is impenetrable to me (khw), so instead the code here
3379  *      punts.  This routine examines EXACTFL nodes, and (when the pattern
3380  *      isn't UTF-8) EXACTF and EXACTFA for such unfolded folds, and returns a
3381  *      boolean indicating whether or not the node contains such a fold.  When
3382  *      it is true, the caller sets a flag that later causes the optimizer in
3383  *      this file to not set values for the floating and fixed string lengths,
3384  *      and thus avoids the optimizer code in regexec.c that makes the invalid
3385  *      assumption.  Thus, there is no optimization based on string lengths for
3386  *      EXACTFL nodes that contain these few folds, nor for non-UTF8-pattern
3387  *      EXACTF and EXACTFA nodes that contain the sharp s.  (The reason the
3388  *      assumption is wrong only in these cases is that all other non-UTF-8
3389  *      folds are 1-1; and, for UTF-8 patterns, we pre-fold all other folds to
3390  *      their expanded versions.  (Again, we can't prefold sharp s to 'ss' in
3391  *      EXACTF nodes because we don't know at compile time if it actually
3392  *      matches 'ss' or not.  For EXACTF nodes it will match iff the target
3393  *      string is in UTF-8.  This is in contrast to EXACTFU nodes, where it
3394  *      always matches; and EXACTFA where it never does.  In an EXACTFA node in
3395  *      a UTF-8 pattern, sharp s is folded to "\x{17F}\x{17F}, avoiding the
3396  *      problem; but in a non-UTF8 pattern, folding it to that above-Latin1
3397  *      string would require the pattern to be forced into UTF-8, the overhead
3398  *      of which we want to avoid.  Similarly the unfolded multi-char folds in
3399  *      EXACTFL nodes will match iff the locale at the time of match is a UTF-8
3400  *      locale.)
3401  *
3402  *      Similarly, the code that generates tries doesn't currently handle
3403  *      not-already-folded multi-char folds, and it looks like a pain to change
3404  *      that.  Therefore, trie generation of EXACTFA nodes with the sharp s
3405  *      doesn't work.  Instead, such an EXACTFA is turned into a new regnode,
3406  *      EXACTFA_NO_TRIE, which the trie code knows not to handle.  Most people
3407  *      using /iaa matching will be doing so almost entirely with ASCII
3408  *      strings, so this should rarely be encountered in practice */
3409
3410 #define JOIN_EXACT(scan,min_subtract,unfolded_multi_char, flags) \
3411     if (PL_regkind[OP(scan)] == EXACT) \
3412         join_exact(pRExC_state,(scan),(min_subtract),unfolded_multi_char, (flags),NULL,depth+1)
3413
3414 STATIC U32
3415 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan,
3416                    UV *min_subtract, bool *unfolded_multi_char,
3417                    U32 flags,regnode *val, U32 depth)
3418 {
3419     /* Merge several consecutive EXACTish nodes into one. */
3420     regnode *n = regnext(scan);
3421     U32 stringok = 1;
3422     regnode *next = scan + NODE_SZ_STR(scan);
3423     U32 merged = 0;
3424     U32 stopnow = 0;
3425 #ifdef DEBUGGING
3426     regnode *stop = scan;
3427     GET_RE_DEBUG_FLAGS_DECL;
3428 #else
3429     PERL_UNUSED_ARG(depth);
3430 #endif
3431
3432     PERL_ARGS_ASSERT_JOIN_EXACT;
3433 #ifndef EXPERIMENTAL_INPLACESCAN
3434     PERL_UNUSED_ARG(flags);
3435     PERL_UNUSED_ARG(val);
3436 #endif
3437     DEBUG_PEEP("join",scan,depth);
3438
3439     /* Look through the subsequent nodes in the chain.  Skip NOTHING, merge
3440      * EXACT ones that are mergeable to the current one. */
3441     while (n
3442            && (PL_regkind[OP(n)] == NOTHING
3443                || (stringok && OP(n) == OP(scan)))
3444            && NEXT_OFF(n)
3445            && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX)
3446     {
3447
3448         if (OP(n) == TAIL || n > next)
3449             stringok = 0;
3450         if (PL_regkind[OP(n)] == NOTHING) {
3451             DEBUG_PEEP("skip:",n,depth);
3452             NEXT_OFF(scan) += NEXT_OFF(n);
3453             next = n + NODE_STEP_REGNODE;
3454 #ifdef DEBUGGING
3455             if (stringok)
3456                 stop = n;
3457 #endif
3458             n = regnext(n);
3459         }
3460         else if (stringok) {
3461             const unsigned int oldl = STR_LEN(scan);
3462             regnode * const nnext = regnext(n);
3463
3464             /* XXX I (khw) kind of doubt that this works on platforms (should
3465              * Perl ever run on one) where U8_MAX is above 255 because of lots
3466              * of other assumptions */
3467             /* Don't join if the sum can't fit into a single node */
3468             if (oldl + STR_LEN(n) > U8_MAX)
3469                 break;
3470
3471             DEBUG_PEEP("merg",n,depth);
3472             merged++;
3473
3474             NEXT_OFF(scan) += NEXT_OFF(n);
3475             STR_LEN(scan) += STR_LEN(n);
3476             next = n + NODE_SZ_STR(n);
3477             /* Now we can overwrite *n : */
3478             Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
3479 #ifdef DEBUGGING
3480             stop = next - 1;
3481 #endif
3482             n = nnext;
3483             if (stopnow) break;
3484         }
3485
3486 #ifdef EXPERIMENTAL_INPLACESCAN
3487         if (flags && !NEXT_OFF(n)) {
3488             DEBUG_PEEP("atch", val, depth);
3489             if (reg_off_by_arg[OP(n)]) {
3490                 ARG_SET(n, val - n);
3491             }
3492             else {
3493                 NEXT_OFF(n) = val - n;
3494             }
3495             stopnow = 1;
3496         }
3497 #endif
3498     }
3499
3500     *min_subtract = 0;
3501     *unfolded_multi_char = FALSE;
3502
3503     /* Here, all the adjacent mergeable EXACTish nodes have been merged.  We
3504      * can now analyze for sequences of problematic code points.  (Prior to
3505      * this final joining, sequences could have been split over boundaries, and
3506      * hence missed).  The sequences only happen in folding, hence for any
3507      * non-EXACT EXACTish node */
3508     if (OP(scan) != EXACT && OP(scan) != EXACTL) {
3509         U8* s0 = (U8*) STRING(scan);
3510         U8* s = s0;
3511         U8* s_end = s0 + STR_LEN(scan);
3512
3513         int total_count_delta = 0;  /* Total delta number of characters that
3514                                        multi-char folds expand to */
3515
3516         /* One pass is made over the node's string looking for all the
3517          * possibilities.  To avoid some tests in the loop, there are two main
3518          * cases, for UTF-8 patterns (which can't have EXACTF nodes) and
3519          * non-UTF-8 */
3520         if (UTF) {
3521             U8* folded = NULL;
3522
3523             if (OP(scan) == EXACTFL) {
3524                 U8 *d;
3525
3526                 /* An EXACTFL node would already have been changed to another
3527                  * node type unless there is at least one character in it that
3528                  * is problematic; likely a character whose fold definition
3529                  * won't be known until runtime, and so has yet to be folded.
3530                  * For all but the UTF-8 locale, folds are 1-1 in length, but
3531                  * to handle the UTF-8 case, we need to create a temporary
3532                  * folded copy using UTF-8 locale rules in order to analyze it.
3533                  * This is because our macros that look to see if a sequence is
3534                  * a multi-char fold assume everything is folded (otherwise the
3535                  * tests in those macros would be too complicated and slow).
3536                  * Note that here, the non-problematic folds will have already
3537                  * been done, so we can just copy such characters.  We actually
3538                  * don't completely fold the EXACTFL string.  We skip the
3539                  * unfolded multi-char folds, as that would just create work
3540                  * below to figure out the size they already are */
3541
3542                 Newx(folded, UTF8_MAX_FOLD_CHAR_EXPAND * STR_LEN(scan) + 1, U8);
3543                 d = folded;
3544                 while (s < s_end) {
3545                     STRLEN s_len = UTF8SKIP(s);
3546                     if (! is_PROBLEMATIC_LOCALE_FOLD_utf8(s)) {
3547                         Copy(s, d, s_len, U8);
3548                         d += s_len;
3549                     }
3550                     else if (is_FOLDS_TO_MULTI_utf8(s)) {
3551                         *unfolded_multi_char = TRUE;
3552                         Copy(s, d, s_len, U8);
3553                         d += s_len;
3554                     }
3555                     else if (isASCII(*s)) {
3556                         *(d++) = toFOLD(*s);
3557                     }
3558                     else {
3559                         STRLEN len;
3560                         _to_utf8_fold_flags(s, d, &len, FOLD_FLAGS_FULL);
3561                         d += len;
3562                     }
3563                     s += s_len;
3564                 }
3565
3566                 /* Point the remainder of the routine to look at our temporary
3567                  * folded copy */
3568                 s = folded;
3569                 s_end = d;
3570             } /* End of creating folded copy of EXACTFL string */
3571
3572             /* Examine the string for a multi-character fold sequence.  UTF-8
3573              * patterns have all characters pre-folded by the time this code is
3574              * executed */
3575             while (s < s_end - 1) /* Can stop 1 before the end, as minimum
3576                                      length sequence we are looking for is 2 */
3577             {
3578                 int count = 0;  /* How many characters in a multi-char fold */
3579                 int len = is_MULTI_CHAR_FOLD_utf8_safe(s, s_end);
3580                 if (! len) {    /* Not a multi-char fold: get next char */
3581                     s += UTF8SKIP(s);
3582                     continue;
3583                 }
3584
3585                 /* Nodes with 'ss' require special handling, except for
3586                  * EXACTFA-ish for which there is no multi-char fold to this */
3587                 if (len == 2 && *s == 's' && *(s+1) == 's'
3588                     && OP(scan) != EXACTFA
3589                     && OP(scan) != EXACTFA_NO_TRIE)
3590                 {
3591                     count = 2;
3592                     if (OP(scan) != EXACTFL) {
3593                         OP(scan) = EXACTFU_SS;
3594                     }
3595                     s += 2;
3596                 }
3597                 else { /* Here is a generic multi-char fold. */
3598                     U8* multi_end  = s + len;
3599
3600                     /* Count how many characters are in it.  In the case of
3601                      * /aa, no folds which contain ASCII code points are
3602                      * allowed, so check for those, and skip if found. */
3603                     if (OP(scan) != EXACTFA && OP(scan) != EXACTFA_NO_TRIE) {
3604                         count = utf8_length(s, multi_end);
3605                         s = multi_end;
3606                     }
3607                     else {
3608                         while (s < multi_end) {
3609                             if (isASCII(*s)) {
3610                                 s++;
3611                                 goto next_iteration;
3612                             }
3613                             else {
3614                                 s += UTF8SKIP(s);
3615                             }
3616                             count++;
3617                         }
3618                     }
3619                 }
3620
3621                 /* The delta is how long the sequence is minus 1 (1 is how long
3622                  * the character that folds to the sequence is) */
3623                 total_count_delta += count - 1;
3624               next_iteration: ;
3625             }
3626
3627             /* We created a temporary folded copy of the string in EXACTFL
3628              * nodes.  Therefore we need to be sure it doesn't go below zero,
3629              * as the real string could be shorter */
3630             if (OP(scan) == EXACTFL) {
3631                 int total_chars = utf8_length((U8*) STRING(scan),
3632                                            (U8*) STRING(scan) + STR_LEN(scan));
3633                 if (total_count_delta > total_chars) {
3634                     total_count_delta = total_chars;
3635                 }
3636             }
3637
3638             *min_subtract += total_count_delta;
3639             Safefree(folded);
3640         }
3641         else if (OP(scan) == EXACTFA) {
3642
3643             /* Non-UTF-8 pattern, EXACTFA node.  There can't be a multi-char
3644              * fold to the ASCII range (and there are no existing ones in the
3645              * upper latin1 range).  But, as outlined in the comments preceding
3646              * this function, we need to flag any occurrences of the sharp s.
3647              * This character forbids trie formation (because of added
3648              * complexity) */
3649             while (s < s_end) {
3650                 if (*s == LATIN_SMALL_LETTER_SHARP_S) {
3651                     OP(scan) = EXACTFA_NO_TRIE;
3652                     *unfolded_multi_char = TRUE;
3653                     break;
3654                 }
3655                 s++;
3656                 continue;
3657             }
3658         }
3659         else {
3660
3661             /* Non-UTF-8 pattern, not EXACTFA node.  Look for the multi-char
3662              * folds that are all Latin1.  As explained in the comments
3663              * preceding this function, we look also for the sharp s in EXACTF
3664              * and EXACTFL nodes; it can be in the final position.  Otherwise
3665              * we can stop looking 1 byte earlier because have to find at least
3666              * two characters for a multi-fold */
3667             const U8* upper = (OP(scan) == EXACTF || OP(scan) == EXACTFL)
3668                               ? s_end
3669                               : s_end -1;
3670
3671             while (s < upper) {
3672                 int len = is_MULTI_CHAR_FOLD_latin1_safe(s, s_end);
3673                 if (! len) {    /* Not a multi-char fold. */
3674                     if (*s == LATIN_SMALL_LETTER_SHARP_S
3675                         && (OP(scan) == EXACTF || OP(scan) == EXACTFL))
3676                     {
3677                         *unfolded_multi_char = TRUE;
3678                     }
3679                     s++;
3680                     continue;
3681                 }
3682
3683                 if (len == 2
3684                     && isALPHA_FOLD_EQ(*s, 's')
3685                     && isALPHA_FOLD_EQ(*(s+1), 's'))
3686                 {
3687
3688                     /* EXACTF nodes need to know that the minimum length
3689                      * changed so that a sharp s in the string can match this
3690                      * ss in the pattern, but they remain EXACTF nodes, as they
3691                      * won't match this unless the target string is is UTF-8,
3692                      * which we don't know until runtime.  EXACTFL nodes can't
3693                      * transform into EXACTFU nodes */
3694                     if (OP(scan) != EXACTF && OP(scan) != EXACTFL) {
3695                         OP(scan) = EXACTFU_SS;
3696                     }
3697                 }
3698
3699                 *min_subtract += len - 1;
3700                 s += len;
3701             }
3702         }
3703     }
3704
3705 #ifdef DEBUGGING
3706     /* Allow dumping but overwriting the collection of skipped
3707      * ops and/or strings with fake optimized ops */
3708     n = scan + NODE_SZ_STR(scan);
3709     while (n <= stop) {
3710         OP(n) = OPTIMIZED;
3711         FLAGS(n) = 0;
3712         NEXT_OFF(n) = 0;
3713         n++;
3714     }
3715 #endif
3716     DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl",scan,depth)});
3717     return stopnow;
3718 }
3719
3720 /* REx optimizer.  Converts nodes into quicker variants "in place".
3721    Finds fixed substrings.  */
3722
3723 /* Stops at toplevel WHILEM as well as at "last". At end *scanp is set
3724    to the position after last scanned or to NULL. */
3725
3726 #define INIT_AND_WITHP \
3727     assert(!and_withp); \
3728     Newx(and_withp,1, regnode_ssc); \
3729     SAVEFREEPV(and_withp)
3730
3731
3732 static void
3733 S_unwind_scan_frames(pTHX_ const void *p)
3734 {
3735     scan_frame *f= (scan_frame *)p;
3736     do {
3737         scan_frame *n= f->next_frame;
3738         Safefree(f);
3739         f= n;
3740     } while (f);
3741 }
3742
3743
3744 STATIC SSize_t
3745 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
3746                         SSize_t *minlenp, SSize_t *deltap,
3747                         regnode *last,
3748                         scan_data_t *data,
3749                         I32 stopparen,
3750                         U32 recursed_depth,
3751                         regnode_ssc *and_withp,
3752                         U32 flags, U32 depth)
3753                         /* scanp: Start here (read-write). */
3754                         /* deltap: Write maxlen-minlen here. */
3755                         /* last: Stop before this one. */
3756                         /* data: string data about the pattern */
3757                         /* stopparen: treat close N as END */
3758                         /* recursed: which subroutines have we recursed into */
3759                         /* and_withp: Valid if flags & SCF_DO_STCLASS_OR */
3760 {
3761     /* There must be at least this number of characters to match */
3762     SSize_t min = 0;
3763     I32 pars = 0, code;
3764     regnode *scan = *scanp, *next;
3765     SSize_t delta = 0;
3766     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
3767     int is_inf_internal = 0;            /* The studied chunk is infinite */
3768     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
3769     scan_data_t data_fake;
3770     SV *re_trie_maxbuff = NULL;
3771     regnode *first_non_open = scan;
3772     SSize_t stopmin = SSize_t_MAX;
3773     scan_frame *frame = NULL;
3774     GET_RE_DEBUG_FLAGS_DECL;
3775
3776     PERL_ARGS_ASSERT_STUDY_CHUNK;
3777
3778
3779     if ( depth == 0 ) {
3780         while (first_non_open && OP(first_non_open) == OPEN)
3781             first_non_open=regnext(first_non_open);
3782     }
3783
3784
3785   fake_study_recurse:
3786     DEBUG_r(
3787         RExC_study_chunk_recursed_count++;
3788     );
3789     DEBUG_OPTIMISE_MORE_r(
3790     {
3791         PerlIO_printf(Perl_debug_log,
3792             "%*sstudy_chunk stopparen=%ld recursed_count=%lu depth=%lu recursed_depth=%lu scan=%p last=%p",
3793             (int)(depth*2), "", (long)stopparen,
3794             (unsigned long)RExC_study_chunk_recursed_count,
3795             (unsigned long)depth, (unsigned long)recursed_depth,
3796             scan,
3797             last);
3798         if (recursed_depth) {
3799             U32 i;
3800             U32 j;
3801             for ( j = 0 ; j < recursed_depth ; j++ ) {
3802                 for ( i = 0 ; i < (U32)RExC_npar ; i++ ) {
3803                     if (
3804                         PAREN_TEST(RExC_study_chunk_recursed +
3805                                    ( j * RExC_study_chunk_recursed_bytes), i )
3806                         && (
3807                             !j ||
3808                             !PAREN_TEST(RExC_study_chunk_recursed +
3809                                    (( j - 1 ) * RExC_study_chunk_recursed_bytes), i)
3810                         )
3811                     ) {
3812                         PerlIO_printf(Perl_debug_log," %d",(int)i);
3813                         break;
3814                     }
3815                 }
3816                 if ( j + 1 < recursed_depth ) {
3817                     PerlIO_printf(Perl_debug_log, ",");
3818                 }
3819             }
3820         }
3821         PerlIO_printf(Perl_debug_log,"\n");
3822     }
3823     );
3824     while ( scan && OP(scan) != END && scan < last ){
3825         UV min_subtract = 0;    /* How mmany chars to subtract from the minimum
3826                                    node length to get a real minimum (because
3827                                    the folded version may be shorter) */
3828         bool unfolded_multi_char = FALSE;
3829         /* Peephole optimizer: */
3830         DEBUG_STUDYDATA("Peep:", data, depth);
3831         DEBUG_PEEP("Peep", scan, depth);
3832
3833
3834         /* The reason we do this here we need to deal with things like /(?:f)(?:o)(?:o)/
3835          * which cant be dealt with by the normal EXACT parsing code, as each (?:..) is handled
3836          * by a different invocation of reg() -- Yves
3837          */
3838         JOIN_EXACT(scan,&min_subtract, &unfolded_multi_char, 0);
3839
3840         /* Follow the next-chain of the current node and optimize
3841            away all the NOTHINGs from it.  */
3842         if (OP(scan) != CURLYX) {
3843             const int max = (reg_off_by_arg[OP(scan)]
3844                        ? I32_MAX
3845                        /* I32 may be smaller than U16 on CRAYs! */
3846                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
3847             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
3848             int noff;
3849             regnode *n = scan;
3850
3851             /* Skip NOTHING and LONGJMP. */
3852             while ((n = regnext(n))
3853                    && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
3854                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
3855                    && off + noff < max)
3856                 off += noff;
3857             if (reg_off_by_arg[OP(scan)])
3858                 ARG(scan) = off;
3859             else
3860                 NEXT_OFF(scan) = off;
3861         }
3862
3863         /* The principal pseudo-switch.  Cannot be a switch, since we
3864            look into several different things.  */
3865         if ( OP(scan) == DEFINEP ) {
3866             SSize_t minlen = 0;
3867             SSize_t deltanext = 0;
3868             SSize_t fake_last_close = 0;
3869             I32 f = SCF_IN_DEFINE;
3870
3871             StructCopy(&zero_scan_data, &data_fake, scan_data_t);
3872             scan = regnext(scan);
3873             assert( OP(scan) == IFTHEN );
3874             DEBUG_PEEP("expect IFTHEN", scan, depth);
3875
3876             data_fake.last_closep= &fake_last_close;
3877             minlen = *minlenp;
3878             next = regnext(scan);
3879             scan = NEXTOPER(NEXTOPER(scan));
3880             DEBUG_PEEP("scan", scan, depth);
3881             DEBUG_PEEP("next", next, depth);
3882
3883             /* we suppose the run is continuous, last=next...
3884              * NOTE we dont use the return here! */
3885             (void)study_chunk(pRExC_state, &scan, &minlen,
3886                               &deltanext, next, &data_fake, stopparen,
3887                               recursed_depth, NULL, f, depth+1);
3888
3889             scan = next;
3890         } else
3891         if (
3892             OP(scan) == BRANCH  ||
3893             OP(scan) == BRANCHJ ||
3894             OP(scan) == IFTHEN
3895         ) {
3896             next = regnext(scan);
3897             code = OP(scan);
3898
3899             /* The op(next)==code check below is to see if we
3900              * have "BRANCH-BRANCH", "BRANCHJ-BRANCHJ", "IFTHEN-IFTHEN"
3901              * IFTHEN is special as it might not appear in pairs.
3902              * Not sure whether BRANCH-BRANCHJ is possible, regardless
3903              * we dont handle it cleanly. */
3904             if (OP(next) == code || code == IFTHEN) {
3905                 /* NOTE - There is similar code to this block below for
3906                  * handling TRIE nodes on a re-study.  If you change stuff here
3907                  * check there too. */
3908                 SSize_t max1 = 0, min1 = SSize_t_MAX, num = 0;
3909                 regnode_ssc accum;
3910                 regnode * const startbranch=scan;
3911
3912                 if (flags & SCF_DO_SUBSTR) {
3913                     /* Cannot merge strings after this. */
3914                     scan_commit(pRExC_state, data, minlenp, is_inf);
3915                 }
3916
3917                 if (flags & SCF_DO_STCLASS)
3918                     ssc_init_zero(pRExC_state, &accum);
3919
3920                 while (OP(scan) == code) {
3921                     SSize_t deltanext, minnext, fake;
3922                     I32 f = 0;
3923                     regnode_ssc this_class;
3924
3925                     DEBUG_PEEP("Branch", scan, depth);
3926
3927                     num++;
3928                     StructCopy(&zero_scan_data, &data_fake, scan_data_t);
3929                     if (data) {
3930                         data_fake.whilem_c = data->whilem_c;
3931                         data_fake.last_closep = data->last_closep;
3932                     }
3933                     else
3934                         data_fake.last_closep = &fake;
3935
3936                     data_fake.pos_delta = delta;
3937                     next = regnext(scan);
3938
3939                     scan = NEXTOPER(scan); /* everything */
3940                     if (code != BRANCH)    /* everything but BRANCH */
3941                         scan = NEXTOPER(scan);
3942
3943                     if (flags & SCF_DO_STCLASS) {
3944                         ssc_init(pRExC_state, &this_class);
3945                         data_fake.start_class = &this_class;
3946                         f = SCF_DO_STCLASS_AND;
3947                     }
3948                     if (flags & SCF_WHILEM_VISITED_POS)
3949                         f |= SCF_WHILEM_VISITED_POS;
3950
3951                     /* we suppose the run is continuous, last=next...*/
3952                     minnext = study_chunk(pRExC_state, &scan, minlenp,
3953                                       &deltanext, next, &data_fake, stopparen,
3954                                       recursed_depth, NULL, f,depth+1);
3955
3956                     if (min1 > minnext)
3957                         min1 = minnext;
3958                     if (deltanext == SSize_t_MAX) {
3959                         is_inf = is_inf_internal = 1;
3960                         max1 = SSize_t_MAX;
3961                     } else if (max1 < minnext + deltanext)
3962                         max1 = minnext + deltanext;
3963                     scan = next;
3964                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3965                         pars++;
3966                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
3967                         if ( stopmin > minnext)