[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 11:24:41 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 973d429b98fa93f6d6c64d48916525e66cae6297
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Jul 22 14:43:09 2010 +0000

    2010-07-22  Hayato Ito  <hayato at chromium.org>
    
            Reviewed by Darin Adler.
    
            Refactor CSSSelector's destructor and make it inline.
    
            https://bugs.webkit.org/show_bug.cgi?id=42726
    
            Refactor with no behavior change, thus no new tests.
    
            * css/CSSSelector.cpp:
            (WebCore::CSSSelectorBag::~CSSSelectorBag): Make sure the bag is empty.
            (WebCore::CSSSelectorBag::add): Renamed from append().
            (WebCore::CSSSelector::releaseOwnedSelectorsToBag):
            (WebCore::CSSSelector::deleteReachableSelectors):
            * css/CSSSelector.h:
            (WebCore::CSSSelector::~CSSSelector):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63892 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 8c63a54..e4ea95a 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,21 @@
+2010-07-22  Hayato Ito  <hayato at chromium.org>
+
+        Reviewed by Darin Adler.
+
+        Refactor CSSSelector's destructor and make it inline.
+
+        https://bugs.webkit.org/show_bug.cgi?id=42726
+
+        Refactor with no behavior change, thus no new tests.
+
+        * css/CSSSelector.cpp:
+        (WebCore::CSSSelectorBag::~CSSSelectorBag): Make sure the bag is empty.
+        (WebCore::CSSSelectorBag::add): Renamed from append().
+        (WebCore::CSSSelector::releaseOwnedSelectorsToBag):
+        (WebCore::CSSSelector::deleteReachableSelectors):
+        * css/CSSSelector.h:
+        (WebCore::CSSSelector::~CSSSelector):
+
 2010-07-22  Yury Semikhatsky  <yurys at chromium.org>
 
         Reviewed by Pavel Feldman.
diff --git a/WebCore/css/CSSSelector.cpp b/WebCore/css/CSSSelector.cpp
index b1de4ec..facce83 100644
--- a/WebCore/css/CSSSelector.cpp
+++ b/WebCore/css/CSSSelector.cpp
@@ -37,12 +37,11 @@ namespace WebCore {
     
 using namespace HTMLNames;
 
-// A helper class to hold CSSSelectors.
 class CSSSelectorBag : public Noncopyable {
 public:
     ~CSSSelectorBag()
     {
-        deleteAllValues(m_stack);
+        ASSERT(isEmpty());
     }
 
     bool isEmpty() const
@@ -50,7 +49,7 @@ public:
         return m_stack.isEmpty();
     }
 
-    void append(PassOwnPtr<CSSSelector> selector)
+    void add(PassOwnPtr<CSSSelector> selector)
     {
         if (selector)
             m_stack.append(selector.leakPtr());
@@ -68,46 +67,6 @@ private:
     Vector<CSSSelector*, 16> m_stack;
 };
 
-CSSSelector::~CSSSelector()
-{
-    // We should avoid a recursive destructor call, which causes stack overflow
-    // if CSS Selectors are deeply nested.
-
-    // Early exit if we have already processed the children of this selector.
-    if (m_hasRareData) {
-        if (!m_data.m_rareData)
-            return;
-    } else if (!m_data.m_tagHistory)
-        return;
-
-    CSSSelectorBag selectorsToBeDeleted;
-    if (m_hasRareData) {
-        selectorsToBeDeleted.append(m_data.m_rareData->m_tagHistory.release());
-        selectorsToBeDeleted.append(m_data.m_rareData->m_simpleSelector.release());
-        delete m_data.m_rareData;
-    } else
-        selectorsToBeDeleted.append(adoptPtr(m_data.m_tagHistory));
-
-    // Traverse the tree of CSSSelector and delete each CSSSelector iteratively.
-    while (!selectorsToBeDeleted.isEmpty()) {
-        OwnPtr<CSSSelector> selector(selectorsToBeDeleted.takeAny());
-        ASSERT(selector);
-        if (selector->m_hasRareData) {
-            ASSERT(selector->m_data.m_rareData);
-            selectorsToBeDeleted.append(selector->m_data.m_rareData->m_tagHistory.release());
-            selectorsToBeDeleted.append(selector->m_data.m_rareData->m_simpleSelector.release());
-            delete selector->m_data.m_rareData;
-            // Clear the pointer so that a destructor of the selector, which is
-            // about to be called, can know the children are already processed.
-            selector->m_data.m_rareData = 0;
-        } else {
-            selectorsToBeDeleted.append(adoptPtr(selector->m_data.m_tagHistory));
-            // Clear the pointer for the same reason.
-            selector->m_data.m_tagHistory = 0;
-        }
-    }
-}
-
 unsigned int CSSSelector::specificity()
 {
     if (m_isForPage)
@@ -980,4 +939,33 @@ bool CSSSelector::RareData::matchNth(int count)
     }
 }
 
+inline void CSSSelector::releaseOwnedSelectorsToBag(CSSSelectorBag& bag)
+{
+    if (m_hasRareData) {
+        ASSERT(m_data.m_rareData);
+        bag.add(m_data.m_rareData->m_tagHistory.release());
+        bag.add(m_data.m_rareData->m_simpleSelector.release());
+        delete m_data.m_rareData;
+        // Clear the pointer so that a destructor of this selector will not
+        // traverse this chain.
+        m_data.m_rareData = 0;
+    } else {
+        bag.add(adoptPtr(m_data.m_tagHistory));
+        // Clear the pointer for the same reason.
+        m_data.m_tagHistory = 0;
+    }
+}
+
+void CSSSelector::deleteReachableSelectors()
+{
+    // Traverse the chain of selectors and delete each iteratively.
+    CSSSelectorBag selectorsToBeDeleted;
+    releaseOwnedSelectorsToBag(selectorsToBeDeleted);
+    while (!selectorsToBeDeleted.isEmpty()) {
+        OwnPtr<CSSSelector> selector(selectorsToBeDeleted.takeAny());
+        ASSERT(selector);
+        selector->releaseOwnedSelectorsToBag(selectorsToBeDeleted);
+    }
+}
+
 } // namespace WebCore
diff --git a/WebCore/css/CSSSelector.h b/WebCore/css/CSSSelector.h
index 518ff2c..34e4af0 100644
--- a/WebCore/css/CSSSelector.h
+++ b/WebCore/css/CSSSelector.h
@@ -30,6 +30,8 @@
 
 namespace WebCore {
 
+    class CSSSelectorBag;
+
     // this class represents a selector for a StyleRule
     class CSSSelector : public Noncopyable {
     public:
@@ -57,7 +59,21 @@ namespace WebCore {
         {
         }
 
-        ~CSSSelector();
+        ~CSSSelector()
+        {
+            // Exit if this selector does not own any objects to be deleted.
+            if (m_hasRareData) {
+                if (!m_data.m_rareData)
+                    return;
+            } else if (!m_data.m_tagHistory)
+                return;
+
+            // We can not delete the owned object(s) by simply calling delete
+            // directly on them. That would lead to recursive destructor calls
+            // which might cause stack overflow. We have to delete them
+            // iteratively.
+            deleteReachableSelectors();
+        }
 
         /**
          * Re-create selector text from selector's data
@@ -275,6 +291,9 @@ namespace WebCore {
         bool m_hasRareData            : 1;
         bool m_isForPage              : 1;
 
+        void releaseOwnedSelectorsToBag(CSSSelectorBag&);
+        void deleteReachableSelectors();
+
         unsigned specificityForPage();
         void extractPseudoType() const;
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list