]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | \r |
2 | def flatten(tup):\r | |
3 | elts = []\r | |
4 | for elt in tup:\r | |
5 | if isinstance(elt, tuple):\r | |
6 | elts = elts + flatten(elt)\r | |
7 | else:\r | |
8 | elts.append(elt)\r | |
9 | return elts\r | |
10 | \r | |
11 | class Set:\r | |
12 | def __init__(self):\r | |
13 | self.elts = {}\r | |
14 | def __len__(self):\r | |
15 | return len(self.elts)\r | |
16 | def __contains__(self, elt):\r | |
17 | return elt in self.elts\r | |
18 | def add(self, elt):\r | |
19 | self.elts[elt] = elt\r | |
20 | def elements(self):\r | |
21 | return self.elts.keys()\r | |
22 | def has_elt(self, elt):\r | |
23 | return elt in self.elts\r | |
24 | def remove(self, elt):\r | |
25 | del self.elts[elt]\r | |
26 | def copy(self):\r | |
27 | c = Set()\r | |
28 | c.elts.update(self.elts)\r | |
29 | return c\r | |
30 | \r | |
31 | class Stack:\r | |
32 | def __init__(self):\r | |
33 | self.stack = []\r | |
34 | self.pop = self.stack.pop\r | |
35 | def __len__(self):\r | |
36 | return len(self.stack)\r | |
37 | def push(self, elt):\r | |
38 | self.stack.append(elt)\r | |
39 | def top(self):\r | |
40 | return self.stack[-1]\r | |
41 | def __getitem__(self, index): # needed by visitContinue()\r | |
42 | return self.stack[index]\r | |
43 | \r | |
44 | MANGLE_LEN = 256 # magic constant from compile.c\r | |
45 | \r | |
46 | def mangle(name, klass):\r | |
47 | if not name.startswith('__'):\r | |
48 | return name\r | |
49 | if len(name) + 2 >= MANGLE_LEN:\r | |
50 | return name\r | |
51 | if name.endswith('__'):\r | |
52 | return name\r | |
53 | try:\r | |
54 | i = 0\r | |
55 | while klass[i] == '_':\r | |
56 | i = i + 1\r | |
57 | except IndexError:\r | |
58 | return name\r | |
59 | klass = klass[i:]\r | |
60 | \r | |
61 | tlen = len(klass) + len(name)\r | |
62 | if tlen > MANGLE_LEN:\r | |
63 | klass = klass[:MANGLE_LEN-tlen]\r | |
64 | \r | |
65 | return "_%s%s" % (klass, name)\r | |
66 | \r | |
67 | def set_filename(filename, tree):\r | |
68 | """Set the filename attribute to filename on every node in tree"""\r | |
69 | worklist = [tree]\r | |
70 | while worklist:\r | |
71 | node = worklist.pop(0)\r | |
72 | node.filename = filename\r | |
73 | worklist.extend(node.getChildNodes())\r |