| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 if (l->is_linked()) { | 77 if (l->is_linked()) { |
| 78 pos = l->pos(); | 78 pos = l->pos(); |
| 79 } | 79 } |
| 80 l->link_to(pc_); | 80 l->link_to(pc_); |
| 81 Emit32(pos); | 81 Emit32(pos); |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 | 85 |
| 86 void RegExpMacroAssemblerIrregexp::PopRegister(int register_index) { | 86 void RegExpMacroAssemblerIrregexp::PopRegister(int register_index) { |
| 87 ASSERT(register_index >= 0); |
| 88 ASSERT(register_index <= kMaxRegister); |
| 87 Emit(BC_POP_REGISTER, register_index); | 89 Emit(BC_POP_REGISTER, register_index); |
| 88 } | 90 } |
| 89 | 91 |
| 90 | 92 |
| 91 void RegExpMacroAssemblerIrregexp::PushRegister( | 93 void RegExpMacroAssemblerIrregexp::PushRegister( |
| 92 int register_index, | 94 int register_index, |
| 93 StackCheckFlag check_stack_limit) { | 95 StackCheckFlag check_stack_limit) { |
| 94 ASSERT(register_index >= 0); | 96 ASSERT(register_index >= 0); |
| 97 ASSERT(register_index <= kMaxRegister); |
| 95 Emit(BC_PUSH_REGISTER, register_index); | 98 Emit(BC_PUSH_REGISTER, register_index); |
| 96 } | 99 } |
| 97 | 100 |
| 98 | 101 |
| 99 void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister( | 102 void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister( |
| 100 int register_index, int cp_offset) { | 103 int register_index, int cp_offset) { |
| 101 ASSERT(register_index >= 0); | 104 ASSERT(register_index >= 0); |
| 105 ASSERT(register_index <= kMaxRegister); |
| 102 Emit(BC_SET_REGISTER_TO_CP, register_index); | 106 Emit(BC_SET_REGISTER_TO_CP, register_index); |
| 103 Emit32(cp_offset); // Current position offset. | 107 Emit32(cp_offset); // Current position offset. |
| 104 } | 108 } |
| 105 | 109 |
| 106 | 110 |
| 107 void RegExpMacroAssemblerIrregexp::ClearRegister(int reg) { | 111 void RegExpMacroAssemblerIrregexp::ClearRegister(int reg) { |
| 108 SetRegister(reg, -1); | 112 SetRegister(reg, -1); |
| 109 } | 113 } |
| 110 | 114 |
| 111 | 115 |
| 112 void RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister( | 116 void RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister( |
| 113 int register_index) { | 117 int register_index) { |
| 114 ASSERT(register_index >= 0); | 118 ASSERT(register_index >= 0); |
| 119 ASSERT(register_index <= kMaxRegister); |
| 115 Emit(BC_SET_CP_TO_REGISTER, register_index); | 120 Emit(BC_SET_CP_TO_REGISTER, register_index); |
| 116 } | 121 } |
| 117 | 122 |
| 118 | 123 |
| 119 void RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister( | 124 void RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister( |
| 120 int register_index) { | 125 int register_index) { |
| 121 ASSERT(register_index >= 0); | 126 ASSERT(register_index >= 0); |
| 127 ASSERT(register_index <= kMaxRegister); |
| 122 Emit(BC_SET_REGISTER_TO_SP, register_index); | 128 Emit(BC_SET_REGISTER_TO_SP, register_index); |
| 123 } | 129 } |
| 124 | 130 |
| 125 | 131 |
| 126 void RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister( | 132 void RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister( |
| 127 int register_index) { | 133 int register_index) { |
| 128 ASSERT(register_index >= 0); | 134 ASSERT(register_index >= 0); |
| 135 ASSERT(register_index <= kMaxRegister); |
| 129 Emit(BC_SET_SP_TO_REGISTER, register_index); | 136 Emit(BC_SET_SP_TO_REGISTER, register_index); |
| 130 } | 137 } |
| 131 | 138 |
| 132 | 139 |
| 133 void RegExpMacroAssemblerIrregexp::SetRegister(int register_index, int to) { | 140 void RegExpMacroAssemblerIrregexp::SetRegister(int register_index, int to) { |
| 134 ASSERT(register_index >= 0); | 141 ASSERT(register_index >= 0); |
| 142 ASSERT(register_index <= kMaxRegister); |
| 135 Emit(BC_SET_REGISTER, register_index); | 143 Emit(BC_SET_REGISTER, register_index); |
| 136 Emit32(to); | 144 Emit32(to); |
| 137 } | 145 } |
| 138 | 146 |
| 139 | 147 |
| 140 void RegExpMacroAssemblerIrregexp::AdvanceRegister(int register_index, int by) { | 148 void RegExpMacroAssemblerIrregexp::AdvanceRegister(int register_index, int by) { |
| 141 ASSERT(register_index >= 0); | 149 ASSERT(register_index >= 0); |
| 150 ASSERT(register_index <= kMaxRegister); |
| 142 Emit(BC_ADVANCE_REGISTER, register_index); | 151 Emit(BC_ADVANCE_REGISTER, register_index); |
| 143 Emit32(by); | 152 Emit32(by); |
| 144 } | 153 } |
| 145 | 154 |
| 146 | 155 |
| 147 void RegExpMacroAssemblerIrregexp::PopCurrentPosition() { | 156 void RegExpMacroAssemblerIrregexp::PopCurrentPosition() { |
| 148 Emit(BC_POP_CP, 0); | 157 Emit(BC_POP_CP, 0); |
| 149 } | 158 } |
| 150 | 159 |
| 151 | 160 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 175 Emit(BC_SUCCEED, 0); | 184 Emit(BC_SUCCEED, 0); |
| 176 } | 185 } |
| 177 | 186 |
| 178 | 187 |
| 179 void RegExpMacroAssemblerIrregexp::Fail() { | 188 void RegExpMacroAssemblerIrregexp::Fail() { |
| 180 Emit(BC_FAIL, 0); | 189 Emit(BC_FAIL, 0); |
| 181 } | 190 } |
| 182 | 191 |
| 183 | 192 |
| 184 void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { | 193 void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { |
| 194 ASSERT(by >= kMinCPOffset); |
| 195 ASSERT(by <= kMaxCPOffset); |
| 185 Emit(BC_ADVANCE_CP, by); | 196 Emit(BC_ADVANCE_CP, by); |
| 186 } | 197 } |
| 187 | 198 |
| 188 | 199 |
| 189 void RegExpMacroAssemblerIrregexp::CheckGreedyLoop( | 200 void RegExpMacroAssemblerIrregexp::CheckGreedyLoop( |
| 190 Label* on_tos_equals_current_position) { | 201 Label* on_tos_equals_current_position) { |
| 191 Emit(BC_CHECK_GREEDY, 0); | 202 Emit(BC_CHECK_GREEDY, 0); |
| 192 EmitOrLink(on_tos_equals_current_position); | 203 EmitOrLink(on_tos_equals_current_position); |
| 193 } | 204 } |
| 194 | 205 |
| 195 | 206 |
| 196 void RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(int cp_offset, | 207 void RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(int cp_offset, |
| 197 Label* on_failure, | 208 Label* on_failure, |
| 198 bool check_bounds, | 209 bool check_bounds, |
| 199 int characters) { | 210 int characters) { |
| 211 ASSERT(cp_offset >= kMinCPOffset); |
| 212 ASSERT(cp_offset <= kMaxCPOffset); |
| 200 int bytecode; | 213 int bytecode; |
| 201 if (check_bounds) { | 214 if (check_bounds) { |
| 202 if (characters == 4) { | 215 if (characters == 4) { |
| 203 bytecode = BC_LOAD_4_CURRENT_CHARS; | 216 bytecode = BC_LOAD_4_CURRENT_CHARS; |
| 204 } else if (characters == 2) { | 217 } else if (characters == 2) { |
| 205 bytecode = BC_LOAD_2_CURRENT_CHARS; | 218 bytecode = BC_LOAD_2_CURRENT_CHARS; |
| 206 } else { | 219 } else { |
| 207 ASSERT(characters == 1); | 220 ASSERT(characters == 1); |
| 208 bytecode = BC_LOAD_CURRENT_CHAR; | 221 bytecode = BC_LOAD_CURRENT_CHAR; |
| 209 } | 222 } |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 Label* on_not_equal) { | 321 Label* on_not_equal) { |
| 309 Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c); | 322 Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c); |
| 310 Emit16(minus); | 323 Emit16(minus); |
| 311 Emit16(mask); | 324 Emit16(mask); |
| 312 EmitOrLink(on_not_equal); | 325 EmitOrLink(on_not_equal); |
| 313 } | 326 } |
| 314 | 327 |
| 315 | 328 |
| 316 void RegExpMacroAssemblerIrregexp::CheckNotBackReference(int start_reg, | 329 void RegExpMacroAssemblerIrregexp::CheckNotBackReference(int start_reg, |
| 317 Label* on_not_equal) { | 330 Label* on_not_equal) { |
| 331 ASSERT(start_reg >= 0); |
| 332 ASSERT(start_reg <= kMaxRegister); |
| 318 Emit(BC_CHECK_NOT_BACK_REF, start_reg); | 333 Emit(BC_CHECK_NOT_BACK_REF, start_reg); |
| 319 EmitOrLink(on_not_equal); | 334 EmitOrLink(on_not_equal); |
| 320 } | 335 } |
| 321 | 336 |
| 322 | 337 |
| 323 void RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase( | 338 void RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase( |
| 324 int start_reg, | 339 int start_reg, |
| 325 Label* on_not_equal) { | 340 Label* on_not_equal) { |
| 341 ASSERT(start_reg >= 0); |
| 342 ASSERT(start_reg <= kMaxRegister); |
| 326 Emit(BC_CHECK_NOT_BACK_REF_NO_CASE, start_reg); | 343 Emit(BC_CHECK_NOT_BACK_REF_NO_CASE, start_reg); |
| 327 EmitOrLink(on_not_equal); | 344 EmitOrLink(on_not_equal); |
| 328 } | 345 } |
| 329 | 346 |
| 330 | 347 |
| 331 void RegExpMacroAssemblerIrregexp::CheckNotRegistersEqual(int reg1, | 348 void RegExpMacroAssemblerIrregexp::CheckNotRegistersEqual(int reg1, |
| 332 int reg2, | 349 int reg2, |
| 333 Label* on_not_equal) { | 350 Label* on_not_equal) { |
| 351 ASSERT(reg1 >= 0); |
| 352 ASSERT(reg1 <= kMaxRegister); |
| 334 Emit(BC_CHECK_NOT_REGS_EQUAL, reg1); | 353 Emit(BC_CHECK_NOT_REGS_EQUAL, reg1); |
| 335 Emit32(reg2); | 354 Emit32(reg2); |
| 336 EmitOrLink(on_not_equal); | 355 EmitOrLink(on_not_equal); |
| 337 } | 356 } |
| 338 | 357 |
| 339 | 358 |
| 340 void RegExpMacroAssemblerIrregexp::CheckBitmap(uc16 start, | 359 void RegExpMacroAssemblerIrregexp::CheckBitmap(uc16 start, |
| 341 Label* bitmap, | 360 Label* bitmap, |
| 342 Label* on_zero) { | 361 Label* on_zero) { |
| 343 UNIMPLEMENTED(); | 362 UNIMPLEMENTED(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 366 const Vector<Label*>& table) { | 385 const Vector<Label*>& table) { |
| 367 UNIMPLEMENTED(); | 386 UNIMPLEMENTED(); |
| 368 } | 387 } |
| 369 | 388 |
| 370 | 389 |
| 371 void RegExpMacroAssemblerIrregexp::CheckCharacters( | 390 void RegExpMacroAssemblerIrregexp::CheckCharacters( |
| 372 Vector<const uc16> str, | 391 Vector<const uc16> str, |
| 373 int cp_offset, | 392 int cp_offset, |
| 374 Label* on_failure, | 393 Label* on_failure, |
| 375 bool check_end_of_string) { | 394 bool check_end_of_string) { |
| 395 ASSERT(cp_offset >= kMinCPOffset); |
| 396 ASSERT(cp_offset + str.length() - 1 <= kMaxCPOffset); |
| 376 // It is vital that this loop is backwards due to the unchecked character | 397 // It is vital that this loop is backwards due to the unchecked character |
| 377 // load below. | 398 // load below. |
| 378 for (int i = str.length() - 1; i >= 0; i--) { | 399 for (int i = str.length() - 1; i >= 0; i--) { |
| 379 if (check_end_of_string && i == str.length() - 1) { | 400 if (check_end_of_string && i == str.length() - 1) { |
| 380 Emit(BC_LOAD_CURRENT_CHAR, cp_offset + i); | 401 Emit(BC_LOAD_CURRENT_CHAR, cp_offset + i); |
| 381 EmitOrLink(on_failure); | 402 EmitOrLink(on_failure); |
| 382 } else { | 403 } else { |
| 383 Emit(BC_LOAD_CURRENT_CHAR_UNCHECKED, cp_offset + i); | 404 Emit(BC_LOAD_CURRENT_CHAR_UNCHECKED, cp_offset + i); |
| 384 } | 405 } |
| 385 Emit(BC_CHECK_NOT_CHAR, str[i]); | 406 Emit(BC_CHECK_NOT_CHAR, str[i]); |
| 386 EmitOrLink(on_failure); | 407 EmitOrLink(on_failure); |
| 387 } | 408 } |
| 388 } | 409 } |
| 389 | 410 |
| 390 | 411 |
| 391 void RegExpMacroAssemblerIrregexp::IfRegisterLT(int register_index, | 412 void RegExpMacroAssemblerIrregexp::IfRegisterLT(int register_index, |
| 392 int comparand, | 413 int comparand, |
| 393 Label* on_less_than) { | 414 Label* on_less_than) { |
| 394 ASSERT(comparand >= 0 && comparand <= 65535); | 415 ASSERT(register_index >= 0); |
| 416 ASSERT(register_index <= kMaxRegister); |
| 395 Emit(BC_CHECK_REGISTER_LT, register_index); | 417 Emit(BC_CHECK_REGISTER_LT, register_index); |
| 396 Emit32(comparand); | 418 Emit32(comparand); |
| 397 EmitOrLink(on_less_than); | 419 EmitOrLink(on_less_than); |
| 398 } | 420 } |
| 399 | 421 |
| 400 | 422 |
| 401 void RegExpMacroAssemblerIrregexp::IfRegisterGE(int register_index, | 423 void RegExpMacroAssemblerIrregexp::IfRegisterGE(int register_index, |
| 402 int comparand, | 424 int comparand, |
| 403 Label* on_greater_or_equal) { | 425 Label* on_greater_or_equal) { |
| 404 ASSERT(comparand >= 0 && comparand <= 65535); | 426 ASSERT(register_index >= 0); |
| 427 ASSERT(register_index <= kMaxRegister); |
| 405 Emit(BC_CHECK_REGISTER_GE, register_index); | 428 Emit(BC_CHECK_REGISTER_GE, register_index); |
| 406 Emit32(comparand); | 429 Emit32(comparand); |
| 407 EmitOrLink(on_greater_or_equal); | 430 EmitOrLink(on_greater_or_equal); |
| 408 } | 431 } |
| 409 | 432 |
| 410 | 433 |
| 411 void RegExpMacroAssemblerIrregexp::IfRegisterEqPos(int register_index, | 434 void RegExpMacroAssemblerIrregexp::IfRegisterEqPos(int register_index, |
| 412 Label* on_eq) { | 435 Label* on_eq) { |
| 436 ASSERT(register_index >= 0); |
| 437 ASSERT(register_index <= kMaxRegister); |
| 413 Emit(BC_CHECK_REGISTER_EQ_POS, register_index); | 438 Emit(BC_CHECK_REGISTER_EQ_POS, register_index); |
| 414 EmitOrLink(on_eq); | 439 EmitOrLink(on_eq); |
| 415 } | 440 } |
| 416 | 441 |
| 417 | 442 |
| 418 Handle<Object> RegExpMacroAssemblerIrregexp::GetCode(Handle<String> source) { | 443 Handle<Object> RegExpMacroAssemblerIrregexp::GetCode(Handle<String> source) { |
| 419 Bind(&backtrack_); | 444 Bind(&backtrack_); |
| 420 Emit(BC_POP_BT, 0); | 445 Emit(BC_POP_BT, 0); |
| 421 Handle<ByteArray> array = Factory::NewByteArray(length()); | 446 Handle<ByteArray> array = Factory::NewByteArray(length()); |
| 422 Copy(array->GetDataStartAddress()); | 447 Copy(array->GetDataStartAddress()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 440 buffer_ = Vector<byte>::New(old_buffer.length() * 2); | 465 buffer_ = Vector<byte>::New(old_buffer.length() * 2); |
| 441 own_buffer_ = true; | 466 own_buffer_ = true; |
| 442 memcpy(buffer_.start(), old_buffer.start(), old_buffer.length()); | 467 memcpy(buffer_.start(), old_buffer.start(), old_buffer.length()); |
| 443 if (old_buffer_was_our_own) { | 468 if (old_buffer_was_our_own) { |
| 444 old_buffer.Dispose(); | 469 old_buffer.Dispose(); |
| 445 } | 470 } |
| 446 } | 471 } |
| 447 | 472 |
| 448 | 473 |
| 449 } } // namespace v8::internal | 474 } } // namespace v8::internal |
| OLD | NEW |