[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

msaboff at apple.com msaboff at apple.com
Sun Feb 20 22:57:36 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit 0fcfa8d1ec7c181a0419ec2ebe8401795c03e56d
Author: msaboff at apple.com <msaboff at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Jan 14 16:02:51 2011 +0000

    2011-01-14  Michael Saboff  <msaboff at apple.com>
    
            Reviewed by Oliver Hunt.
    
            Incorrect backtracking for nested alternatives
            https://bugs.webkit.org/show_bug.cgi?id=52387
    
            Added tests to verfiy backtracking of alternatives following
            parenthesis.
    
            * fast/regex/parentheses-expected.txt:
            * fast/regex/script-tests/parentheses.js:
    2011-01-14  Michael Saboff  <msaboff at apple.com>
    
            Reviewed by Oliver Hunt.
    
            Incorrect backtracking for nested alternatives
            https://bugs.webkit.org/show_bug.cgi?id=52387
    
            In the process of propigating a datalabel it wasn't getting connected
            to a destination when the destination was an indirect jump.  Added
            code to recognize a direct backtrack destination that was an indirect
            jump and added mechanism to associate DataLabelPtrs with indirect
            jump entries.
            Removed dead method
            BacktrackDestination::linkDataLabelToHereIfExists()
    
            * yarr/YarrJIT.cpp:
            (JSC::Yarr::YarrGenerator::IndirectJumpEntry::IndirectJumpEntry):
            (JSC::Yarr::YarrGenerator::IndirectJumpEntry::addDataLabel):
            (JSC::Yarr::YarrGenerator::GenerationState::addIndirectJumpEntry):
            (JSC::Yarr::YarrGenerator::GenerationState::emitIndirectJumpTable):
            Changes to link indirect jumps with DataLabelPtr's.
            (JSC::Yarr::YarrGenerator::BacktrackDestination::clearSubDataLabelPtr):
            (JSC::Yarr::YarrGenerator::TermGenerationState::linkDataLabelToBacktrackIfExists):
            Updated to handle immediate linking of indirect jumps to
            DataLabelPtr.
            (JSC::Yarr::YarrGenerator::generateParenthesesDisjunction): Changed to
            reflect updated linkDataLabelToBacktrackIfExists().
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@75796 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 5551206..e74d2f4 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2011-01-14  Michael Saboff  <msaboff at apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Incorrect backtracking for nested alternatives
+        https://bugs.webkit.org/show_bug.cgi?id=52387
+
+        Added tests to verfiy backtracking of alternatives following 
+        parenthesis.
+
+        * fast/regex/parentheses-expected.txt:
+        * fast/regex/script-tests/parentheses.js:
+
 2011-01-14  Pavel Feldman  <pfeldman at chromium.org>
 
         Web Inspector: do not use this as protocol message
diff --git a/LayoutTests/fast/regex/parentheses-expected.txt b/LayoutTests/fast/regex/parentheses-expected.txt
index e6915f7..c086d36 100644
--- a/LayoutTests/fast/regex/parentheses-expected.txt
+++ b/LayoutTests/fast/regex/parentheses-expected.txt
@@ -43,6 +43,21 @@ PASS regexp34.exec('btn-abc') is ['btn-abc']
 PASS regexp34.exec('btn- abc') is null
 PASS regexp34.exec('XXbtn-abc') is null
 PASS regexp34.exec('XX btn-abc') is ['btn-abc']
+PASS regexp35.exec('ax') is ['ax','ax','a','x']
+PASS regexp35.exec('axx') is null
+PASS regexp35.exec('axxx') is ['axxx','axxx','a','xxx']
+PASS regexp35.exec('bx') is ['bx','bx','b','x']
+PASS regexp35.exec('bxx') is null
+PASS regexp35.exec('bxxx') is ['bxxx','bxxx','b','xxx']
+PASS regexp36.exec('/2011') is ['/2011','/2011','/','2011']
+PASS regexp36.exec('/11') is ['/11','/11','/','11']
+PASS regexp36.exec('/123') is null
+PASS regexp37.exec('7/4/1776') is ['7/4/1776','7','/','4','/1776','/','1776']
+PASS regexp37.exec('07-04-1776') is ['07-04-1776','07','-','04','-1776','-','1776']
+PASS regexp38.exec('xx') is ['xx','xx','xx']
+PASS regexp38.exec('b') is ['b','b',undefined]
+PASS regexp38.exec('z') is ['z','z',undefined]
+PASS regexp38.exec('') is ['','',undefined]
 PASS 'Hi Bob'.match(/(Rob)|(Bob)|(Robert)|(Bobby)/) is ['Bob',undefined,'Bob',undefined,undefined]
 PASS successfullyParsed is true
 
diff --git a/LayoutTests/fast/regex/script-tests/parentheses.js b/LayoutTests/fast/regex/script-tests/parentheses.js
index 3f0017c..ea4fff3 100644
--- a/LayoutTests/fast/regex/script-tests/parentheses.js
+++ b/LayoutTests/fast/regex/script-tests/parentheses.js
@@ -147,6 +147,29 @@ shouldBeNull("regexp34.exec('btn- abc')");
 shouldBeNull("regexp34.exec('XXbtn-abc')");
 shouldBe("regexp34.exec('XX btn-abc')","['btn-abc']");
 
+var regexp35 = /^((a|b)(x|xxx)|)$/;
+shouldBe("regexp35.exec('ax')", "['ax','ax','a','x']");
+shouldBeNull("regexp35.exec('axx')");
+shouldBe("regexp35.exec('axxx')", "['axxx','axxx','a','xxx']");
+shouldBe("regexp35.exec('bx')", "['bx','bx','b','x']");
+shouldBeNull("regexp35.exec('bxx')");
+shouldBe("regexp35.exec('bxxx')", "['bxxx','bxxx','b','xxx']");
+
+var regexp36 = /^((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
+shouldBe("regexp36.exec('/2011')", "['/2011','/2011','/','2011']");
+shouldBe("regexp36.exec('/11')", "['/11','/11','/','11']");
+shouldBeNull("regexp36.exec('/123')");
+
+var regexp37 = /^([1][0-2]|[0]\d|\d)(\/|\.|\-)([0-2]\d|[3][0-1]|\d)((\/|\.|\-)(\d\d|\d\d\d\d)|)$/;
+shouldBe("regexp37.exec('7/4/1776')", "['7/4/1776','7','/','4','/1776','/','1776']");
+shouldBe("regexp37.exec('07-04-1776')", "['07-04-1776','07','-','04','-1776','-','1776']");
+
+var regexp38 = /^(z|(x|xx)|b|)$/;
+shouldBe("regexp38.exec('xx')", "['xx','xx','xx']");
+shouldBe("regexp38.exec('b')", "['b','b',undefined]");
+shouldBe("regexp38.exec('z')", "['z','z',undefined]");
+shouldBe("regexp38.exec('')", "['','',undefined]");
+
 shouldBe("'Hi Bob'.match(/(Rob)|(Bob)|(Robert)|(Bobby)/)", "['Bob',undefined,'Bob',undefined,undefined]");
 
 var successfullyParsed = true;
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index eb8c885..cd4aff8 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,31 @@
+2011-01-14  Michael Saboff  <msaboff at apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Incorrect backtracking for nested alternatives
+        https://bugs.webkit.org/show_bug.cgi?id=52387
+
+        In the process of propigating a datalabel it wasn't getting connected
+        to a destination when the destination was an indirect jump.  Added
+        code to recognize a direct backtrack destination that was an indirect
+        jump and added mechanism to associate DataLabelPtrs with indirect
+        jump entries.
+        Removed dead method
+        BacktrackDestination::linkDataLabelToHereIfExists()
+
+        * yarr/YarrJIT.cpp:
+        (JSC::Yarr::YarrGenerator::IndirectJumpEntry::IndirectJumpEntry):
+        (JSC::Yarr::YarrGenerator::IndirectJumpEntry::addDataLabel):
+        (JSC::Yarr::YarrGenerator::GenerationState::addIndirectJumpEntry):
+        (JSC::Yarr::YarrGenerator::GenerationState::emitIndirectJumpTable):
+        Changes to link indirect jumps with DataLabelPtr's.
+        (JSC::Yarr::YarrGenerator::BacktrackDestination::clearSubDataLabelPtr):
+        (JSC::Yarr::YarrGenerator::TermGenerationState::linkDataLabelToBacktrackIfExists): 
+        Updated to handle immediate linking of indirect jumps to
+        DataLabelPtr.
+        (JSC::Yarr::YarrGenerator::generateParenthesesDisjunction): Changed to
+        reflect updated linkDataLabelToBacktrackIfExists().
+
 2011-01-14  Pavel Podivilov  <podivilov at chromium.org>
 
         Reviewed by Yury Semikhatsky.
diff --git a/Source/JavaScriptCore/yarr/YarrJIT.cpp b/Source/JavaScriptCore/yarr/YarrJIT.cpp
index ae3cdf2..2556531 100644
--- a/Source/JavaScriptCore/yarr/YarrJIT.cpp
+++ b/Source/JavaScriptCore/yarr/YarrJIT.cpp
@@ -299,13 +299,25 @@ class YarrGenerator : private MacroAssembler {
             addJump(jump);
         }
 
+        IndirectJumpEntry(int32_t stackOffset, DataLabelPtr dataLabel)
+        : m_stackOffset(stackOffset)
+        {
+            addDataLabel(dataLabel);
+        }
+
         void addJump(Jump jump)
         {
             m_relJumps.append(jump);
         }
+        
+        void addDataLabel(DataLabelPtr dataLabel)
+        {
+            m_dataLabelPtrVector.append(dataLabel);
+        }
 
         int32_t m_stackOffset;
         JumpList m_relJumps;
+        Vector<DataLabelPtr, 16> m_dataLabelPtrVector;
     };
 
     struct AlternativeBacktrackRecord {
@@ -354,10 +366,31 @@ class YarrGenerator : private MacroAssembler {
             jumps.empty();
         }
 
+        void addIndirectJumpEntry(int32_t stackOffset, DataLabelPtr dataLabel)
+        {
+            IndirectJumpHashMap::iterator result = m_indirectJumpMap.find(stackOffset);
+
+            ASSERT(stackOffset >= 0);
+
+            uint32_t offset = static_cast<uint32_t>(stackOffset);
+
+            if (result == m_indirectJumpMap.end())
+                m_indirectJumpMap.add(offset, new IndirectJumpEntry(stackOffset, dataLabel));
+            else
+                result->second->addDataLabel(dataLabel);
+        }
+
         void emitIndirectJumpTable(MacroAssembler* masm)
         {
             for (IndirectJumpHashMap::iterator iter = m_indirectJumpMap.begin(); iter != m_indirectJumpMap.end(); ++iter) {
                 IndirectJumpEntry* indJumpEntry = iter->second;
+                size_t size = indJumpEntry->m_dataLabelPtrVector.size();
+                if (size) {
+                    // Link any associated DataLabelPtr's with indirect jump via label
+                    Label hereLabel = masm->label();
+                    for (size_t i = 0; i < size; ++i)
+                        m_backtrackRecords.append(AlternativeBacktrackRecord(indJumpEntry->m_dataLabelPtrVector[i], hereLabel));
+                }
                 indJumpEntry->m_relJumps.link(masm);
                 masm->jump(Address(stackPointerRegister, indJumpEntry->m_stackOffset));
                 delete indJumpEntry;
@@ -605,6 +638,11 @@ class YarrGenerator : private MacroAssembler {
                 m_dataLabelPtr = dp;
         }
 
+        void clearSubDataLabelPtr()
+        {
+            m_subDataLabelPtr = 0;
+        }
+
         void setSubDataLabelPtr(DataLabelPtr* subDataLabelPtr)
         {
             m_subDataLabelPtr = subDataLabelPtr;
@@ -682,17 +720,6 @@ class YarrGenerator : private MacroAssembler {
                 m_backTrackJumps.append(jumps);
         }
 
-        bool linkDataLabelToHereIfExists(YarrGenerator* generator)
-        {
-            if (hasDataLabel()) {
-                generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(getDataLabel(), generator->label()));
-                clearDataLabel();
-                return true;
-            }
-
-            return false;
-        }
-
         bool plantJumpToBacktrackIfExists(YarrGenerator* generator)
         {
             if (isJumpList()) {
@@ -892,12 +919,21 @@ class YarrGenerator : private MacroAssembler {
             return m_backtrack.plantJumpToBacktrackIfExists(generator);
         }
 
-        bool linkDataLabelToBacktrackIfExists(YarrGenerator* generator)
+        bool linkDataLabelToBacktrackIfExists(YarrGenerator* generator, DataLabelPtr dataLabel)
         {
-            if ((m_backtrack.isLabel()) && (m_backtrack.hasDataLabel())) {
-                generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(m_backtrack.getDataLabel(), m_backtrack.getLabel()));
-                m_backtrack.clearDataLabel();
-                return true;
+            // If we have a stack offset backtrack destination, use it directly
+            if (m_backtrack.isStackOffset()) {
+                generator->m_expressionState.addIndirectJumpEntry(m_backtrack.getStackOffset(), dataLabel);
+                m_backtrack.clearSubDataLabelPtr();
+            } else {
+                // Otherwise set the data label (which may be linked)
+                setBacktrackDataLabel(dataLabel);
+
+                if ((m_backtrack.isLabel()) && (m_backtrack.hasDataLabel())) {
+                    generator->m_expressionState.m_backtrackRecords.append(AlternativeBacktrackRecord(m_backtrack.getDataLabel(), m_backtrack.getLabel()));
+                    m_backtrack.clearDataLabel();
+                    return true;
+                }
             }
 
             return false;
@@ -1565,11 +1601,9 @@ class YarrGenerator : private MacroAssembler {
 
                 // Alternative did not match.
 
-                state.setBacktrackDataLabel(dataLabel);
-
                 // Do we have a backtrack destination?
                 //    if so, link the data label to it.
-                state.linkDataLabelToBacktrackIfExists(this);
+                state.linkDataLabelToBacktrackIfExists(this, dataLabel);
 
                 if (!state.isLastAlternative() || countToCheck)
                     state.linkAlternativeBacktracks(this);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list