Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1281)

Side by Side Diff: src/interpreter-irregexp.cc

Issue 12406: Case independent back references. (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/regexp2000/
Patch Set: Created 12 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 11 matching lines...) Expand all
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 // A simple interpreter for the Irregexp byte code. 28 // A simple interpreter for the Irregexp byte code.
29 29
30 30
31 #include "v8.h" 31 #include "v8.h"
32 #include "unicode.h"
32 #include "utils.h" 33 #include "utils.h"
33 #include "ast.h" 34 #include "ast.h"
34 #include "bytecodes-irregexp.h" 35 #include "bytecodes-irregexp.h"
35 #include "interpreter-irregexp.h" 36 #include "interpreter-irregexp.h"
36 37
37 38
38 namespace v8 { namespace internal { 39 namespace v8 { namespace internal {
39 40
40 41
42 static unibrow::Mapping<unibrow::Ecma262Canonicalize> canonicalize;
43
44
45 static bool BackRefMatchesNoCase(int from,
Christian Plesner Hansen 2008/11/25 08:18:45 If we were concerned about performance we could co
46 int current,
47 int len,
48 Vector<const uc16> subject) {
49 for (int i = 0; i < len; i++) {
50 unibrow::uchar old_char = subject[from++];
51 unibrow::uchar new_char = subject[current++];
52 canonicalize.get(old_char, '\0', &old_char);
53 canonicalize.get(new_char, '\0', &new_char);
54 if (old_char != new_char) {
55 return false;
56 }
57 }
58 return true;
59 }
60
61
41 #ifdef DEBUG 62 #ifdef DEBUG
42 static void TraceInterpreter(const byte* code_base, 63 static void TraceInterpreter(const byte* code_base,
43 const byte* pc, 64 const byte* pc,
44 int stack_depth, 65 int stack_depth,
45 int current_position, 66 int current_position,
46 int bytecode_length, 67 int bytecode_length,
47 const char* bytecode_name) { 68 const char* bytecode_name) {
48 if (FLAG_trace_regexp_bytecodes) { 69 if (FLAG_trace_regexp_bytecodes) {
49 PrintF("pc = %02x, sp = %d, current = %d, bc = %s", 70 PrintF("pc = %02x, sp = %d, current = %d, bc = %s",
50 pc - code_base, 71 pc - code_base,
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 pc = code_base + Load32(pc + 2); 333 pc = code_base + Load32(pc + 2);
313 break; 334 break;
314 } 335 }
315 } 336 }
316 if (i < len) break; 337 if (i < len) break;
317 current += len; 338 current += len;
318 } 339 }
319 pc += BC_CHECK_NOT_BACK_REF_LENGTH; 340 pc += BC_CHECK_NOT_BACK_REF_LENGTH;
320 break; 341 break;
321 } 342 }
343 BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) {
344 int from = registers[pc[1]];
345 int len = registers[pc[1] + 1] - from;
346 if (current + len > subject.length()) {
347 pc = code_base + Load32(pc + 2);
348 break;
349 } else {
350 if (BackRefMatchesNoCase(from, current, len, subject)) {
351 pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH;
352 } else {
353 pc = code_base + Load32(pc + 2);
354 }
355 }
356 break;
357 }
322 default: 358 default:
323 UNREACHABLE(); 359 UNREACHABLE();
324 break; 360 break;
325 } 361 }
326 } 362 }
327 } 363 }
328 364
329 365
330 bool IrregexpInterpreter::Match(Handle<ByteArray> code_array, 366 bool IrregexpInterpreter::Match(Handle<ByteArray> code_array,
331 Handle<String> subject16, 367 Handle<String> subject16,
332 int* registers, 368 int* registers,
333 int start_position) { 369 int start_position) {
334 ASSERT(StringShape(*subject16).IsTwoByteRepresentation()); 370 ASSERT(StringShape(*subject16).IsTwoByteRepresentation());
335 ASSERT(subject16->IsFlat(StringShape(*subject16))); 371 ASSERT(subject16->IsFlat(StringShape(*subject16)));
336 372
337 373
338 AssertNoAllocation a; 374 AssertNoAllocation a;
339 const byte* code_base = code_array->GetDataStartAddress(); 375 const byte* code_base = code_array->GetDataStartAddress();
340 return RawMatch(code_base, 376 return RawMatch(code_base,
341 Vector<const uc16>(subject16->GetTwoByteData(), 377 Vector<const uc16>(subject16->GetTwoByteData(),
342 subject16->length()), 378 subject16->length()),
343 registers, 379 registers,
344 start_position); 380 start_position);
345 } 381 }
346 382
347 } } // namespace v8::internal 383 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/bytecodes-irregexp.h ('k') | src/jsregexp.cc » ('j') | src/jsregexp.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698