diff options
| author | Ulf Magnusson <ulfalizer@gmail.com> | 2018-11-25 16:07:13 +0100 |
|---|---|---|
| committer | Ulf Magnusson <ulfalizer@gmail.com> | 2018-11-26 05:42:13 +0100 |
| commit | 120f551b8bf9a6c35a9a97d5c7551bff66dc78bb (patch) | |
| tree | 65ca86d04906b42ff7f4c8a67ff5386fa7539743 /kconfiglib.py | |
| parent | 010425856a3e56ece63aea7e7824e63e24a33d96 (diff) | |
Speed up more token membership tests
Similar change to commit 4b23936 ("Speed up some token tests"), just for
more tests.
This especially helps for the "not a property line" case in
_parse_properties(), which checks against all the cases.
Saves 2-3% of parsing time together with the earlier change.
Diffstat (limited to 'kconfiglib.py')
| -rw-r--r-- | kconfiglib.py | 101 |
1 files changed, 69 insertions, 32 deletions
diff --git a/kconfiglib.py b/kconfiglib.py index d050323..838fbb7 100644 --- a/kconfiglib.py +++ b/kconfiglib.py @@ -1096,7 +1096,7 @@ class Kconfig(object): linenr) continue - if sym.orig_type in (BOOL, TRISTATE): + if sym.orig_type in _BOOL_TRISTATE: # The C implementation only checks the first character # to the right of '=', for whatever reason if not ((sym.orig_type is BOOL and @@ -1160,7 +1160,7 @@ class Kconfig(object): continue sym = syms[name] - if sym.orig_type not in (BOOL, TRISTATE): + if sym.orig_type not in _BOOL_TRISTATE: continue val = "n" @@ -1169,7 +1169,7 @@ class Kconfig(object): if sym._was_set: # Use strings for bool/tristate user values in the warning - if sym.orig_type in (BOOL, TRISTATE): + if sym.orig_type in _BOOL_TRISTATE: display_user_val = TRI_TO_STR[sym.user_value] else: display_user_val = sym.user_value @@ -1224,7 +1224,7 @@ class Kconfig(object): # property magic. val = sym.str_value if sym._write_to_conf: - if sym.orig_type in (BOOL, TRISTATE): + if sym.orig_type in _BOOL_TRISTATE: if val != "n": f.write("#define {}{}{} 1\n" .format(self.config_prefix, sym.name, @@ -1235,7 +1235,7 @@ class Kconfig(object): .format(self.config_prefix, sym.name, escape(val))) - elif sym.orig_type in (INT, HEX): + elif sym.orig_type in _INT_HEX: if sym.orig_type is HEX and \ not val.startswith(("0x", "0X")): val = "0x" + val @@ -1417,7 +1417,7 @@ class Kconfig(object): if sym._write_to_conf: if sym._old_val is None and \ - sym.orig_type in (BOOL, TRISTATE) and \ + sym.orig_type in _BOOL_TRISTATE and \ val == "n": # No old value (the symbol was missing or n), new value n. # No change. @@ -1464,8 +1464,7 @@ class Kconfig(object): with self._open("auto.conf", "w") as f: for sym in self.unique_defined_syms: - if not (sym.orig_type in (BOOL, TRISTATE) and - not sym.tri_value): + if not (sym.orig_type in _BOOL_TRISTATE and not sym.tri_value): f.write(sym.config_string) def _load_old_vals(self): @@ -3210,7 +3209,7 @@ class Kconfig(object): cur.prompt = (cur.prompt[0], self._make_and(cur.prompt[1], dep)) - if cur.item.__class__ in (Symbol, Choice): + if cur.item.__class__ in _SYMBOL_CHOICE: # Propagate 'visible if' dependencies to the prompt if cur.prompt: cur.prompt = (cur.prompt[0], @@ -3293,12 +3292,12 @@ class Kconfig(object): return sym.orig_type is type_ for sym in self.unique_defined_syms: - if sym.orig_type in (BOOL, TRISTATE): + if sym.orig_type in _BOOL_TRISTATE: # A helper function could be factored out here, but keep it # speedy/straightforward for target_sym, _ in sym.selects: - if target_sym.orig_type not in (BOOL, TRISTATE, UNKNOWN): + if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN: self._warn("{} selects the {} symbol {}, which is not " "bool or tristate" .format(_name_and_loc(sym), @@ -3306,14 +3305,14 @@ class Kconfig(object): _name_and_loc(target_sym))) for target_sym, _ in sym.implies: - if target_sym.orig_type not in (BOOL, TRISTATE, UNKNOWN): + if target_sym.orig_type not in _BOOL_TRISTATE_UNKNOWN: self._warn("{} implies the {} symbol {}, which is not " "bool or tristate" .format(_name_and_loc(sym), TYPE_TO_STR[target_sym.orig_type], _name_and_loc(target_sym))) - elif sym.orig_type in (STRING, INT, HEX): + elif sym.orig_type in _STRING_INT_HEX: for default, _ in sym.defaults: if default.__class__ is not Symbol: raise KconfigError( @@ -3333,7 +3332,7 @@ class Kconfig(object): "default value for string symbol " + _name_and_loc(sym)) - elif sym.orig_type in (INT, HEX) and \ + elif sym.orig_type in _INT_HEX and \ not num_ok(default, sym.orig_type): self._warn("the {0} symbol {1} has a non-{0} default {2}" @@ -3352,7 +3351,7 @@ class Kconfig(object): if sym.ranges: - if sym.orig_type not in (INT, HEX): + if sym.orig_type not in _INT_HEX: self._warn( "the {} symbol {} has ranges, but is not int or hex" .format(TYPE_TO_STR[sym.orig_type], @@ -3385,7 +3384,7 @@ class Kconfig(object): self._warn(msg) for choice in self.unique_choices: - if choice.orig_type not in (BOOL, TRISTATE): + if choice.orig_type not in _BOOL_TRISTATE: self._warn("{} defined with type {}" .format(_name_and_loc(choice), TYPE_TO_STR[choice.orig_type])) @@ -3843,7 +3842,7 @@ class Symbol(object): if self._cached_str_val is not None: return self._cached_str_val - if self.orig_type in (BOOL, TRISTATE): + if self.orig_type in _BOOL_TRISTATE: # Also calculates the visibility, so invalidation safe self._cached_str_val = TRI_TO_STR[self.tri_value] return self._cached_str_val @@ -3862,7 +3861,7 @@ class Symbol(object): self._write_to_conf = (vis != 0) - if self.orig_type in (INT, HEX): + if self.orig_type in _INT_HEX: # The C implementation checks the user value against the range in a # separate code path (post-processing after loading a .config). # Checking all values here instead makes more sense for us. It @@ -3984,7 +3983,7 @@ class Symbol(object): if self._cached_tri_val is not None: return self._cached_tri_val - if self.orig_type not in (BOOL, TRISTATE): + if self.orig_type not in _BOOL_TRISTATE: if self.orig_type: # != UNKNOWN # Would take some work to give the location here self.kconfig._warn( @@ -4087,14 +4086,14 @@ class Symbol(object): if not self._write_to_conf: return "" - if self.orig_type in (BOOL, TRISTATE): + if self.orig_type in _BOOL_TRISTATE: return "{}{}={}\n" \ .format(self.kconfig.config_prefix, self.name, val) \ if val != "n" else \ "# {}{} is not set\n" \ .format(self.kconfig.config_prefix, self.name) - if self.orig_type in (INT, HEX): + if self.orig_type in _INT_HEX: return "{}{}={}\n" \ .format(self.kconfig.config_prefix, self.name, val) @@ -4171,7 +4170,7 @@ class Symbol(object): return False - if self.orig_type in (BOOL, TRISTATE) and value in ("n", "m", "y"): + if self.orig_type in _BOOL_TRISTATE and value in ("n", "m", "y"): value = STR_TO_TRI[value] self.user_value = value @@ -4228,7 +4227,7 @@ class Symbol(object): # Only add quotes for non-bool/tristate symbols fields.append("value " + (self.str_value - if self.orig_type in (BOOL, TRISTATE) else + if self.orig_type in _BOOL_TRISTATE else '"{}"'.format(self.str_value))) if not self.is_constant: @@ -4238,7 +4237,7 @@ class Symbol(object): # Only add quotes for non-bool/tristate symbols fields.append("user value " + (TRI_TO_STR[self.user_value] - if self.orig_type in (BOOL, TRISTATE) else + if self.orig_type in _BOOL_TRISTATE else '"{}"'.format(self.user_value))) fields.append("visibility " + TRI_TO_STR[self.visibility]) @@ -4344,7 +4343,7 @@ class Symbol(object): def _assignable(self): # Worker function for the 'assignable' attribute - if self.orig_type not in (BOOL, TRISTATE): + if self.orig_type not in _BOOL_TRISTATE: return () # Warning: See Symbol._rec_invalidate(), and note that this is a hidden @@ -4453,7 +4452,7 @@ class Symbol(object): # the same algorithm as the C implementation (though a bit cleaned up), # for compatibility. - if self.orig_type in (BOOL, TRISTATE): + if self.orig_type in _BOOL_TRISTATE: val = 0 # Defaults, selects, and implies do not affect choice symbols @@ -4475,7 +4474,7 @@ class Symbol(object): return TRI_TO_STR[val] - if self.orig_type in (STRING, INT, HEX): + if self.orig_type in _STRING_INT_HEX: for default, cond in self.defaults: if expr_value(cond): return default.str_value @@ -5207,7 +5206,7 @@ class MenuNode(object): fields.append("'visible if' deps " + TRI_TO_STR[expr_value(self.visibility)]) - if self.item.__class__ in (Symbol, Choice) and self.help is not None: + if self.item.__class__ in _SYMBOL_CHOICE and self.help is not None: fields.append("has help") if self.list: @@ -5244,7 +5243,7 @@ class MenuNode(object): for all symbol/choice references. See expr_str(). """ return self._menu_comment_node_str(sc_expr_str_fn) \ - if self.item in (MENU, COMMENT) else \ + if self.item in _MENU_COMMENT else \ self._sym_choice_node_str(sc_expr_str_fn) def _menu_comment_node_str(self, sc_expr_str_fn): @@ -5789,7 +5788,7 @@ def _sym_to_num(sym): # For BOOL and TRISTATE, n/m/y count as 0/1/2. This mirrors 9059a3493ef # ("kconfig: fix relational operators for bool and tristate symbols") in # the C implementation. - return sym.tri_value if sym.orig_type in (BOOL, TRISTATE) else \ + return sym.tri_value if sym.orig_type in _BOOL_TRISTATE else \ int(sym.str_value, _TYPE_TO_BASE[sym.orig_type]) def _internal_error(msg): @@ -5849,7 +5848,7 @@ def _expr_depends_on(expr, sym): if expr.__class__ is not tuple: return expr is sym - if expr[0] in (EQUAL, UNEQUAL): + if expr[0] in _EQUAL_UNEQUAL: # Check for one of the following: # sym = m/y, m/y = sym, sym != n, n != sym @@ -6372,7 +6371,8 @@ _STRING_LEX = frozenset(( _T_TRISTATE, )) -# Various sets, for quick membership tests +# Various sets, for quick membership tests. This gives us a single global +# lookup and avoids creating temporary dicts/tuples. _TYPE_TOKENS = frozenset(( _T_BOOL, @@ -6408,6 +6408,43 @@ _DEF_TYPE_TOKENS = frozenset(( _T_DEF_STRING, )) +_BOOL_TRISTATE = frozenset(( + BOOL, + TRISTATE, +)) + +_BOOL_TRISTATE_UNKNOWN = frozenset(( + BOOL, + TRISTATE, + UNKNOWN, +)) + +_INT_HEX = frozenset(( + INT, + HEX, +)) + +_STRING_INT_HEX = frozenset(( + STRING, + INT, + HEX, +)) + +_SYMBOL_CHOICE = frozenset(( + Symbol, + Choice, +)) + +_MENU_COMMENT = frozenset(( + MENU, + COMMENT, +)) + +_EQUAL_UNEQUAL = frozenset(( + EQUAL, + UNEQUAL, +)) + # Helper functions for getting compiled regular expressions, with the needed # matching function returned directly as a small optimization. # |
