| import types |
| |
| def flatten(tup): |
| elts = [] |
| for elt in tup: |
| if type(elt) == types.TupleType: |
| 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 self.elts.has_key(elt) |
| def add(self, elt): |
| self.elts[elt] = elt |
| def elements(self): |
| return self.elts.keys() |
| def has_elt(self, elt): |
| return self.elts.has_key(elt) |
| 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()) |