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