Title: [183433] trunk/Source/WebCore
Revision
183433
Author
achristen...@apple.com
Date
2015-04-27 15:34:47 -0700 (Mon, 27 Apr 2015)

Log Message

Reduce allocations and memory usage when compiling content extensions.
https://bugs.webkit.org/show_bug.cgi?id=144277

Reviewed by Benjamin Poulain.

Covered by existing tests.

* contentextensions/Term.h:
(WebCore::ContentExtensions::Term::CharacterSet::set):
(WebCore::ContentExtensions::Term::CharacterSet::get):
(WebCore::ContentExtensions::Term::CharacterSet::invert):
(WebCore::ContentExtensions::Term::CharacterSet::inverted):
(WebCore::ContentExtensions::Term::CharacterSet::bitCount):
(WebCore::ContentExtensions::Term::CharacterSet::operator==):
(WebCore::ContentExtensions::Term::CharacterSet::hash):
(WebCore::ContentExtensions::Term::Term):
(WebCore::ContentExtensions::Term::addCharacter):
(WebCore::ContentExtensions::Term::isEndOfLineAssertion):
(WebCore::ContentExtensions::Term::isUniversalTransition):
(WebCore::ContentExtensions::Term::generateSubgraphForAtom):
Use two uint64_t's instead of a BitVector with a capacity of 128 bits.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (183432 => 183433)


--- trunk/Source/WebCore/ChangeLog	2015-04-27 22:30:47 UTC (rev 183432)
+++ trunk/Source/WebCore/ChangeLog	2015-04-27 22:34:47 UTC (rev 183433)
@@ -1,3 +1,27 @@
+2015-04-27  Alex Christensen  <achristen...@webkit.org>
+
+        Reduce allocations and memory usage when compiling content extensions.
+        https://bugs.webkit.org/show_bug.cgi?id=144277
+
+        Reviewed by Benjamin Poulain.
+
+        Covered by existing tests.
+
+        * contentextensions/Term.h:
+        (WebCore::ContentExtensions::Term::CharacterSet::set):
+        (WebCore::ContentExtensions::Term::CharacterSet::get):
+        (WebCore::ContentExtensions::Term::CharacterSet::invert):
+        (WebCore::ContentExtensions::Term::CharacterSet::inverted):
+        (WebCore::ContentExtensions::Term::CharacterSet::bitCount):
+        (WebCore::ContentExtensions::Term::CharacterSet::operator==):
+        (WebCore::ContentExtensions::Term::CharacterSet::hash):
+        (WebCore::ContentExtensions::Term::Term):
+        (WebCore::ContentExtensions::Term::addCharacter):
+        (WebCore::ContentExtensions::Term::isEndOfLineAssertion):
+        (WebCore::ContentExtensions::Term::isUniversalTransition):
+        (WebCore::ContentExtensions::Term::generateSubgraphForAtom):
+        Use two uint64_t's instead of a BitVector with a capacity of 128 bits.
+
 2015-04-27  Michael Catanzaro  <mcatanz...@igalia.com>
 
         Rename WTF_USE_3D_GRAPHICS to ENABLE_GRAPHICS_CONTEXT_3D

Modified: trunk/Source/WebCore/contentextensions/Term.h (183432 => 183433)


--- trunk/Source/WebCore/contentextensions/Term.h	2015-04-27 22:30:47 UTC (rev 183432)
+++ trunk/Source/WebCore/contentextensions/Term.h	2015-04-27 22:34:47 UTC (rev 183433)
@@ -31,7 +31,6 @@
 #include "NFA.h"
 #include <unicode/utypes.h>
 #include <wtf/ASCIICType.h>
-#include <wtf/BitVector.h>
 #include <wtf/HashMap.h>
 #include <wtf/Vector.h>
 
@@ -126,19 +125,47 @@
     TermType m_termType { TermType::Empty };
     AtomQuantifier m_quantifier { AtomQuantifier::One };
 
-    struct CharacterSet {
-        bool inverted { false };
-        BitVector characters { 128 };
-
+    class CharacterSet {
+    public:
+        void set(UChar character)
+        {
+            RELEASE_ASSERT(character < 128);
+            m_characters[character / 64] |= (uint64_t(1) << (character % 64));
+        }
+        
+        bool get(UChar character) const
+        {
+            RELEASE_ASSERT(character < 128);
+            return m_characters[character / 64] & (uint64_t(1) << (character % 64));
+        }
+        
+        void invert()
+        {
+            ASSERT(!m_inverted);
+            m_inverted = true;
+        }
+        
+        bool inverted() const { return m_inverted; }
+        
+        unsigned bitCount() const
+        {
+            return WTF::bitCount(m_characters[0]) + WTF::bitCount(m_characters[1]);
+        }
+        
         bool operator==(const CharacterSet& other) const
         {
-            return other.inverted == inverted && other.characters == characters;
+            return other.m_inverted == m_inverted
+                && other.m_characters[0] == m_characters[0]
+                && other.m_characters[1] == m_characters[1];
         }
 
         unsigned hash() const
         {
-            return WTF::pairIntHash(inverted, characters.hash());
+            return WTF::pairIntHash(WTF::pairIntHash(WTF::intHash(m_characters[0]), WTF::intHash(m_characters[1])), m_inverted);
         }
+    private:
+        bool m_inverted { false };
+        uint64_t m_characters[2] { 0, 0 };
     };
 
     struct Group {
@@ -195,20 +222,20 @@
     addCharacter(character, isCaseSensitive);
 }
 
-enum UniversalTransitionTag { UniversalTransition };
 inline Term::Term(UniversalTransitionTag)
     : m_termType(TermType::CharacterSet)
 {
     new (NotNull, &m_atomData.characterSet) CharacterSet();
-    for (unsigned i = 0; i < 128; ++i)
-        m_atomData.characterSet.characters.set(i);
+    for (UChar i = 0; i < 128; ++i)
+        m_atomData.characterSet.set(i);
 }
 
 inline Term::Term(CharacterSetTermTag, bool isInverted)
     : m_termType(TermType::CharacterSet)
 {
     new (NotNull, &m_atomData.characterSet) CharacterSet();
-    m_atomData.characterSet.inverted = isInverted;
+    if (isInverted)
+        m_atomData.characterSet.invert();
 }
 
 inline Term::Term(GroupTermTag)
@@ -220,7 +247,7 @@
 inline Term::Term(EndOfLineAssertionTermTag)
     : Term(CharacterSetTerm, false)
 {
-    m_atomData.characterSet.characters.set(0);
+    m_atomData.characterSet.set(0);
 }
 
 inline Term::Term(const Term& other)
@@ -287,10 +314,10 @@
         return;
 
     if (isCaseSensitive || !isASCIIAlpha(character))
-        m_atomData.characterSet.characters.set(character);
+        m_atomData.characterSet.set(character);
     else {
-        m_atomData.characterSet.characters.set(toASCIIUpper(character));
-        m_atomData.characterSet.characters.set(toASCIILower(character));
+        m_atomData.characterSet.set(toASCIIUpper(character));
+        m_atomData.characterSet.set(toASCIILower(character));
     }
 }
 
@@ -356,7 +383,7 @@
 
 inline bool Term::isEndOfLineAssertion() const
 {
-    return m_termType == TermType::CharacterSet && m_atomData.characterSet.characters.bitCount() == 1 && m_atomData.characterSet.characters.get(0);
+    return m_termType == TermType::CharacterSet && m_atomData.characterSet.bitCount() == 1 && m_atomData.characterSet.get(0);
 }
 
 inline bool Term::matchesAtLeastOneCharacter() const
@@ -517,8 +544,8 @@
         ASSERT_NOT_REACHED();
         break;
     case TermType::CharacterSet:
-        return (m_atomData.characterSet.inverted && !m_atomData.characterSet.characters.bitCount())
-            || (!m_atomData.characterSet.inverted && m_atomData.characterSet.characters.bitCount() == 128);
+        return (m_atomData.characterSet.inverted() && !m_atomData.characterSet.bitCount())
+            || (!m_atomData.characterSet.inverted() && m_atomData.characterSet.bitCount() == 128);
     case TermType::Group:
         return m_atomData.group.terms.size() == 1 && m_atomData.group.terms.first().isUniversalTransition();
     }
@@ -537,14 +564,15 @@
         if (isUniversalTransition())
             nfa.addTransitionsOnAnyCharacter(source, target);
         else {
-            if (!m_atomData.characterSet.inverted) {
-                for (const auto& characterIterator : m_atomData.characterSet.characters.setBits())
-                    nfa.addTransition(source, target, static_cast<char>(characterIterator));
+            if (!m_atomData.characterSet.inverted()) {
+                for (UChar i = 0; i < 128; ++i) {
+                    if (m_atomData.characterSet.get(i))
+                        nfa.addTransition(source, target, static_cast<char>(i));
+                }
             } else {
-                for (unsigned i = 1; i < m_atomData.characterSet.characters.size(); ++i) {
-                    if (m_atomData.characterSet.characters.get(i))
-                        continue;
-                    nfa.addTransition(source, target, static_cast<char>(i));
+                for (UChar i = 1; i < 128; ++i) {
+                    if (!m_atomData.characterSet.get(i))
+                        nfa.addTransition(source, target, static_cast<char>(i));
                 }
             }
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to