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

Side by Side Diff: src/ast.cc

Issue 3850005: Use finite-length end-anchored regexps to reduce part of regexp that is searched. (Closed)
Patch Set: Addressed review comments. Created 10 years, 2 months 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
« no previous file with comments | « src/ast.h ('k') | src/bytecodes-irregexp.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 Interval self(StartRegister(index()), EndRegister(index())); 391 Interval self(StartRegister(index()), EndRegister(index()));
392 return self.Union(body()->CaptureRegisters()); 392 return self.Union(body()->CaptureRegisters());
393 } 393 }
394 394
395 395
396 Interval RegExpQuantifier::CaptureRegisters() { 396 Interval RegExpQuantifier::CaptureRegisters() {
397 return body()->CaptureRegisters(); 397 return body()->CaptureRegisters();
398 } 398 }
399 399
400 400
401 bool RegExpAssertion::IsAnchored() { 401 bool RegExpAssertion::IsAnchoredAtStart() {
402 return type() == RegExpAssertion::START_OF_INPUT; 402 return type() == RegExpAssertion::START_OF_INPUT;
403 } 403 }
404 404
405 405
406 bool RegExpAlternative::IsAnchored() { 406 bool RegExpAssertion::IsAnchoredAtEnd() {
407 return type() == RegExpAssertion::END_OF_INPUT;
408 }
409
410
411 bool RegExpAlternative::IsAnchoredAtStart() {
407 ZoneList<RegExpTree*>* nodes = this->nodes(); 412 ZoneList<RegExpTree*>* nodes = this->nodes();
408 for (int i = 0; i < nodes->length(); i++) { 413 for (int i = 0; i < nodes->length(); i++) {
409 RegExpTree* node = nodes->at(i); 414 RegExpTree* node = nodes->at(i);
410 if (node->IsAnchored()) { return true; } 415 if (node->IsAnchoredAtStart()) { return true; }
411 if (node->max_match() > 0) { return false; } 416 if (node->max_match() > 0) { return false; }
412 } 417 }
413 return false; 418 return false;
414 } 419 }
415 420
416 421
417 bool RegExpDisjunction::IsAnchored() { 422 bool RegExpAlternative::IsAnchoredAtEnd() {
423 ZoneList<RegExpTree*>* nodes = this->nodes();
424 for (int i = nodes->length() - 1; i >= 0; i--) {
425 RegExpTree* node = nodes->at(i);
426 if (node->IsAnchoredAtEnd()) { return true; }
427 if (node->max_match() > 0) { return false; }
428 }
429 return false;
430 }
431
432
433 bool RegExpDisjunction::IsAnchoredAtStart() {
418 ZoneList<RegExpTree*>* alternatives = this->alternatives(); 434 ZoneList<RegExpTree*>* alternatives = this->alternatives();
419 for (int i = 0; i < alternatives->length(); i++) { 435 for (int i = 0; i < alternatives->length(); i++) {
420 if (!alternatives->at(i)->IsAnchored()) 436 if (!alternatives->at(i)->IsAnchoredAtStart())
421 return false; 437 return false;
422 } 438 }
423 return true; 439 return true;
424 } 440 }
425 441
426 442
427 bool RegExpLookahead::IsAnchored() { 443 bool RegExpDisjunction::IsAnchoredAtEnd() {
428 return is_positive() && body()->IsAnchored(); 444 ZoneList<RegExpTree*>* alternatives = this->alternatives();
445 for (int i = 0; i < alternatives->length(); i++) {
446 if (!alternatives->at(i)->IsAnchoredAtEnd())
447 return false;
448 }
449 return true;
429 } 450 }
430 451
431 452
432 bool RegExpCapture::IsAnchored() { 453 bool RegExpLookahead::IsAnchoredAtStart() {
433 return body()->IsAnchored(); 454 return is_positive() && body()->IsAnchoredAtStart();
434 } 455 }
435 456
436 457
458 bool RegExpCapture::IsAnchoredAtStart() {
459 return body()->IsAnchoredAtStart();
460 }
461
462
463 bool RegExpCapture::IsAnchoredAtEnd() {
464 return body()->IsAnchoredAtEnd();
465 }
466
467
437 // Convert regular expression trees to a simple sexp representation. 468 // Convert regular expression trees to a simple sexp representation.
438 // This representation should be different from the input grammar 469 // This representation should be different from the input grammar
439 // in as many cases as possible, to make it more difficult for incorrect 470 // in as many cases as possible, to make it more difficult for incorrect
440 // parses to look as correct ones which is likely if the input and 471 // parses to look as correct ones which is likely if the input and
441 // output formats are alike. 472 // output formats are alike.
442 class RegExpUnparser: public RegExpVisitor { 473 class RegExpUnparser: public RegExpVisitor {
443 public: 474 public:
444 RegExpUnparser(); 475 RegExpUnparser();
445 void VisitCharacterRange(CharacterRange that); 476 void VisitCharacterRange(CharacterRange that);
446 SmartPointer<const char> ToString() { return stream_.ToCString(); } 477 SmartPointer<const char> ToString() { return stream_.ToCString(); }
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 cond_(NULL), 673 cond_(NULL),
643 may_have_function_literal_(true) { 674 may_have_function_literal_(true) {
644 } 675 }
645 676
646 677
647 CaseClause::CaseClause(Expression* label, ZoneList<Statement*>* statements) 678 CaseClause::CaseClause(Expression* label, ZoneList<Statement*>* statements)
648 : label_(label), statements_(statements) { 679 : label_(label), statements_(statements) {
649 } 680 }
650 681
651 } } // namespace v8::internal 682 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ast.h ('k') | src/bytecodes-irregexp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698