diff options
| author | Ulf Magnusson <ulfalizer@gmail.com> | 2015-06-18 16:25:25 +0200 |
|---|---|---|
| committer | Ulf Magnusson <ulfalizer@gmail.com> | 2015-06-18 17:06:56 +0200 |
| commit | f171a001919f6f9e3dca935ab6fd2a4d1fed3778 (patch) | |
| tree | 7f2c994fc828cbc5e5d6a4ee7229667921fcfbff /kconfiglib.py | |
| parent | 7f1ae0f76b7a0bdee46786e937781b9e0082d2e0 (diff) | |
Optimize _get_expr_syms().
Instantiating that nested function with free variables turned out to be
quite expensive in cProfile.
For the _build_dep() case, it would be even neater to have a function
like _add_sym_deps(sym, expr) that adds 'sym' to each 'deps' set in
'expr', removing the need for a temporary set. Unfortunately,
_get_expr_syms() is used elsewhere too, and it's probably not worthwhile
having another very similar function just as a small optimization.
Diffstat (limited to 'kconfiglib.py')
| -rw-r--r-- | kconfiglib.py | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/kconfiglib.py b/kconfiglib.py index 9632b3e..2219ed6 100644 --- a/kconfiglib.py +++ b/kconfiglib.py @@ -3230,35 +3230,31 @@ def _make_or(e1, e2): return (OR, [e1, e2]) +def _get_expr_syms_rec(expr, res): + """_get_expr_syms() helper. Recurses through expressions.""" + if isinstance(expr, Symbol): + res.add(expr) + elif isinstance(expr, str): + return + elif expr[0] == AND or expr[0] == OR: + for term in expr[1]: + _get_expr_syms_rec(term, res) + elif expr[0] == NOT: + _get_expr_syms_rec(expr[1], res) + elif expr[0] == EQUAL or expr[0] == UNEQUAL: + if isinstance(expr[1], Symbol): + res.add(expr[1]) + if isinstance(expr[2], Symbol): + res.add(expr[2]) + else: + _internal_error("Internal error while fetching symbols from an " + "expression with token stream {0}.".format(expr)) + def _get_expr_syms(expr): """Returns the set() of symbols appearing in expr.""" res = set() - if expr is None: - return res - - def rec(expr): - if isinstance(expr, Symbol): - res.add(expr) - return - if isinstance(expr, str): - return - - if expr[0] == AND or expr[0] == OR: - for term in expr[1]: - rec(term) - elif expr[0] == NOT: - rec(expr[1]) - elif expr[0] == EQUAL or expr[0] == UNEQUAL: - _, v1, v2 = expr - if isinstance(v1, Symbol): - res.add(v1) - if isinstance(v2, Symbol): - res.add(v2) - else: - _internal_error("Internal error while fetching symbols from an " - "expression with token stream {0}.".format(expr)) - - rec(expr) + if expr is not None: + _get_expr_syms_rec(expr, res) return res def _str_val(obj): |
