v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
js-regexp-inl.h
Go to the documentation of this file.
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_OBJECTS_JS_REGEXP_INL_H_
6#define V8_OBJECTS_JS_REGEXP_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
12#include "src/objects/objects-inl.h" // Needed for write barriers
13#include "src/objects/smi.h"
14#include "src/objects/string.h"
15
16// Has to be the last include (doesn't have include guards):
18
19namespace v8 {
20namespace internal {
21
22#include "torque-generated/src/objects/js-regexp-tq-inl.inc"
23
25TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResult)
26TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResultIndices)
27TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResultWithIndices)
28
29OBJECT_CONSTRUCTORS_IMPL(RegExpData, ExposedTrustedObject)
30OBJECT_CONSTRUCTORS_IMPL(AtomRegExpData, RegExpData)
31OBJECT_CONSTRUCTORS_IMPL(IrRegExpData, RegExpData)
32OBJECT_CONSTRUCTORS_IMPL(RegExpDataWrapper, Struct)
33
34ACCESSORS(JSRegExp, last_index, Tagged<Object>, kLastIndexOffset)
35
36Tagged<String> JSRegExp::source() const {
37 return Cast<String>(TorqueGeneratedClass::source());
38}
39
40JSRegExp::Flags JSRegExp::flags() const {
41 Tagged<Smi> smi = Cast<Smi>(TorqueGeneratedClass::flags());
42 return Flags(smi.value());
43}
44
46 kRegExpDataIndirectPointerTag)
47
48// static
49const char* JSRegExp::FlagsToString(Flags flags, FlagsBuffer* out_buffer) {
50 int cursor = 0;
51 FlagsBuffer& buffer = *out_buffer;
52#define V(Lower, Camel, LowerCamel, Char, Bit) \
53 if (flags & JSRegExp::k##Camel) buffer[cursor++] = Char;
55#undef V
56 buffer[cursor++] = '\0';
57 return buffer.begin();
58}
59
64
67 return Type(value.value());
68}
69
72 *this, Smi::FromInt(static_cast<uint8_t>(type)));
73}
74
75ACCESSORS(RegExpData, source, Tagged<String>, kSourceOffset)
76
77JSRegExp::Flags RegExpData::flags() const {
79 return JSRegExp::Flags(value.value());
80}
81
82void RegExpData::set_flags(JSRegExp::Flags flags) {
84}
85
86ACCESSORS(RegExpData, wrapper, Tagged<RegExpDataWrapper>, kWrapperOffset)
87
88int RegExpData::capture_count() const {
89 switch (type_tag()) {
90 case Type::ATOM:
91 return 0;
92 case Type::EXPERIMENTAL:
93 case Type::IRREGEXP:
94 return Cast<IrRegExpData>(*this)->capture_count();
95 }
96}
97
99 kRegExpDataIndirectPointerTag)
100
102
103CODE_POINTER_ACCESSORS(IrRegExpData, latin1_code, kLatin1CodeOffset)
104CODE_POINTER_ACCESSORS(IrRegExpData, uc16_code, kUc16CodeOffset)
105bool IrRegExpData::has_code(bool is_one_byte) const {
106 return is_one_byte ? has_latin1_code() : has_uc16_code();
107}
108void IrRegExpData::set_code(bool is_one_byte, Tagged<Code> code) {
109 if (is_one_byte) {
110 set_latin1_code(code);
111 } else {
112 set_uc16_code(code);
113 }
114}
116 bool is_one_byte) const {
117 return is_one_byte ? latin1_code(isolate) : uc16_code(isolate);
118}
120 kLatin1BytecodeOffset)
122 kUc16BytecodeOffset)
123bool IrRegExpData::has_bytecode(bool is_one_byte) const {
124 return is_one_byte ? has_latin1_bytecode() : has_uc16_bytecode();
125}
126void IrRegExpData::clear_bytecode(bool is_one_byte) {
127 if (is_one_byte) {
128 clear_latin1_bytecode();
129 } else {
130 clear_uc16_bytecode();
131 }
132}
133void IrRegExpData::set_bytecode(bool is_one_byte,
134 Tagged<TrustedByteArray> bytecode) {
135 if (is_one_byte) {
136 set_latin1_bytecode(bytecode);
137 } else {
138 set_uc16_bytecode(bytecode);
139 }
140}
142 return is_one_byte ? latin1_bytecode() : uc16_bytecode();
143}
145void IrRegExpData::set_capture_name_map(
147 if (capture_name_map.is_null()) {
148 set_capture_name_map(Smi::zero());
149 } else {
150 set_capture_name_map(*capture_name_map);
151 }
152}
153
154SMI_ACCESSORS(IrRegExpData, max_register_count, kMaxRegisterCountOffset)
155SMI_ACCESSORS(IrRegExpData, capture_count, kCaptureCountOffset)
156SMI_ACCESSORS(IrRegExpData, ticks_until_tier_up, kTicksUntilTierUpOffset)
157SMI_ACCESSORS(IrRegExpData, backtrack_limit, kBacktrackLimitOffset)
158
159} // namespace internal
160} // namespace v8
161
163
164#endif // V8_OBJECTS_JS_REGEXP_INL_H_
Tagged< TrustedByteArray > bytecode(bool is_one_byte) const
bool has_code(bool is_one_byte) const
void set_code(bool is_one_byte, Tagged< Code > code)
void set_bytecode(bool is_one_byte, Tagged< TrustedByteArray > bytecode)
Tagged< Code > code(IsolateForSandbox isolate, bool is_one_byte) const
void clear_bytecode(bool is_one_byte)
static const char * FlagsToString(Flags flags, FlagsBuffer *out_buffer)
Tagged< String > source() const
Tagged< String > EscapedPattern()
base::EmbeddedVector< char, kFlagCount+1 > FlagsBuffer
Definition js-regexp.h:145
void set_flags(JSRegExp::Flags flags)
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
static PtrType load(Tagged< HeapObject > host, int offset=0)
static void store(Tagged< HeapObject > host, PtrType value)
DirectHandle< FixedArray > capture_name_map
std::string pattern
V8_EXPORT_PRIVATE base::Vector< Flag > Flags()
Definition flags.cc:300
Tagged(T object) -> Tagged< T >
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
#define CODE_POINTER_ACCESSORS(holder, name, offset)
#define PROTECTED_POINTER_ACCESSORS(holder, name, type, offset)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define ACCESSORS(holder, name, type, offset)
#define TRUSTED_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define SMI_ACCESSORS(holder, name, offset)
#define DCHECK(condition)
Definition logging.h:482