annotate Lib/compiler/misc.py @ 58925:eecf1bef052d 2.6

Merged revisions 78207 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line #7930: fix stripid ........
author Ezio Melotti <ezio.melotti@gmail.com>
date Tue, 16 Feb 2010 23:29:44 +0000
parents e4675113d10e
children f340cb045bf9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11790
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
1
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
2 def flatten(tup):
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
3 elts = []
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
4 for elt in tup:
35946
b2eb1589c22b No need for types, use isinstance
Neal Norwitz <nnorwitz@gmail.com>
parents: 20547
diff changeset
5 if isinstance(elt, tuple):
11790
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
6 elts = elts + flatten(elt)
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
7 else:
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
8 elts.append(elt)
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
9 return elts
72848c6b611c add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11747
diff changeset
10
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 class Set:
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 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
13 self.elts = {}
11747
7ef39e07120a add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11733
diff changeset
14 def __len__(self):
7ef39e07120a add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11733
diff changeset
15 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
16 def __contains__(self, elt):
50257
e4675113d10e Merged revisions 67654,67676-67677,67681,67692,67725,67746,67748,67761,67784-67785,67787-67788,67802,67832,67848-67849,67859,67862-67864,67880,67882,67885,67889-67892,67895 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 35946
diff changeset
17 return elt in self.elts
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18 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
19 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
20 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
21 return self.elts.keys()
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 def has_elt(self, elt):
50257
e4675113d10e Merged revisions 67654,67676-67677,67681,67692,67725,67746,67748,67761,67784-67785,67787-67788,67802,67832,67848-67849,67859,67862-67864,67880,67882,67885,67889-67892,67895 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 35946
diff changeset
23 return elt in self.elts
11733
78f0098812b7 add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11705
diff changeset
24 def remove(self, elt):
78f0098812b7 add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11705
diff changeset
25 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
26 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
27 c = Set()
7a82f84290f7 Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12006
diff changeset
28 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
29 return c
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 class Stack:
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 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
33 self.stack = []
ecdc78148811 satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11790
diff changeset
34 self.pop = self.stack.pop
11747
7ef39e07120a add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11733
diff changeset
35 def __len__(self):
7ef39e07120a add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11733
diff changeset
36 return len(self.stack)
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 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
38 self.stack.append(elt)
11705
d10c108d3fd7 checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
39 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
40 return self.stack[-1]
19571
c485d77376fa Add __getitem__() handler for use by visitContinue()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19522
diff changeset
41 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
42 return self.stack[index]
19522
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
43
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
44 MANGLE_LEN = 256 # magic constant from compile.c
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
45
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
46 def mangle(name, klass):
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
47 if not name.startswith('__'):
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
48 return name
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
49 if len(name) + 2 >= MANGLE_LEN:
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
50 return name
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
51 if name.endswith('__'):
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
52 return name
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
53 try:
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
54 i = 0
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
55 while klass[i] == '_':
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
56 i = i + 1
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
57 except IndexError:
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
58 return name
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
59 klass = klass[i:]
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
60
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
61 tlen = len(klass) + len(name)
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
62 if tlen > MANGLE_LEN:
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
63 klass = klass[:MANGLE_LEN-tlen]
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
64
a0847b7a8902 Handle private names
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15379
diff changeset
65 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
66
fd7a7f832258 Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19571
diff changeset
67 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
68 """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
69 worklist = [tree]
fd7a7f832258 Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19571
diff changeset
70 while worklist:
fd7a7f832258 Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19571
diff changeset
71 node = worklist.pop(0)
fd7a7f832258 Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19571
diff changeset
72 node.filename = filename
fd7a7f832258 Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19571
diff changeset
73 worklist.extend(node.getChildNodes())