Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | import types |
2 | ||
3 | def flatten(tup): | |
4 | elts = [] | |
5 | for elt in tup: | |
6 | if type(elt) == types.TupleType: | |
7 | elts = elts + flatten(elt) | |
8 | else: | |
9 | elts.append(elt) | |
10 | return elts | |
11 | ||
12 | class Set: | |
13 | def __init__(self): | |
14 | self.elts = {} | |
15 | def __len__(self): | |
16 | return len(self.elts) | |
17 | def __contains__(self, elt): | |
18 | return self.elts.has_key(elt) | |
19 | def add(self, elt): | |
20 | self.elts[elt] = elt | |
21 | def elements(self): | |
22 | return self.elts.keys() | |
23 | def has_elt(self, elt): | |
24 | return self.elts.has_key(elt) | |
25 | def remove(self, elt): | |
26 | del self.elts[elt] | |
27 | def copy(self): | |
28 | c = Set() | |
29 | c.elts.update(self.elts) | |
30 | return c | |
31 | ||
32 | class Stack: | |
33 | def __init__(self): | |
34 | self.stack = [] | |
35 | self.pop = self.stack.pop | |
36 | def __len__(self): | |
37 | return len(self.stack) | |
38 | def push(self, elt): | |
39 | self.stack.append(elt) | |
40 | def top(self): | |
41 | return self.stack[-1] | |
42 | def __getitem__(self, index): # needed by visitContinue() | |
43 | return self.stack[index] | |
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) | |
67 | ||
68 | def set_filename(filename, tree): | |
69 | """Set the filename attribute to filename on every node in tree""" | |
70 | worklist = [tree] | |
71 | while worklist: | |
72 | node = worklist.pop(0) | |
73 | node.filename = filename | |
74 | worklist.extend(node.getChildNodes()) |