• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 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_BUILTINS_BUILTINS_REGEXP_GEN_H_
6 #define V8_BUILTINS_BUILTINS_REGEXP_GEN_H_
7 
8 #include "src/code-stub-assembler.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 class RegExpBuiltinsAssembler : public CodeStubAssembler {
14  public:
RegExpBuiltinsAssembler(compiler::CodeAssemblerState * state)15   explicit RegExpBuiltinsAssembler(compiler::CodeAssemblerState* state)
16       : CodeStubAssembler(state) {}
17 
18   void BranchIfFastRegExp(Node* const context, Node* const object,
19                           Node* const map, Label* const if_isunmodified,
20                           Label* const if_ismodified);
21 
22   // Create and initialize a RegExp object.
23   TNode<Object> RegExpCreate(TNode<Context> context,
24                              TNode<Context> native_context,
25                              TNode<Object> regexp_string, TNode<String> flags);
26 
27   TNode<Object> RegExpCreate(TNode<Context> context, TNode<Map> initial_map,
28                              TNode<Object> regexp_string, TNode<String> flags);
29 
30   TNode<Object> MatchAllIterator(TNode<Context> context,
31                                  TNode<Context> native_context,
32                                  TNode<Object> regexp, TNode<String> string,
33                                  TNode<BoolT> is_fast_regexp,
34                                  char const* method_name);
35 
36  protected:
37   TNode<Smi> SmiZero();
38   TNode<IntPtrT> IntPtrZero();
39 
40   // Allocate a RegExpResult with the given length (the number of captures,
41   // including the match itself), index (the index where the match starts),
42   // and input string.
43   TNode<JSRegExpResult> AllocateRegExpResult(TNode<Context> context,
44                                              TNode<Smi> length,
45                                              TNode<Smi> index,
46                                              TNode<String> input);
47 
48   TNode<Object> FastLoadLastIndex(TNode<JSRegExp> regexp);
49   TNode<Object> SlowLoadLastIndex(TNode<Context> context, TNode<Object> regexp);
50   TNode<Object> LoadLastIndex(TNode<Context> context, TNode<Object> regexp,
51                               bool is_fastpath);
52 
53   void FastStoreLastIndex(Node* regexp, Node* value);
54   void SlowStoreLastIndex(Node* context, Node* regexp, Node* value);
55   void StoreLastIndex(Node* context, Node* regexp, Node* value,
56                       bool is_fastpath);
57 
58   // Loads {var_string_start} and {var_string_end} with the corresponding
59   // offsets into the given {string_data}.
60   void GetStringPointers(Node* const string_data, Node* const offset,
61                          Node* const last_index, Node* const string_length,
62                          String::Encoding encoding, Variable* var_string_start,
63                          Variable* var_string_end);
64 
65   // Low level logic around the actual call into pattern matching code.
66   TNode<HeapObject> RegExpExecInternal(TNode<Context> context,
67                                        TNode<JSRegExp> regexp,
68                                        TNode<String> string,
69                                        TNode<Number> last_index,
70                                        TNode<RegExpMatchInfo> match_info);
71 
72   TNode<JSRegExpResult> ConstructNewResultFromMatchInfo(
73       TNode<Context> context, TNode<JSReceiver> maybe_regexp,
74       TNode<RegExpMatchInfo> match_info, TNode<String> string);
75 
76   TNode<RegExpMatchInfo> RegExpPrototypeExecBodyWithoutResult(
77       TNode<Context> context, TNode<JSReceiver> maybe_regexp,
78       TNode<String> string, Label* if_didnotmatch, const bool is_fastpath);
79   TNode<HeapObject> RegExpPrototypeExecBody(TNode<Context> context,
80                                             TNode<JSReceiver> maybe_regexp,
81                                             TNode<String> string,
82                                             const bool is_fastpath);
83 
84   Node* ThrowIfNotJSReceiver(Node* context, Node* maybe_receiver,
85                              MessageTemplate::Template msg_template,
86                              char const* method_name);
87 
88   // Analogous to BranchIfFastRegExp, for use in asserts.
89   TNode<BoolT> IsFastRegExp(SloppyTNode<Context> context,
90                             SloppyTNode<Object> object);
91 
92   void BranchIfFastRegExp(Node* const context, Node* const object,
93                           Label* const if_isunmodified,
94                           Label* const if_ismodified);
95 
96   // Performs fast path checks on the given object itself, but omits prototype
97   // checks.
98   Node* IsFastRegExpNoPrototype(Node* const context, Node* const object);
99   TNode<BoolT> IsFastRegExpWithOriginalExec(TNode<Context> context,
100                                             TNode<JSRegExp> object);
101   Node* IsFastRegExpNoPrototype(Node* const context, Node* const object,
102                                 Node* const map);
103 
104   void BranchIfFastRegExpResult(Node* const context, Node* const object,
105                                 Label* if_isunmodified, Label* if_ismodified);
106 
107   Node* FlagsGetter(Node* const context, Node* const regexp, bool is_fastpath);
108 
109   Node* FastFlagGetter(Node* const regexp, JSRegExp::Flag flag);
110   Node* SlowFlagGetter(Node* const context, Node* const regexp,
111                        JSRegExp::Flag flag);
112   Node* FlagGetter(Node* const context, Node* const regexp, JSRegExp::Flag flag,
113                    bool is_fastpath);
114   void FlagGetter(Node* context, Node* receiver, JSRegExp::Flag flag,
115                   int counter, const char* method_name);
116 
117   Node* IsRegExp(Node* const context, Node* const maybe_receiver);
118 
119   Node* RegExpInitialize(Node* const context, Node* const regexp,
120                          Node* const maybe_pattern, Node* const maybe_flags);
121 
122   Node* RegExpExec(Node* context, Node* regexp, Node* string);
123 
124   Node* AdvanceStringIndex(Node* const string, Node* const index,
125                            Node* const is_unicode, bool is_fastpath);
126 
127   void RegExpPrototypeMatchBody(Node* const context, Node* const regexp,
128                                 TNode<String> const string,
129                                 const bool is_fastpath);
130 
131   void RegExpPrototypeSearchBodyFast(Node* const context, Node* const regexp,
132                                      Node* const string);
133   void RegExpPrototypeSearchBodySlow(Node* const context, Node* const regexp,
134                                      Node* const string);
135 
136   void RegExpPrototypeSplitBody(Node* const context, Node* const regexp,
137                                 TNode<String> const string,
138                                 TNode<Smi> const limit);
139 
140   Node* ReplaceGlobalCallableFastPath(Node* context, Node* regexp, Node* string,
141                                       Node* replace_callable);
142   Node* ReplaceSimpleStringFastPath(Node* context, Node* regexp,
143                                     TNode<String> string,
144                                     TNode<String> replace_string);
145 };
146 
147 }  // namespace internal
148 }  // namespace v8
149 
150 #endif  // V8_BUILTINS_BUILTINS_REGEXP_GEN_H_
151