[webkit-reviews] review granted: [Bug 70931] Matched declaration cache : [Attachment 112550] patch
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Wed Oct 26 09:47:47 PDT 2011
Darin Adler <darin at apple.com> has granted Antti Koivisto <koivisto at iki.fi>'s
request for review:
Bug 70931: Matched declaration cache
https://bugs.webkit.org/show_bug.cgi?id=70931
Attachment 112550: patch
https://bugs.webkit.org/attachment.cgi?id=112550&action=review
------- Additional Comments from Darin Adler <darin at apple.com>
View in context: https://bugs.webkit.org/attachment.cgi?id=112550&action=review
> Source/WebCore/css/CSSProperty.cpp:384
> + COMPILE_ASSERT(349 == numCSSProperties,
_when_adding_new_properties_add_the_inherited_here_and_bump_the_property_count)
;
Looks like this assertion is failing on various platforms. Maybe the number of
properties varies based on feature defines?
> Source/WebCore/css/CSSProperty.h:73
> + signed m_id : 14;
> + signed m_shorthandID : 14; // If this property was set as part of a
shorthand, gives the shorthand.
Is there a good way to do a runtime check to assert we have enough bits here?
Does this really need to be signed rather than unsigned?
> Source/WebCore/css/CSSStyleSelector.cpp:2153
> + unsigned hash = 0;
> + for (unsigned i = 0; i < size; ++i) {
> + unsigned ptrHash =
PtrHash<CSSMutableStyleDeclaration*>::hash(declarations[i].styleDeclaration);
> + ptrHash ^= IntHash<unsigned>::hash(declarations[i].linkMatchType);
> + // Make the position matter.
> + hash ^= (ptrHash << i) | (ptrHash >> (32 - i));
> + }
> + return hash;
I think a better way to compute this hash is to just compute a hash across each
bit of data using the algorithm like StringHasher::hashMemory. Combining
multiple hashes into a new one is typically not as good as that function. I
believe that would be both faster and a better algorithm than this. The
function that is needed to make StringHasher usable for this would be
StringHasher::addMemory that would let you add things other than characters to
a hash. Should be really easy to write.
> Source/WebCore/css/CSSStyleSelector.cpp:2186
> + if (!(m_matchedDecls[i] == cacheItem.matchedStyleDeclarations[i]))
I think this would be easier to read with (a != b) rather than (!(a == b)).
> Source/WebCore/css/CSSStyleSelector.cpp:2189
> + if (!(cacheItem.matchResult == matchResult))
Ditto.
> Source/WebCore/css/CSSStyleSelector.cpp:2264
> + if (m_style->unique() || m_style->hasAppearance() ||
(m_style->styleType() != NOPSEUDO && m_parentStyle->unique())
> + || m_style->zoom() != RenderStyle::initialZoom())
> + return;
You could break this up into two or more return statements to avoid having the
awkwardly broken long line.
> Source/WebCore/css/CSSStyleSelector.h:230
> + bool operator==(const MatchResult&) const;
Usually as a matter of default C++ style operator== should be a free function,
not a member function. In cases where type conversions are possible the free
function allows type conversions on the left side. But I guess that might be a
little tricky to do inside a class definition.
We should add an operator != that just calls operator== and does the ! part.
> Source/WebCore/css/CSSStyleSelector.h:333
> + bool operator==(const MatchedStyleDeclaration&) const;
Same as above.
More information about the webkit-reviews
mailing list