diff options
| author | Ulf Magnusson <ulfalizer@gmail.com> | 2018-11-25 01:25:16 +0100 |
|---|---|---|
| committer | Ulf Magnusson <ulfalizer@gmail.com> | 2018-11-25 02:39:21 +0100 |
| commit | 4b2393627c5c75807d559ef706f0d966ce131f60 (patch) | |
| tree | f1fb14ed0109f7a7e1eb132351ec10e78200ba5e /kconfiglib.py | |
| parent | e02c01e0628507d46ab7e25e4fa1b84183a86712 (diff) | |
Speed up some token tests
Turn some of the hotter membership test tuples into global sets, like
was already done for _TYPE_TOKENS. That saves some global lookups for
the tuple members and avoids repeatedly recreating tuples. It's 30%-50%
faster in a microbenchmark, even for two-element tuples (with global
lookups for the members).
Diffstat (limited to 'kconfiglib.py')
| -rw-r--r-- | kconfiglib.py | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/kconfiglib.py b/kconfiglib.py index 80a65ba..b0e3ab8 100644 --- a/kconfiglib.py +++ b/kconfiglib.py @@ -2503,7 +2503,7 @@ class Kconfig(object): # Blank line continue - elif t0 in (_T_SOURCE, _T_RSOURCE, _T_OSOURCE, _T_ORSOURCE): + elif t0 in _SOURCE_TOKENS: pattern = self._expect_str_and_eol() # Check if the pattern is absolute and avoid stripping srctree @@ -2511,7 +2511,7 @@ class Kconfig(object): # join()'ing, as srctree might be an absolute path. isabs = os.path.isabs(pattern) - if t0 in (_T_RSOURCE, _T_ORSOURCE): + if t0 in _REL_SOURCE_TOKENS: # Relative source pattern = os.path.join(os.path.dirname(self._filename), pattern) @@ -2522,7 +2522,7 @@ class Kconfig(object): filenames = \ sorted(glob.iglob(os.path.join(self.srctree, pattern))) - if not filenames and t0 in (_T_SOURCE, _T_RSOURCE): + if not filenames and t0 in _OBL_SOURCE_TOKENS: raise KconfigError("\n" + textwrap.fill( "{}:{}: '{}' does not exist{}".format( self._filename, self._linenr, pattern, @@ -2726,8 +2726,7 @@ class Kconfig(object): node.defaults.append((self._parse_expr(False), self._parse_cond())) - elif t0 in (_T_DEF_BOOL, _T_DEF_TRISTATE, _T_DEF_INT, _T_DEF_HEX, - _T_DEF_STRING): + elif t0 in _DEF_TYPE_TOKENS: self._set_type(node, t0) node.defaults.append((self._parse_expr(False), self._parse_cond())) @@ -2736,8 +2735,7 @@ class Kconfig(object): self._parse_prompt(node) elif t0 is _T_RANGE: - node.ranges.append((self._expect_sym(), - self._expect_sym(), + node.ranges.append((self._expect_sym(), self._expect_sym(), self._parse_cond())) elif t0 is _T_IMPLY: @@ -6375,8 +6373,8 @@ _STRING_LEX = frozenset(( _T_TRISTATE, )) -# Tokens for types, excluding def_bool, def_tristate, etc., for quick -# checks during parsing +# Various sets, for quick membership tests + _TYPE_TOKENS = frozenset(( _T_BOOL, _T_TRISTATE, @@ -6385,6 +6383,31 @@ _TYPE_TOKENS = frozenset(( _T_STRING, )) +_SOURCE_TOKENS = frozenset(( + _T_SOURCE, + _T_RSOURCE, + _T_OSOURCE, + _T_ORSOURCE, +)) + +_REL_SOURCE_TOKENS = frozenset(( + _T_RSOURCE, + _T_ORSOURCE, +)) + +# Obligatory (non-optional) sources +_OBL_SOURCE_TOKENS = frozenset(( + _T_SOURCE, + _T_RSOURCE, +)) + +_DEF_TYPE_TOKENS = frozenset(( + _T_DEF_BOOL, + _T_DEF_TRISTATE, + _T_DEF_INT, + _T_DEF_HEX, + _T_DEF_STRING, +)) # Helper functions for getting compiled regular expressions, with the needed # matching function returned directly as a small optimization. |
