Title: [175067] trunk/Source/WebCore
Revision
175067
Author
[email protected]
Date
2014-10-22 14:16:48 -0700 (Wed, 22 Oct 2014)

Log Message

Avoid repeated is<MutableStyleProperties>() checks in StyleProperties
https://bugs.webkit.org/show_bug.cgi?id=137978

Reviewed by Andreas Kling.

Reduce the amount of is<MutableStyleProperties>() checks in
StyleProperties by:
- Removing the checks in each method of StyleProperties::PropertyReference,
  and replace them by a single check in StyleProperties::propertyAt().
- Providing faster propertyCount() / propertyAt() / isEmpty() methods on
  MutableStyleProperties / ImmutableStyleProperties as a lot of callers use
  tight typing.
- Using tighter typing at call sites whenever possible.

Ideally, we could be able to use iterators instead of propertyCount() /
propertyAt() but this is not trivial to do efficiently as the
representation in memory is fundamentally different for MutableStyleProperties
/ ImmutableStyleProperties. We may be able to do better longer term, but
this is already more efficient short term at least.

No new tests, no behavior change.

* css/StyleProperties.cpp:
(WebCore::MutableStyleProperties::MutableStyleProperties):
(WebCore::StyleProperties::PropertyReference::cssText):
* css/StyleProperties.h:
(WebCore::StyleProperties::PropertyReference::PropertyReference):
(WebCore::StyleProperties::PropertyReference::id):
(WebCore::StyleProperties::PropertyReference::shorthandID):
(WebCore::StyleProperties::PropertyReference::isImportant):
(WebCore::StyleProperties::PropertyReference::isInherited):
(WebCore::StyleProperties::PropertyReference::isImplicit):
(WebCore::StyleProperties::PropertyReference::value):
(WebCore::StyleProperties::PropertyReference::toCSSProperty):
(WebCore::StyleProperties::isEmpty):
(WebCore::ImmutableStyleProperties::isEmpty):
(WebCore::MutableStyleProperties::isEmpty):
(WebCore::ImmutableStyleProperties::propertyAt):
(WebCore::MutableStyleProperties::propertyAt):
(WebCore::StyleProperties::propertyAt):
(WebCore::StyleProperties::propertyCount):
(WebCore::StyleProperties::PropertyReference::propertyMetadata): Deleted.
(WebCore::StyleProperties::PropertyReference::propertyValue): Deleted.
* editing/EditingStyle.cpp:
(WebCore::removePropertiesInStyle):
(WebCore::EditingStyle::removePropertiesInElementDefaultStyle):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (175066 => 175067)


--- trunk/Source/WebCore/ChangeLog	2014-10-22 21:14:07 UTC (rev 175066)
+++ trunk/Source/WebCore/ChangeLog	2014-10-22 21:16:48 UTC (rev 175067)
@@ -1,3 +1,52 @@
+2014-10-22  Chris Dumez  <[email protected]>
+
+        Avoid repeated is<MutableStyleProperties>() checks in StyleProperties
+        https://bugs.webkit.org/show_bug.cgi?id=137978
+
+        Reviewed by Andreas Kling.
+
+        Reduce the amount of is<MutableStyleProperties>() checks in
+        StyleProperties by:
+        - Removing the checks in each method of StyleProperties::PropertyReference,
+          and replace them by a single check in StyleProperties::propertyAt().
+        - Providing faster propertyCount() / propertyAt() / isEmpty() methods on
+          MutableStyleProperties / ImmutableStyleProperties as a lot of callers use
+          tight typing.
+        - Using tighter typing at call sites whenever possible.
+
+        Ideally, we could be able to use iterators instead of propertyCount() /
+        propertyAt() but this is not trivial to do efficiently as the
+        representation in memory is fundamentally different for MutableStyleProperties
+        / ImmutableStyleProperties. We may be able to do better longer term, but
+        this is already more efficient short term at least.
+
+        No new tests, no behavior change.
+
+        * css/StyleProperties.cpp:
+        (WebCore::MutableStyleProperties::MutableStyleProperties):
+        (WebCore::StyleProperties::PropertyReference::cssText):
+        * css/StyleProperties.h:
+        (WebCore::StyleProperties::PropertyReference::PropertyReference):
+        (WebCore::StyleProperties::PropertyReference::id):
+        (WebCore::StyleProperties::PropertyReference::shorthandID):
+        (WebCore::StyleProperties::PropertyReference::isImportant):
+        (WebCore::StyleProperties::PropertyReference::isInherited):
+        (WebCore::StyleProperties::PropertyReference::isImplicit):
+        (WebCore::StyleProperties::PropertyReference::value):
+        (WebCore::StyleProperties::PropertyReference::toCSSProperty):
+        (WebCore::StyleProperties::isEmpty):
+        (WebCore::ImmutableStyleProperties::isEmpty):
+        (WebCore::MutableStyleProperties::isEmpty):
+        (WebCore::ImmutableStyleProperties::propertyAt):
+        (WebCore::MutableStyleProperties::propertyAt):
+        (WebCore::StyleProperties::propertyAt):
+        (WebCore::StyleProperties::propertyCount):
+        (WebCore::StyleProperties::PropertyReference::propertyMetadata): Deleted.
+        (WebCore::StyleProperties::PropertyReference::propertyValue): Deleted.
+        * editing/EditingStyle.cpp:
+        (WebCore::removePropertiesInStyle):
+        (WebCore::EditingStyle::removePropertiesInElementDefaultStyle):
+
 2014-10-22  Eric Carlson  <[email protected]>
 
         [Mac][MediaStream] clean up bit rot

Modified: trunk/Source/WebCore/css/StyleProperties.cpp (175066 => 175067)


--- trunk/Source/WebCore/css/StyleProperties.cpp	2014-10-22 21:14:07 UTC (rev 175066)
+++ trunk/Source/WebCore/css/StyleProperties.cpp	2014-10-22 21:16:48 UTC (rev 175067)
@@ -109,9 +109,11 @@
     if (is<MutableStyleProperties>(other))
         m_propertyVector = downcast<MutableStyleProperties>(other).m_propertyVector;
     else {
-        m_propertyVector.reserveInitialCapacity(other.propertyCount());
-        for (unsigned i = 0; i < other.propertyCount(); ++i)
-            m_propertyVector.uncheckedAppend(other.propertyAt(i).toCSSProperty());
+        const auto& immutableOther = downcast<ImmutableStyleProperties>(other);
+        unsigned propertyCount = immutableOther.propertyCount();
+        m_propertyVector.reserveInitialCapacity(propertyCount);
+        for (unsigned i = 0; i < propertyCount; ++i)
+            m_propertyVector.uncheckedAppend(immutableOther.propertyAt(i).toCSSProperty());
     }
 }
 
@@ -1257,7 +1259,7 @@
     StringBuilder result;
     result.append(cssName());
     result.appendLiteral(": ");
-    result.append(propertyValue()->cssText());
+    result.append(m_value->cssText());
     if (isImportant())
         result.appendLiteral(" !important");
     result.append(';');

Modified: trunk/Source/WebCore/css/StyleProperties.h (175066 => 175067)


--- trunk/Source/WebCore/css/StyleProperties.h	2014-10-22 21:14:07 UTC (rev 175066)
+++ trunk/Source/WebCore/css/StyleProperties.h	2014-10-22 21:16:48 UTC (rev 175067)
@@ -55,40 +55,36 @@
 
     class PropertyReference {
     public:
-        PropertyReference(const StyleProperties& propertySet, unsigned index)
-            : m_propertySet(propertySet)
-            , m_index(index)
-        {
-        }
+        PropertyReference(const StylePropertyMetadata& metadata, const CSSValue* value)
+            : m_metadata(metadata)
+            , m_value(value)
+        { }
 
-        CSSPropertyID id() const { return static_cast<CSSPropertyID>(propertyMetadata().m_propertyID); }
-        CSSPropertyID shorthandID() const { return propertyMetadata().shorthandID(); }
+        CSSPropertyID id() const { return static_cast<CSSPropertyID>(m_metadata.m_propertyID); }
+        CSSPropertyID shorthandID() const { return m_metadata.shorthandID(); }
 
-        bool isImportant() const { return propertyMetadata().m_important; }
-        bool isInherited() const { return propertyMetadata().m_inherited; }
-        bool isImplicit() const { return propertyMetadata().m_implicit; }
+        bool isImportant() const { return m_metadata.m_important; }
+        bool isInherited() const { return m_metadata.m_inherited; }
+        bool isImplicit() const { return m_metadata.m_implicit; }
 
         String cssName() const;
         String cssText() const;
 
-        const CSSValue* value() const { return propertyValue(); }
+        const CSSValue* value() const { return m_value; }
         // FIXME: We should try to remove this mutable overload.
-        CSSValue* value() { return const_cast<CSSValue*>(propertyValue()); }
+        CSSValue* value() { return const_cast<CSSValue*>(m_value); }
 
         // FIXME: Remove this.
-        CSSProperty toCSSProperty() const { return CSSProperty(id(), const_cast<CSSValue*>(propertyValue()), isImportant(), propertyMetadata().m_isSetFromShorthand, propertyMetadata().m_indexInShorthandsVector, isImplicit()); }
-        const StylePropertyMetadata& propertyMetadata() const;
+        CSSProperty toCSSProperty() const { return CSSProperty(id(), const_cast<CSSValue*>(m_value), isImportant(), m_metadata.m_isSetFromShorthand, m_metadata.m_indexInShorthandsVector, isImplicit()); }
 
     private:
-        const CSSValue* propertyValue() const;
-
-        const StyleProperties& m_propertySet;
-        unsigned m_index;
+        const StylePropertyMetadata& m_metadata;
+        const CSSValue* m_value;
     };
 
     unsigned propertyCount() const;
-    bool isEmpty() const;
-    PropertyReference propertyAt(unsigned index) const { return PropertyReference(*this, index); }
+    bool isEmpty() const { return !propertyCount(); }
+    PropertyReference propertyAt(unsigned) const;
 
     PassRefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID) const;
     String getPropertyValue(CSSPropertyID) const;
@@ -161,6 +157,8 @@
     static PassRef<ImmutableStyleProperties> create(const CSSProperty* properties, unsigned count, CSSParserMode);
 
     unsigned propertyCount() const { return m_arraySize; }
+    bool isEmpty() const { return !propertyCount(); }
+    PropertyReference propertyAt(unsigned index) const;
 
     const CSSValue** valueArray() const;
     const StylePropertyMetadata* metadataArray() const;
@@ -190,6 +188,8 @@
     WEBCORE_EXPORT ~MutableStyleProperties();
 
     unsigned propertyCount() const { return m_propertyVector.size(); }
+    bool isEmpty() const { return !propertyCount(); }
+    PropertyReference propertyAt(unsigned index) const;
 
     PropertySetCSSStyleDeclaration* cssStyleDeclaration();
 
@@ -236,30 +236,29 @@
     friend class StyleProperties;
 };
 
-inline const StylePropertyMetadata& StyleProperties::PropertyReference::propertyMetadata() const
+inline ImmutableStyleProperties::PropertyReference ImmutableStyleProperties::propertyAt(unsigned index) const
 {
-    if (is<MutableStyleProperties>(m_propertySet))
-        return downcast<MutableStyleProperties>(m_propertySet).m_propertyVector.at(m_index).metadata();
-    return downcast<ImmutableStyleProperties>(m_propertySet).metadataArray()[m_index];
+    return PropertyReference(metadataArray()[index], valueArray()[index]);
 }
 
-inline const CSSValue* StyleProperties::PropertyReference::propertyValue() const
+inline MutableStyleProperties::PropertyReference MutableStyleProperties::propertyAt(unsigned index) const
 {
-    if (is<MutableStyleProperties>(m_propertySet))
-        return downcast<MutableStyleProperties>(m_propertySet).m_propertyVector.at(m_index).value();
-    return downcast<ImmutableStyleProperties>(m_propertySet).valueArray()[m_index];
+    const CSSProperty& property = m_propertyVector[index];
+    return PropertyReference(property.metadata(), property.value());
 }
 
-inline unsigned StyleProperties::propertyCount() const
+inline StyleProperties::PropertyReference StyleProperties::propertyAt(unsigned index) const
 {
     if (is<MutableStyleProperties>(*this))
-        return downcast<MutableStyleProperties>(*this).m_propertyVector.size();
-    return m_arraySize;
+        return downcast<MutableStyleProperties>(*this).propertyAt(index);
+    return downcast<ImmutableStyleProperties>(*this).propertyAt(index);
 }
 
-inline bool StyleProperties::isEmpty() const
+inline unsigned StyleProperties::propertyCount() const
 {
-    return !propertyCount();
+    if (is<MutableStyleProperties>(*this))
+        return downcast<MutableStyleProperties>(*this).propertyCount();
+    return downcast<ImmutableStyleProperties>(*this).propertyCount();
 }
 
 inline void StyleProperties::deref()

Modified: trunk/Source/WebCore/editing/EditingStyle.cpp (175066 => 175067)


--- trunk/Source/WebCore/editing/EditingStyle.cpp	2014-10-22 21:14:07 UTC (rev 175066)
+++ trunk/Source/WebCore/editing/EditingStyle.cpp	2014-10-22 21:16:48 UTC (rev 175067)
@@ -1142,7 +1142,7 @@
     m_mutableStyle->mergeAndOverrideOnConflict(*fromComputedStyle);
 }
 
-static void removePropertiesInStyle(MutableStyleProperties* styleToRemovePropertiesFrom, StyleProperties* style)
+static void removePropertiesInStyle(MutableStyleProperties* styleToRemovePropertiesFrom, MutableStyleProperties* style)
 {
     unsigned propertyCount = style->propertyCount();
     Vector<CSSPropertyID> propertiesToRemove(propertyCount);
@@ -1188,7 +1188,7 @@
     if (!m_mutableStyle || m_mutableStyle->isEmpty())
         return;
 
-    RefPtr<StyleProperties> defaultStyle = styleFromMatchedRulesForElement(element, StyleResolver::UAAndUserCSSRules);
+    RefPtr<MutableStyleProperties> defaultStyle = styleFromMatchedRulesForElement(element, StyleResolver::UAAndUserCSSRules);
 
     removePropertiesInStyle(m_mutableStyle.get(), defaultStyle.get());
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to