[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