blob: 6d5eaa83b0d3f57775da7d60be1d022ec7fa878a [file] [log] [blame]
Jeremy Hylton65d4ea02000-02-16 00:49:47 +00001import types
2
3def 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
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000012class Set:
13 def __init__(self):
Jeremy Hylton772dd412000-02-21 22:46:00 +000014 self.elts = {}
Jeremy Hylton95b86142000-02-10 20:54:27 +000015 def __len__(self):
16 return len(self.elts)
Jeremy Hylton314e3fb2000-11-06 03:43:11 +000017 def __contains__(self, elt):
18 return self.elts.has_key(elt)
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000019 def add(self, elt):
Jeremy Hylton772dd412000-02-21 22:46:00 +000020 self.elts[elt] = elt
Jeremy Hyltone4d62932000-03-16 20:02:38 +000021 def elements(self):
Jeremy Hylton772dd412000-02-21 22:46:00 +000022 return self.elts.keys()
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000023 def has_elt(self, elt):
Jeremy Hylton772dd412000-02-21 22:46:00 +000024 return self.elts.has_key(elt)
Jeremy Hylton69926ea2000-02-10 00:43:22 +000025 def remove(self, elt):
26 del self.elts[elt]
Jeremy Hylton314e3fb2000-11-06 03:43:11 +000027 def copy(self):
28 c = Set()
29 c.elts.update(self.elts)
30 return c
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000031
32class Stack:
33 def __init__(self):
Jeremy Hylton772dd412000-02-21 22:46:00 +000034 self.stack = []
35 self.pop = self.stack.pop
Jeremy Hylton95b86142000-02-10 20:54:27 +000036 def __len__(self):
37 return len(self.stack)
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000038 def push(self, elt):
Jeremy Hylton772dd412000-02-21 22:46:00 +000039 self.stack.append(elt)
Jeremy Hylton8b6323d2000-02-04 00:28:21 +000040 def top(self):
Jeremy Hylton772dd412000-02-21 22:46:00 +000041 return self.stack[-1]
Jeremy Hylton4bd4ddd2001-08-29 22:26:35 +000042 def __getitem__(self, index): # needed by visitContinue()
43 return self.stack[index]
Jeremy Hyltonc59e2202001-08-27 22:56:16 +000044
45MANGLE_LEN = 256 # magic constant from compile.c
46
47def 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)
Jeremy Hylton09392b72001-09-17 18:02:21 +000067
68def 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())