Mercurial > cpython-lru_cache-weakref
annotate Lib/compiler/misc.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 | b2eb1589c22b |
| rev | line source |
|---|---|
|
11790
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
1 import types |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
2 |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
3 def flatten(tup): |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
4 elts = [] |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
5 for elt in tup: |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
6 if type(elt) == types.TupleType: |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
7 elts = elts + flatten(elt) |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
8 else: |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
9 elts.append(elt) |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
10 return elts |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
11 |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 class Set: |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
13 def __init__(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
14 self.elts = {} |
|
11747
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
15 def __len__(self): |
|
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
16 return len(self.elts) |
|
15379
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
17 def __contains__(self, elt): |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
18 return self.elts.has_key(elt) |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
19 def add(self, elt): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
20 self.elts[elt] = elt |
|
12006
9d735639429d
change name of Set method: items -> elements (avoids confusion with
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11829
diff
changeset
|
21 def elements(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
22 return self.elts.keys() |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
23 def has_elt(self, elt): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
24 return self.elts.has_key(elt) |
|
11733
78f0098812b7
add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11705
diff
changeset
|
25 def remove(self, elt): |
|
78f0098812b7
add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11705
diff
changeset
|
26 del self.elts[elt] |
|
15379
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
27 def copy(self): |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
28 c = Set() |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
29 c.elts.update(self.elts) |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
30 return c |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
31 |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
32 class Stack: |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
33 def __init__(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
34 self.stack = [] |
|
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
35 self.pop = self.stack.pop |
|
11747
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
36 def __len__(self): |
|
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
37 return len(self.stack) |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
38 def push(self, elt): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
39 self.stack.append(elt) |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
40 def top(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
41 return self.stack[-1] |
|
19571
c485d77376fa
Add __getitem__() handler for use by visitContinue()
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19522
diff
changeset
|
42 def __getitem__(self, index): # needed by visitContinue() |
|
c485d77376fa
Add __getitem__() handler for use by visitContinue()
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19522
diff
changeset
|
43 return self.stack[index] |
| 19522 | 44 |
| 45 MANGLE_LEN = 256 # magic constant from compile.c | |
| 46 | |
| 47 def mangle(name, klass): | |
| 48 if not name.startswith('__'): | |
| 49 return name | |
| 50 if len(name) + 2 >= MANGLE_LEN: | |
| 51 return name | |
| 52 if name.endswith('__'): | |
| 53 return name | |
| 54 try: | |
| 55 i = 0 | |
| 56 while klass[i] == '_': | |
| 57 i = i + 1 | |
| 58 except IndexError: | |
| 59 return name | |
| 60 klass = klass[i:] | |
| 61 | |
| 62 tlen = len(klass) + len(name) | |
| 63 if tlen > MANGLE_LEN: | |
| 64 klass = klass[:MANGLE_LEN-tlen] | |
| 65 | |
| 66 return "_%s%s" % (klass, name) | |
|
19938
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
67 |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
68 def set_filename(filename, tree): |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
69 """Set the filename attribute to filename on every node in tree""" |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
70 worklist = [tree] |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
71 while worklist: |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
72 node = worklist.pop(0) |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
73 node.filename = filename |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
74 worklist.extend(node.getChildNodes()) |
