1 2 // Copyright 2021 the V8 project authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 6 #ifndef INCLUDE_V8_REGEXP_H_ 7 #define INCLUDE_V8_REGEXP_H_ 8 9 #include "v8-local-handle.h" // NOLINT(build/include_directory) 10 #include "v8-object.h" // NOLINT(build/include_directory) 11 #include "v8config.h" // NOLINT(build/include_directory) 12 13 namespace v8 { 14 15 class Context; 16 17 /** 18 * An instance of the built-in RegExp constructor (ECMA-262, 15.10). 19 */ 20 class V8_EXPORT RegExp : public Object { 21 public: 22 /** 23 * Regular expression flag bits. They can be or'ed to enable a set 24 * of flags. 25 * The kLinear value ('l') is experimental and can only be used with 26 * --enable-experimental-regexp-engine. RegExps with kLinear flag are 27 * guaranteed to be executed in asymptotic linear time wrt. the length of 28 * the subject string. 29 */ 30 enum Flags { 31 kNone = 0, 32 kGlobal = 1 << 0, 33 kIgnoreCase = 1 << 1, 34 kMultiline = 1 << 2, 35 kSticky = 1 << 3, 36 kUnicode = 1 << 4, 37 kDotAll = 1 << 5, 38 kLinear = 1 << 6, 39 kHasIndices = 1 << 7, 40 }; 41 42 static constexpr int kFlagCount = 8; 43 44 /** 45 * Creates a regular expression from the given pattern string and 46 * the flags bit field. May throw a JavaScript exception as 47 * described in ECMA-262, 15.10.4.1. 48 * 49 * For example, 50 * RegExp::New(v8::String::New("foo"), 51 * static_cast<RegExp::Flags>(kGlobal | kMultiline)) 52 * is equivalent to evaluating "/foo/gm". 53 */ 54 static V8_WARN_UNUSED_RESULT MaybeLocal<RegExp> New(Local<Context> context, 55 Local<String> pattern, 56 Flags flags); 57 58 /** 59 * Like New, but additionally specifies a backtrack limit. If the number of 60 * backtracks done in one Exec call hits the limit, a match failure is 61 * immediately returned. 62 */ 63 static V8_WARN_UNUSED_RESULT MaybeLocal<RegExp> NewWithBacktrackLimit( 64 Local<Context> context, Local<String> pattern, Flags flags, 65 uint32_t backtrack_limit); 66 67 /** 68 * Executes the current RegExp instance on the given subject string. 69 * Equivalent to RegExp.prototype.exec as described in 70 * 71 * https://tc39.es/ecma262/#sec-regexp.prototype.exec 72 * 73 * On success, an Array containing the matched strings is returned. On 74 * failure, returns Null. 75 * 76 * Note: modifies global context state, accessible e.g. through RegExp.input. 77 */ 78 V8_WARN_UNUSED_RESULT MaybeLocal<Object> Exec(Local<Context> context, 79 Local<String> subject); 80 81 /** 82 * Returns the value of the source property: a string representing 83 * the regular expression. 84 */ 85 Local<String> GetSource() const; 86 87 /** 88 * Returns the flags bit field. 89 */ 90 Flags GetFlags() const; 91 Cast(Value * value)92 V8_INLINE static RegExp* Cast(Value* value) { 93 #ifdef V8_ENABLE_CHECKS 94 CheckCast(value); 95 #endif 96 return static_cast<RegExp*>(value); 97 } 98 99 private: 100 static void CheckCast(Value* obj); 101 }; 102 103 } // namespace v8 104 105 #endif // INCLUDE_V8_REGEXP_H_ 106