1// Copyright 2016 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_REGEXP_UTILS_H_
6#define V8_REGEXP_REGEXP_UTILS_H_
7
8#include "src/objects.h"
9
10namespace v8 {
11namespace internal {
12
13class RegExpMatchInfo;
14
15// Helper methods for C++ regexp builtins.
16class RegExpUtils : public AllStatic {
17 public:
18  // Last match info accessors.
19  static Handle<String> GenericCaptureGetter(Isolate* isolate,
20                                             Handle<RegExpMatchInfo> match_info,
21                                             int capture, bool* ok = nullptr);
22
23  // Last index (RegExp.lastIndex) accessors.
24  static MUST_USE_RESULT MaybeHandle<Object> SetLastIndex(
25      Isolate* isolate, Handle<JSReceiver> regexp, int value);
26  static MUST_USE_RESULT MaybeHandle<Object> GetLastIndex(
27      Isolate* isolate, Handle<JSReceiver> recv);
28
29  // ES#sec-regexpexec Runtime Semantics: RegExpExec ( R, S )
30  static MUST_USE_RESULT MaybeHandle<Object> RegExpExec(
31      Isolate* isolate, Handle<JSReceiver> regexp, Handle<String> string,
32      Handle<Object> exec);
33
34  // ES#sec-isregexp IsRegExp ( argument )
35  // Includes checking of the match property.
36  static Maybe<bool> IsRegExp(Isolate* isolate, Handle<Object> object);
37
38  // Checks whether the given object is an unmodified JSRegExp instance.
39  // Neither the object's map, nor its prototype's map may be modified.
40  static bool IsUnmodifiedRegExp(Isolate* isolate, Handle<Object> obj);
41
42  // ES#sec-advancestringindex
43  // AdvanceStringIndex ( S, index, unicode )
44  static int AdvanceStringIndex(Isolate* isolate, Handle<String> string,
45                                int index, bool unicode);
46  static MUST_USE_RESULT MaybeHandle<Object> SetAdvancedStringIndex(
47      Isolate* isolate, Handle<JSReceiver> regexp, Handle<String> string,
48      bool unicode);
49};
50
51}  // namespace internal
52}  // namespace v8
53
54#endif  // V8_REGEXP_REGEXP_UTILS_H_
55