CMakeChecker takes unusually long time to run
authorparoga@webkit.org <paroga@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Sep 2013 17:40:19 +0000 (17:40 +0000)
committerparoga@webkit.org <paroga@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Sep 2013 17:40:19 +0000 (17:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=105662

Reviewed by Ryosuke Niwa.

Move the caching mechanism for regular expression of the C++ checker into
a common file and use it for the CMake and ChangeLog checkers too.

* Scripts/webkitpy/style/checkers/changelog.py:
(ChangeLogChecker.check_entry):
* Scripts/webkitpy/style/checkers/cmake.py:
(CMakeChecker._process_line):
(CMakeChecker._check_no_space_cmds):
(CMakeChecker._check_one_space_cmds):
(CMakeChecker._check_non_lowercase_cmd):
* Scripts/webkitpy/style/checkers/common.py:
(match):
(search):
(searchIgnorecase):
(sub):
(subn):
* Scripts/webkitpy/style/checkers/cpp.py:

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

Tools/ChangeLog
Tools/Scripts/webkitpy/style/checkers/changelog.py
Tools/Scripts/webkitpy/style/checkers/cmake.py
Tools/Scripts/webkitpy/style/checkers/common.py
Tools/Scripts/webkitpy/style/checkers/cpp.py

index e73b4af..a117429 100644 (file)
@@ -1,3 +1,28 @@
+2013-09-25  Patrick Gansterer  <paroga@webkit.org>
+
+        CMakeChecker takes unusually long time to run
+        https://bugs.webkit.org/show_bug.cgi?id=105662
+
+        Reviewed by Ryosuke Niwa.
+
+        Move the caching mechanism for regular expression of the C++ checker into
+        a common file and use it for the CMake and ChangeLog checkers too.
+
+        * Scripts/webkitpy/style/checkers/changelog.py:
+        (ChangeLogChecker.check_entry):
+        * Scripts/webkitpy/style/checkers/cmake.py:
+        (CMakeChecker._process_line):
+        (CMakeChecker._check_no_space_cmds):
+        (CMakeChecker._check_one_space_cmds):
+        (CMakeChecker._check_non_lowercase_cmd):
+        * Scripts/webkitpy/style/checkers/common.py:
+        (match):
+        (search):
+        (searchIgnorecase):
+        (sub):
+        (subn):
+        * Scripts/webkitpy/style/checkers/cpp.py:
+
 2013-09-25  Allan Sandfeld Jensen  <allan.jensen@digia.com>
 
         [Qt] Fix build with Qt 5.2 QtPosition module
index 699bc3d..61dadb4 100644 (file)
@@ -23,8 +23,7 @@
 
 """Checks WebKit style for ChangeLog files."""
 
-import re
-from common import TabChecker
+from common import TabChecker, match, search, searchIgnorecase
 from webkitpy.common.checkout.changelog import parse_bug_id_from_changelog
 
 
@@ -45,9 +44,9 @@ class ChangeLogChecker(object):
         for line in entry_lines:
             if parse_bug_id_from_changelog(line):
                 break
-            if re.search("Unreviewed", line, re.IGNORECASE):
+            if searchIgnorecase("Unreviewed", line):
                 break
-            if re.search("build", line, re.IGNORECASE) and re.search("fix", line, re.IGNORECASE):
+            if searchIgnorecase("build", line) and searchIgnorecase("fix", line):
                 break
         else:
             self.handle_style_error(first_line_checked,
@@ -58,9 +57,9 @@ class ChangeLogChecker(object):
         for line in entry_lines:
             line_no = line_no + 1
             # filter file change descriptions
-            if not re.match('\s*\*\s', line):
+            if not match('\s*\*\s', line):
                 continue
-            if re.search(':\s*$', line) or re.search(':\s', line):
+            if search(':\s*$', line) or search(':\s', line):
                 continue
             self.handle_style_error(line_no,
                                     "changelog/filechangedescriptionwhitespace", 5,
@@ -70,7 +69,7 @@ class ChangeLogChecker(object):
         line_no = first_line_checked - 1
         for line in entry_lines:
             line_no = line_no + 1
-            if re.match('\s*No new tests. \(OOPS!\)$', line):
+            if match('\s*No new tests. \(OOPS!\)$', line):
                 self.handle_style_error(line_no,
                                         "changelog/nonewtests", 5,
                                         "You should remove the 'No new tests' and either add and list tests, or explain why no new tests were possible.")
index 06b8929..a004629 100644 (file)
@@ -24,9 +24,7 @@
 
 """Supports checking WebKit style in cmake files.(.cmake, CMakeLists.txt)"""
 
-import re
-
-from common import TabChecker
+from common import TabChecker, match, search, searchIgnorecase
 
 
 class CMakeChecker(object):
@@ -97,16 +95,16 @@ class CMakeChecker(object):
             self._process_line(l + 1, lines[l])
 
     def _process_line(self, line_number, line_content):
-        if re.match('(^|\ +)#', line_content):
+        if match('(^|\ +)#', line_content):
             # ignore comment line
             return
         l = line_content.expandtabs(4)
         # check command like message( "testing")
-        if re.search('\(\ +', l):
+        if search('\(\ +', l):
             self._handle_style_error(line_number, 'whitespace/parentheses', 5,
                                      'No space after "("')
         # check command like message("testing" )
-        if re.search('\ +\)', l) and not re.search('^\ +\)$', l):
+        if search('\ +\)', l) and not search('^\ +\)$', l):
             self._handle_style_error(line_number, 'whitespace/parentheses', 5,
                                      'No space before ")"')
         self._check_trailing_whitespace(line_number, l)
@@ -127,7 +125,7 @@ class CMakeChecker(object):
         # check command like "SET    (" or "Set("
         for t in self.NO_SPACE_CMDS:
             self._check_non_lowercase_cmd(line_number, line_content, t)
-            if re.search('(^|\ +)' + t.lower() + '\ +\(', line_content):
+            if search('(^|\ +)' + t.lower() + '\ +\(', line_content):
                 msg = 'No space between command "' + t.lower() + '" and its parentheses, should be "' + t + '("'
                 self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
 
@@ -135,13 +133,13 @@ class CMakeChecker(object):
         # check command like "IF (" or "if(" or "if   (" or "If ()"
         for t in self.ONE_SPACE_CMDS:
             self._check_non_lowercase_cmd(line_number, line_content, t)
-            if re.search('(^|\ +)' + t.lower() + '(\(|\ \ +\()', line_content):
+            if search('(^|\ +)' + t.lower() + '(\(|\ \ +\()', line_content):
                 msg = 'One space between command "' + t.lower() + '" and its parentheses, should be "' + t + ' ("'
                 self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
 
     def _check_non_lowercase_cmd(self, line_number, line_content, cmd):
-        if re.search('(^|\ +)' + cmd + '\ *\(', line_content, flags=re.IGNORECASE) and \
-           (not re.search('(^|\ +)' + cmd.lower() + '\ *\(', line_content)):
+        if searchIgnorecase('(^|\ +)' + cmd + '\ *\(', line_content) and \
+           (not search('(^|\ +)' + cmd.lower() + '\ *\(', line_content)):
             msg = 'Use lowercase command "' + cmd.lower() + '"'
             self._handle_style_error(line_number, 'command/lowercase', 5, msg)
 
index 76aa956..124448d 100644 (file)
@@ -22,6 +22,8 @@
 
 """Supports style checking not specific to any one file type."""
 
+import re
+import sre_compile
 
 # FIXME: Test this list in the same way that the list of CppChecker
 #        categories is tested, for example by checking that all of its
@@ -33,6 +35,43 @@ categories = set([
     "whitespace/tab"])
 
 
+# The regexp compilation caching is inlined in all regexp functions for
+# performance reasons; factoring it out into a separate function turns out
+# to be noticeably expensive.
+_regexp_compile_cache = {}
+_regexp_compile_cache_ignorecase = {}
+
+
+def match(pattern, s):
+    if not pattern in _regexp_compile_cache:
+        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
+    return _regexp_compile_cache[pattern].match(s)
+
+
+def search(pattern, string):
+    if not pattern in _regexp_compile_cache:
+        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
+    return _regexp_compile_cache[pattern].search(string)
+
+
+def searchIgnorecase(pattern, string):
+    if not pattern in _regexp_compile_cache_ignorecase:
+        _regexp_compile_cache_ignorecase[pattern] = re.compile(pattern, flags=re.IGNORECASE)
+    return _regexp_compile_cache_ignorecase[pattern].search(string)
+
+
+def sub(pattern, replacement, s):
+    if not pattern in _regexp_compile_cache:
+        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
+    return _regexp_compile_cache[pattern].sub(replacement, s)
+
+
+def subn(pattern, replacement, s):
+    if not pattern in _regexp_compile_cache:
+        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
+    return _regexp_compile_cache[pattern].subn(replacement, s)
+
+
 class CarriageReturnChecker(object):
 
     """Supports checking for and handling carriage returns."""
index 0cdb2b7..71e07c8 100644 (file)
@@ -41,11 +41,11 @@ import math  # for log
 import os
 import os.path
 import re
-import sre_compile
 import string
 import sys
 import unicodedata
 
+from common import match, search, sub, subn
 from webkitpy.common.memoized import memoized
 
 # The key to use to provide a class to fake loading a header file.
@@ -127,40 +127,6 @@ _MOC_HEADER = 3
 _unit_test_config = {}
 
 
-# The regexp compilation caching is inlined in all regexp functions for
-# performance reasons; factoring it out into a separate function turns out
-# to be noticeably expensive.
-_regexp_compile_cache = {}
-
-
-def match(pattern, s):
-    """Matches the string with the pattern, caching the compiled regexp."""
-    if not pattern in _regexp_compile_cache:
-        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-    return _regexp_compile_cache[pattern].match(s)
-
-
-def search(pattern, s):
-    """Searches the string for the pattern, caching the compiled regexp."""
-    if not pattern in _regexp_compile_cache:
-        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-    return _regexp_compile_cache[pattern].search(s)
-
-
-def sub(pattern, replacement, s):
-    """Substitutes occurrences of a pattern, caching the compiled regexp."""
-    if not pattern in _regexp_compile_cache:
-        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-    return _regexp_compile_cache[pattern].sub(replacement, s)
-
-
-def subn(pattern, replacement, s):
-    """Substitutes occurrences of a pattern, caching the compiled regexp."""
-    if not pattern in _regexp_compile_cache:
-        _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-    return _regexp_compile_cache[pattern].subn(replacement, s)
-
-
 def iteratively_replace_matches_with_char(pattern, char_replacement, s):
     """Returns the string with replacement done.