1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/compiler/misc.py Fri May 18 23:26:30 2012 +0200
1.3 @@ -0,0 +1,73 @@
1.4 +
1.5 +def flatten(tup):
1.6 + elts = []
1.7 + for elt in tup:
1.8 + if isinstance(elt, tuple):
1.9 + elts = elts + flatten(elt)
1.10 + else:
1.11 + elts.append(elt)
1.12 + return elts
1.13 +
1.14 +class Set:
1.15 + def __init__(self):
1.16 + self.elts = {}
1.17 + def __len__(self):
1.18 + return len(self.elts)
1.19 + def __contains__(self, elt):
1.20 + return elt in self.elts
1.21 + def add(self, elt):
1.22 + self.elts[elt] = elt
1.23 + def elements(self):
1.24 + return self.elts.keys()
1.25 + def has_elt(self, elt):
1.26 + return elt in self.elts
1.27 + def remove(self, elt):
1.28 + del self.elts[elt]
1.29 + def copy(self):
1.30 + c = Set()
1.31 + c.elts.update(self.elts)
1.32 + return c
1.33 +
1.34 +class Stack:
1.35 + def __init__(self):
1.36 + self.stack = []
1.37 + self.pop = self.stack.pop
1.38 + def __len__(self):
1.39 + return len(self.stack)
1.40 + def push(self, elt):
1.41 + self.stack.append(elt)
1.42 + def top(self):
1.43 + return self.stack[-1]
1.44 + def __getitem__(self, index): # needed by visitContinue()
1.45 + return self.stack[index]
1.46 +
1.47 +MANGLE_LEN = 256 # magic constant from compile.c
1.48 +
1.49 +def mangle(name, klass):
1.50 + if not name.startswith('__'):
1.51 + return name
1.52 + if len(name) + 2 >= MANGLE_LEN:
1.53 + return name
1.54 + if name.endswith('__'):
1.55 + return name
1.56 + try:
1.57 + i = 0
1.58 + while klass[i] == '_':
1.59 + i = i + 1
1.60 + except IndexError:
1.61 + return name
1.62 + klass = klass[i:]
1.63 +
1.64 + tlen = len(klass) + len(name)
1.65 + if tlen > MANGLE_LEN:
1.66 + klass = klass[:MANGLE_LEN-tlen]
1.67 +
1.68 + return "_%s%s" % (klass, name)
1.69 +
1.70 +def set_filename(filename, tree):
1.71 + """Set the filename attribute to filename on every node in tree"""
1.72 + worklist = [tree]
1.73 + while worklist:
1.74 + node = worklist.pop(0)
1.75 + node.filename = filename
1.76 + worklist.extend(node.getChildNodes())