Reviewers: Erik Corry,

Description:
Added propagation of the start set calculated for a choice node to the
nodes that are interested in its start set.

Please review this at http://codereview.chromium.org/9771

Affected files:
   M src/jsregexp.h
   M src/jsregexp.cc
   M test/cctest/test-regexp.cc


Index: src/jsregexp.cc
diff --git a/src/jsregexp.cc b/src/jsregexp.cc
index  
d09d2fa336d9cadc287edb81e9a62254cc00ccc1..1afaccfbf55694c4149be405b57c699437afb344
  
100644
--- a/src/jsregexp.cc
+++ b/src/jsregexp.cc
@@ -1545,6 +1545,21 @@ void Analysis::VisitEnd(EndNode* that) {
  }


+class AddDispatchRange {
+ public:
+  AddDispatchRange(Analysis* analysis) : analysis_(analysis) { }
+  void Call(uc32 from, DispatchTable::Entry entry);
+ private:
+  Analysis* analysis_;
+};
+
+
+void AddDispatchRange::Call(uc32 from, DispatchTable::Entry entry) {
+  CharacterRange range(from, entry.to());
+  analysis_->table()->AddRange(range, analysis_->choice_index());
+}
+
+
  void Analysis::VisitChoice(ChoiceNode* node) {
    if (node->visited()) return;
    node->set_visited(true);
@@ -1556,6 +1571,9 @@ void Analysis::VisitChoice(ChoiceNode* node) {
      data.Analyze(choices->at(i).node());
    }
    node->set_visited(false);
+  if (table() != NULL) {
+    data.table()->ForEach(AddDispatchRange(this));
+  }
  }


Index: src/jsregexp.h
diff --git a/src/jsregexp.h b/src/jsregexp.h
index  
871a00810e6c739d45cdd6b72ed7117107733559..4ab6db0fc184313f131d47ee1d9f788db68da3df
  
100644
--- a/src/jsregexp.h
+++ b/src/jsregexp.h
@@ -324,6 +324,9 @@ class DispatchTable {
    void AddRange(CharacterRange range, int value);
    OutSet Get(uc16 value);
    void Dump();
+
+  template <typename Callback>
+  void ForEach(Callback callback) { return tree()->ForEach(callback); }
   private:
    ZoneSplayTree<Config>* tree() { return &tree_; }
    ZoneSplayTree<Config> tree_;
Index: test/cctest/test-regexp.cc
diff --git a/test/cctest/test-regexp.cc b/test/cctest/test-regexp.cc
index  
a2b3c97d1af69cdc1cc9adcab7231b42b8457cac..f209da9f8ff9fcd7479736e6366b462b514baa9b
  
100644
--- a/test/cctest/test-regexp.cc
+++ b/test/cctest/test-regexp.cc
@@ -610,5 +610,5 @@ TEST(Assembler2) {


  TEST(Graph) {
-  Execute("(a|b|c|\\w|\\s)", "", true);
+  Execute("(a|b|c*|\\w|\\s)", "", true);
  }



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to