1
2def 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
11class Set:
12    def __init__(self):
13        self.elts = {}
14    def __len__(self):
15        return len(self.elts)
16    def __contains__(self, elt):
17        return elt in self.elts
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 elt in self.elts
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
31class 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
44MANGLE_LEN = 256 # magic constant from compile.c
45
46def 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
67def 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())
74