Reviewers: Erik Corry,

Message:
As requested.

Description:
Instead of jumping over a conditional backtrack, jump to a single
instance somewhere else.

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

Affected files:
   M src/regexp-macro-assembler-ia32.h
   M src/regexp-macro-assembler-ia32.cc


Index: src/regexp-macro-assembler-ia32.cc
diff --git a/src/regexp-macro-assembler-ia32.cc  
b/src/regexp-macro-assembler-ia32.cc
index  
fe38075b4f010ac589051f6d030cc8ac992af986..d3415204c715483e39e1df66408bbce445f1159e
  
100644
--- a/src/regexp-macro-assembler-ia32.cc
+++ b/src/regexp-macro-assembler-ia32.cc
@@ -93,6 +93,7 @@ RegExpMacroAssemblerIA32::RegExpMacroAssemblerIA32(
        entry_label_(),
        start_label_(),
        success_label_(),
+      backtrack_label_(),
        exit_label_(),
        self_(Heap::undefined_value()) {
    __ jmp(&entry_label_);   // We'll write the entry code later.
@@ -106,6 +107,7 @@ RegExpMacroAssemblerIA32::~RegExpMacroAssemblerIA32() {
    entry_label_.Unuse();
    start_label_.Unuse();
    success_label_.Unuse();
+  backtrack_label_.Unuse();
    exit_label_.Unuse();
    check_preempt_label_.Unuse();
  }
@@ -551,6 +553,12 @@ Handle<Object>  
RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
    __ pop(esi);
    __ ret(0);

+  // Backtrack code (branch target for conditional backtracks).
+  if (backtrack_label_.is_linked()) {
+    __ bind(&backtrack_label_);
+    Backtrack();
+  }
+
    // Preempt-code
    if (check_preempt_label_.is_linked()) {
      __ bind(&check_preempt_label_);
@@ -801,10 +809,7 @@ void  
RegExpMacroAssemblerIA32::BranchOrBacktrack(Condition condition,
      return;
    }
    if (to == NULL) {
-    Label skip;
-    __ j(NegateCondition(condition), &skip);
-    Backtrack();
-    __ bind(&skip);
+    __ j(condition, &backtrack_label_);
      return;
    }
    __ j(condition, to);
Index: src/regexp-macro-assembler-ia32.h
diff --git a/src/regexp-macro-assembler-ia32.h  
b/src/regexp-macro-assembler-ia32.h
index  
7c2d5728e469c5eae257f5c24551daf636484813..a06ea5b1c38d102939ccef680fce4a38e94c704a
  
100644
--- a/src/regexp-macro-assembler-ia32.h
+++ b/src/regexp-macro-assembler-ia32.h
@@ -192,6 +192,7 @@ class RegExpMacroAssemblerIA32: public  
RegExpMacroAssembler {
    Label entry_label_;
    Label start_label_;
    Label success_label_;
+  Label backtrack_label_;
    Label exit_label_;
    Label check_preempt_label_;
    // Handle used to represent the generated code object itself.



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

Reply via email to