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

Side by Side Diff: src/jsregexp.h

Issue 1082763002: Reduce regexp compiler stack size when not optimizing regexps (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: More recursion limiting. Created 5 years, 8 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 | « no previous file | src/jsregexp.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_JSREGEXP_H_ 5 #ifndef V8_JSREGEXP_H_
6 #define V8_JSREGEXP_H_ 6 #define V8_JSREGEXP_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/assembler.h" 9 #include "src/assembler.h"
10 10
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 bool cannot_match_; 563 bool cannot_match_;
564 }; 564 };
565 565
566 566
567 extern int kUninitializedRegExpNodePlaceHolder; 567 extern int kUninitializedRegExpNodePlaceHolder;
568 568
569 569
570 class RegExpNode: public ZoneObject { 570 class RegExpNode: public ZoneObject {
571 public: 571 public:
572 explicit RegExpNode(Zone* zone) 572 explicit RegExpNode(Zone* zone)
573 : replacement_(NULL), trace_count_(0), zone_(zone) { 573 : replacement_(NULL), on_work_list_(false), trace_count_(0), zone_(zone) {
574 bm_info_[0] = bm_info_[1] = NULL; 574 bm_info_[0] = bm_info_[1] = NULL;
575 } 575 }
576 virtual ~RegExpNode(); 576 virtual ~RegExpNode();
577 virtual void Accept(NodeVisitor* visitor) = 0; 577 virtual void Accept(NodeVisitor* visitor) = 0;
578 // Generates a goto to this node or actually generates the code at this point. 578 // Generates a goto to this node or actually generates the code at this point.
579 virtual void Emit(RegExpCompiler* compiler, Trace* trace) = 0; 579 virtual void Emit(RegExpCompiler* compiler, Trace* trace) = 0;
580 // How many characters must this node consume at a minimum in order to 580 // How many characters must this node consume at a minimum in order to
581 // succeed. If we have found at least 'still_to_find' characters that 581 // succeed. If we have found at least 'still_to_find' characters that
582 // must be consumed there is no need to ask any following nodes whether 582 // must be consumed there is no need to ask any following nodes whether
583 // they are sure to eat any more characters. The not_at_start argument is 583 // they are sure to eat any more characters. The not_at_start argument is
(...skipping 27 matching lines...) Expand all
611 RegExpCompiler* compiler) { 611 RegExpCompiler* compiler) {
612 return NULL; 612 return NULL;
613 } 613 }
614 614
615 // Collects information on the possible code units (mod 128) that can match if 615 // Collects information on the possible code units (mod 128) that can match if
616 // we look forward. This is used for a Boyer-Moore-like string searching 616 // we look forward. This is used for a Boyer-Moore-like string searching
617 // implementation. TODO(erikcorry): This should share more code with 617 // implementation. TODO(erikcorry): This should share more code with
618 // EatsAtLeast, GetQuickCheckDetails. The budget argument is used to limit 618 // EatsAtLeast, GetQuickCheckDetails. The budget argument is used to limit
619 // the number of nodes we are willing to look at in order to create this data. 619 // the number of nodes we are willing to look at in order to create this data.
620 static const int kRecursionBudget = 200; 620 static const int kRecursionBudget = 200;
621 bool KeepRecursing(RegExpCompiler* compiler);
621 virtual void FillInBMInfo(int offset, 622 virtual void FillInBMInfo(int offset,
622 int budget, 623 int budget,
623 BoyerMooreLookahead* bm, 624 BoyerMooreLookahead* bm,
624 bool not_at_start) { 625 bool not_at_start) {
625 UNREACHABLE(); 626 UNREACHABLE();
626 } 627 }
627 628
628 // If we know that the input is one-byte then there are some nodes that can 629 // If we know that the input is one-byte then there are some nodes that can
629 // never match. This method returns a node that can be substituted for 630 // never match. This method returns a node that can be substituted for
630 // itself, or NULL if the node can never match. 631 // itself, or NULL if the node can never match.
(...skipping 20 matching lines...) Expand all
651 } 652 }
652 653
653 Label* label() { return &label_; } 654 Label* label() { return &label_; }
654 // If non-generic code is generated for a node (i.e. the node is not at the 655 // If non-generic code is generated for a node (i.e. the node is not at the
655 // start of the trace) then it cannot be reused. This variable sets a limit 656 // start of the trace) then it cannot be reused. This variable sets a limit
656 // on how often we allow that to happen before we insist on starting a new 657 // on how often we allow that to happen before we insist on starting a new
657 // trace and generating generic code for a node that can be reused by flushing 658 // trace and generating generic code for a node that can be reused by flushing
658 // the deferred actions in the current trace and generating a goto. 659 // the deferred actions in the current trace and generating a goto.
659 static const int kMaxCopiesCodeGenerated = 10; 660 static const int kMaxCopiesCodeGenerated = 10;
660 661
662 bool on_work_list() { return on_work_list_; }
663 void set_on_work_list(bool value) { on_work_list_ = value; }
664
661 NodeInfo* info() { return &info_; } 665 NodeInfo* info() { return &info_; }
662 666
663 BoyerMooreLookahead* bm_info(bool not_at_start) { 667 BoyerMooreLookahead* bm_info(bool not_at_start) {
664 return bm_info_[not_at_start ? 1 : 0]; 668 return bm_info_[not_at_start ? 1 : 0];
665 } 669 }
666 670
667 Zone* zone() const { return zone_; } 671 Zone* zone() const { return zone_; }
668 672
669 protected: 673 protected:
670 enum LimitResult { DONE, CONTINUE }; 674 enum LimitResult { DONE, CONTINUE };
671 RegExpNode* replacement_; 675 RegExpNode* replacement_;
672 676
673 LimitResult LimitVersions(RegExpCompiler* compiler, Trace* trace); 677 LimitResult LimitVersions(RegExpCompiler* compiler, Trace* trace);
674 678
675 void set_bm_info(bool not_at_start, BoyerMooreLookahead* bm) { 679 void set_bm_info(bool not_at_start, BoyerMooreLookahead* bm) {
676 bm_info_[not_at_start ? 1 : 0] = bm; 680 bm_info_[not_at_start ? 1 : 0] = bm;
677 } 681 }
678 682
679 private: 683 private:
680 static const int kFirstCharBudget = 10; 684 static const int kFirstCharBudget = 10;
681 Label label_; 685 Label label_;
686 bool on_work_list_;
682 NodeInfo info_; 687 NodeInfo info_;
683 // This variable keeps track of how many times code has been generated for 688 // This variable keeps track of how many times code has been generated for
684 // this node (in different traces). We don't keep track of where the 689 // this node (in different traces). We don't keep track of where the
685 // generated code is located unless the code is generated at the start of 690 // generated code is located unless the code is generated at the start of
686 // a trace, in which case it is generic and can be reused by flushing the 691 // a trace, in which case it is generic and can be reused by flushing the
687 // deferred operations in the current trace and generating a goto. 692 // deferred operations in the current trace and generating a goto.
688 int trace_count_; 693 int trace_count_;
689 BoyerMooreLookahead* bm_info_[2]; 694 BoyerMooreLookahead* bm_info_[2];
690 695
691 Zone* zone_; 696 Zone* zone_;
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 1675
1671 static bool TooMuchRegExpCode(Handle<String> pattern); 1676 static bool TooMuchRegExpCode(Handle<String> pattern);
1672 1677
1673 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); 1678 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case);
1674 }; 1679 };
1675 1680
1676 1681
1677 } } // namespace v8::internal 1682 } } // namespace v8::internal
1678 1683
1679 #endif // V8_JSREGEXP_H_ 1684 #endif // V8_JSREGEXP_H_
OLDNEW
« no previous file with comments | « no previous file | src/jsregexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698