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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 } | 74 } |
75 return true; | 75 return true; |
76 } | 76 } |
77 | 77 |
78 | 78 |
79 #ifdef DEBUG | 79 #ifdef DEBUG |
80 static void TraceInterpreter(const byte* code_base, | 80 static void TraceInterpreter(const byte* code_base, |
81 const byte* pc, | 81 const byte* pc, |
82 int stack_depth, | 82 int stack_depth, |
83 int current_position, | 83 int current_position, |
| 84 uint32_t current_char, |
84 int bytecode_length, | 85 int bytecode_length, |
85 const char* bytecode_name) { | 86 const char* bytecode_name) { |
86 if (FLAG_trace_regexp_bytecodes) { | 87 if (FLAG_trace_regexp_bytecodes) { |
87 PrintF("pc = %02x, sp = %d, current = %d, bc = %s", | 88 bool printable = (current_char < 127 && current_char >= 32); |
| 89 const char* format = |
| 90 printable ? |
| 91 "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s" : |
| 92 "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s"; |
| 93 PrintF(format, |
88 pc - code_base, | 94 pc - code_base, |
89 stack_depth, | 95 stack_depth, |
90 current_position, | 96 current_position, |
| 97 current_char, |
| 98 printable ? current_char : '.', |
91 bytecode_name); | 99 bytecode_name); |
92 for (int i = 1; i < bytecode_length; i++) { | 100 for (int i = 1; i < bytecode_length; i++) { |
93 printf(", %02x", pc[i]); | 101 printf(", %02x", pc[i]); |
94 } | 102 } |
| 103 printf(" "); |
| 104 for (int i = 1; i < bytecode_length; i++) { |
| 105 unsigned char b = pc[i]; |
| 106 if (b < 127 && b >= 32) { |
| 107 printf("%c", b); |
| 108 } else { |
| 109 printf("."); |
| 110 } |
| 111 } |
95 printf("\n"); | 112 printf("\n"); |
96 } | 113 } |
97 } | 114 } |
98 | 115 |
99 | 116 |
100 #define BYTECODE(name) \ | 117 #define BYTECODE(name) \ |
101 case BC_##name: \ | 118 case BC_##name: \ |
102 TraceInterpreter(code_base, \ | 119 TraceInterpreter(code_base, \ |
103 pc, \ | 120 pc, \ |
104 backtrack_sp - backtrack_stack, \ | 121 backtrack_sp - backtrack_stack, \ |
105 current, \ | 122 current, \ |
| 123 current_char, \ |
106 BC_##name##_LENGTH, \ | 124 BC_##name##_LENGTH, \ |
107 #name); | 125 #name); |
108 #else | 126 #else |
109 #define BYTECODE(name) \ | 127 #define BYTECODE(name) \ |
110 case BC_##name: | 128 case BC_##name: |
111 #endif | 129 #endif |
112 | 130 |
113 | 131 |
114 | 132 |
115 template <typename Char> | 133 template <typename Char> |
116 static bool RawMatch(const byte* code_base, | 134 static bool RawMatch(const byte* code_base, |
117 Vector<const Char> subject, | 135 Vector<const Char> subject, |
118 int* registers, | 136 int* registers, |
119 int current, | 137 int current, |
120 int current_char) { | 138 uint32_t current_char) { |
121 const byte* pc = code_base; | 139 const byte* pc = code_base; |
122 static const int kBacktrackStackSize = 10000; | 140 static const int kBacktrackStackSize = 10000; |
123 int backtrack_stack[kBacktrackStackSize]; | 141 int backtrack_stack[kBacktrackStackSize]; |
124 int backtrack_stack_space = kBacktrackStackSize; | 142 int backtrack_stack_space = kBacktrackStackSize; |
125 int* backtrack_sp = backtrack_stack; | 143 int* backtrack_sp = backtrack_stack; |
126 #ifdef DEBUG | 144 #ifdef DEBUG |
127 if (FLAG_trace_regexp_bytecodes) { | 145 if (FLAG_trace_regexp_bytecodes) { |
128 PrintF("\n\nStart bytecode interpreter\n\n"); | 146 PrintF("\n\nStart bytecode interpreter\n\n"); |
129 } | 147 } |
130 #endif | 148 #endif |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 pc += BC_LOAD_CURRENT_CHAR_LENGTH; | 244 pc += BC_LOAD_CURRENT_CHAR_LENGTH; |
227 } | 245 } |
228 break; | 246 break; |
229 } | 247 } |
230 BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) { | 248 BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) { |
231 int pos = current + Load32(pc + 1); | 249 int pos = current + Load32(pc + 1); |
232 current_char = subject[pos]; | 250 current_char = subject[pos]; |
233 pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH; | 251 pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH; |
234 break; | 252 break; |
235 } | 253 } |
| 254 BYTECODE(LOAD_2_CURRENT_CHARS) { |
| 255 int pos = current + Load32(pc + 1); |
| 256 if (pos + 2 > subject.length()) { |
| 257 pc = code_base + Load32(pc + 5); |
| 258 } else { |
| 259 Char next = subject[pos + 1]; |
| 260 current_char = |
| 261 (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); |
| 262 pc += BC_LOAD_2_CURRENT_CHARS_LENGTH; |
| 263 } |
| 264 break; |
| 265 } |
| 266 BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) { |
| 267 int pos = current + Load32(pc + 1); |
| 268 Char next = subject[pos + 1]; |
| 269 current_char = (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); |
| 270 pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH; |
| 271 break; |
| 272 } |
| 273 BYTECODE(LOAD_4_CURRENT_CHARS) { |
| 274 ASSERT(sizeof(Char) == 1); |
| 275 int pos = current + Load32(pc + 1); |
| 276 if (pos + 4 > subject.length()) { |
| 277 pc = code_base + Load32(pc + 5); |
| 278 } else { |
| 279 Char next1 = subject[pos + 1]; |
| 280 Char next2 = subject[pos + 2]; |
| 281 Char next3 = subject[pos + 3]; |
| 282 current_char = (subject[pos] | |
| 283 (next1 << 8) | |
| 284 (next2 << 16) | |
| 285 (next3 << 24)); |
| 286 pc += BC_LOAD_4_CURRENT_CHARS_LENGTH; |
| 287 } |
| 288 break; |
| 289 } |
| 290 BYTECODE(LOAD_4_CURRENT_CHARS_UNCHECKED) { |
| 291 ASSERT(sizeof(Char) == 1); |
| 292 int pos = current + Load32(pc + 1); |
| 293 Char next1 = subject[pos + 1]; |
| 294 Char next2 = subject[pos + 2]; |
| 295 Char next3 = subject[pos + 3]; |
| 296 current_char = (subject[pos] | |
| 297 (next1 << 8) | |
| 298 (next2 << 16) | |
| 299 (next3 << 24)); |
| 300 pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH; |
| 301 break; |
| 302 } |
236 BYTECODE(CHECK_CHAR) { | 303 BYTECODE(CHECK_CHAR) { |
237 int c = Load16(pc + 1); | 304 uint32_t c = Load32(pc + 1); |
238 if (c == current_char) { | 305 if (c == current_char) { |
239 pc = code_base + Load32(pc + 3); | 306 pc = code_base + Load32(pc + 5); |
240 } else { | 307 } else { |
241 pc += BC_CHECK_CHAR_LENGTH; | 308 pc += BC_CHECK_CHAR_LENGTH; |
242 } | 309 } |
243 break; | 310 break; |
244 } | 311 } |
245 BYTECODE(CHECK_NOT_CHAR) { | 312 BYTECODE(CHECK_NOT_CHAR) { |
246 int c = Load16(pc + 1); | 313 uint32_t c = Load32(pc + 1); |
247 if (c != current_char) { | 314 if (c != current_char) { |
248 pc = code_base + Load32(pc + 3); | 315 pc = code_base + Load32(pc + 5); |
249 } else { | 316 } else { |
250 pc += BC_CHECK_NOT_CHAR_LENGTH; | 317 pc += BC_CHECK_NOT_CHAR_LENGTH; |
251 } | 318 } |
252 break; | 319 break; |
253 } | 320 } |
254 BYTECODE(OR_CHECK_NOT_CHAR) { | 321 BYTECODE(AND_CHECK_CHAR) { |
255 int c = Load16(pc + 1); | 322 uint32_t c = Load32(pc + 1); |
256 if (c != (current_char | Load16(pc + 3))) { | 323 if (c == (current_char & Load32(pc + 5))) { |
257 pc = code_base + Load32(pc + 5); | 324 pc = code_base + Load32(pc + 9); |
258 } else { | 325 } else { |
259 pc += BC_OR_CHECK_NOT_CHAR_LENGTH; | 326 pc += BC_AND_CHECK_CHAR_LENGTH; |
260 } | 327 } |
261 break; | 328 break; |
262 } | 329 } |
263 BYTECODE(MINUS_OR_CHECK_NOT_CHAR) { | 330 BYTECODE(AND_CHECK_NOT_CHAR) { |
264 int c = Load16(pc + 1); | 331 uint32_t c = Load32(pc + 1); |
265 int m = Load16(pc + 3); | 332 if (c != (current_char & Load32(pc + 5))) { |
266 if (c != ((current_char - m) | m)) { | 333 pc = code_base + Load32(pc + 9); |
267 pc = code_base + Load32(pc + 5); | |
268 } else { | 334 } else { |
269 pc += BC_MINUS_OR_CHECK_NOT_CHAR_LENGTH; | 335 pc += BC_AND_CHECK_NOT_CHAR_LENGTH; |
| 336 } |
| 337 break; |
| 338 } |
| 339 BYTECODE(MINUS_AND_CHECK_NOT_CHAR) { |
| 340 uint32_t c = Load16(pc + 1); |
| 341 uint32_t minus = Load16(pc + 3); |
| 342 uint32_t mask = Load16(pc + 5); |
| 343 if (c != ((current_char - minus) & mask)) { |
| 344 pc = code_base + Load32(pc + 7); |
| 345 } else { |
| 346 pc += BC_MINUS_AND_CHECK_NOT_CHAR_LENGTH; |
270 } | 347 } |
271 break; | 348 break; |
272 } | 349 } |
273 BYTECODE(CHECK_LT) { | 350 BYTECODE(CHECK_LT) { |
274 int limit = Load16(pc + 1); | 351 uint32_t limit = Load16(pc + 1); |
275 if (current_char < limit) { | 352 if (current_char < limit) { |
276 pc = code_base + Load32(pc + 3); | 353 pc = code_base + Load32(pc + 3); |
277 } else { | 354 } else { |
278 pc += BC_CHECK_LT_LENGTH; | 355 pc += BC_CHECK_LT_LENGTH; |
279 } | 356 } |
280 break; | 357 break; |
281 } | 358 } |
282 BYTECODE(CHECK_GT) { | 359 BYTECODE(CHECK_GT) { |
283 int limit = Load16(pc + 1); | 360 uint32_t limit = Load16(pc + 1); |
284 if (current_char > limit) { | 361 if (current_char > limit) { |
285 pc = code_base + Load32(pc + 3); | 362 pc = code_base + Load32(pc + 3); |
286 } else { | 363 } else { |
287 pc += BC_CHECK_GT_LENGTH; | 364 pc += BC_CHECK_GT_LENGTH; |
288 } | 365 } |
289 break; | 366 break; |
290 } | 367 } |
291 BYTECODE(CHECK_REGISTER_LT) | 368 BYTECODE(CHECK_REGISTER_LT) |
292 if (registers[pc[1]] < Load16(pc + 2)) { | 369 if (registers[pc[1]] < Load16(pc + 2)) { |
293 pc = code_base + Load32(pc + 4); | 370 pc = code_base + Load32(pc + 4); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 if (start_position != 0) previous_char = subject_vector[start_position - 1]; | 521 if (start_position != 0) previous_char = subject_vector[start_position - 1]; |
445 return RawMatch(code_base, | 522 return RawMatch(code_base, |
446 subject_vector, | 523 subject_vector, |
447 registers, | 524 registers, |
448 start_position, | 525 start_position, |
449 previous_char); | 526 previous_char); |
450 } | 527 } |
451 } | 528 } |
452 | 529 |
453 } } // namespace v8::internal | 530 } } // namespace v8::internal |
OLD | NEW |