16 PrintF(
"RegExpMacroAssembler%s();\n",
23 PrintF(
" AbortedCodeGeneration\n");
31 return static_cast<int>(
reinterpret_cast<intptr_t
>(
label));
42 PrintF(
" AdvanceCurrentPosition(by=%d);\n", by);
54 PrintF(
" PopCurrentPosition();\n");
60 PrintF(
" PushCurrentPosition();\n");
85 PrintF(
" Succeed();%s\n", restart ?
" [restart for global match]" :
"");
97 PrintF(
" PopRegister(register=%d);\n", register_index);
105 PrintF(
" PushRegister(register=%d, %s);\n",
107 check_stack_limit ?
"check stack limit" :
"");
113 PrintF(
" AdvanceRegister(register=%d, by=%d);\n",
reg, by);
119 PrintF(
" SetCurrentPositionFromEnd(by=%d);\n", by);
125 PrintF(
" SetRegister(register=%d, to=%d);\n", register_index, to);
132 PrintF(
" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n",
140 PrintF(
" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to);
146 PrintF(
" ReadCurrentPositionFromRegister(register=%d);\n",
reg);
152 PrintF(
" WriteStackPointerToRegister(register=%d);\n",
reg);
158 PrintF(
" ReadStackPointerFromRegister(register=%d);\n",
reg);
163 int cp_offset,
Label* on_end_of_input,
bool check_bounds,
int characters,
165 const char* check_msg = check_bounds ?
"" :
" (unchecked)";
167 " LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars) (eats at "
169 cp_offset,
LabelToInt(on_end_of_input), check_msg, characters,
172 characters, eats_at_least);
177class PrintablePrinter {
181 const char* operator*() {
182 if (character_ >=
' ' && character_ <=
'~') {
202 PrintablePrinter printable(limit);
203 PrintF(
" CheckCharacterLT(c=0x%04x%s, label[%08x]);\n",
212 PrintablePrinter printable(limit);
213 PrintF(
" CheckCharacterGT(c=0x%04x%s, label[%08x]);\n",
221 PrintablePrinter printable(c);
222 PrintF(
" CheckCharacter(c=0x%04x%s, label[%08x]);\n",
230 Label* on_at_start) {
231 PrintF(
" CheckAtStart(cp_offset=%d, label[%08x]);\n", cp_offset,
237 Label* on_not_at_start) {
238 PrintF(
" CheckNotAtStart(cp_offset=%d, label[%08x]);\n", cp_offset,
245 Label* on_not_equal) {
246 PrintablePrinter printable(c);
247 PrintF(
" CheckNotCharacter(c=0x%04x%s, label[%08x]);\n",
259 PrintablePrinter printable(c);
260 PrintF(
" CheckCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
272 Label* on_not_equal) {
273 PrintablePrinter printable(c);
274 PrintF(
" CheckNotCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
284 PrintF(
" CheckNotCharacterAfterMinusAnd(c=0x%04x, minus=%04x, mask=0x%04x, "
295 Label* on_not_in_range) {
296 PrintablePrinter printable_from(from);
297 PrintablePrinter printable_to(to);
298 PrintF(
" CheckCharacterInRange(from=0x%04x%s, to=0x%04x%s, label[%08x]);\n",
309 Label* on_in_range) {
310 PrintablePrinter printable_from(from);
311 PrintablePrinter printable_to(to);
313 " CheckCharacterNotInRange(from=0x%04x%s," " to=%04x%s, label[%08x]);\n",
325 for (
int i = 0;
i < ranges->
length();
i++) {
328 PrintablePrinter printable_from(from);
329 PrintablePrinter printable_to(to);
330 PrintF(
" [from=0x%04x%s, to=%04x%s],\n", from, *printable_from, to,
340 " CheckCharacterInRangeArray(\n"
343 PrintRangeArray(ranges);
353 " CheckCharacterNotInRangeArray(\n"
356 PrintRangeArray(ranges);
365 PrintF(
"%c", table->get(
i) != 0 ?
'X' :
'.');
377 PrintF(
"SkipUntilBitInTable(cp_offset=%d, advance_by=%d\n ", cp_offset,
380 PrintF(
"%c", table->get(
i) != 0 ?
'X' :
'.');
386 static constexpr int kRows = 16;
390 PrintF(
" +----------------\n");
395 PrintF(
"\n--+----------------");
396 for (
int i = 0;
i < kRows;
i++) {
397 int r = nibble_table->get(
i);
400 PrintF(
" %c", (
r & (1 << j)) == 0 ?
'.' :
'X');
410 Label* on_no_match) {
411 PrintF(
" CheckNotBackReference(register=%d, %s, label[%08x]);\n", start_reg,
412 read_backward ?
"backward" :
"forward",
LabelToInt(on_no_match));
417 int start_reg,
bool read_backward,
bool unicode,
Label* on_no_match) {
418 PrintF(
" CheckNotBackReferenceIgnoreCase(register=%d, %s %s, label[%08x]);\n",
419 start_reg, read_backward ?
"backward" :
"forward",
420 unicode ?
"unicode" :
"non-unicode",
LabelToInt(on_no_match));
426 Label* on_outside_input) {
427 PrintF(
" CheckPosition(cp_offset=%d, label[%08x]);\n", cp_offset,
435 PrintF(
" CheckSpecialClassRanges(type='%c', label[%08x]): %s;\n",
436 static_cast<char>(type),
LabelToInt(on_no_match),
437 supported ?
"true" :
"false");
442 int comparand,
Label* if_lt) {
443 PrintF(
" IfRegisterLT(register=%d, number=%d, label[%08x]);\n",
444 register_index, comparand,
LabelToInt(if_lt));
451 PrintF(
" IfRegisterEqPos(register=%d, label[%08x]);\n",
458 int comparand,
Label* if_ge) {
459 PrintF(
" IfRegisterGE(register=%d, number=%d, label[%08x]);\n",
460 register_index, comparand,
LabelToInt(if_ge));
474 PrintF(
" GetCode('%s', '%s');\n", source->ToCString().get(),
475 flags_str->ToCString().get());
V8_INLINE bool is_null() const
static V8_EXPORT_PRIVATE DirectHandle< String > StringFromFlags(Isolate *isolate, Flags flags)
static constexpr Flags AsJSRegExpFlags(RegExpFlags f)
void ReadStackPointerFromRegister(int reg) override
bool CheckCharacterInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_in_range) override
void IfRegisterGE(int reg, int comparand, Label *if_ge) override
void GoTo(Label *label) override
void SetRegister(int register_index, int to) override
void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, bool unicode, Label *on_no_match) override
void AdvanceRegister(int reg, int by) override
void CheckCharacterLT(base::uc16 limit, Label *on_less) override
void WriteCurrentPositionToRegister(int reg, int cp_offset) override
void CheckCharacterAfterAnd(unsigned c, unsigned and_with, Label *on_equal) override
void CheckNotAtStart(int cp_offset, Label *on_not_at_start) override
void AdvanceCurrentPosition(int by) override
void ClearRegisters(int reg_from, int reg_to) override
void CheckPosition(int cp_offset, Label *on_outside_input) override
bool CheckCharacterNotInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_not_in_range) override
void PushCurrentPosition() override
void CheckNotCharacterAfterMinusAnd(base::uc16 c, base::uc16 minus, base::uc16 and_with, Label *on_not_equal) override
void CheckCharacterInRange(base::uc16 from, base::uc16 to, Label *on_in_range) override
RegExpMacroAssemblerTracer(Isolate *isolate, RegExpMacroAssembler *assembler)
void WriteStackPointerToRegister(int reg) override
void CheckCharacterGT(base::uc16 limit, Label *on_greater) override
void PopRegister(int register_index) override
void CheckAtStart(int cp_offset, Label *on_at_start) override
void CheckNotBackReference(int start_reg, bool read_backward, Label *on_no_match) override
void IfRegisterEqPos(int reg, Label *if_eq) override
void CheckNotCharacterAfterAnd(unsigned c, unsigned and_with, Label *on_not_equal) override
void CheckCharacterNotInRange(base::uc16 from, base::uc16 to, Label *on_not_in_range) override
~RegExpMacroAssemblerTracer() override
DirectHandle< HeapObject > GetCode(DirectHandle< String > source, RegExpFlags flags) override
void AbortedCodeGeneration() override
void PushRegister(int register_index, StackCheckFlag check_stack_limit) override
void SetCurrentPositionFromEnd(int by) override
void PopCurrentPosition() override
void CheckGreedyLoop(Label *on_tos_equals_current_position) override
IrregexpImplementation Implementation() override
void CheckBitInTable(Handle< ByteArray > table, Label *on_bit_set) override
void CheckNotCharacter(unsigned c, Label *on_not_equal) override
void ReadCurrentPositionFromRegister(int reg) override
void Backtrack() override
void CheckCharacter(unsigned c, Label *on_equal) override
RegExpMacroAssembler * assembler_
void SkipUntilBitInTable(int cp_offset, Handle< ByteArray > table, Handle< ByteArray > nibble_table, int advance_by) override
void LoadCurrentCharacterImpl(int cp_offset, Label *on_end_of_input, bool check_bounds, int characters, int eats_at_least) override
void PushBacktrack(Label *label) override
void IfRegisterLT(int reg, int comparand, Label *if_lt) override
void Bind(Label *label) override
bool CheckSpecialClassRanges(StandardCharacterSet type, Label *on_no_match) override
virtual void SkipUntilBitInTable(int cp_offset, Handle< ByteArray > table, Handle< ByteArray > nibble_table, int advance_by)=0
virtual bool CheckCharacterInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_in_range)=0
static constexpr int kTableSize
virtual void CheckNotAtStart(int cp_offset, Label *on_not_at_start)=0
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, bool unicode, Label *on_no_match)=0
virtual void CheckCharacterInRange(base::uc16 from, base::uc16 to, Label *on_in_range)=0
virtual void CheckBitInTable(Handle< ByteArray > table, Label *on_bit_set)=0
virtual void PushRegister(int register_index, StackCheckFlag check_stack_limit)=0
virtual void Bind(Label *label)=0
virtual void PushBacktrack(Label *label)=0
virtual void CheckNotBackReference(int start_reg, bool read_backward, Label *on_no_match)=0
virtual void AbortedCodeGeneration()
virtual void IfRegisterEqPos(int reg, Label *if_eq)=0
virtual bool CheckSpecialClassRanges(StandardCharacterSet type, Label *on_no_match)
virtual void CheckCharacterLT(base::uc16 limit, Label *on_less)=0
virtual void SetRegister(int register_index, int to)=0
virtual void Backtrack()=0
static constexpr int kTableMask
virtual void CheckCharacterAfterAnd(unsigned c, unsigned and_with, Label *on_equal)=0
virtual void SetCurrentPositionFromEnd(int by)=0
virtual void CheckCharacter(unsigned c, Label *on_equal)=0
virtual void ReadCurrentPositionFromRegister(int reg)=0
virtual DirectHandle< HeapObject > GetCode(DirectHandle< String > source, RegExpFlags flags)=0
virtual void IfRegisterLT(int reg, int comparand, Label *if_lt)=0
virtual IrregexpImplementation Implementation()=0
virtual void PushCurrentPosition()=0
virtual void ReadStackPointerFromRegister(int reg)=0
virtual void CheckNotCharacterAfterMinusAnd(base::uc16 c, base::uc16 minus, base::uc16 and_with, Label *on_not_equal)=0
virtual void CheckPosition(int cp_offset, Label *on_outside_input)
virtual void CheckAtStart(int cp_offset, Label *on_at_start)=0
virtual void WriteStackPointerToRegister(int reg)=0
virtual void WriteCurrentPositionToRegister(int reg, int cp_offset)=0
virtual void CheckGreedyLoop(Label *on_tos_equals_current_position)=0
virtual void AdvanceCurrentPosition(int by)=0
V8_EXPORT_PRIVATE void LoadCurrentCharacter(int cp_offset, Label *on_end_of_input, bool check_bounds=true, int characters=1, int eats_at_least=kUseCharactersValue)
virtual void PopRegister(int register_index)=0
virtual void PopCurrentPosition()=0
Isolate * isolate() const
virtual void CheckCharacterNotInRange(base::uc16 from, base::uc16 to, Label *on_not_in_range)=0
const char * ImplementationToString(IrregexpImplementation impl)
virtual void CheckNotCharacter(unsigned c, Label *on_not_equal)=0
virtual void GoTo(Label *label)=0
virtual bool CheckCharacterNotInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_not_in_range)=0
virtual void AdvanceRegister(int reg, int by)=0
virtual void ClearRegisters(int reg_from, int reg_to)=0
virtual void CheckCharacterGT(base::uc16 limit, Label *on_greater)=0
virtual void IfRegisterGE(int reg, int comparand, Label *if_ge)=0
virtual void CheckNotCharacterAfterAnd(unsigned c, unsigned and_with, Label *on_not_equal)=0
base::OwnedVector< uint8_t > buffer_
BytecodeAssembler & assembler_
constexpr int kBitsPerByte
void PrintF(const char *format,...)
BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL int character
static int LabelToInt(Label *label)