sizeof(CSSRule) is 20 instead of 12 on Windows
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Jan 2012 01:19:42 +0000 (01:19 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Jan 2012 01:19:42 +0000 (01:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=75665

Reviewed by Darin Fisher.

Unlike gcc and clang, MSVC pads each consecutive member variables of the same type
in bitfields. e.g. if you have:

sturct AB {
unsigned m_1 : 31;
bool m_2 : 1;
}

then MSVC pads m_1 and allocates sizeof(unsigned) * 2 for AB whereas gcc and clang
only allocate sizeof(unsigned) * 1 for AB.

Fix the bloat by turning all bitfields in CSSRule either signed or unsigned integers.

* css/CSSRule.cpp:
* css/CSSRule.h:
(WebCore::CSSRule::sourceLine):
(WebCore::CSSRule::setSourceLine):
(WebCore::CSSRule::hasCachedSelectorText):
(WebCore::CSSRule::setHasCachedSelectorText):
* css/CSSStyleRule.cpp:
(WebCore::CSSStyleRule::CSSStyleRule):
(WebCore::CSSStyleRule::cleanup):
(WebCore::CSSStyleRule::selectorText):
(WebCore::CSSStyleRule::setSelectorText):
* css/CSSStyleRule.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@104254 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/css/CSSRule.cpp
Source/WebCore/css/CSSRule.h
Source/WebCore/css/CSSStyleRule.cpp
Source/WebCore/css/CSSStyleRule.h

index bdb6af4868fc941920ec110e632d4a8472bacdcf..985609024381d7f5f38def74ac892db106248284 100755 (executable)
@@ -1,3 +1,36 @@
+2012-01-05  Ryosuke Niwa  <rniwa@webkit.org>
+
+        sizeof(CSSRule) is 20 instead of 12 on Windows
+        https://bugs.webkit.org/show_bug.cgi?id=75665
+
+        Reviewed by Darin Fisher.
+
+        Unlike gcc and clang, MSVC pads each consecutive member variables of the same type
+        in bitfields. e.g. if you have:
+
+        sturct AB {
+        unsigned m_1 : 31;
+        bool m_2 : 1;
+        }
+
+        then MSVC pads m_1 and allocates sizeof(unsigned) * 2 for AB whereas gcc and clang
+        only allocate sizeof(unsigned) * 1 for AB.
+
+        Fix the bloat by turning all bitfields in CSSRule either signed or unsigned integers.
+
+        * css/CSSRule.cpp:
+        * css/CSSRule.h:
+        (WebCore::CSSRule::sourceLine):
+        (WebCore::CSSRule::setSourceLine):
+        (WebCore::CSSRule::hasCachedSelectorText):
+        (WebCore::CSSRule::setHasCachedSelectorText):
+        * css/CSSStyleRule.cpp:
+        (WebCore::CSSStyleRule::CSSStyleRule):
+        (WebCore::CSSStyleRule::cleanup):
+        (WebCore::CSSStyleRule::selectorText):
+        (WebCore::CSSStyleRule::setSelectorText):
+        * css/CSSStyleRule.h:
+
 2012-01-05  David Grogan  <dgrogan@chromium.org>
 
         IndexedDB: fix cursor prefetch crash
index e7e044bfc7550e5558555a6694604b1b6ae7c43b..7891c9da5aa45e1e9b7885aa16816eea1b3319cc 100644 (file)
                                FD6F252D13F5EF0E0065165F /* MediaElementAudioSourceNode.h in Headers */,
                                E44613AD0CD6331000FADA75 /* MediaError.h in Headers */,
                                4E1959220A39DABA00220FE5 /* MediaFeatureNames.h in Headers */,
-                               07A6D1EC1491137700051D0C /* MediaFragmentURIParser.h in Headers */,
+                               07A6D1EC1491137700051D0C /* MediaFragmentURIParser.h in Headers */,
                                A8EA800E0A19516E00A8EF5F /* MediaList.h in Headers */,
                                E44613E40CD681A200FADA75 /* MediaPlayer.h in Headers */,
                                076F0D0E12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h in Headers */,
                                97205AB71239291000B17380 /* MediaDocument.cpp in Sources */,
                                FD6F252C13F5EF0E0065165F /* MediaElementAudioSourceNode.cpp in Sources */,
                                4E1959210A39DABA00220FE5 /* MediaFeatureNames.cpp in Sources */,
-                               07A6D1EB1491137700051D0C /* MediaFragmentURIParser.cpp in Sources */,
+                               07A6D1EB1491137700051D0C /* MediaFragmentURIParser.cpp in Sources */,
                                A8EA80090A19516E00A8EF5F /* MediaList.cpp in Sources */,
                                E44613E30CD6819F00FADA75 /* MediaPlayer.cpp in Sources */,
                                072C8B11131C518600A4FCE9 /* MediaPlayerPrivateAVFoundation.cpp in Sources */,
index a727ac385fa3e74f0d939ecd088afc8363653465..5399848da14f4e25d54d1aadd99e9181ba277e09 100644 (file)
 
 namespace WebCore {
 
+struct SameSizeAsCSSRule : public RefCounted<SameSizeAsCSSRule> {
+    unsigned bitfields;
+    void* pointerUnion;
+};
+
+COMPILE_ASSERT(sizeof(CSSRule) == sizeof(SameSizeAsCSSRule), CSSRule_should_stay_small);
+
 void CSSRule::setCssText(const String& /*cssText*/, ExceptionCode& /*ec*/)
 {
     notImplemented();
index 43bb60c3cda3258d4951ddae97a12e722f00ef2d..4f3ca3b74ddaa0ddd8ef08caea7c51aa1dd3b505 100644 (file)
@@ -122,12 +122,16 @@ protected:
 
     ~CSSRule() { }
 
-    // Only used by CSSStyleRule but kept here to maximize struct packing.
-    signed m_sourceLine : 26;
-    mutable bool m_hasCachedSelectorText : 1;
+    int sourceLine() const { return m_sourceLine; }
+    void setSourceLine(int sourceLine) { m_sourceLine = sourceLine; }
+    bool hasCachedSelectorText() const { return m_hasCachedSelectorText; }
+    void setHasCachedSelectorText(bool hasCachedSelectorText) const { m_hasCachedSelectorText = hasCachedSelectorText; }
 
 private:
-    bool m_parentIsRule : 1;
+    // Only used by CSSStyleRule but kept here to maximize struct packing.
+    signed m_sourceLine : 26;
+    mutable unsigned m_hasCachedSelectorText : 1;
+    unsigned m_parentIsRule : 1;
     unsigned m_type : 4;
     union {
         CSSRule* m_parentRule;
index 19d2790eb986c6b8b6df41c9df5128533c2dbd73..6296e64b7474019404e3aa8bd308b58f95b6bf0f 100644 (file)
 
 namespace WebCore {
 
-CSSStyleRule::CSSStyleRule(CSSStyleSheet* parent, int sourceLine, CSSRule::Type type)
+CSSStyleRule::CSSStyleRule(CSSStyleSheet* parent, int line, CSSRule::Type type)
     : CSSRule(parent, type)
 {
-    m_sourceLine = sourceLine;
+    setSourceLine(line);
 
     // m_sourceLine is a bitfield, so let's catch any overflow early in debug mode.
-    ASSERT(m_sourceLine == sourceLine);
+    ASSERT(sourceLine() == line);
 }
 
 CSSStyleRule::~CSSStyleRule()
@@ -60,9 +60,9 @@ static SelectorTextCache& selectorTextCache()
 
 inline void CSSStyleRule::cleanup()
 {
-    if (m_hasCachedSelectorText) {
+    if (hasCachedSelectorText()) {
         selectorTextCache().remove(this);
-        m_hasCachedSelectorText = false;
+        setHasCachedSelectorText(false);
     }
 }
 
@@ -83,7 +83,7 @@ String CSSStyleRule::generateSelectorText() const
 
 String CSSStyleRule::selectorText() const
 {
-    if (m_hasCachedSelectorText) {
+    if (hasCachedSelectorText()) {
         ASSERT(selectorTextCache().contains(this));
         return selectorTextCache().get(this);
     }
@@ -91,7 +91,7 @@ String CSSStyleRule::selectorText() const
     ASSERT(!selectorTextCache().contains(this));
     String text = generateSelectorText();
     selectorTextCache().set(this, text);
-    m_hasCachedSelectorText = true;
+    setHasCachedSelectorText(true);
     return text;
 }
 
@@ -119,7 +119,7 @@ void CSSStyleRule::setSelectorText(const String& selectorText)
     String oldSelectorText = this->selectorText();
     m_selectorList.adopt(selectorList);
 
-    if (m_hasCachedSelectorText) {
+    if (hasCachedSelectorText()) {
         ASSERT(selectorTextCache().contains(this));
         selectorTextCache().set(this, generateSelectorText());
     }
index 22add47c4783c6520dfe4f59fa57eb66e16c40b5..111c5f1aad0b2680f3d187a1d89336a9fb80330c 100644 (file)
@@ -55,7 +55,7 @@ public:
 
     void addSubresourceStyleURLs(ListHashSet<KURL>& urls);
 
-    int sourceLine() { return m_sourceLine; }
+    using CSSRule::sourceLine;
 
 protected:
     CSSStyleRule(CSSStyleSheet* parent, int sourceLine, CSSRule::Type = CSSRule::STYLE_RULE);