blob: 8718e94365817805fafd76964a60341728b256ba [file] [log] [blame]
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_OBJECTS_JS_REGEXP_INL_H_
#define V8_OBJECTS_JS_REGEXP_INL_H_
#include "src/objects/js-regexp.h"
#include "src/objects/js-array-inl.h"
#include "src/objects/objects-inl.h" // Needed for write barriers
#include "src/objects/smi.h"
#include "src/objects/string.h"
// Has to be the last include (doesn't have include guards):
#include "src/objects/object-macros.h"
namespace v8 {
namespace internal {
#include "torque-generated/src/objects/js-regexp-tq-inl.inc"
TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExp)
TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResult)
TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResultIndices)
TQ_OBJECT_CONSTRUCTORS_IMPL(JSRegExpResultWithIndices)
OBJECT_CONSTRUCTORS_IMPL(RegExpData, ExposedTrustedObject)
OBJECT_CONSTRUCTORS_IMPL(AtomRegExpData, RegExpData)
OBJECT_CONSTRUCTORS_IMPL(IrRegExpData, RegExpData)
OBJECT_CONSTRUCTORS_IMPL(RegExpDataWrapper, Struct)
ACCESSORS(JSRegExp, last_index, Tagged<Object>, kLastIndexOffset)
Tagged<String> JSRegExp::source() const {
return Cast<String>(TorqueGeneratedClass::source());
}
JSRegExp::Flags JSRegExp::flags() const {
Tagged<Smi> smi = Cast<Smi>(TorqueGeneratedClass::flags());
return Flags(smi.value());
}
TRUSTED_POINTER_ACCESSORS(JSRegExp, data, RegExpData, kDataOffset,
kRegExpDataIndirectPointerTag)
// static
const char* JSRegExp::FlagsToString(Flags flags, FlagsBuffer* out_buffer) {
int cursor = 0;
FlagsBuffer& buffer = *out_buffer;
#define V(Lower, Camel, LowerCamel, Char, Bit) \
if (flags & JSRegExp::k##Camel) buffer[cursor++] = Char;
REGEXP_FLAG_LIST(V)
#undef V
buffer[cursor++] = '\0';
return buffer.begin();
}
Tagged<String> JSRegExp::EscapedPattern() {
DCHECK(IsString(source()));
return Cast<String>(source());
}
RegExpData::Type RegExpData::type_tag() const {
Tagged<Smi> value = TaggedField<Smi, kTypeTagOffset>::load(*this);
return Type(value.value());
}
void RegExpData::set_type_tag(Type type) {
TaggedField<Smi, kTypeTagOffset>::store(
*this, Smi::FromInt(static_cast<uint8_t>(type)));
}
ACCESSORS(RegExpData, source, Tagged<String>, kSourceOffset)
JSRegExp::Flags RegExpData::flags() const {
Tagged<Smi> value = TaggedField<Smi, kFlagsOffset>::load(*this);
return JSRegExp::Flags(value.value());
}
void RegExpData::set_flags(JSRegExp::Flags flags) {
TaggedField<Smi, kFlagsOffset>::store(*this, Smi::FromInt(flags));
}
ACCESSORS(RegExpData, wrapper, Tagged<RegExpDataWrapper>, kWrapperOffset)
int RegExpData::capture_count() const {
switch (type_tag()) {
case Type::ATOM:
return 0;
case Type::EXPERIMENTAL:
case Type::IRREGEXP:
return Cast<IrRegExpData>(*this)->capture_count();
}
}
TRUSTED_POINTER_ACCESSORS(RegExpDataWrapper, data, RegExpData, kDataOffset,
kRegExpDataIndirectPointerTag)
ACCESSORS(AtomRegExpData, pattern, Tagged<String>, kPatternOffset)
CODE_POINTER_ACCESSORS(IrRegExpData, latin1_code, kLatin1CodeOffset)
CODE_POINTER_ACCESSORS(IrRegExpData, uc16_code, kUc16CodeOffset)
bool IrRegExpData::has_code(bool is_one_byte) const {
return is_one_byte ? has_latin1_code() : has_uc16_code();
}
void IrRegExpData::set_code(bool is_one_byte, Tagged<Code> code) {
if (is_one_byte) {
set_latin1_code(code);
} else {
set_uc16_code(code);
}
}
Tagged<Code> IrRegExpData::code(IsolateForSandbox isolate,
bool is_one_byte) const {
return is_one_byte ? latin1_code(isolate) : uc16_code(isolate);
}
PROTECTED_POINTER_ACCESSORS(IrRegExpData, latin1_bytecode, TrustedByteArray,
kLatin1BytecodeOffset)
PROTECTED_POINTER_ACCESSORS(IrRegExpData, uc16_bytecode, TrustedByteArray,
kUc16BytecodeOffset)
bool IrRegExpData::has_bytecode(bool is_one_byte) const {
return is_one_byte ? has_latin1_bytecode() : has_uc16_bytecode();
}
void IrRegExpData::clear_bytecode(bool is_one_byte) {
if (is_one_byte) {
clear_latin1_bytecode();
} else {
clear_uc16_bytecode();
}
}
void IrRegExpData::set_bytecode(bool is_one_byte,
Tagged<TrustedByteArray> bytecode) {
if (is_one_byte) {
set_latin1_bytecode(bytecode);
} else {
set_uc16_bytecode(bytecode);
}
}
Tagged<TrustedByteArray> IrRegExpData::bytecode(bool is_one_byte) const {
return is_one_byte ? latin1_bytecode() : uc16_bytecode();
}
ACCESSORS(IrRegExpData, capture_name_map, Tagged<Object>, kCaptureNameMapOffset)
void IrRegExpData::set_capture_name_map(
DirectHandle<FixedArray> capture_name_map) {
if (capture_name_map.is_null()) {
set_capture_name_map(Smi::zero());
} else {
set_capture_name_map(*capture_name_map);
}
}
SMI_ACCESSORS(IrRegExpData, max_register_count, kMaxRegisterCountOffset)
SMI_ACCESSORS(IrRegExpData, capture_count, kCaptureCountOffset)
SMI_ACCESSORS(IrRegExpData, ticks_until_tier_up, kTicksUntilTierUpOffset)
SMI_ACCESSORS(IrRegExpData, backtrack_limit, kBacktrackLimitOffset)
} // namespace internal
} // namespace v8
#include "src/objects/object-macros-undef.h"
#endif // V8_OBJECTS_JS_REGEXP_INL_H_