diff options
Diffstat (limited to 'deps/v8/src/regexp/experimental/experimental-compiler.cc')
-rw-r--r-- | deps/v8/src/regexp/experimental/experimental-compiler.cc | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/deps/v8/src/regexp/experimental/experimental-compiler.cc b/deps/v8/src/regexp/experimental/experimental-compiler.cc index ce6e0c75ca..566ae06829 100644 --- a/deps/v8/src/regexp/experimental/experimental-compiler.cc +++ b/deps/v8/src/regexp/experimental/experimental-compiler.cc @@ -69,6 +69,11 @@ class CanBeHandledVisitor final : private RegExpVisitor { return nullptr; } + void* VisitClassSetOperand(RegExpClassSetOperand* node, void*) override { + result_ = !node->has_strings(); + return nullptr; + } + void* VisitClassSetExpression(RegExpClassSetExpression* node, void*) override { result_ = false; @@ -391,11 +396,10 @@ class CompileVisitor : private RegExpVisitor { return nullptr; } - void* VisitClassRanges(RegExpClassRanges* node, void*) override { + void CompileCharacterRanges(ZoneList<CharacterRange>* ranges, bool negated) { // A character class is compiled as Disjunction over its `CharacterRange`s. - ZoneList<CharacterRange>* ranges = node->ranges(zone_); CharacterRange::Canonicalize(ranges); - if (node->is_negated()) { + if (negated) { // The complement of a disjoint, non-adjacent (i.e. `Canonicalize`d) // union of k intervals is a union of at most k + 1 intervals. ZoneList<CharacterRange>* negated = @@ -422,6 +426,17 @@ class CompileVisitor : private RegExpVisitor { assembler_.ConsumeRange(from_uc16, to_uc16); }); + } + + void* VisitClassRanges(RegExpClassRanges* node, void*) override { + CompileCharacterRanges(node->ranges(zone_), node->is_negated()); + return nullptr; + } + + void* VisitClassSetOperand(RegExpClassSetOperand* node, void*) override { + // TODO(v8:11935): Support strings. + DCHECK(!node->has_strings()); + CompileCharacterRanges(node->ranges(), false); return nullptr; } |