summaryrefslogtreecommitdiff
path: root/kconfiglib.py
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2012-12-10 07:08:36 +0100
committerUlf Magnusson <ulfalizer@gmail.com>2012-12-10 08:08:18 +0100
commitb8366c3b2dfcc0578bfc467d5c5ea03fa0f753d1 (patch)
tree4a04e00b6797432e23304651bb301a20933d3649 /kconfiglib.py
parent2e2bd9ec8b07be93d7558ce0369f2f864ea0daef (diff)
Copy less when searching for symbols.
Diffstat (limited to 'kconfiglib.py')
-rw-r--r--kconfiglib.py50
1 files changed, 28 insertions, 22 deletions
diff --git a/kconfiglib.py b/kconfiglib.py
index 40a19cb..7fe9c33 100644
--- a/kconfiglib.py
+++ b/kconfiglib.py
@@ -1866,37 +1866,43 @@ might be an error, and you should e-mail kconfiglib@gmail.com.
def _get_expr_syms(expr):
"""Returns the set() of symbols appearing in expr."""
- if expr is None or isinstance(expr, str):
- return set()
+ res = set()
+ if expr is None:
+ return res
- if isinstance(expr, Symbol):
- return set((expr,))
+ def rec(expr):
+ if isinstance(expr, Symbol):
+ res.add(expr)
+ return
- elif expr[0] in (OR, AND):
- res = set()
- for subres in [_get_expr_syms(e) for e in expr[1]]:
- res.update(subres)
- return res
+ if isinstance(expr, str):
+ return
- elif expr[0] == NOT:
- return _get_expr_syms(expr[1])
+ e0 = expr[0]
- elif expr[0] in (EQUAL, UNEQUAL):
- res = set()
+ if e0 == OR or e0 == AND:
+ for term in expr[1]:
+ rec(term)
- _, v1, v2 = expr
+ elif e0 == NOT:
+ rec(expr[1])
- if isinstance(v1, Symbol):
- res.add(v1)
+ elif e0 == EQUAL or e0 == UNEQUAL:
+ _, v1, v2 = expr
- if isinstance(v2, Symbol):
- res.add(v2)
+ if isinstance(v1, Symbol):
+ res.add(v1)
- return res
+ 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)
+ return res
- else:
- _internal_error("Internal error while fetching symbols from an expression with "
- "token stream {0}.".format(expr))
#
# Construction of expressions