Coverage Report

Created: 2025-12-14 06:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/re2/re2/compile.cc
Line
Count
Source
1
// Copyright 2007 The RE2 Authors.  All Rights Reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
5
// Compile regular expression to Prog.
6
//
7
// Prog and Inst are defined in prog.h.
8
// This file's external interface is just Regexp::CompileToProg.
9
// The Compiler class defined in this file is private.
10
11
#include <stdint.h>
12
#include <string.h>
13
14
#include <string>
15
#include <utility>
16
17
#include "absl/container/flat_hash_map.h"
18
#include "absl/log/absl_check.h"
19
#include "absl/log/absl_log.h"
20
#include "absl/strings/string_view.h"
21
#include "re2/pod_array.h"
22
#include "re2/prog.h"
23
#include "re2/re2.h"
24
#include "re2/regexp.h"
25
#include "re2/walker-inl.h"
26
#include "util/utf.h"
27
28
namespace re2 {
29
30
// List of pointers to Inst* that need to be filled in (patched).
31
// Because the Inst* haven't been filled in yet,
32
// we can use the Inst* word to hold the list's "next" pointer.
33
// It's kind of sleazy, but it works well in practice.
34
// See http://swtch.com/~rsc/regexp/regexp1.html for inspiration.
35
//
36
// Because the out and out1 fields in Inst are no longer pointers,
37
// we can't use pointers directly here either.  Instead, head refers
38
// to inst_[head>>1].out (head&1 == 0) or inst_[head>>1].out1 (head&1 == 1).
39
// head == 0 represents the NULL list.  This is okay because instruction #0
40
// is always the fail instruction, which never appears on a list.
41
struct PatchList {
42
  // Returns patch list containing just p.
43
65.8M
  static PatchList Mk(uint32_t p) {
44
65.8M
    return {p, p};
45
65.8M
  }
46
47
  // Patches all the entries on l to have value p.
48
  // Caller must not ever use patch list again.
49
37.3M
  static void Patch(Prog::Inst* inst0, PatchList l, uint32_t p) {
50
81.9M
    while (l.head != 0) {
51
44.6M
      Prog::Inst* ip = &inst0[l.head>>1];
52
44.6M
      if (l.head&1) {
53
1.17M
        l.head = ip->out1();
54
1.17M
        ip->out1_ = p;
55
43.4M
      } else {
56
43.4M
        l.head = ip->out();
57
43.4M
        ip->set_out(p);
58
43.4M
      }
59
44.6M
    }
60
37.3M
  }
61
62
  // Appends two patch lists and returns result.
63
8.49M
  static PatchList Append(Prog::Inst* inst0, PatchList l1, PatchList l2) {
64
8.49M
    if (l1.head == 0)
65
539k
      return l2;
66
7.95M
    if (l2.head == 0)
67
0
      return l1;
68
7.95M
    Prog::Inst* ip = &inst0[l1.tail>>1];
69
7.95M
    if (l1.tail&1)
70
1.07M
      ip->out1_ = l2.head;
71
6.87M
    else
72
6.87M
      ip->set_out(l2.head);
73
7.95M
    return {l1.head, l2.tail};
74
7.95M
  }
75
76
  uint32_t head;
77
  uint32_t tail;  // for constant-time append
78
};
79
80
static const PatchList kNullPatchList = {0, 0};
81
82
// Compiled program fragment.
83
struct Frag {
84
  uint32_t begin;
85
  PatchList end;
86
  bool nullable;
87
88
52.4M
  Frag() : begin(0), end(kNullPatchList), nullable(false) {}
89
  Frag(uint32_t begin, PatchList end, bool nullable)
90
72.5M
      : begin(begin), end(end), nullable(nullable) {}
91
};
92
93
// Input encodings.
94
enum Encoding {
95
  kEncodingUTF8 = 1,  // UTF-8 (0-10FFFF)
96
  kEncodingLatin1,    // Latin-1 (0-FF)
97
};
98
99
class Compiler : public Regexp::Walker<Frag> {
100
 public:
101
  explicit Compiler();
102
  ~Compiler();
103
104
  // Compiles Regexp to a new Prog.
105
  // Caller is responsible for deleting Prog when finished with it.
106
  // If reversed is true, compiles for walking over the input
107
  // string backward (reverses all concatenations).
108
  static Prog *Compile(Regexp* re, bool reversed, int64_t max_mem);
109
110
  // Compiles alternation of all the re to a new Prog.
111
  // Each re has a match with an id equal to its index in the vector.
112
  static Prog* CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem);
113
114
  // Interface for Regexp::Walker, which helps traverse the Regexp.
115
  // The walk is purely post-recursive: given the machines for the
116
  // children, PostVisit combines them to create the machine for
117
  // the current node.  The child_args are Frags.
118
  // The Compiler traverses the Regexp parse tree, visiting
119
  // each node in depth-first order.  It invokes PreVisit before
120
  // visiting the node's children and PostVisit after visiting
121
  // the children.
122
  Frag PreVisit(Regexp* re, Frag parent_arg, bool* stop);
123
  Frag PostVisit(Regexp* re, Frag parent_arg, Frag pre_arg, Frag* child_args,
124
                 int nchild_args);
125
  Frag ShortVisit(Regexp* re, Frag parent_arg);
126
  Frag Copy(Frag arg);
127
128
  // Given fragment a, returns a+ or a+?; a* or a*?; a? or a??
129
  Frag Plus(Frag a, bool nongreedy);
130
  Frag Star(Frag a, bool nongreedy);
131
  Frag Quest(Frag a, bool nongreedy);
132
133
  // Given fragment a, returns (a) capturing as \n.
134
  Frag Capture(Frag a, int n);
135
136
  // Given fragments a and b, returns ab; a|b
137
  Frag Cat(Frag a, Frag b);
138
  Frag Alt(Frag a, Frag b);
139
140
  // Returns a fragment that can't match anything.
141
  Frag NoMatch();
142
143
  // Returns a fragment that matches the empty string.
144
  Frag Match(int32_t id);
145
146
  // Returns a no-op fragment.
147
  Frag Nop();
148
149
  // Returns a fragment matching the byte range lo-hi.
150
  Frag ByteRange(int lo, int hi, bool foldcase);
151
152
  // Returns a fragment matching an empty-width special op.
153
  Frag EmptyWidth(EmptyOp op);
154
155
  // Adds n instructions to the program.
156
  // Returns the index of the first one.
157
  // Returns -1 if no more instructions are available.
158
  int AllocInst(int n);
159
160
  // Rune range compiler.
161
162
  // Begins a new alternation.
163
  void BeginRange();
164
165
  // Adds a fragment matching the rune range lo-hi.
166
  void AddRuneRange(Rune lo, Rune hi, bool foldcase);
167
  void AddRuneRangeLatin1(Rune lo, Rune hi, bool foldcase);
168
  void AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase);
169
  void Add_80_10ffff();
170
171
  // New suffix that matches the byte range lo-hi, then goes to next.
172
  int UncachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, int next);
173
  int CachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase, int next);
174
175
  // Returns true iff the suffix is cached.
176
  bool IsCachedRuneByteSuffix(int id);
177
178
  // Adds a suffix to alternation.
179
  void AddSuffix(int id);
180
181
  // Adds a suffix to the trie starting from the given root node.
182
  // Returns zero iff allocating an instruction fails. Otherwise, returns
183
  // the current root node, which might be different from what was given.
184
  int AddSuffixRecursive(int root, int id);
185
186
  // Finds the trie node for the given suffix. Returns a Frag in order to
187
  // distinguish between pointing at the root node directly (end.head == 0)
188
  // and pointing at an Alt's out1 or out (end.head&1 == 1 or 0, respectively).
189
  Frag FindByteRange(int root, int id);
190
191
  // Compares two ByteRanges and returns true iff they are equal.
192
  bool ByteRangeEqual(int id1, int id2);
193
194
  // Returns the alternation of all the added suffixes.
195
  Frag EndRange();
196
197
  // Single rune.
198
  Frag Literal(Rune r, bool foldcase);
199
200
  void Setup(Regexp::ParseFlags flags, int64_t max_mem, RE2::Anchor anchor);
201
  Prog* Finish(Regexp* re);
202
203
  // Returns .* where dot = any byte
204
  Frag DotStar();
205
206
 private:
207
  Prog* prog_;         // Program being built.
208
  bool failed_;        // Did we give up compiling?
209
  Encoding encoding_;  // Input encoding
210
  bool reversed_;      // Should program run backward over text?
211
212
  PODArray<Prog::Inst> inst_;
213
  int ninst_;          // Number of instructions used.
214
  int max_ninst_;      // Maximum number of instructions.
215
216
  int64_t max_mem_;    // Total memory budget.
217
218
  absl::flat_hash_map<uint64_t, int> rune_cache_;
219
  Frag rune_range_;
220
221
  RE2::Anchor anchor_;  // anchor mode for RE2::Set
222
223
  Compiler(const Compiler&) = delete;
224
  Compiler& operator=(const Compiler&) = delete;
225
};
226
227
40.1k
Compiler::Compiler() {
228
40.1k
  prog_ = new Prog();
229
40.1k
  failed_ = false;
230
40.1k
  encoding_ = kEncodingUTF8;
231
40.1k
  reversed_ = false;
232
40.1k
  ninst_ = 0;
233
40.1k
  max_ninst_ = 1;  // make AllocInst for fail instruction okay
234
40.1k
  max_mem_ = 0;
235
40.1k
  int fail = AllocInst(1);
236
40.1k
  inst_[fail].InitFail();
237
40.1k
  max_ninst_ = 0;  // Caller must change
238
40.1k
}
239
240
40.1k
Compiler::~Compiler() {
241
40.1k
  delete prog_;
242
40.1k
}
243
244
61.9M
int Compiler::AllocInst(int n) {
245
61.9M
  if (failed_ || ninst_ + n > max_ninst_) {
246
0
    failed_ = true;
247
0
    return -1;
248
0
  }
249
250
61.9M
  if (ninst_ + n > inst_.size()) {
251
165k
    int cap = inst_.size();
252
165k
    if (cap == 0)
253
40.1k
      cap = 8;
254
291k
    while (ninst_ + n > cap)
255
125k
      cap *= 2;
256
165k
    PODArray<Prog::Inst> inst(cap);
257
165k
    if (inst_.data() != NULL)
258
125k
      memmove(inst.data(), inst_.data(), ninst_*sizeof inst_[0]);
259
165k
    memset(inst.data() + ninst_, 0, (cap - ninst_)*sizeof inst_[0]);
260
165k
    inst_ = std::move(inst);
261
165k
  }
262
61.9M
  int id = ninst_;
263
61.9M
  ninst_ += n;
264
61.9M
  return id;
265
61.9M
}
266
267
// These routines are somewhat hard to visualize in text --
268
// see http://swtch.com/~rsc/regexp/regexp1.html for
269
// pictures explaining what is going on here.
270
271
// Returns an unmatchable fragment.
272
15.7M
Frag Compiler::NoMatch() {
273
15.7M
  return Frag();
274
15.7M
}
275
276
// Is a an unmatchable fragment?
277
49.3M
static bool IsNoMatch(Frag a) {
278
49.3M
  return a.begin == 0;
279
49.3M
}
280
281
// Given fragments a and b, returns fragment for ab.
282
4.79M
Frag Compiler::Cat(Frag a, Frag b) {
283
4.79M
  if (IsNoMatch(a) || IsNoMatch(b))
284
33.1k
    return NoMatch();
285
286
  // Elide no-op.
287
4.76M
  Prog::Inst* begin = &inst_[a.begin];
288
4.76M
  if (begin->opcode() == kInstNop &&
289
6.17k
      a.end.head == (a.begin << 1) &&
290
4.59k
      begin->out() == 0) {
291
    // in case refs to a somewhere
292
4.59k
    PatchList::Patch(inst_.data(), a.end, b.begin);
293
4.59k
    return b;
294
4.59k
  }
295
296
  // To run backward over string, reverse all concatenations.
297
4.76M
  if (reversed_) {
298
1.15M
    PatchList::Patch(inst_.data(), b.end, a.begin);
299
1.15M
    return Frag(b.begin, a.end, b.nullable && a.nullable);
300
1.15M
  }
301
302
3.61M
  PatchList::Patch(inst_.data(), a.end, b.begin);
303
3.61M
  return Frag(a.begin, b.end, a.nullable && b.nullable);
304
4.76M
}
305
306
// Given fragments for a and b, returns fragment for a|b.
307
650k
Frag Compiler::Alt(Frag a, Frag b) {
308
  // Special case for convenience in loops.
309
650k
  if (IsNoMatch(a))
310
536
    return b;
311
649k
  if (IsNoMatch(b))
312
2.31k
    return a;
313
314
647k
  int id = AllocInst(1);
315
647k
  if (id < 0)
316
0
    return NoMatch();
317
318
647k
  inst_[id].InitAlt(a.begin, b.begin);
319
647k
  return Frag(id, PatchList::Append(inst_.data(), a.end, b.end),
320
647k
              a.nullable || b.nullable);
321
647k
}
322
323
// When capturing submatches in like-Perl mode, a kOpAlt Inst
324
// treats out_ as the first choice, out1_ as the second.
325
//
326
// For *, +, and ?, if out_ causes another repetition,
327
// then the operator is greedy.  If out1_ is the repetition
328
// (and out_ moves forward), then the operator is non-greedy.
329
330
// Given a fragment for a, returns a fragment for a+ or a+? (if nongreedy)
331
108k
Frag Compiler::Plus(Frag a, bool nongreedy) {
332
108k
  int id = AllocInst(1);
333
108k
  if (id < 0)
334
0
    return NoMatch();
335
108k
  PatchList pl;
336
108k
  if (nongreedy) {
337
3.16k
    inst_[id].InitAlt(0, a.begin);
338
3.16k
    pl = PatchList::Mk(id << 1);
339
105k
  } else {
340
105k
    inst_[id].InitAlt(a.begin, 0);
341
105k
    pl = PatchList::Mk((id << 1) | 1);
342
105k
  }
343
108k
  PatchList::Patch(inst_.data(), a.end, id);
344
108k
  return Frag(a.begin, pl, a.nullable);
345
108k
}
346
347
// Given a fragment for a, returns a fragment for a* or a*? (if nongreedy)
348
399k
Frag Compiler::Star(Frag a, bool nongreedy) {
349
  // When the subexpression is nullable, one Alt isn't enough to guarantee
350
  // correct priority ordering within the transitive closure. The simplest
351
  // solution is to handle it as (a+)? instead, which adds the second Alt.
352
399k
  if (a.nullable)
353
34.0k
    return Quest(Plus(a, nongreedy), nongreedy);
354
355
365k
  int id = AllocInst(1);
356
365k
  if (id < 0)
357
0
    return NoMatch();
358
365k
  PatchList pl;
359
365k
  if (nongreedy) {
360
39.7k
    inst_[id].InitAlt(0, a.begin);
361
39.7k
    pl = PatchList::Mk(id << 1);
362
325k
  } else {
363
325k
    inst_[id].InitAlt(a.begin, 0);
364
325k
    pl = PatchList::Mk((id << 1) | 1);
365
325k
  }
366
365k
  PatchList::Patch(inst_.data(), a.end, id);
367
365k
  return Frag(id, pl, true);
368
365k
}
369
370
// Given a fragment for a, returns a fragment for a? or a?? (if nongreedy)
371
765k
Frag Compiler::Quest(Frag a, bool nongreedy) {
372
765k
  if (IsNoMatch(a))
373
365
    return Nop();
374
764k
  int id = AllocInst(1);
375
764k
  if (id < 0)
376
0
    return NoMatch();
377
764k
  PatchList pl;
378
764k
  if (nongreedy) {
379
5.13k
    inst_[id].InitAlt(0, a.begin);
380
5.13k
    pl = PatchList::Mk(id << 1);
381
759k
  } else {
382
759k
    inst_[id].InitAlt(a.begin, 0);
383
759k
    pl = PatchList::Mk((id << 1) | 1);
384
759k
  }
385
764k
  return Frag(id, PatchList::Append(inst_.data(), pl, a.end), true);
386
764k
}
387
388
// Returns a fragment for the byte range lo-hi.
389
43.1M
Frag Compiler::ByteRange(int lo, int hi, bool foldcase) {
390
43.1M
  int id = AllocInst(1);
391
43.1M
  if (id < 0)
392
0
    return NoMatch();
393
43.1M
  inst_[id].InitByteRange(lo, hi, foldcase, 0);
394
43.1M
  return Frag(id, PatchList::Mk(id << 1), false);
395
43.1M
}
396
397
// Returns a no-op fragment.  Sometimes unavoidable.
398
197k
Frag Compiler::Nop() {
399
197k
  int id = AllocInst(1);
400
197k
  if (id < 0)
401
0
    return NoMatch();
402
197k
  inst_[id].InitNop(0);
403
197k
  return Frag(id, PatchList::Mk(id << 1), true);
404
197k
}
405
406
// Returns a fragment that signals a match.
407
40.1k
Frag Compiler::Match(int32_t match_id) {
408
40.1k
  int id = AllocInst(1);
409
40.1k
  if (id < 0)
410
0
    return NoMatch();
411
40.1k
  inst_[id].InitMatch(match_id);
412
40.1k
  return Frag(id, kNullPatchList, false);
413
40.1k
}
414
415
// Returns a fragment matching a particular empty-width op (like ^ or $)
416
493k
Frag Compiler::EmptyWidth(EmptyOp empty) {
417
493k
  int id = AllocInst(1);
418
493k
  if (id < 0)
419
0
    return NoMatch();
420
493k
  inst_[id].InitEmptyWidth(empty, 0);
421
493k
  return Frag(id, PatchList::Mk(id << 1), true);
422
493k
}
423
424
// Given a fragment a, returns a fragment with capturing parens around a.
425
235k
Frag Compiler::Capture(Frag a, int n) {
426
235k
  if (IsNoMatch(a))
427
1.02k
    return NoMatch();
428
234k
  int id = AllocInst(2);
429
234k
  if (id < 0)
430
0
    return NoMatch();
431
234k
  inst_[id].InitCapture(2*n, a.begin);
432
234k
  inst_[id+1].InitCapture(2*n+1, 0);
433
234k
  PatchList::Patch(inst_.data(), a.end, id+1);
434
435
234k
  return Frag(id, PatchList::Mk((id+1) << 1), a.nullable);
436
234k
}
437
438
// A Rune is a name for a Unicode code point.
439
// Returns maximum rune encoded by UTF-8 sequence of length len.
440
59.2M
static int MaxRune(int len) {
441
59.2M
  int b;  // number of Rune bits in len-byte UTF-8 sequence (len < UTFmax)
442
59.2M
  if (len == 1)
443
19.8M
    b = 7;
444
39.4M
  else
445
39.4M
    b = 8-(len+1) + 6*(len-1);
446
59.2M
  return (1<<b) - 1;   // maximum Rune for b bits.
447
59.2M
}
448
449
// The rune range compiler caches common suffix fragments,
450
// which are very common in UTF-8 (e.g., [80-bf]).
451
// The fragment suffixes are identified by their start
452
// instructions.  NULL denotes the eventual end match.
453
// The Frag accumulates in rune_range_.  Caching common
454
// suffixes reduces the UTF-8 "." from 32 to 24 instructions,
455
// and it reduces the corresponding one-pass NFA from 16 nodes to 8.
456
457
539k
void Compiler::BeginRange() {
458
539k
  rune_cache_.clear();
459
539k
  rune_range_.begin = 0;
460
539k
  rune_range_.end = kNullPatchList;
461
539k
}
462
463
int Compiler::UncachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase,
464
38.9M
                                     int next) {
465
38.9M
  Frag f = ByteRange(lo, hi, foldcase);
466
38.9M
  if (next != 0) {
467
31.8M
    PatchList::Patch(inst_.data(), f.end, next);
468
31.8M
  } else {
469
7.07M
    rune_range_.end = PatchList::Append(inst_.data(), rune_range_.end, f.end);
470
7.07M
  }
471
38.9M
  return f.begin;
472
38.9M
}
473
474
static uint64_t MakeRuneCacheKey(uint8_t lo, uint8_t hi, bool foldcase,
475
65.0M
                                 int next) {
476
65.0M
  return (uint64_t)next << 17 |
477
65.0M
         (uint64_t)lo   <<  9 |
478
65.0M
         (uint64_t)hi   <<  1 |
479
65.0M
         (uint64_t)foldcase;
480
65.0M
}
481
482
int Compiler::CachedRuneByteSuffix(uint8_t lo, uint8_t hi, bool foldcase,
483
21.5M
                                   int next) {
484
21.5M
  uint64_t key = MakeRuneCacheKey(lo, hi, foldcase, next);
485
21.5M
  absl::flat_hash_map<uint64_t, int>::const_iterator it = rune_cache_.find(key);
486
21.5M
  if (it != rune_cache_.end())
487
12.7M
    return it->second;
488
8.75M
  int id = UncachedRuneByteSuffix(lo, hi, foldcase, next);
489
8.75M
  rune_cache_[key] = id;
490
8.75M
  return id;
491
21.5M
}
492
493
43.5M
bool Compiler::IsCachedRuneByteSuffix(int id) {
494
43.5M
  uint8_t lo = inst_[id].lo_;
495
43.5M
  uint8_t hi = inst_[id].hi_;
496
43.5M
  bool foldcase = inst_[id].foldcase() != 0;
497
43.5M
  int next = inst_[id].out();
498
499
43.5M
  uint64_t key = MakeRuneCacheKey(lo, hi, foldcase, next);
500
43.5M
  return rune_cache_.find(key) != rune_cache_.end();
501
43.5M
}
502
503
16.4M
void Compiler::AddSuffix(int id) {
504
16.4M
  if (failed_)
505
0
    return;
506
507
16.4M
  if (rune_range_.begin == 0) {
508
539k
    rune_range_.begin = id;
509
539k
    return;
510
539k
  }
511
512
15.8M
  if (encoding_ == kEncodingUTF8) {
513
    // Build a trie in order to reduce fanout.
514
15.7M
    rune_range_.begin = AddSuffixRecursive(rune_range_.begin, id);
515
15.7M
    return;
516
15.7M
  }
517
518
147k
  int alt = AllocInst(1);
519
147k
  if (alt < 0) {
520
0
    rune_range_.begin = 0;
521
0
    return;
522
0
  }
523
147k
  inst_[alt].InitAlt(rune_range_.begin, id);
524
147k
  rune_range_.begin = alt;
525
147k
}
526
527
37.4M
int Compiler::AddSuffixRecursive(int root, int id) {
528
37.4M
  ABSL_DCHECK(inst_[root].opcode() == kInstAlt ||
529
37.4M
              inst_[root].opcode() == kInstByteRange);
530
531
37.4M
  Frag f = FindByteRange(root, id);
532
37.4M
  if (IsNoMatch(f)) {
533
15.7M
    int alt = AllocInst(1);
534
15.7M
    if (alt < 0)
535
0
      return 0;
536
15.7M
    inst_[alt].InitAlt(root, id);
537
15.7M
    return alt;
538
15.7M
  }
539
540
21.7M
  int br;
541
21.7M
  if (f.end.head == 0)
542
1.18M
    br = root;
543
20.5M
  else if (f.end.head&1)
544
20.5M
    br = inst_[f.begin].out1();
545
10.7k
  else
546
10.7k
    br = inst_[f.begin].out();
547
548
21.7M
  if (IsCachedRuneByteSuffix(br)) {
549
    // We can't fiddle with cached suffixes, so make a clone of the head.
550
73.9k
    int byterange = AllocInst(1);
551
73.9k
    if (byterange < 0)
552
0
      return 0;
553
73.9k
    inst_[byterange].InitByteRange(inst_[br].lo(), inst_[br].hi(),
554
73.9k
                                   inst_[br].foldcase(), inst_[br].out());
555
556
    // Ensure that the parent points to the clone, not to the original.
557
    // Note that this could leave the head unreachable except via the cache.
558
73.9k
    br = byterange;
559
73.9k
    if (f.end.head == 0)
560
13.7k
      root = br;
561
60.2k
    else if (f.end.head&1)
562
51.6k
      inst_[f.begin].out1_ = br;
563
8.58k
    else
564
8.58k
      inst_[f.begin].set_out(br);
565
73.9k
  }
566
567
21.7M
  int out = inst_[id].out();
568
21.7M
  if (!IsCachedRuneByteSuffix(id)) {
569
    // The head should be the instruction most recently allocated, so free it
570
    // instead of leaving it unreachable.
571
21.6M
    ABSL_DCHECK_EQ(id, ninst_-1);
572
21.6M
    inst_[id].out_opcode_ = 0;
573
21.6M
    inst_[id].out1_ = 0;
574
21.6M
    ninst_--;
575
21.6M
  }
576
577
21.7M
  out = AddSuffixRecursive(inst_[br].out(), out);
578
21.7M
  if (out == 0)
579
0
    return 0;
580
581
21.7M
  inst_[br].set_out(out);
582
21.7M
  return root;
583
21.7M
}
584
585
544M
bool Compiler::ByteRangeEqual(int id1, int id2) {
586
544M
  return inst_[id1].lo() == inst_[id2].lo() &&
587
53.3M
         inst_[id1].hi() == inst_[id2].hi() &&
588
21.7M
         inst_[id1].foldcase() == inst_[id2].foldcase();
589
544M
}
590
591
37.4M
Frag Compiler::FindByteRange(int root, int id) {
592
37.4M
  if (inst_[root].opcode() == kInstByteRange) {
593
5.31M
    if (ByteRangeEqual(root, id))
594
1.18M
      return Frag(root, kNullPatchList, false);
595
4.13M
    else
596
4.13M
      return NoMatch();
597
5.31M
  }
598
599
536M
  while (inst_[root].opcode() == kInstAlt) {
600
536M
    int out1 = inst_[root].out1();
601
536M
    if (ByteRangeEqual(out1, id))
602
20.5M
      return Frag(root, PatchList::Mk((root << 1) | 1), false);
603
604
    // CharClass is a sorted list of ranges, so if out1 of the root Alt wasn't
605
    // what we're looking for, then we can stop immediately. Unfortunately, we
606
    // can't short-circuit the search in reverse mode.
607
515M
    if (!reversed_)
608
8.36M
      return NoMatch();
609
610
507M
    int out = inst_[root].out();
611
507M
    if (inst_[out].opcode() == kInstAlt)
612
504M
      root = out;
613
3.23M
    else if (ByteRangeEqual(out, id))
614
10.7k
      return Frag(root, PatchList::Mk(root << 1), false);
615
3.22M
    else
616
3.22M
      return NoMatch();
617
507M
  }
618
619
32.1M
  ABSL_LOG(DFATAL) << "should never happen";
620
0
  return NoMatch();
621
0
}
622
623
539k
Frag Compiler::EndRange() {
624
539k
  return rune_range_;
625
539k
}
626
627
// Converts rune range lo-hi into a fragment that recognizes
628
// the bytes that would make up those runes in the current
629
// encoding (Latin 1 or UTF-8).
630
// This lets the machine work byte-by-byte even when
631
// using multibyte encodings.
632
633
12.5M
void Compiler::AddRuneRange(Rune lo, Rune hi, bool foldcase) {
634
12.5M
  switch (encoding_) {
635
0
    default:
636
12.2M
    case kEncodingUTF8:
637
12.2M
      AddRuneRangeUTF8(lo, hi, foldcase);
638
12.2M
      break;
639
264k
    case kEncodingLatin1:
640
264k
      AddRuneRangeLatin1(lo, hi, foldcase);
641
264k
      break;
642
12.5M
  }
643
12.5M
}
644
645
264k
void Compiler::AddRuneRangeLatin1(Rune lo, Rune hi, bool foldcase) {
646
  // Latin-1 is easy: runes *are* bytes.
647
264k
  if (lo > hi || lo > 0xFF)
648
0
    return;
649
264k
  if (hi > 0xFF)
650
14.9k
    hi = 0xFF;
651
264k
  AddSuffix(UncachedRuneByteSuffix(static_cast<uint8_t>(lo),
652
264k
                                   static_cast<uint8_t>(hi), foldcase, 0));
653
264k
}
654
655
39.0k
void Compiler::Add_80_10ffff() {
656
  // The 80-10FFFF (Runeself-Runemax) rune range occurs frequently enough
657
  // (for example, for /./ and /[^a-z]/) that it is worth simplifying: by
658
  // permitting overlong encodings in E0 and F0 sequences and code points
659
  // over 10FFFF in F4 sequences, the size of the bytecode and the number
660
  // of equivalence classes are reduced significantly.
661
39.0k
  int id;
662
39.0k
  if (reversed_) {
663
    // Prefix factoring matters, but we don't have to handle it here
664
    // because the rune range trie logic takes care of that already.
665
10.8k
    id = UncachedRuneByteSuffix(0xC2, 0xDF, false, 0);
666
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
667
10.8k
    AddSuffix(id);
668
669
10.8k
    id = UncachedRuneByteSuffix(0xE0, 0xEF, false, 0);
670
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
671
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
672
10.8k
    AddSuffix(id);
673
674
10.8k
    id = UncachedRuneByteSuffix(0xF0, 0xF4, false, 0);
675
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
676
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
677
10.8k
    id = UncachedRuneByteSuffix(0x80, 0xBF, false, id);
678
10.8k
    AddSuffix(id);
679
28.2k
  } else {
680
    // Suffix factoring matters - and we do have to handle it here.
681
28.2k
    int cont1 = UncachedRuneByteSuffix(0x80, 0xBF, false, 0);
682
28.2k
    id = UncachedRuneByteSuffix(0xC2, 0xDF, false, cont1);
683
28.2k
    AddSuffix(id);
684
685
28.2k
    int cont2 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont1);
686
28.2k
    id = UncachedRuneByteSuffix(0xE0, 0xEF, false, cont2);
687
28.2k
    AddSuffix(id);
688
689
28.2k
    int cont3 = UncachedRuneByteSuffix(0x80, 0xBF, false, cont2);
690
28.2k
    id = UncachedRuneByteSuffix(0xF0, 0xF4, false, cont3);
691
28.2k
    AddSuffix(id);
692
28.2k
  }
693
39.0k
}
694
695
19.8M
void Compiler::AddRuneRangeUTF8(Rune lo, Rune hi, bool foldcase) {
696
19.8M
  if (lo > hi)
697
0
    return;
698
699
  // Pick off 80-10FFFF as a common special case.
700
19.8M
  if (lo == 0x80 && hi == 0x10ffff) {
701
39.0k
    Add_80_10ffff();
702
39.0k
    return;
703
39.0k
  }
704
705
  // Split range into same-length sized ranges.
706
78.8M
  for (int i = 1; i < UTFmax; i++) {
707
59.2M
    Rune max = MaxRune(i);
708
59.2M
    if (lo <= max && max < hi) {
709
183k
      AddRuneRangeUTF8(lo, max, foldcase);
710
183k
      AddRuneRangeUTF8(max+1, hi, foldcase);
711
183k
      return;
712
183k
    }
713
59.2M
  }
714
715
  // ASCII range is always a special case.
716
19.6M
  if (hi < Runeself) {
717
355k
    AddSuffix(UncachedRuneByteSuffix(static_cast<uint8_t>(lo),
718
355k
                                     static_cast<uint8_t>(hi), foldcase, 0));
719
355k
    return;
720
355k
  }
721
722
  // Split range into sections that agree on leading bytes.
723
66.7M
  for (int i = 1; i < UTFmax; i++) {
724
51.1M
    uint32_t m = (1<<(6*i)) - 1;  // last i bytes of a UTF-8 sequence
725
51.1M
    if ((lo & ~m) != (hi & ~m)) {
726
5.78M
      if ((lo & m) != 0) {
727
2.48M
        AddRuneRangeUTF8(lo, lo|m, foldcase);
728
2.48M
        AddRuneRangeUTF8((lo|m)+1, hi, foldcase);
729
2.48M
        return;
730
2.48M
      }
731
3.30M
      if ((hi & m) != m) {
732
1.15M
        AddRuneRangeUTF8(lo, (hi&~m)-1, foldcase);
733
1.15M
        AddRuneRangeUTF8(hi&~m, hi, foldcase);
734
1.15M
        return;
735
1.15M
      }
736
3.30M
    }
737
51.1M
  }
738
739
  // Finally.  Generate byte matching equivalent for lo-hi.
740
15.6M
  uint8_t ulo[UTFmax], uhi[UTFmax];
741
15.6M
  int n = runetochar(reinterpret_cast<char*>(ulo), &lo);
742
15.6M
  int m = runetochar(reinterpret_cast<char*>(uhi), &hi);
743
15.6M
  (void)m;  // USED(m)
744
15.6M
  ABSL_DCHECK_EQ(n, m);
745
746
  // The logic below encodes this thinking:
747
  //
748
  // 1. When we have built the whole suffix, we know that it cannot
749
  // possibly be a suffix of anything longer: in forward mode, nothing
750
  // else can occur before the leading byte; in reverse mode, nothing
751
  // else can occur after the last continuation byte or else the leading
752
  // byte would have to change. Thus, there is no benefit to caching
753
  // the first byte of the suffix whereas there is a cost involved in
754
  // cloning it if it begins a common prefix, which is fairly likely.
755
  //
756
  // 2. Conversely, the last byte of the suffix cannot possibly be a
757
  // prefix of anything because next == 0, so we will never want to
758
  // clone it, but it is fairly likely to be a common suffix. Perhaps
759
  // more so in reverse mode than in forward mode because the former is
760
  // "converging" towards lower entropy, but caching is still worthwhile
761
  // for the latter in cases such as 80-BF.
762
  //
763
  // 3. Handling the bytes between the first and the last is less
764
  // straightforward and, again, the approach depends on whether we are
765
  // "converging" towards lower entropy: in forward mode, a single byte
766
  // is unlikely to be part of a common suffix whereas a byte range
767
  // is more likely so; in reverse mode, a byte range is unlikely to
768
  // be part of a common suffix whereas a single byte is more likely
769
  // so. The same benefit versus cost argument applies here.
770
15.6M
  int id = 0;
771
15.6M
  if (reversed_) {
772
17.0M
    for (int i = 0; i < n; i++) {
773
      // In reverse UTF-8 mode: cache the leading byte; don't cache the last
774
      // continuation byte; cache anything else iff it's a single byte (XX-XX).
775
13.0M
      if (i == 0 || (ulo[i] == uhi[i] && i != n-1))
776
8.75M
        id = CachedRuneByteSuffix(ulo[i], uhi[i], false, id);
777
4.32M
      else
778
4.32M
        id = UncachedRuneByteSuffix(ulo[i], uhi[i], false, id);
779
13.0M
    }
780
11.6M
  } else {
781
49.4M
    for (int i = n-1; i >= 0; i--) {
782
      // In forward UTF-8 mode: don't cache the leading byte; cache the last
783
      // continuation byte; cache anything else iff it's a byte range (XX-YY).
784
37.7M
      if (i == n-1 || (ulo[i] < uhi[i] && i != 0))
785
12.7M
        id = CachedRuneByteSuffix(ulo[i], uhi[i], false, id);
786
24.9M
      else
787
24.9M
        id = UncachedRuneByteSuffix(ulo[i], uhi[i], false, id);
788
37.7M
    }
789
11.6M
  }
790
15.6M
  AddSuffix(id);
791
15.6M
}
792
793
// Should not be called.
794
0
Frag Compiler::Copy(Frag arg) {
795
  // We're using WalkExponential; there should be no copying.
796
0
  failed_ = true;
797
0
  ABSL_LOG(DFATAL) << "Compiler::Copy called!";
798
0
  return NoMatch();
799
0
}
800
801
// Visits a node quickly; called once WalkExponential has
802
// decided to cut this walk short.
803
0
Frag Compiler::ShortVisit(Regexp* re, Frag) {
804
0
  failed_ = true;
805
0
  return NoMatch();
806
0
}
807
808
// Called before traversing a node's children during the walk.
809
6.26M
Frag Compiler::PreVisit(Regexp* re, Frag, bool* stop) {
810
  // Cut off walk if we've already failed.
811
6.26M
  if (failed_)
812
0
    *stop = true;
813
814
6.26M
  return Frag();  // not used by caller
815
6.26M
}
816
817
4.04M
Frag Compiler::Literal(Rune r, bool foldcase) {
818
4.04M
  switch (encoding_) {
819
0
    default:
820
0
      return Frag();
821
822
3.64M
    case kEncodingLatin1:
823
3.64M
      return ByteRange(r, r, foldcase);
824
825
407k
    case kEncodingUTF8: {
826
407k
      if (r < Runeself)  // Make common case fast.
827
328k
        return ByteRange(r, r, foldcase);
828
79.5k
      uint8_t buf[UTFmax];
829
79.5k
      int n = runetochar(reinterpret_cast<char*>(buf), &r);
830
79.5k
      Frag f = ByteRange((uint8_t)buf[0], buf[0], false);
831
192k
      for (int i = 1; i < n; i++)
832
112k
        f = Cat(f, ByteRange((uint8_t)buf[i], buf[i], false));
833
79.5k
      return f;
834
407k
    }
835
4.04M
  }
836
4.04M
}
837
838
// Called after traversing the node's children during the walk.
839
// Given their frags, build and return the frag for this re.
840
Frag Compiler::PostVisit(Regexp* re, Frag, Frag, Frag* child_frags,
841
6.26M
                         int nchild_frags) {
842
  // If a child failed, don't bother going forward, especially
843
  // since the child_frags might contain Frags with NULLs in them.
844
6.26M
  if (failed_)
845
0
    return NoMatch();
846
847
  // Given the child fragments, return the fragment for this node.
848
6.26M
  switch (re->op()) {
849
0
    case kRegexpRepeat:
850
      // Should not see; code at bottom of function will print error
851
0
      break;
852
853
14.7k
    case kRegexpNoMatch:
854
14.7k
      return NoMatch();
855
856
197k
    case kRegexpEmptyMatch:
857
197k
      return Nop();
858
859
9.60k
    case kRegexpHaveMatch: {
860
9.60k
      Frag f = Match(re->match_id());
861
9.60k
      if (anchor_ == RE2::ANCHOR_BOTH) {
862
        // Append \z or else the subexpression will effectively be unanchored.
863
        // Complemented by the UNANCHORED case in CompileSet().
864
2.49k
        f = Cat(EmptyWidth(kEmptyEndText), f);
865
2.49k
      }
866
9.60k
      return f;
867
0
    }
868
869
969k
    case kRegexpConcat: {
870
969k
      Frag f = child_frags[0];
871
3.93M
      for (int i = 1; i < nchild_frags; i++)
872
2.96M
        f = Cat(f, child_frags[i]);
873
969k
      return f;
874
0
    }
875
876
230k
    case kRegexpAlternate: {
877
230k
      Frag f = child_frags[0];
878
880k
      for (int i = 1; i < nchild_frags; i++)
879
650k
        f = Alt(f, child_frags[i]);
880
230k
      return f;
881
0
    }
882
883
366k
    case kRegexpStar:
884
366k
      return Star(child_frags[0], (re->parse_flags()&Regexp::NonGreedy) != 0);
885
886
74.1k
    case kRegexpPlus:
887
74.1k
      return Plus(child_frags[0], (re->parse_flags()&Regexp::NonGreedy) != 0);
888
889
730k
    case kRegexpQuest:
890
730k
      return Quest(child_frags[0], (re->parse_flags()&Regexp::NonGreedy) != 0);
891
892
1.87M
    case kRegexpLiteral:
893
1.87M
      return Literal(re->rune(), (re->parse_flags()&Regexp::FoldCase) != 0);
894
895
517k
    case kRegexpLiteralString: {
896
      // Concatenation of literals.
897
517k
      if (re->nrunes() == 0)
898
0
        return Nop();
899
517k
      Frag f;
900
2.69M
      for (int i = 0; i < re->nrunes(); i++) {
901
2.17M
        Frag f1 = Literal(re->runes()[i],
902
2.17M
                          (re->parse_flags()&Regexp::FoldCase) != 0);
903
2.17M
        if (i == 0)
904
517k
          f = f1;
905
1.65M
        else
906
1.65M
          f = Cat(f, f1);
907
2.17M
      }
908
517k
      return f;
909
517k
    }
910
911
22.5k
    case kRegexpAnyChar:
912
22.5k
      BeginRange();
913
22.5k
      AddRuneRange(0, Runemax, false);
914
22.5k
      return EndRange();
915
916
9.20k
    case kRegexpAnyByte:
917
9.20k
      return ByteRange(0x00, 0xFF, false);
918
919
517k
    case kRegexpCharClass: {
920
517k
      CharClass* cc = re->cc();
921
517k
      if (cc->empty()) {
922
        // This can't happen.
923
0
        failed_ = true;
924
0
        ABSL_LOG(DFATAL) << "No ranges in char class";
925
0
        return NoMatch();
926
0
      }
927
928
      // ASCII case-folding optimization: if the char class
929
      // behaves the same on A-Z as it does on a-z,
930
      // discard any ranges wholly contained in A-Z
931
      // and mark the other ranges as foldascii.
932
      // This reduces the size of a program for
933
      // (?i)abc from 3 insts per letter to 1 per letter.
934
517k
      bool foldascii = cc->FoldsASCII();
935
936
      // Character class is just a big OR of the different
937
      // character ranges in the class.
938
517k
      BeginRange();
939
13.0M
      for (CharClass::iterator i = cc->begin(); i != cc->end(); ++i) {
940
        // ASCII case-folding optimization (see above).
941
12.5M
        if (foldascii && 'A' <= i->lo && i->hi <= 'Z')
942
40.5k
          continue;
943
944
        // If this range contains all of A-Za-z or none of it,
945
        // the fold flag is unnecessary; don't bother.
946
12.4M
        bool fold = foldascii;
947
12.4M
        if ((i->lo <= 'A' && 'z' <= i->hi) || i->hi < 'A' || 'z' < i->lo ||
948
143k
            ('Z' < i->lo && i->hi < 'a'))
949
12.3M
          fold = false;
950
951
12.4M
        AddRuneRange(i->lo, i->hi, fold);
952
12.4M
      }
953
517k
      return EndRange();
954
517k
    }
955
956
235k
    case kRegexpCapture:
957
      // If this is a non-capturing parenthesis -- (?:foo) --
958
      // just use the inner expression.
959
235k
      if (re->cap() < 0)
960
0
        return child_frags[0];
961
235k
      return Capture(child_frags[0], re->cap());
962
963
12.7k
    case kRegexpBeginLine:
964
12.7k
      return EmptyWidth(reversed_ ? kEmptyEndLine : kEmptyBeginLine);
965
966
43.7k
    case kRegexpEndLine:
967
43.7k
      return EmptyWidth(reversed_ ? kEmptyBeginLine : kEmptyEndLine);
968
969
85.6k
    case kRegexpBeginText:
970
85.6k
      return EmptyWidth(reversed_ ? kEmptyEndText : kEmptyBeginText);
971
972
342k
    case kRegexpEndText:
973
342k
      return EmptyWidth(reversed_ ? kEmptyBeginText : kEmptyEndText);
974
975
2.83k
    case kRegexpWordBoundary:
976
2.83k
      return EmptyWidth(kEmptyWordBoundary);
977
978
3.00k
    case kRegexpNoWordBoundary:
979
3.00k
      return EmptyWidth(kEmptyNonWordBoundary);
980
6.26M
  }
981
0
  failed_ = true;
982
0
  ABSL_LOG(DFATAL) << "Missing case in Compiler: " << re->op();
983
0
  return NoMatch();
984
0
}
985
986
// Is this regexp required to start at the beginning of the text?
987
// Only approximate; can return false for complicated regexps like (\Aa|\Ab),
988
// but handles (\A(a|b)).  Could use the Walker to write a more exact one.
989
59.1k
static bool IsAnchorStart(Regexp** pre, int depth) {
990
59.1k
  Regexp* re = *pre;
991
59.1k
  Regexp* sub;
992
  // The depth limit makes sure that we don't overflow
993
  // the stack on a deeply nested regexp.  As the comment
994
  // above says, IsAnchorStart is conservative, so returning
995
  // a false negative is okay.  The exact limit is somewhat arbitrary.
996
59.1k
  if (re == NULL || depth >= 4)
997
712
    return false;
998
58.4k
  switch (re->op()) {
999
28.4k
    default:
1000
28.4k
      break;
1001
28.4k
    case kRegexpConcat:
1002
21.7k
      if (re->nsub() > 0) {
1003
21.7k
        sub = re->sub()[0]->Incref();
1004
21.7k
        if (IsAnchorStart(&sub, depth+1)) {
1005
1.65k
          PODArray<Regexp*> subcopy(re->nsub());
1006
1.65k
          subcopy[0] = sub;  // already have reference
1007
14.4k
          for (int i = 1; i < re->nsub(); i++)
1008
12.7k
            subcopy[i] = re->sub()[i]->Incref();
1009
1.65k
          *pre = Regexp::Concat(subcopy.data(), re->nsub(), re->parse_flags());
1010
1.65k
          re->Decref();
1011
1.65k
          return true;
1012
1.65k
        }
1013
20.1k
        sub->Decref();
1014
20.1k
      }
1015
20.1k
      break;
1016
20.1k
    case kRegexpCapture:
1017
6.80k
      sub = re->sub()[0]->Incref();
1018
6.80k
      if (IsAnchorStart(&sub, depth+1)) {
1019
376
        *pre = Regexp::Capture(sub, re->parse_flags(), re->cap());
1020
376
        re->Decref();
1021
376
        return true;
1022
376
      }
1023
6.42k
      sub->Decref();
1024
6.42k
      break;
1025
1.36k
    case kRegexpBeginText:
1026
1.36k
      *pre = Regexp::LiteralString(NULL, 0, re->parse_flags());
1027
1.36k
      re->Decref();
1028
1.36k
      return true;
1029
58.4k
  }
1030
55.0k
  return false;
1031
58.4k
}
1032
1033
// Is this regexp required to start at the end of the text?
1034
// Only approximate; can return false for complicated regexps like (a\z|b\z),
1035
// but handles ((a|b)\z).  Could use the Walker to write a more exact one.
1036
57.9k
static bool IsAnchorEnd(Regexp** pre, int depth) {
1037
57.9k
  Regexp* re = *pre;
1038
57.9k
  Regexp* sub;
1039
  // The depth limit makes sure that we don't overflow
1040
  // the stack on a deeply nested regexp.  As the comment
1041
  // above says, IsAnchorEnd is conservative, so returning
1042
  // a false negative is okay.  The exact limit is somewhat arbitrary.
1043
57.9k
  if (re == NULL || depth >= 4)
1044
621
    return false;
1045
57.3k
  switch (re->op()) {
1046
27.7k
    default:
1047
27.7k
      break;
1048
27.7k
    case kRegexpConcat:
1049
21.2k
      if (re->nsub() > 0) {
1050
21.2k
        sub = re->sub()[re->nsub() - 1]->Incref();
1051
21.2k
        if (IsAnchorEnd(&sub, depth+1)) {
1052
2.39k
          PODArray<Regexp*> subcopy(re->nsub());
1053
2.39k
          subcopy[re->nsub() - 1] = sub;  // already have reference
1054
18.4k
          for (int i = 0; i < re->nsub() - 1; i++)
1055
16.0k
            subcopy[i] = re->sub()[i]->Incref();
1056
2.39k
          *pre = Regexp::Concat(subcopy.data(), re->nsub(), re->parse_flags());
1057
2.39k
          re->Decref();
1058
2.39k
          return true;
1059
2.39k
        }
1060
18.8k
        sub->Decref();
1061
18.8k
      }
1062
18.8k
      break;
1063
18.8k
    case kRegexpCapture:
1064
6.21k
      sub = re->sub()[0]->Incref();
1065
6.21k
      if (IsAnchorEnd(&sub, depth+1)) {
1066
356
        *pre = Regexp::Capture(sub, re->parse_flags(), re->cap());
1067
356
        re->Decref();
1068
356
        return true;
1069
356
      }
1070
5.85k
      sub->Decref();
1071
5.85k
      break;
1072
2.20k
    case kRegexpEndText:
1073
2.20k
      *pre = Regexp::LiteralString(NULL, 0, re->parse_flags());
1074
2.20k
      re->Decref();
1075
2.20k
      return true;
1076
57.3k
  }
1077
52.3k
  return false;
1078
57.3k
}
1079
1080
void Compiler::Setup(Regexp::ParseFlags flags, int64_t max_mem,
1081
40.1k
                     RE2::Anchor anchor) {
1082
40.1k
  if (flags & Regexp::Latin1)
1083
20.5k
    encoding_ = kEncodingLatin1;
1084
40.1k
  max_mem_ = max_mem;
1085
40.1k
  if (max_mem <= 0) {
1086
0
    max_ninst_ = 100000;  // more than enough
1087
40.1k
  } else if (static_cast<size_t>(max_mem) <= sizeof(Prog)) {
1088
    // No room for anything.
1089
0
    max_ninst_ = 0;
1090
40.1k
  } else {
1091
40.1k
    int64_t m = (max_mem - sizeof(Prog)) / sizeof(Prog::Inst);
1092
    // Limit instruction count so that inst->id() fits nicely in an int.
1093
    // SparseArray also assumes that the indices (inst->id()) are ints.
1094
    // The call to WalkExponential uses 2*max_ninst_ below,
1095
    // and other places in the code use 2 or 3 * prog->size().
1096
    // Limiting to 2^24 should avoid overflow in those places.
1097
    // (The point of allowing more than 32 bits of memory is to
1098
    // have plenty of room for the DFA states, not to use it up
1099
    // on the program.)
1100
40.1k
    if (m >= 1<<24)
1101
0
      m = 1<<24;
1102
    // Inst imposes its own limit (currently bigger than 2^24 but be safe).
1103
40.1k
    if (m > Prog::Inst::kMaxInst)
1104
0
      m = Prog::Inst::kMaxInst;
1105
40.1k
    max_ninst_ = static_cast<int>(m);
1106
40.1k
  }
1107
40.1k
  anchor_ = anchor;
1108
40.1k
}
1109
1110
// Compiles re, returning program.
1111
// Caller is responsible for deleting prog_.
1112
// If reversed is true, compiles a program that expects
1113
// to run over the input string backward (reverses all concatenations).
1114
// The reversed flag is also recorded in the returned program.
1115
30.5k
Prog* Compiler::Compile(Regexp* re, bool reversed, int64_t max_mem) {
1116
30.5k
  Compiler c;
1117
30.5k
  c.Setup(re->parse_flags(), max_mem, RE2::UNANCHORED /* unused */);
1118
30.5k
  c.reversed_ = reversed;
1119
1120
  // Simplify to remove things like counted repetitions
1121
  // and character classes like \d.
1122
30.5k
  Regexp* sre = re->Simplify();
1123
30.5k
  if (sre == NULL)
1124
0
    return NULL;
1125
1126
  // Record whether prog is anchored, removing the anchors.
1127
  // (They get in the way of other optimizations.)
1128
30.5k
  bool is_anchor_start = IsAnchorStart(&sre, 0);
1129
30.5k
  bool is_anchor_end = IsAnchorEnd(&sre, 0);
1130
1131
  // Generate fragment for entire regexp.
1132
30.5k
  Frag all = c.WalkExponential(sre, Frag(), 2*c.max_ninst_);
1133
30.5k
  sre->Decref();
1134
30.5k
  if (c.failed_)
1135
0
    return NULL;
1136
1137
  // Success!  Finish by putting Match node at end, and record start.
1138
  // Turn off c.reversed_ (if it is set) to force the remaining concatenations
1139
  // to behave normally.
1140
30.5k
  c.reversed_ = false;
1141
30.5k
  all = c.Cat(all, c.Match(0));
1142
1143
30.5k
  c.prog_->set_reversed(reversed);
1144
30.5k
  if (c.prog_->reversed()) {
1145
10.2k
    c.prog_->set_anchor_start(is_anchor_end);
1146
10.2k
    c.prog_->set_anchor_end(is_anchor_start);
1147
20.3k
  } else {
1148
20.3k
    c.prog_->set_anchor_start(is_anchor_start);
1149
20.3k
    c.prog_->set_anchor_end(is_anchor_end);
1150
20.3k
  }
1151
1152
30.5k
  c.prog_->set_start(all.begin);
1153
30.5k
  if (!c.prog_->anchor_start()) {
1154
    // Also create unanchored version, which starts with a .*? loop.
1155
28.5k
    all = c.Cat(c.DotStar(), all);
1156
28.5k
  }
1157
30.5k
  c.prog_->set_start_unanchored(all.begin);
1158
1159
  // Hand ownership of prog_ to caller.
1160
30.5k
  return c.Finish(re);
1161
30.5k
}
1162
1163
40.1k
Prog* Compiler::Finish(Regexp* re) {
1164
40.1k
  if (failed_)
1165
0
    return NULL;
1166
1167
40.1k
  if (prog_->start() == 0 && prog_->start_unanchored() == 0) {
1168
    // No possible matches; keep Fail instruction only.
1169
745
    ninst_ = 1;
1170
745
  }
1171
1172
  // Hand off the array to Prog.
1173
40.1k
  prog_->inst_ = std::move(inst_);
1174
40.1k
  prog_->size_ = ninst_;
1175
1176
40.1k
  prog_->Optimize();
1177
40.1k
  prog_->Flatten();
1178
40.1k
  prog_->ComputeByteMap();
1179
1180
40.1k
  if (!prog_->reversed()) {
1181
29.9k
    std::string prefix;
1182
29.9k
    bool prefix_foldcase;
1183
29.9k
    if (re->RequiredPrefixForAccel(&prefix, &prefix_foldcase))
1184
6.33k
      prog_->ConfigurePrefixAccel(prefix, prefix_foldcase);
1185
29.9k
  }
1186
1187
  // Record remaining memory for DFA.
1188
40.1k
  if (max_mem_ <= 0) {
1189
0
    prog_->set_dfa_mem(1<<20);
1190
40.1k
  } else {
1191
40.1k
    int64_t m = max_mem_ - sizeof(Prog);
1192
40.1k
    m -= prog_->size_*sizeof(Prog::Inst);  // account for inst_
1193
40.1k
    if (prog_->CanBitState())
1194
33.0k
      m -= prog_->size_*sizeof(uint16_t);  // account for list_heads_
1195
40.1k
    if (m < 0)
1196
28
      m = 0;
1197
40.1k
    prog_->set_dfa_mem(m);
1198
40.1k
  }
1199
1200
40.1k
  Prog* p = prog_;
1201
40.1k
  prog_ = NULL;
1202
40.1k
  return p;
1203
40.1k
}
1204
1205
// Converts Regexp to Prog.
1206
20.3k
Prog* Regexp::CompileToProg(int64_t max_mem) {
1207
20.3k
  return Compiler::Compile(this, false, max_mem);
1208
20.3k
}
1209
1210
10.2k
Prog* Regexp::CompileToReverseProg(int64_t max_mem) {
1211
10.2k
  return Compiler::Compile(this, true, max_mem);
1212
10.2k
}
1213
1214
32.7k
Frag Compiler::DotStar() {
1215
32.7k
  return Star(ByteRange(0x00, 0xff, false), true);
1216
32.7k
}
1217
1218
// Compiles RE set to Prog.
1219
9.60k
Prog* Compiler::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) {
1220
9.60k
  Compiler c;
1221
9.60k
  c.Setup(re->parse_flags(), max_mem, anchor);
1222
1223
9.60k
  Regexp* sre = re->Simplify();
1224
9.60k
  if (sre == NULL)
1225
0
    return NULL;
1226
1227
9.60k
  Frag all = c.WalkExponential(sre, Frag(), 2*c.max_ninst_);
1228
9.60k
  sre->Decref();
1229
9.60k
  if (c.failed_)
1230
0
    return NULL;
1231
1232
9.60k
  c.prog_->set_anchor_start(true);
1233
9.60k
  c.prog_->set_anchor_end(true);
1234
1235
9.60k
  if (anchor == RE2::UNANCHORED) {
1236
    // Prepend .* or else the expression will effectively be anchored.
1237
    // Complemented by the ANCHOR_BOTH case in PostVisit().
1238
4.20k
    all = c.Cat(c.DotStar(), all);
1239
4.20k
  }
1240
9.60k
  c.prog_->set_start(all.begin);
1241
9.60k
  c.prog_->set_start_unanchored(all.begin);
1242
1243
9.60k
  Prog* prog = c.Finish(re);
1244
9.60k
  if (prog == NULL)
1245
0
    return NULL;
1246
1247
  // Make sure DFA has enough memory to operate,
1248
  // since we're not going to fall back to the NFA.
1249
9.60k
  bool dfa_failed = false;
1250
9.60k
  absl::string_view sp = "hello, world";
1251
9.60k
  prog->SearchDFA(sp, sp, Prog::kAnchored, Prog::kManyMatch,
1252
9.60k
                  NULL, &dfa_failed, NULL);
1253
9.60k
  if (dfa_failed) {
1254
0
    delete prog;
1255
0
    return NULL;
1256
0
  }
1257
1258
9.60k
  return prog;
1259
9.60k
}
1260
1261
9.60k
Prog* Prog::CompileSet(Regexp* re, RE2::Anchor anchor, int64_t max_mem) {
1262
9.60k
  return Compiler::CompileSet(re, anchor, max_mem);
1263
9.60k
}
1264
1265
}  // namespace re2