5 #ifdef V8_INTERPRETED_REGEXP 7 #include "src/regexp/regexp-macro-assembler-irregexp.h" 9 #include "src/ast/ast.h" 10 #include "src/objects-inl.h" 11 #include "src/regexp/bytecodes-irregexp.h" 12 #include "src/regexp/regexp-macro-assembler-irregexp-inl.h" 13 #include "src/regexp/regexp-macro-assembler.h" 18 RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Isolate* isolate,
21 : RegExpMacroAssembler(isolate, zone),
25 advance_current_end_(kInvalidPC),
29 RegExpMacroAssemblerIrregexp::~RegExpMacroAssemblerIrregexp() {
30 if (backtrack_.is_linked()) backtrack_.Unuse();
31 if (own_buffer_) buffer_.Dispose();
35 RegExpMacroAssemblerIrregexp::IrregexpImplementation
36 RegExpMacroAssemblerIrregexp::Implementation() {
37 return kBytecodeImplementation;
41 void RegExpMacroAssemblerIrregexp::Bind(Label* l) {
42 advance_current_end_ = kInvalidPC;
43 DCHECK(!l->is_bound());
48 pos = *
reinterpret_cast<int32_t*
>(buffer_.start() + fixup);
49 *
reinterpret_cast<uint32_t*
>(buffer_.start() + fixup) = pc_;
56 void RegExpMacroAssemblerIrregexp::EmitOrLink(Label* l) {
57 if (l ==
nullptr) l = &backtrack_;
71 void RegExpMacroAssemblerIrregexp::PopRegister(
int register_index) {
72 DCHECK_LE(0, register_index);
73 DCHECK_GE(kMaxRegister, register_index);
74 Emit(BC_POP_REGISTER, register_index);
78 void RegExpMacroAssemblerIrregexp::PushRegister(
80 StackCheckFlag check_stack_limit) {
81 DCHECK_LE(0, register_index);
82 DCHECK_GE(kMaxRegister, register_index);
83 Emit(BC_PUSH_REGISTER, register_index);
87 void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister(
88 int register_index,
int cp_offset) {
89 DCHECK_LE(0, register_index);
90 DCHECK_GE(kMaxRegister, register_index);
91 Emit(BC_SET_REGISTER_TO_CP, register_index);
96 void RegExpMacroAssemblerIrregexp::ClearRegisters(
int reg_from,
int reg_to) {
97 DCHECK(reg_from <= reg_to);
98 for (
int reg = reg_from; reg <= reg_to; reg++) {
104 void RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister(
105 int register_index) {
106 DCHECK_LE(0, register_index);
107 DCHECK_GE(kMaxRegister, register_index);
108 Emit(BC_SET_CP_TO_REGISTER, register_index);
112 void RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister(
113 int register_index) {
114 DCHECK_LE(0, register_index);
115 DCHECK_GE(kMaxRegister, register_index);
116 Emit(BC_SET_REGISTER_TO_SP, register_index);
120 void RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister(
121 int register_index) {
122 DCHECK_LE(0, register_index);
123 DCHECK_GE(kMaxRegister, register_index);
124 Emit(BC_SET_SP_TO_REGISTER, register_index);
128 void RegExpMacroAssemblerIrregexp::SetCurrentPositionFromEnd(
int by) {
129 DCHECK(is_uint24(by));
130 Emit(BC_SET_CURRENT_POSITION_FROM_END, by);
134 void RegExpMacroAssemblerIrregexp::SetRegister(
int register_index,
int to) {
135 DCHECK_LE(0, register_index);
136 DCHECK_GE(kMaxRegister, register_index);
137 Emit(BC_SET_REGISTER, register_index);
142 void RegExpMacroAssemblerIrregexp::AdvanceRegister(
int register_index,
int by) {
143 DCHECK_LE(0, register_index);
144 DCHECK_GE(kMaxRegister, register_index);
145 Emit(BC_ADVANCE_REGISTER, register_index);
150 void RegExpMacroAssemblerIrregexp::PopCurrentPosition() {
155 void RegExpMacroAssemblerIrregexp::PushCurrentPosition() {
160 void RegExpMacroAssemblerIrregexp::Backtrack() {
165 void RegExpMacroAssemblerIrregexp::GoTo(Label* l) {
166 if (advance_current_end_ == pc_) {
168 pc_ = advance_current_start_;
169 Emit(BC_ADVANCE_CP_AND_GOTO, advance_current_offset_);
171 advance_current_end_ = kInvalidPC;
180 void RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) {
186 bool RegExpMacroAssemblerIrregexp::Succeed() {
192 void RegExpMacroAssemblerIrregexp::Fail() {
197 void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(
int by) {
198 DCHECK_LE(kMinCPOffset, by);
199 DCHECK_GE(kMaxCPOffset, by);
200 advance_current_start_ = pc_;
201 advance_current_offset_ = by;
202 Emit(BC_ADVANCE_CP, by);
203 advance_current_end_ = pc_;
207 void RegExpMacroAssemblerIrregexp::CheckGreedyLoop(
208 Label* on_tos_equals_current_position) {
209 Emit(BC_CHECK_GREEDY, 0);
210 EmitOrLink(on_tos_equals_current_position);
214 void RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(
int cp_offset,
218 DCHECK_LE(kMinCPOffset, cp_offset);
219 DCHECK_GE(kMaxCPOffset, cp_offset);
222 if (characters == 4) {
223 bytecode = BC_LOAD_4_CURRENT_CHARS;
224 }
else if (characters == 2) {
225 bytecode = BC_LOAD_2_CURRENT_CHARS;
227 DCHECK_EQ(1, characters);
228 bytecode = BC_LOAD_CURRENT_CHAR;
231 if (characters == 4) {
232 bytecode = BC_LOAD_4_CURRENT_CHARS_UNCHECKED;
233 }
else if (characters == 2) {
234 bytecode = BC_LOAD_2_CURRENT_CHARS_UNCHECKED;
236 DCHECK_EQ(1, characters);
237 bytecode = BC_LOAD_CURRENT_CHAR_UNCHECKED;
240 Emit(bytecode, cp_offset);
241 if (check_bounds) EmitOrLink(on_failure);
245 void RegExpMacroAssemblerIrregexp::CheckCharacterLT(uc16 limit,
247 Emit(BC_CHECK_LT, limit);
252 void RegExpMacroAssemblerIrregexp::CheckCharacterGT(uc16 limit,
254 Emit(BC_CHECK_GT, limit);
255 EmitOrLink(on_greater);
259 void RegExpMacroAssemblerIrregexp::CheckCharacter(
uint32_t c, Label* on_equal) {
260 if (c > MAX_FIRST_ARG) {
261 Emit(BC_CHECK_4_CHARS, 0);
264 Emit(BC_CHECK_CHAR, c);
266 EmitOrLink(on_equal);
270 void RegExpMacroAssemblerIrregexp::CheckAtStart(Label* on_at_start) {
271 Emit(BC_CHECK_AT_START, 0);
272 EmitOrLink(on_at_start);
276 void RegExpMacroAssemblerIrregexp::CheckNotAtStart(
int cp_offset,
277 Label* on_not_at_start) {
278 Emit(BC_CHECK_NOT_AT_START, cp_offset);
279 EmitOrLink(on_not_at_start);
283 void RegExpMacroAssemblerIrregexp::CheckNotCharacter(
uint32_t c,
284 Label* on_not_equal) {
285 if (c > MAX_FIRST_ARG) {
286 Emit(BC_CHECK_NOT_4_CHARS, 0);
289 Emit(BC_CHECK_NOT_CHAR, c);
291 EmitOrLink(on_not_equal);
295 void RegExpMacroAssemblerIrregexp::CheckCharacterAfterAnd(
299 if (c > MAX_FIRST_ARG) {
300 Emit(BC_AND_CHECK_4_CHARS, 0);
303 Emit(BC_AND_CHECK_CHAR, c);
306 EmitOrLink(on_equal);
310 void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterAnd(
313 Label* on_not_equal) {
314 if (c > MAX_FIRST_ARG) {
315 Emit(BC_AND_CHECK_NOT_4_CHARS, 0);
318 Emit(BC_AND_CHECK_NOT_CHAR, c);
321 EmitOrLink(on_not_equal);
325 void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterMinusAnd(
329 Label* on_not_equal) {
330 Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c);
333 EmitOrLink(on_not_equal);
337 void RegExpMacroAssemblerIrregexp::CheckCharacterInRange(
340 Label* on_in_range) {
341 Emit(BC_CHECK_CHAR_IN_RANGE, 0);
344 EmitOrLink(on_in_range);
348 void RegExpMacroAssemblerIrregexp::CheckCharacterNotInRange(
351 Label* on_not_in_range) {
352 Emit(BC_CHECK_CHAR_NOT_IN_RANGE, 0);
355 EmitOrLink(on_not_in_range);
359 void RegExpMacroAssemblerIrregexp::CheckBitInTable(
360 Handle<ByteArray> table, Label* on_bit_set) {
361 Emit(BC_CHECK_BIT_IN_TABLE, 0);
362 EmitOrLink(on_bit_set);
363 for (
int i = 0;
i < kTableSize;
i += kBitsPerByte) {
365 for (
int j = 0; j < kBitsPerByte; j++) {
366 if (table->get(
i + j) != 0) byte |= 1 << j;
373 void RegExpMacroAssemblerIrregexp::CheckNotBackReference(
int start_reg,
375 Label* on_not_equal) {
376 DCHECK_LE(0, start_reg);
377 DCHECK_GE(kMaxRegister, start_reg);
378 Emit(read_backward ? BC_CHECK_NOT_BACK_REF_BACKWARD : BC_CHECK_NOT_BACK_REF,
380 EmitOrLink(on_not_equal);
384 void RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase(
385 int start_reg,
bool read_backward,
bool unicode, Label* on_not_equal) {
386 DCHECK_LE(0, start_reg);
387 DCHECK_GE(kMaxRegister, start_reg);
388 Emit(read_backward ? (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD
389 : BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD)
390 : (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE
391 : BC_CHECK_NOT_BACK_REF_NO_CASE),
393 EmitOrLink(on_not_equal);
397 void RegExpMacroAssemblerIrregexp::IfRegisterLT(
int register_index,
399 Label* on_less_than) {
400 DCHECK_LE(0, register_index);
401 DCHECK_GE(kMaxRegister, register_index);
402 Emit(BC_CHECK_REGISTER_LT, register_index);
404 EmitOrLink(on_less_than);
408 void RegExpMacroAssemblerIrregexp::IfRegisterGE(
int register_index,
410 Label* on_greater_or_equal) {
411 DCHECK_LE(0, register_index);
412 DCHECK_GE(kMaxRegister, register_index);
413 Emit(BC_CHECK_REGISTER_GE, register_index);
415 EmitOrLink(on_greater_or_equal);
419 void RegExpMacroAssemblerIrregexp::IfRegisterEqPos(
int register_index,
421 DCHECK_LE(0, register_index);
422 DCHECK_GE(kMaxRegister, register_index);
423 Emit(BC_CHECK_REGISTER_EQ_POS, register_index);
428 Handle<HeapObject> RegExpMacroAssemblerIrregexp::GetCode(
429 Handle<String> source) {
432 Handle<ByteArray> array = isolate_->factory()->NewByteArray(length());
433 Copy(array->GetDataStartAddress());
438 int RegExpMacroAssemblerIrregexp::length() {
442 void RegExpMacroAssemblerIrregexp::Copy(byte* a) {
443 MemCopy(a, buffer_.start(), length());
447 void RegExpMacroAssemblerIrregexp::Expand() {
448 bool old_buffer_was_our_own = own_buffer_;
449 Vector<byte> old_buffer = buffer_;
450 buffer_ = Vector<byte>::New(old_buffer.length() * 2);
452 MemCopy(buffer_.start(), old_buffer.start(), old_buffer.length());
453 if (old_buffer_was_our_own) {
454 old_buffer.Dispose();
461 #endif // V8_INTERPRETED_REGEXP