Mercurial > cpython-lru_cache-weakref
annotate Lib/compiler/future.py @ 25838:8540887bcec6 2.2
Backport of 2.183:
Fix memory leak in add_subclass() found by NealN with valgrind.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 18 Oct 2002 13:42:21 +0000 |
| parents | a12ccdbce8da |
| children | acaa79e73133 |
| rev | line source |
|---|---|
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
1 """Parser for future statements |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
2 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
3 """ |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
4 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
5 from compiler import ast, walk |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
6 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
7 def is_future(stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
8 """Return true if statement is a well-formed future statement""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
9 if not isinstance(stmt, ast.From): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
10 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
11 if stmt.modname == "__future__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 return 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
13 else: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
14 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
15 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
16 class FutureParser: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
17 |
|
19361
9222b6e3b368
Track removal of doc string from Module().nodes[0]
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17346
diff
changeset
|
18 features = ("nested_scopes", "generators", "division") |
|
20547
a12ccdbce8da
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
19361
diff
changeset
|
19 |
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
20 def __init__(self): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
21 self.found = {} # set |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
22 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
23 def visitModule(self, node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
24 stmt = node.node |
|
19361
9222b6e3b368
Track removal of doc string from Module().nodes[0]
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17346
diff
changeset
|
25 for s in stmt.nodes: |
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
26 if not self.check_stmt(s): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
27 break |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
28 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
29 def check_stmt(self, stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
30 if is_future(stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
31 for name, asname in stmt.names: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
32 if name in self.features: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
33 self.found[name] = 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
34 else: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
35 raise SyntaxError, \ |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
36 "future feature %s is not defined" % name |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
37 stmt.valid_future = 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
38 return 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
39 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
40 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
41 def get_features(self): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
42 """Return list of features enabled by future statements""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
43 return self.found.keys() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
44 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
45 class BadFutureParser: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
46 """Check for invalid future statements""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
47 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
48 def visitFrom(self, node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
49 if hasattr(node, 'valid_future'): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
50 return |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
51 if node.modname != "__future__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
52 return |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
53 raise SyntaxError, "invalid future statement" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
54 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
55 def find_futures(node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
56 p1 = FutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
57 p2 = BadFutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
58 walk(node, p1) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
59 walk(node, p2) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
60 return p1.get_features() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
61 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
62 if __name__ == "__main__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
63 import sys |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
64 from compiler import parseFile, walk |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
65 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
66 for file in sys.argv[1:]: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
67 print file |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
68 tree = parseFile(file) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
69 v = FutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
70 walk(tree, v) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
71 print v.found |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
72 print |
