186 uint32_t current_char) {
195 int32_t* backtrack_stack_base = backtrack_stack.
data();
196 int32_t* backtrack_sp = backtrack_stack_base;
197 intptr_t backtrack_stack_space = backtrack_stack.
max_size();
203 intptr_t subject_length = subject.
Length();
206 if (FLAG_trace_regexp_bytecodes) {
211 const uint8_t* code_base;
215 code_base =
reinterpret_cast<uint8_t*
>(bytecode.
DataAddr(0));
219 if (
UNLIKELY(thread->HasScheduledInterrupts())) {
220 intptr_t pc_offset = pc - code_base;
221 ErrorPtr
error = thread->HandleInterrupts();
228 code_base =
reinterpret_cast<uint8_t*
>(bytecode.
DataAddr(0));
229 pc = code_base + pc_offset;
232 bool check_for_safepoint_now =
false;
233 while (!check_for_safepoint_now) {
240 if (--backtrack_stack_space < 0) {
243 *backtrack_sp++ = current;
244 pc += BC_PUSH_CP_LENGTH;
247 if (--backtrack_stack_space < 0) {
251 pc += BC_PUSH_BT_LENGTH;
254 if (--backtrack_stack_space < 0) {
258 pc += BC_PUSH_REGISTER_LENGTH;
262 pc += BC_SET_REGISTER_LENGTH;
266 pc += BC_ADVANCE_REGISTER_LENGTH;
270 pc += BC_SET_REGISTER_TO_CP_LENGTH;
274 pc += BC_SET_CP_TO_REGISTER_LENGTH;
278 static_cast<int>(backtrack_sp - backtrack_stack_base);
279 pc += BC_SET_REGISTER_TO_SP_LENGTH;
282 backtrack_sp = backtrack_stack_base + registers[insn >>
BYTECODE_SHIFT];
283 backtrack_stack_space =
285 static_cast<int>(backtrack_sp - backtrack_stack_base);
286 pc += BC_SET_SP_TO_REGISTER_LENGTH;
289 backtrack_stack_space++;
291 current = *backtrack_sp;
292 pc += BC_POP_CP_LENGTH;
295 backtrack_stack_space++;
297 pc = code_base + *backtrack_sp;
299 check_for_safepoint_now =
true;
302 backtrack_stack_space++;
305 pc += BC_POP_REGISTER_LENGTH;
313 pc += BC_ADVANCE_CP_LENGTH;
323 if (current == backtrack_sp[-1]) {
325 backtrack_stack_space++;
328 pc += BC_CHECK_GREEDY_LENGTH;
333 if (pos < 0 || pos >= subject_length) {
337 pc += BC_LOAD_CURRENT_CHAR_LENGTH;
341 BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) {
344 pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH;
349 if (
pos + 2 > subject_length) {
355 pc += BC_LOAD_2_CURRENT_CHARS_LENGTH;
359 BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) {
364 pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH;
368 ASSERT(
sizeof(Char) == 1);
370 if (
pos + 4 > subject_length) {
376 current_char = (subject.
CharAt(
pos) | (next1 << 8) | (next2 << 16) |
378 pc += BC_LOAD_4_CURRENT_CHARS_LENGTH;
382 BYTECODE(LOAD_4_CURRENT_CHARS_UNCHECKED) {
383 ASSERT(
sizeof(Char) == 1);
388 current_char = (subject.
CharAt(
pos) | (next1 << 8) | (next2 << 16) |
390 pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH;
395 if (c == current_char) {
398 pc += BC_CHECK_4_CHARS_LENGTH;
404 if (c == current_char) {
407 pc += BC_CHECK_CHAR_LENGTH;
413 if (c != current_char) {
416 pc += BC_CHECK_NOT_4_CHARS_LENGTH;
422 if (c != current_char) {
425 pc += BC_CHECK_NOT_CHAR_LENGTH;
434 pc += BC_AND_CHECK_4_CHARS_LENGTH;
443 pc += BC_AND_CHECK_CHAR_LENGTH;
452 pc += BC_AND_CHECK_NOT_4_CHARS_LENGTH;
461 pc += BC_AND_CHECK_NOT_CHAR_LENGTH;
465 BYTECODE(MINUS_AND_CHECK_NOT_CHAR) {
469 if (c != ((current_char - minus) & mask)) {
472 pc += BC_MINUS_AND_CHECK_NOT_CHAR_LENGTH;
479 if (from <= current_char && current_char <= to) {
482 pc += BC_CHECK_CHAR_IN_RANGE_LENGTH;
489 if (from > current_char || current_char > to) {
492 pc += BC_CHECK_CHAR_NOT_IN_RANGE_LENGTH;
500 if ((
b & (1 << bit)) != 0) {
503 pc += BC_CHECK_BIT_IN_TABLE_LENGTH;
509 if (current_char < limit) {
512 pc += BC_CHECK_LT_LENGTH;
518 if (current_char > limit) {
521 pc += BC_CHECK_GT_LENGTH;
529 pc += BC_CHECK_REGISTER_LT_LENGTH;
536 pc += BC_CHECK_REGISTER_GE_LENGTH;
543 pc += BC_CHECK_REGISTER_EQ_POS_LENGTH;
549 pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH;
557 if (from < 0 || len <= 0) {
558 pc += BC_CHECK_NOT_BACK_REF_LENGTH;
561 if (current + len > subject_length) {
566 for (i = 0; i < len; i++) {
567 if (subject.
CharAt(from + i) != subject.
CharAt(current + i)) {
575 pc += BC_CHECK_NOT_BACK_REF_LENGTH;
578 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE)
580 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) {
582 (insn &
BYTECODE_MASK) == BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE;
585 if (from < 0 || len <= 0) {
586 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH;
589 if (current + len > subject_length) {
593 if (BackRefMatchesNoCase<Char>(&canonicalize, from, current, len,
596 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH;
603 BYTECODE(CHECK_NOT_BACK_REF_BACKWARD) {
606 if (from < 0 || len <= 0) {
607 pc += BC_CHECK_NOT_BACK_REF_BACKWARD_LENGTH;
610 if ((current - len) < 0) {
618 const int start = current - len;
620 for (i = 0; i < len; i++) {
629 pc += BC_CHECK_NOT_BACK_REF_BACKWARD_LENGTH;
632 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD)
634 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD) {
636 BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD;
639 if (from < 0 || len <= 0) {
640 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD_LENGTH;
647 if (BackRefMatchesNoCase<Char>(&canonicalize, from, current - len,
648 len, subject, unicode)) {
650 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD_LENGTH;
661 pc += BC_CHECK_AT_START_LENGTH;
666 if (current + cp_offset == 0) {
667 pc += BC_CHECK_NOT_AT_START_LENGTH;
673 BYTECODE(SET_CURRENT_POSITION_FROM_END) {
675 if (subject_length - current > by) {
676 current = subject_length - by;
677 current_char = subject.
CharAt(current - 1);
679 pc += BC_SET_CURRENT_POSITION_FROM_END_LENGTH;