Mercurial > cpython-lru_cache-weakref
annotate Lib/compiler/misc.py @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | bdee45888b64 |
| children | f340cb045bf9 |
| rev | line source |
|---|---|
|
11790
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
1 |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
2 def flatten(tup): |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
3 elts = [] |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
4 for elt in tup: |
|
35946
b2eb1589c22b
No need for types, use isinstance
Neal Norwitz <nnorwitz@gmail.com>
parents:
20547
diff
changeset
|
5 if isinstance(elt, tuple): |
|
11790
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
6 elts = elts + flatten(elt) |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
7 else: |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
8 elts.append(elt) |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
9 return elts |
|
72848c6b611c
add flatten helper function
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11747
diff
changeset
|
10 |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
11 class Set: |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 def __init__(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
13 self.elts = {} |
|
11747
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
14 def __len__(self): |
|
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
15 return len(self.elts) |
|
15379
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
16 def __contains__(self, elt): |
|
39588
bdee45888b64
Stomp out more hsa_key() calls.
Guido van Rossum <guido@python.org>
parents:
35946
diff
changeset
|
17 return elt in self.elts |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
18 def add(self, elt): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
19 self.elts[elt] = elt |
|
12006
9d735639429d
change name of Set method: items -> elements (avoids confusion with
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11829
diff
changeset
|
20 def elements(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
21 return self.elts.keys() |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
22 def has_elt(self, elt): |
|
39588
bdee45888b64
Stomp out more hsa_key() calls.
Guido van Rossum <guido@python.org>
parents:
35946
diff
changeset
|
23 return elt in self.elts |
|
11733
78f0098812b7
add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11705
diff
changeset
|
24 def remove(self, elt): |
|
78f0098812b7
add remove method to set
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11705
diff
changeset
|
25 del self.elts[elt] |
|
15379
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
26 def copy(self): |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
27 c = Set() |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
28 c.elts.update(self.elts) |
|
7a82f84290f7
Change the graph structure to contain the code generator object for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12006
diff
changeset
|
29 return c |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
30 |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
31 class Stack: |
|
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
32 def __init__(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
33 self.stack = [] |
|
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
34 self.pop = self.stack.pop |
|
11747
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
35 def __len__(self): |
|
7ef39e07120a
add an __len__ to Set and Stack
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11733
diff
changeset
|
36 return len(self.stack) |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
37 def push(self, elt): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
38 self.stack.append(elt) |
|
11705
d10c108d3fd7
checking in initial weekend's work
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
39 def top(self): |
|
11829
ecdc78148811
satisfy the tabnanny (thanks to MH for noticing the problem)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
11790
diff
changeset
|
40 return self.stack[-1] |
|
19571
c485d77376fa
Add __getitem__() handler for use by visitContinue()
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19522
diff
changeset
|
41 def __getitem__(self, index): # needed by visitContinue() |
|
c485d77376fa
Add __getitem__() handler for use by visitContinue()
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19522
diff
changeset
|
42 return self.stack[index] |
| 19522 | 43 |
| 44 MANGLE_LEN = 256 # magic constant from compile.c | |
| 45 | |
| 46 def mangle(name, klass): | |
| 47 if not name.startswith('__'): | |
| 48 return name | |
| 49 if len(name) + 2 >= MANGLE_LEN: | |
| 50 return name | |
| 51 if name.endswith('__'): | |
| 52 return name | |
| 53 try: | |
| 54 i = 0 | |
| 55 while klass[i] == '_': | |
| 56 i = i + 1 | |
| 57 except IndexError: | |
| 58 return name | |
| 59 klass = klass[i:] | |
| 60 | |
| 61 tlen = len(klass) + len(name) | |
| 62 if tlen > MANGLE_LEN: | |
| 63 klass = klass[:MANGLE_LEN-tlen] | |
| 64 | |
| 65 return "_%s%s" % (klass, name) | |
|
19938
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
66 |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
67 def set_filename(filename, tree): |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
68 """Set the filename attribute to filename on every node in tree""" |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
69 worklist = [tree] |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
70 while worklist: |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
71 node = worklist.pop(0) |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
72 node.filename = filename |
|
fd7a7f832258
Add utility to set filename attribute on all nodes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19571
diff
changeset
|
73 worklist.extend(node.getChildNodes()) |
