| def flatten(tup): | |
| elts = [] | |
| for elt in tup: | |
| if isinstance(elt, tuple): | |
| elts = elts + flatten(elt) | |
| else: | |
| elts.append(elt) | |
| return elts | |
| class Set: | |
| def __init__(self): | |
| self.elts = {} | |
| def __len__(self): | |
| return len(self.elts) | |
| def __contains__(self, elt): | |
| return elt in self.elts | |
| def add(self, elt): | |
| self.elts[elt] = elt | |
| def elements(self): | |
| return self.elts.keys() | |
| def has_elt(self, elt): | |
| return elt in self.elts | |
| def remove(self, elt): | |
| del self.elts[elt] | |
| def copy(self): | |
| c = Set() | |
| c.elts.update(self.elts) | |
| return c | |
| class Stack: | |
| def __init__(self): | |
| self.stack = [] | |
| self.pop = self.stack.pop | |
| def __len__(self): | |
| return len(self.stack) | |
| def push(self, elt): | |
| self.stack.append(elt) | |
| def top(self): | |
| return self.stack[-1] | |
| def __getitem__(self, index): # needed by visitContinue() | |
| return self.stack[index] | |
| MANGLE_LEN = 256 # magic constant from compile.c | |
| def mangle(name, klass): | |
| if not name.startswith('__'): | |
| return name | |
| if len(name) + 2 >= MANGLE_LEN: | |
| return name | |
| if name.endswith('__'): | |
| return name | |
| try: | |
| i = 0 | |
| while klass[i] == '_': | |
| i = i + 1 | |
| except IndexError: | |
| return name | |
| klass = klass[i:] | |
| tlen = len(klass) + len(name) | |
| if tlen > MANGLE_LEN: | |
| klass = klass[:MANGLE_LEN-tlen] | |
| return "_%s%s" % (klass, name) | |
| def set_filename(filename, tree): | |
| """Set the filename attribute to filename on every node in tree""" | |
| worklist = [tree] | |
| while worklist: | |
| node = worklist.pop(0) | |
| node.filename = filename | |
| worklist.extend(node.getChildNodes()) |