|
1 |
|
2 def flatten(tup): |
|
3 elts = [] |
|
4 for elt in tup: |
|
5 if isinstance(elt, tuple): |
|
6 elts = elts + flatten(elt) |
|
7 else: |
|
8 elts.append(elt) |
|
9 return elts |
|
10 |
|
11 class Set: |
|
12 def __init__(self): |
|
13 self.elts = {} |
|
14 def __len__(self): |
|
15 return len(self.elts) |
|
16 def __contains__(self, elt): |
|
17 return self.elts.has_key(elt) |
|
18 def add(self, elt): |
|
19 self.elts[elt] = elt |
|
20 def elements(self): |
|
21 return self.elts.keys() |
|
22 def has_elt(self, elt): |
|
23 return self.elts.has_key(elt) |
|
24 def remove(self, elt): |
|
25 del self.elts[elt] |
|
26 def copy(self): |
|
27 c = Set() |
|
28 c.elts.update(self.elts) |
|
29 return c |
|
30 |
|
31 class Stack: |
|
32 def __init__(self): |
|
33 self.stack = [] |
|
34 self.pop = self.stack.pop |
|
35 def __len__(self): |
|
36 return len(self.stack) |
|
37 def push(self, elt): |
|
38 self.stack.append(elt) |
|
39 def top(self): |
|
40 return self.stack[-1] |
|
41 def __getitem__(self, index): # needed by visitContinue() |
|
42 return self.stack[index] |
|
43 |
|
44 MANGLE_LEN = 256 # magic constant from compile.c |
|
45 |
|
46 def mangle(name, klass): |
|
47 if not name.startswith('__'): |
|
48 return name |
|
49 if len(name) + 2 >= MANGLE_LEN: |
|
50 return name |
|
51 if name.endswith('__'): |
|
52 return name |
|
53 try: |
|
54 i = 0 |
|
55 while klass[i] == '_': |
|
56 i = i + 1 |
|
57 except IndexError: |
|
58 return name |
|
59 klass = klass[i:] |
|
60 |
|
61 tlen = len(klass) + len(name) |
|
62 if tlen > MANGLE_LEN: |
|
63 klass = klass[:MANGLE_LEN-tlen] |
|
64 |
|
65 return "_%s%s" % (klass, name) |
|
66 |
|
67 def set_filename(filename, tree): |
|
68 """Set the filename attribute to filename on every node in tree""" |
|
69 worklist = [tree] |
|
70 while worklist: |
|
71 node = worklist.pop(0) |
|
72 node.filename = filename |
|
73 worklist.extend(node.getChildNodes()) |