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