1 // Copyright 2020 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_H_
6 #define V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_H_
7 
8 #include "src/regexp/regexp-flags.h"
9 #include "src/regexp/regexp.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 class ExperimentalRegExp final : public AllStatic {
15  public:
16   // Initialization & Compilation
17   // -------------------------------------------------------------------------
18   // Check whether a parsed regexp pattern can be compiled and executed by the
19   // EXPERIMENTAL engine.
20   // TODO(mbid, v8:10765): This walks the RegExpTree, but it could also be
21   // checked on the fly in the parser.  Not done currently because walking the
22   // AST again is more flexible and less error prone (but less performant).
23   static bool CanBeHandled(RegExpTree* tree, RegExpFlags flags,
24                            int capture_count);
25   static void Initialize(Isolate* isolate, Handle<JSRegExp> re,
26                          Handle<String> pattern, RegExpFlags flags,
27                          int capture_count);
28   static bool IsCompiled(Handle<JSRegExp> re, Isolate* isolate);
29   V8_WARN_UNUSED_RESULT
30   static bool Compile(Isolate* isolate, Handle<JSRegExp> re);
31 
32   // Execution:
33   static int32_t MatchForCallFromJs(Address subject, int32_t start_position,
34                                     Address input_start, Address input_end,
35                                     int* output_registers,
36                                     int32_t output_register_count,
37                                     RegExp::CallOrigin call_origin,
38                                     Isolate* isolate, Address regexp);
39   static MaybeHandle<Object> Exec(
40       Isolate* isolate, Handle<JSRegExp> regexp, Handle<String> subject,
41       int index, Handle<RegExpMatchInfo> last_match_info,
42       RegExp::ExecQuirks exec_quirks = RegExp::ExecQuirks::kNone);
43   static int32_t ExecRaw(Isolate* isolate, RegExp::CallOrigin call_origin,
44                          JSRegExp regexp, String subject,
45                          int32_t* output_registers,
46                          int32_t output_register_count, int32_t subject_index);
47 
48   // Compile and execute a regexp with the experimental engine, regardless of
49   // its type tag.  The regexp itself is not changed (apart from lastIndex).
50   static MaybeHandle<Object> OneshotExec(
51       Isolate* isolate, Handle<JSRegExp> regexp, Handle<String> subject,
52       int index, Handle<RegExpMatchInfo> last_match_info,
53       RegExp::ExecQuirks exec_quirks = RegExp::ExecQuirks::kNone);
54   static int32_t OneshotExecRaw(Isolate* isolate, Handle<JSRegExp> regexp,
55                                 Handle<String> subject,
56                                 int32_t* output_registers,
57                                 int32_t output_register_count,
58                                 int32_t subject_index);
59 
60   static constexpr bool kSupportsUnicode = false;
61 };
62 
63 }  // namespace internal
64 }  // namespace v8
65 
66 #endif  // V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_H_
67