summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2015-06-18 16:25:25 +0200
committerUlf Magnusson <ulfalizer@gmail.com>2015-06-18 17:06:56 +0200
commitf171a001919f6f9e3dca935ab6fd2a4d1fed3778 (patch)
tree7f2c994fc828cbc5e5d6a4ee7229667921fcfbff
parent7f1ae0f76b7a0bdee46786e937781b9e0082d2e0 (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.
-rw-r--r--kconfiglib.py48
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):