19 buffer_(kInitialBufferSize, zone),
21 advance_current_end_(kInvalidPC),
31 return kBytecodeImplementation;
67 Emit(BC_POP_REGISTER, register_index);
74 Emit(BC_PUSH_REGISTER, register_index);
81 Emit(BC_SET_REGISTER_TO_CP, register_index);
86 DCHECK(reg_from <= reg_to);
87 for (
int reg = reg_from;
reg <= reg_to;
reg++) {
96 Emit(BC_SET_CP_TO_REGISTER, register_index);
102 Emit(BC_SET_REGISTER_TO_SP, register_index);
108 Emit(BC_SET_SP_TO_REGISTER, register_index);
113 Emit(BC_SET_CURRENT_POSITION_FROM_END, by);
119 Emit(BC_SET_REGISTER, register_index);
126 Emit(BC_ADVANCE_REGISTER, register_index);
137 Emit(BC_POP_BT, error_code);
173 Emit(BC_ADVANCE_CP, by);
178 Label* on_tos_equals_current_position) {
179 Emit(BC_CHECK_GREEDY, 0);
189 if (eats_at_least > characters && check_bounds) {
190 DCHECK(is_int24(cp_offset + eats_at_least));
191 Emit(BC_CHECK_CURRENT_POSITION, cp_offset + eats_at_least);
193 check_bounds =
false;
200 if (characters == 4) {
201 bytecode = BC_LOAD_4_CURRENT_CHARS;
202 }
else if (characters == 2) {
203 bytecode = BC_LOAD_2_CURRENT_CHARS;
206 bytecode = BC_LOAD_CURRENT_CHAR;
209 if (characters == 4) {
210 bytecode = BC_LOAD_4_CURRENT_CHARS_UNCHECKED;
211 }
else if (characters == 2) {
212 bytecode = BC_LOAD_2_CURRENT_CHARS_UNCHECKED;
215 bytecode = BC_LOAD_CURRENT_CHAR_UNCHECKED;
218 Emit(bytecode, cp_offset);
224 Emit(BC_CHECK_LT, limit);
230 Emit(BC_CHECK_GT, limit);
236 Emit(BC_CHECK_4_CHARS, 0);
239 Emit(BC_CHECK_CHAR, c);
245 Emit(BC_CHECK_AT_START, cp_offset);
250 Label* on_not_at_start) {
251 Emit(BC_CHECK_NOT_AT_START, cp_offset);
256 Label* on_not_equal) {
258 Emit(BC_CHECK_NOT_4_CHARS, 0);
261 Emit(BC_CHECK_NOT_CHAR, c);
269 Emit(BC_AND_CHECK_4_CHARS, 0);
272 Emit(BC_AND_CHECK_CHAR, c);
280 Label* on_not_equal) {
282 Emit(BC_AND_CHECK_NOT_4_CHARS, 0);
285 Emit(BC_AND_CHECK_NOT_CHAR, c);
293 Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c);
301 Label* on_in_range) {
302 Emit(BC_CHECK_CHAR_IN_RANGE, 0);
310 Label* on_not_in_range) {
311 Emit(BC_CHECK_CHAR_NOT_IN_RANGE, 0);
321 if (table->get(
i + j) != 0)
byte |= 1 << j;
329 Emit(BC_CHECK_BIT_IN_TABLE, 0);
338 Emit(BC_SKIP_UNTIL_BIT_IN_TABLE, cp_offset);
348 Label* on_not_equal) {
351 Emit(read_backward ? BC_CHECK_NOT_BACK_REF_BACKWARD : BC_CHECK_NOT_BACK_REF,
357 int start_reg,
bool read_backward,
bool unicode,
Label* on_not_equal) {
360 Emit(read_backward ? (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD
361 : BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD)
362 : (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE
363 : BC_CHECK_NOT_BACK_REF_NO_CASE),
369 Label* on_less_than) {
372 Emit(BC_CHECK_REGISTER_LT, register_index);
378 Label* on_greater_or_equal) {
381 Emit(BC_CHECK_REGISTER_GE, register_index);
390 Emit(BC_CHECK_REGISTER_EQ_POS, register_index);
400 if (
v8_flags.regexp_peephole_optimization) {
405 Copy(array->begin());
interpreter::Bytecode bytecode
Handle< TrustedByteArray > NewTrustedByteArray(int length, AllocationType allocation_type=AllocationType::kTrusted)
v8::internal::Factory * factory()
V8_INLINE bool is_linked() const
int advance_current_offset_
void IfRegisterLT(int register_index, int comparand, Label *if_lt) override
void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, bool unicode, Label *on_no_match) override
void CheckNotAtStart(int cp_offset, Label *on_not_at_start) override
void IfRegisterEqPos(int register_index, Label *if_eq) override
void PopRegister(int register_index) override
void CheckNotCharacterAfterMinusAnd(base::uc16 c, base::uc16 minus, base::uc16 mask, Label *on_not_equal) override
ZoneVector< uint8_t > buffer_
void AdvanceCurrentPosition(int by) override
void CheckCharacterInRange(base::uc16 from, base::uc16 to, Label *on_in_range) override
void SetCurrentPositionFromEnd(int by) override
void IfRegisterGE(int register_index, int comparand, Label *if_ge) override
void Bind(Label *label) override
void ClearRegisters(int reg_from, int reg_to) override
static const int kInvalidPC
ZoneUnorderedMap< int, int > jump_edges_
void PushRegister(int register_index, StackCheckFlag check_stack_limit) override
void LoadCurrentCharacterImpl(int cp_offset, Label *on_end_of_input, bool check_bounds, int characters, int eats_at_least) override
void AdvanceRegister(int reg, int by) override
void WriteStackPointerToRegister(int reg) override
void CheckAtStart(int cp_offset, Label *on_at_start) override
void CheckCharacter(unsigned c, Label *on_equal) override
void PopCurrentPosition() override
void CheckNotBackReference(int start_reg, bool read_backward, Label *on_no_match) override
RegExpBytecodeGenerator(Isolate *isolate, Zone *zone)
void PushBacktrack(Label *label) override
IrregexpImplementation Implementation() override
void CheckCharacterLT(base::uc16 limit, Label *on_less) override
void Emit(uint32_t bc, uint32_t arg)
int advance_current_start_
void EmitOrLink(Label *label)
void SetRegister(int register_index, int to) override
~RegExpBytecodeGenerator() override
void PushCurrentPosition() override
void CheckBitInTable(Handle< ByteArray > table, Label *on_bit_set) override
void GoTo(Label *label) override
void ReadStackPointerFromRegister(int reg) override
void CheckGreedyLoop(Label *on_tos_equals_current_position) override
void CheckNotCharacterAfterAnd(unsigned c, unsigned mask, Label *on_not_equal) override
void ReadCurrentPositionFromRegister(int reg) override
void CheckNotCharacter(unsigned c, Label *on_not_equal) override
void Backtrack() override
void CheckCharacterGT(base::uc16 limit, Label *on_greater) override
DirectHandle< HeapObject > GetCode(DirectHandle< String > source, RegExpFlags flags) override
void WriteCurrentPositionToRegister(int reg, int cp_offset) override
void CheckCharacterAfterAnd(unsigned c, unsigned mask, Label *on_equal) override
void CheckCharacterNotInRange(base::uc16 from, base::uc16 to, Label *on_not_in_range) override
void EmitSkipTable(DirectHandle< ByteArray > table)
void SkipUntilBitInTable(int cp_offset, Handle< ByteArray > table, Handle< ByteArray > nibble_table, int advance_by) override
static DirectHandle< TrustedByteArray > OptimizeBytecode(Isolate *isolate, Zone *zone, DirectHandle< String > source, const uint8_t *bytecode, int length, const ZoneUnorderedMap< int, int > &jump_edges)
static constexpr int kTableSize
static constexpr int kMaxCPOffset
bool can_fallback() const
static constexpr int kMinCPOffset
static constexpr int kMaxRegister
@ RE_FALLBACK_TO_EXPERIMENTAL
void resize(size_t new_size)
base::OwnedVector< uint8_t > buffer_
constexpr int kBitsPerByte
const unsigned int MAX_FIRST_ARG
V8_EXPORT_PRIVATE FlagValues v8_flags
void MemCopy(void *dest, const void *src, size_t size)
ZoneMap< int, int > jump_edges_
#define DCHECK_LE(v1, v2)
#define CHECK_GE(lhs, rhs)
#define CHECK_LE(lhs, rhs)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)