Mercurial > cpython-lru_cache-weakref
annotate Python/import.c @ 76562:8dab93ec19de
Issue #14605: Insert to the front of sys.path_hooks instead of appending.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Tue, 24 Apr 2012 22:03:46 -0400 |
| parents | 085cf1480cfe |
| children | 1439e2d1f490 |
| rev | line source |
|---|---|
|
145
853b736a6a9e
Added copyright notice.
Guido van Rossum <guido@python.org>
parents:
141
diff
changeset
|
1 |
| 6 | 2 /* Module definition and import implementation */ |
| 3 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
4 #include "Python.h" |
| 6 | 5 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
6 #include "Python-ast.h" |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
7 #undef Yield /* undefine macro conflicting with winbase.h */ |
| 6 | 8 #include "errcode.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
9 #include "marshal.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
10 #include "code.h" |
|
675
5aff9f8fd299
Move SEP to osdefs.h. Use MAXPATHLEN from osdefs.h.
Guido van Rossum <guido@python.org>
parents:
630
diff
changeset
|
11 #include "osdefs.h" |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
12 #include "importdl.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
13 |
|
14708
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
14 #ifdef HAVE_FCNTL_H |
|
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
15 #include <fcntl.h> |
|
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
16 #endif |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
17 #ifdef __cplusplus |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
18 extern "C" { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
19 #endif |
|
14708
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
20 |
|
45495
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
21 #ifdef MS_WINDOWS |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
22 /* for stat.st_mode */ |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
23 typedef unsigned short mode_t; |
|
64594
84217b2d8c0c
Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
64439
diff
changeset
|
24 /* for _mkdir */ |
|
84217b2d8c0c
Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
64439
diff
changeset
|
25 #include <direct.h> |
|
45495
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
26 #endif |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
27 |
|
1351
e149c77d173c
Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents:
1293
diff
changeset
|
28 |
|
31851
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
29 /* Magic word to reject .pyc files generated by other Python versions. |
|
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
30 It should change for each incompatible change to the bytecode. |
|
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
31 |
|
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
32 The value of CR and LF is incorporated so if you ever read or write |
|
2812
fb3daf9b2456
new MAGIC; some changes to default files for imp.load_... functions
Guido van Rossum <guido@python.org>
parents:
2749
diff
changeset
|
33 a .pyc file in text mode the magic number will be wrong; also, the |
|
21010
4a9a9cc041de
Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents:
20768
diff
changeset
|
34 Apple MPW compiler swaps their values, botching string constants. |
|
21886
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
35 |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36926
diff
changeset
|
36 The magic numbers must be spaced apart at least 2 values, as the |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32294
diff
changeset
|
37 -U interpeter flag will cause MAGIC+1 being used. They have been |
|
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32294
diff
changeset
|
38 odd numbers for some time now. |
|
21886
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
39 |
|
31851
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
40 There were a variety of old schemes for setting the magic number. |
|
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
41 The current working scheme is to increment the previous value by |
|
adb42a711696
Bump the magic number to avoid sharing bytecode between 2.3 and 2.4.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31824
diff
changeset
|
42 10. |
|
25085
5fe4d93df429
Because MWH changed the bytecode again, moved the magic number *back*
Guido van Rossum <guido@python.org>
parents:
24844
diff
changeset
|
43 |
| 60648 | 44 Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic |
| 45 number also includes a new "magic tag", i.e. a human readable string used | |
| 46 to represent the magic number in __pycache__ directories. When you change | |
| 47 the magic number, you must also set a new unique magic tag. Generally this | |
| 48 can be named after the Python major version of the magic number bump, but | |
| 49 it can really be anything, as long as it's different than anything else | |
| 50 that's come before. The tags are included in the following table, starting | |
| 51 with Python 3.2a0. | |
| 52 | |
|
21886
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
53 Known values: |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
54 Python 1.5: 20121 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
55 Python 1.5.1: 20121 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
56 Python 1.5.2: 20121 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
57 Python 1.6: 50428 |
|
21886
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
58 Python 2.0: 50823 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
59 Python 2.0.1: 50823 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
60 Python 2.1: 60202 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
61 Python 2.1.1: 60202 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
62 Python 2.1.2: 60202 |
|
abedb2418f62
Fix to the UTF-8 encoder: it failed on 0-length input strings.
Marc-André Lemburg <mal@egenix.com>
parents:
21712
diff
changeset
|
63 Python 2.2: 60717 |
|
23851
d6ae544acd24
Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents:
23832
diff
changeset
|
64 Python 2.3a0: 62011 |
| 24844 | 65 Python 2.3a0: 62021 |
|
25085
5fe4d93df429
Because MWH changed the bytecode again, moved the magic number *back*
Guido van Rossum <guido@python.org>
parents:
24844
diff
changeset
|
66 Python 2.3a0: 62011 (!) |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32294
diff
changeset
|
67 Python 2.4a0: 62041 |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
32882
diff
changeset
|
68 Python 2.4a3: 62051 |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
69 Python 2.4b1: 62061 |
| 35008 | 70 Python 2.5a0: 62071 |
|
35757
eb15cdd4a2f1
the ast-branch changed the stack discipline of MAKE_CLOSURE, so we need to
Michael W. Hudson <mwh@python.net>
parents:
35742
diff
changeset
|
71 Python 2.5a0: 62081 (ast-branch) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36501
diff
changeset
|
72 Python 2.5a0: 62091 (with) |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
73 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
74 Python 2.5b3: 62101 (fix wrong code: for x, in ...) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
75 Python 2.5b3: 62111 (fix wrong code: x += yield) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
76 Python 2.5c1: 62121 (fix wrong lnotab with for loops and |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
77 storing constants that should have been removed) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
78 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44142
diff
changeset
|
79 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45495
diff
changeset
|
80 Python 2.6a1: 62161 (WITH_CLEANUP optimization) |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36926
diff
changeset
|
81 Python 3000: 3000 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
82 3010 (removed UNARY_CONVERT) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
83 3020 (added BUILD_SET) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
84 3030 (added keyword-only parameters) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
85 3040 (added signature annotations) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
86 3050 (print becomes a function) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
87 3060 (PEP 3115 metaclass syntax) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
88 3061 (string literals become unicode) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
89 3071 (PEP 3109 raise changes) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
90 3081 (PEP 3137 make __file__ and __name__ unicode) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
91 3091 (kill str8 interning) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
92 3101 (merge from 2.6a0, see 62151) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
93 3103 (__file__ points to source file) |
|
57629
8b8aee21d85e
remove magic number bumping from the 2.x -U option #7459
Benjamin Peterson <benjamin@python.org>
parents:
56381
diff
changeset
|
94 Python 3.0a4: 3111 (WITH_CLEANUP optimization). |
|
8b8aee21d85e
remove magic number bumping from the 2.x -U option #7459
Benjamin Peterson <benjamin@python.org>
parents:
56381
diff
changeset
|
95 Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT) |
|
8b8aee21d85e
remove magic number bumping from the 2.x -U option #7459
Benjamin Peterson <benjamin@python.org>
parents:
56381
diff
changeset
|
96 Python 3.1a0: 3141 (optimize list, set and dict comprehensions: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
97 change LIST_APPEND and SET_ADD, add MAP_ADD) |
|
57629
8b8aee21d85e
remove magic number bumping from the 2.x -U option #7459
Benjamin Peterson <benjamin@python.org>
parents:
56381
diff
changeset
|
98 Python 3.1a0: 3151 (optimize conditional branches: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
99 introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52721
diff
changeset
|
100 Python 3.2a0: 3160 (add SETUP_WITH) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
101 tag: cpython-32 |
|
64439
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64135
diff
changeset
|
102 Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR) |
|
725231211273
Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents:
64135
diff
changeset
|
103 tag: cpython-32 |
|
64621
252895d49157
bump magic number for DELETE_DEREF
Benjamin Peterson <benjamin@python.org>
parents:
64594
diff
changeset
|
104 Python 3.2a2 3180 (add DELETE_DEREF) |
|
70894
9a6d9ac6fb2e
bump magic for super closure change
Benjamin Peterson <benjamin@python.org>
parents:
70631
diff
changeset
|
105 Python 3.3a0 3190 __class__ super closure changed |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73592
diff
changeset
|
106 Python 3.3a0 3200 (__qualname__ added) |
| 75717 | 107 3210 (added size modulo 2**32 to the pyc header) |
| 108 Python 3.3a1 3220 (changed PEP 380 implementation) | |
|
21010
4a9a9cc041de
Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents:
20768
diff
changeset
|
109 */ |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52721
diff
changeset
|
110 |
|
64638
20a2153b0dda
Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
64621
diff
changeset
|
111 /* MAGIC must change whenever the bytecode emitted by the compiler may no |
|
20a2153b0dda
Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
64621
diff
changeset
|
112 longer be understood by older implementations of the eval loop (usually |
|
20a2153b0dda
Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
64621
diff
changeset
|
113 due to the addition of new opcodes) |
|
20a2153b0dda
Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
64621
diff
changeset
|
114 TAG must change for each major Python release. The magic number will take |
|
20a2153b0dda
Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
64621
diff
changeset
|
115 care of any bytecode changes that occur during development. |
| 60648 | 116 */ |
|
70631
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
117 #define QUOTE(arg) #arg |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
118 #define STRIFY(name) QUOTE(name) |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
119 #define MAJOR STRIFY(PY_MAJOR_VERSION) |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
120 #define MINOR STRIFY(PY_MINOR_VERSION) |
|
75739
c0a6569fdad6
in 72556ff86828, I should have updated the magic as well as the comment (#14230)
Benjamin Peterson <benjamin@python.org>
parents:
75717
diff
changeset
|
121 #define MAGIC (3220 | ((long)'\r'<<16) | ((long)'\n'<<24)) |
|
70631
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
122 #define TAG "cpython-" MAJOR MINOR; |
| 60648 | 123 #define CACHEDIR "__pycache__" |
| 124 /* Current magic word and string tag as globals. */ | |
| 12543 | 125 static long pyc_magic = MAGIC; |
| 60648 | 126 static const char *pyc_tag = TAG; |
|
70631
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
127 #undef QUOTE |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
128 #undef STRIFY |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
129 #undef MAJOR |
|
d31d141f11b1
some horrible preprocessing tricks to automatically update the tag
Benjamin Peterson <benjamin@python.org>
parents:
70396
diff
changeset
|
130 #undef MINOR |
| 12543 | 131 |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
132 /* See _PyImport_FixupExtensionObject() below */ |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
133 static PyObject *extensions = NULL; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
134 |
|
69148
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68887
diff
changeset
|
135 /* Function from Parser/tokenizer.c */ |
|
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68887
diff
changeset
|
136 extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); |
|
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68887
diff
changeset
|
137 |
|
6541
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
138 /* This table is defined in config.c: */ |
|
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
139 extern struct _inittab _PyImport_Inittab[]; |
|
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
140 |
|
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
141 struct _inittab *PyImport_Inittab = _PyImport_Inittab; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
142 |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
143 /* these tables define the module suffixes that Python recognizes */ |
|
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
144 struct filedescr * _PyImport_Filetab = NULL; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
145 |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
146 static const struct filedescr _PyImport_StandardFiletab[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
147 {".py", "U", PY_SOURCE}, |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23879
diff
changeset
|
148 #ifdef MS_WINDOWS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
149 {".pyw", "U", PY_SOURCE}, |
|
21010
4a9a9cc041de
Since the MAGIC number scheme is going to break on January 1st, document
Tim Peters <tim.peters@gmail.com>
parents:
20768
diff
changeset
|
150 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
151 {".pyc", "rb", PY_COMPILED}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
152 {0, 0} |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
153 }; |
|
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
154 |
|
68732
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
155 static PyObject *initstr = NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
156 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
157 /* Initialize things */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
158 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
159 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
160 _PyImport_Init(void) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
161 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
162 const struct filedescr *scan; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
163 struct filedescr *filetab; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
164 int countD = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
165 int countS = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
166 |
|
68732
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
167 initstr = PyUnicode_InternFromString("__init__"); |
|
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
168 if (initstr == NULL) |
|
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
169 Py_FatalError("Can't initialize import variables"); |
|
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
170 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
171 /* prepare _PyImport_Filetab: copy entries from |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
172 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
173 */ |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42622
diff
changeset
|
174 #ifdef HAVE_DYNAMIC_LOADING |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
175 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
176 ++countD; |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42622
diff
changeset
|
177 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
178 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
179 ++countS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
180 filetab = PyMem_NEW(struct filedescr, countD + countS + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
181 if (filetab == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
182 Py_FatalError("Can't initialize import file table."); |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42622
diff
changeset
|
183 #ifdef HAVE_DYNAMIC_LOADING |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
184 memcpy(filetab, _PyImport_DynLoadFiletab, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
185 countD * sizeof(struct filedescr)); |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42622
diff
changeset
|
186 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
187 memcpy(filetab + countD, _PyImport_StandardFiletab, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
188 countS * sizeof(struct filedescr)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
189 filetab[countD + countS].suffix = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
190 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
191 _PyImport_Filetab = filetab; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
192 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
193 if (Py_OptimizeFlag) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
194 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
195 for (; filetab->suffix != NULL; filetab++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
196 if (strcmp(filetab->suffix, ".pyc") == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
197 filetab->suffix = ".pyo"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
198 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
199 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
200 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
201 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
202 void |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
203 _PyImportHooks_Init(void) |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
204 { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
205 PyObject *v, *path_hooks = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
206 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
207 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
208 if (PyType_Ready(&PyNullImporter_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
209 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
210 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
211 /* adding sys.path_hooks and sys.path_importer_cache */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
212 v = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
213 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
214 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
215 err = PySys_SetObject("meta_path", v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
216 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
217 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
218 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
219 v = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
220 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
221 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
222 err = PySys_SetObject("path_importer_cache", v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
223 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
224 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
225 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
226 path_hooks = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
227 if (path_hooks == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
228 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
229 err = PySys_SetObject("path_hooks", path_hooks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
230 if (err) { |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
231 error: |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
232 PyErr_Print(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
233 Py_FatalError("initializing sys.meta_path, sys.path_hooks, " |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
234 "path_importer_cache, or NullImporter failed" |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
235 ); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
236 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
237 Py_DECREF(path_hooks); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
238 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
239 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
240 void |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
241 _PyImportZip_Init(void) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
242 { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
243 PyObject *path_hooks, *zimpimport; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
244 int err = 0; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
245 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
246 path_hooks = PySys_GetObject("path_hooks"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
247 if (path_hooks == NULL) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
248 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
249 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
250 if (Py_VerboseFlag) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
251 PySys_WriteStderr("# installing zipimport hook\n"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
252 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
253 zimpimport = PyImport_ImportModule("zipimport"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
254 if (zimpimport == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
255 PyErr_Clear(); /* No zip import module -- okay */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
256 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
257 PySys_WriteStderr("# can't import zipimport\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
258 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
259 else { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72866
diff
changeset
|
260 _Py_IDENTIFIER(zipimporter); |
|
72848
81380082d216
Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
261 PyObject *zipimporter = _PyObject_GetAttrId(zimpimport, |
|
81380082d216
Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
262 &PyId_zipimporter); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
263 Py_DECREF(zimpimport); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
264 if (zipimporter == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
265 PyErr_Clear(); /* No zipimporter object -- okay */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
266 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
267 PySys_WriteStderr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
268 "# can't import zipimport.zipimporter\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
269 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
270 else { |
|
76562
8dab93ec19de
Issue #14605: Insert to the front of sys.path_hooks instead of appending.
Brett Cannon <brett@python.org>
parents:
76455
diff
changeset
|
271 /* sys.path_hooks.insert(0, zipimporter) */ |
|
8dab93ec19de
Issue #14605: Insert to the front of sys.path_hooks instead of appending.
Brett Cannon <brett@python.org>
parents:
76455
diff
changeset
|
272 err = PyList_Insert(path_hooks, 0, zipimporter); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
273 Py_DECREF(zipimporter); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
274 if (err < 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
275 goto error; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
276 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
277 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
278 PySys_WriteStderr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
279 "# installed zipimport hook\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
280 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
281 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
282 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
283 return; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
284 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
285 error: |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
286 PyErr_Print(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
287 Py_FatalError("initializing zipimport or NullImporter failed"); |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
288 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
289 |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
290 /* Locking primitives to prevent parallel imports of the same module |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
291 in different threads to return with a partially loaded module. |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
292 These calls are serialized by the global interpreter lock. */ |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
293 |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
294 #ifdef WITH_THREAD |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
295 |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9187
diff
changeset
|
296 #include "pythread.h" |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
297 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9431
diff
changeset
|
298 static PyThread_type_lock import_lock = 0; |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
299 static long import_lock_thread = -1; |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
300 static int import_lock_level = 0; |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
301 |
|
56382
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
302 void |
|
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
303 _PyImport_AcquireLock(void) |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
304 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
305 long me = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
306 if (me == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
307 return; /* Too bad */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
308 if (import_lock == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
309 import_lock = PyThread_allocate_lock(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
310 if (import_lock == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
311 return; /* Nothing much we can do. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
312 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
313 if (import_lock_thread == me) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
314 import_lock_level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
315 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
316 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
317 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
318 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
319 PyThreadState *tstate = PyEval_SaveThread(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
320 PyThread_acquire_lock(import_lock, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
321 PyEval_RestoreThread(tstate); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
322 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
323 import_lock_thread = me; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
324 import_lock_level = 1; |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
325 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
326 |
|
56382
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
327 int |
|
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
328 _PyImport_ReleaseLock(void) |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
329 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
330 long me = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
331 if (me == -1 || import_lock == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
332 return 0; /* Too bad */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
333 if (import_lock_thread != me) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
334 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
335 import_lock_level--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
336 if (import_lock_level == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
337 import_lock_thread = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
338 PyThread_release_lock(import_lock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
339 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
340 return 1; |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
341 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
342 |
|
59235
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
343 /* This function is called from PyOS_AfterFork to ensure that newly |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
344 created child processes do not share locks with the parent. |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
345 We now acquire the import lock around fork() calls but on some platforms |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
346 (Solaris 9 and earlier? see isue7242) that still left us with problems. */ |
|
35550
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
347 |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
348 void |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
349 _PyImport_ReInitLock(void) |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
350 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
351 if (import_lock != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
352 import_lock = PyThread_allocate_lock(); |
|
66599
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
353 if (import_lock_level > 1) { |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
354 /* Forked as a side effect of import */ |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
355 long me = PyThread_get_thread_ident(); |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
356 PyThread_acquire_lock(import_lock, 0); |
|
68708
a9d6c7e15456
import.c: replace tab by spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68258
diff
changeset
|
357 /* XXX: can the previous line fail? */ |
|
66599
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
358 import_lock_thread = me; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
359 import_lock_level--; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
360 } else { |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
361 import_lock_thread = -1; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
362 import_lock_level = 0; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
363 } |
|
35550
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
364 } |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
365 |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
366 #endif |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
367 |
|
19596
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
368 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
369 imp_lock_held(PyObject *self, PyObject *noargs) |
|
19596
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
370 { |
|
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
371 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
372 return PyBool_FromLong(import_lock_thread != -1); |
|
19596
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
373 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
374 return PyBool_FromLong(0); |
|
19596
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
375 #endif |
|
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
376 } |
|
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
377 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
378 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
379 imp_acquire_lock(PyObject *self, PyObject *noargs) |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
380 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
381 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
382 _PyImport_AcquireLock(); |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
383 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
384 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
385 return Py_None; |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
386 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
387 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
388 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
389 imp_release_lock(PyObject *self, PyObject *noargs) |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
390 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
391 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
392 if (_PyImport_ReleaseLock() < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
393 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
394 "not holding the import lock"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
395 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
396 } |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
397 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
398 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
399 return Py_None; |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
400 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
401 |
|
73205
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
402 void |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
403 _PyImport_Fini(void) |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
404 { |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
405 Py_XDECREF(extensions); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
406 extensions = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
407 PyMem_DEL(_PyImport_Filetab); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
408 _PyImport_Filetab = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
409 #ifdef WITH_THREAD |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
410 if (import_lock != NULL) { |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
411 PyThread_free_lock(import_lock); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
412 import_lock = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
413 } |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
414 #endif |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
415 } |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
416 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
417 static void |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
418 imp_modules_reloading_clear(void) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
419 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
420 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
421 if (interp->modules_reloading != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
422 PyDict_Clear(interp->modules_reloading); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
423 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
424 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
425 /* Helper for sys */ |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
426 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
427 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
428 PyImport_GetModuleDict(void) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
429 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
430 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
431 if (interp->modules == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
432 Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
433 return interp->modules; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
434 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
435 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
436 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
437 /* List of names to clear in sys */ |
|
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
438 static char* sys_deletes[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
439 "path", "argv", "ps1", "ps2", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
440 "last_type", "last_value", "last_traceback", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
441 "path_hooks", "path_importer_cache", "meta_path", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
442 /* misc stuff */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
443 "flags", "float_info", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
444 NULL |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
445 }; |
|
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
446 |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
447 static char* sys_files[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
448 "stdin", "__stdin__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
449 "stdout", "__stdout__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
450 "stderr", "__stderr__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
451 NULL |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
452 }; |
|
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
453 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
454 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
455 /* Un-initialize things, as good as we can */ |
| 86 | 456 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
457 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
458 PyImport_Cleanup(void) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
459 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
460 Py_ssize_t pos, ndone; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
461 PyObject *key, *value, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
462 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
463 PyObject *modules = interp->modules; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
464 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
465 if (modules == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
466 return; /* Already done */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
467 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
468 /* Delete some special variables first. These are common |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
469 places where user values hide and people complain when their |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
470 destructors fail. Since the modules containing them are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
471 deleted *last* of all, they would come too late in the normal |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
472 destruction order. Sigh. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
473 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
474 value = PyDict_GetItemString(modules, "builtins"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
475 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
476 dict = PyModule_GetDict(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
477 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
478 PySys_WriteStderr("# clear builtins._\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
479 PyDict_SetItemString(dict, "_", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
480 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
481 value = PyDict_GetItemString(modules, "sys"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
482 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
483 char **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
484 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
485 dict = PyModule_GetDict(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
486 for (p = sys_deletes; *p != NULL; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
487 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
488 PySys_WriteStderr("# clear sys.%s\n", *p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
489 PyDict_SetItemString(dict, *p, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
490 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
491 for (p = sys_files; *p != NULL; p+=2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
492 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
493 PySys_WriteStderr("# restore sys.%s\n", *p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
494 v = PyDict_GetItemString(dict, *(p+1)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
495 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
496 v = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
497 PyDict_SetItemString(dict, *p, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
498 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
499 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
500 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
501 /* First, delete __main__ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
502 value = PyDict_GetItemString(modules, "__main__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
503 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
504 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
505 PySys_WriteStderr("# cleanup __main__\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
506 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
507 PyDict_SetItemString(modules, "__main__", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
508 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
509 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
510 /* The special treatment of "builtins" here is because even |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
511 when it's not referenced as a module, its dictionary is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
512 referenced by almost every module's __builtins__. Since |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
513 deleting a module clears its dictionary (even if there are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
514 references left to it), we need to delete the "builtins" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
515 module last. Likewise, we don't delete sys until the very |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
516 end because it is implicitly referenced (e.g. by print). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
517 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
518 Also note that we 'delete' modules by replacing their entry |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
519 in the modules dict with None, rather than really deleting |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
520 them; this avoids a rehash of the modules dictionary and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
521 also marks them as "non existent" so they won't be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
522 re-imported. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
523 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
524 /* Next, repeatedly delete modules with a reference count of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
525 one (skipping builtins and sys) and delete them */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
526 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
527 ndone = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
528 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
529 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
530 if (value->ob_refcnt != 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
531 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
532 if (PyUnicode_Check(key) && PyModule_Check(value)) { |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
533 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
534 continue; |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
535 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
536 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
537 if (Py_VerboseFlag) |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
538 PySys_FormatStderr( |
|
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
539 "# cleanup[1] %U\n", key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
540 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
541 PyDict_SetItem(modules, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
542 ndone++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
543 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
544 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
545 } while (ndone > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
546 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
547 /* Next, delete all modules (still skipping builtins and sys) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
548 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
549 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
550 if (PyUnicode_Check(key) && PyModule_Check(value)) { |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
551 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
552 continue; |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
553 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
554 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
555 if (Py_VerboseFlag) |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
556 PySys_FormatStderr("# cleanup[2] %U\n", key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
557 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
558 PyDict_SetItem(modules, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
559 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
560 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
561 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
562 /* Next, delete sys and builtins (in that order) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
563 value = PyDict_GetItemString(modules, "sys"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
564 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
565 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
566 PySys_WriteStderr("# cleanup sys\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
567 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
568 PyDict_SetItemString(modules, "sys", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
569 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
570 value = PyDict_GetItemString(modules, "builtins"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
571 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
572 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
573 PySys_WriteStderr("# cleanup builtins\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
574 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
575 PyDict_SetItemString(modules, "builtins", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
576 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
577 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
578 /* Finally, clear and delete the modules directory */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
579 PyDict_Clear(modules); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
580 interp->modules = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
581 Py_DECREF(modules); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
582 Py_CLEAR(interp->modules_reloading); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
583 } |
|
166
28923e44254c
Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
584 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
585 |
| 60648 | 586 /* Helper for pythonrun.c -- return magic number and tag. */ |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
587 |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
588 long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
589 PyImport_GetMagicNumber(void) |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
590 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
591 return pyc_magic; |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
592 } |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
593 |
| 6 | 594 |
| 60648 | 595 const char * |
| 596 PyImport_GetMagicTag(void) | |
| 597 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
598 return pyc_tag; |
| 60648 | 599 } |
| 600 | |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
601 /* Magic for extension modules (built-in as well as dynamically |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
602 loaded). To prevent initializing an extension module more than |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
603 once, we keep a static dictionary 'extensions' keyed by module name |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
604 (for built-in modules) or by filename (for dynamically loaded |
|
19238
5b87ee44000b
Fixed typo in comment leading up to _PyImport_FixupExtension().
Barry Warsaw <barry@python.org>
parents:
19063
diff
changeset
|
605 modules), containing these modules. A copy of the module's |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
606 dictionary is stored by calling _PyImport_FixupExtensionObject() |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
607 immediately after the module initialization function succeeds. A |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
608 copy can be retrieved from there by calling |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
609 _PyImport_FindExtensionObject(). |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
610 |
| 62385 | 611 Modules which do support multiple initialization set their m_size |
| 612 field to a non-negative number (indicating the size of the | |
| 613 module-specific state). They are still recorded in the extensions | |
| 614 dictionary, to avoid loading shared libraries twice. | |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
615 */ |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
616 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
617 int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
618 _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
619 PyObject *filename) |
| 6 | 620 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
621 PyObject *modules, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
622 struct PyModuleDef *def; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
623 if (extensions == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
624 extensions = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
625 if (extensions == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
626 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
627 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
628 if (mod == NULL || !PyModule_Check(mod)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
629 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
630 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
631 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
632 def = PyModule_GetDef(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
633 if (!def) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
634 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
635 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
636 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
637 modules = PyImport_GetModuleDict(); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
638 if (PyDict_SetItem(modules, name, mod) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
639 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
640 if (_PyState_AddModule(mod, def) < 0) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
641 PyDict_DelItem(modules, name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
642 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
643 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
644 if (def->m_size == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
645 if (def->m_base.m_copy) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
646 /* Somebody already imported the module, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
647 likely under a different name. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
648 XXX this should really not happen. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
649 Py_DECREF(def->m_base.m_copy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
650 def->m_base.m_copy = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
651 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
652 dict = PyModule_GetDict(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
653 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
654 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
655 def->m_base.m_copy = PyDict_Copy(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
656 if (def->m_base.m_copy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
657 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
658 } |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
659 PyDict_SetItem(extensions, filename, (PyObject*)def); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
660 return 0; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
661 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
662 |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
663 int |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
664 _PyImport_FixupBuiltin(PyObject *mod, char *name) |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
665 { |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
666 int res; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
667 PyObject *nameobj; |
|
68713
ced52fcd95f6
Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68712
diff
changeset
|
668 nameobj = PyUnicode_InternFromString(name); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
669 if (nameobj == NULL) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
670 return -1; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
671 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
672 Py_DECREF(nameobj); |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
673 return res; |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
674 } |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
675 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
676 PyObject * |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
677 _PyImport_FindExtensionObject(PyObject *name, PyObject *filename) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
678 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
679 PyObject *mod, *mdict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
680 PyModuleDef* def; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
681 if (extensions == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
682 return NULL; |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
683 def = (PyModuleDef*)PyDict_GetItem(extensions, filename); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
684 if (def == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
685 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
686 if (def->m_size == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
687 /* Module does not support repeated initialization */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
688 if (def->m_base.m_copy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
689 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
690 mod = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
691 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
692 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
693 mdict = PyModule_GetDict(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
694 if (mdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
695 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
696 if (PyDict_Update(mdict, def->m_base.m_copy)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
697 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
698 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
699 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
700 if (def->m_base.m_init == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
701 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
702 mod = def->m_base.m_init(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
703 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
704 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
705 PyDict_SetItem(PyImport_GetModuleDict(), name, mod); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
706 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
707 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
708 if (_PyState_AddModule(mod, def) < 0) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
709 PyDict_DelItem(PyImport_GetModuleDict(), name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
710 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
711 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
712 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
713 if (Py_VerboseFlag) |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
714 PySys_FormatStderr("import %U # previously loaded (%R)\n", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
715 name, filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
716 return mod; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
717 |
| 6 | 718 } |
| 719 | |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
720 PyObject * |
|
68110
44cc9ef43127
Issue #3080: Mark _PyImport_FindBuiltin() argument as constant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68107
diff
changeset
|
721 _PyImport_FindBuiltin(const char *name) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
722 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
723 PyObject *res, *nameobj; |
|
68713
ced52fcd95f6
Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68712
diff
changeset
|
724 nameobj = PyUnicode_InternFromString(name); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
725 if (nameobj == NULL) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
726 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
727 res = _PyImport_FindExtensionObject(nameobj, nameobj); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
728 Py_DECREF(nameobj); |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
729 return res; |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
730 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
731 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
732 /* Get the module object corresponding to a module name. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
733 First check the modules dictionary if there's one there, |
|
30722
651fc8d98d99
Fix a bunch of typos in documentation, docstrings and comments.
Walter Dörwald <walter@livinglogic.de>
parents:
30311
diff
changeset
|
734 if not, create a new one and insert it in the modules dictionary. |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
735 Because the former action is most common, THIS DOES NOT RETURN A |
|
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
736 'NEW' REFERENCE! */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
737 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
738 PyObject * |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
739 PyImport_AddModuleObject(PyObject *name) |
|
40
f28ac7f621c7
Added reload() functionality.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
740 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
741 PyObject *modules = PyImport_GetModuleDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
742 PyObject *m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
743 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
744 if ((m = PyDict_GetItem(modules, name)) != NULL && |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
745 PyModule_Check(m)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
746 return m; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
747 m = PyModule_NewObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
748 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
749 return NULL; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
750 if (PyDict_SetItem(modules, name, m) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
751 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
752 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
753 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
754 Py_DECREF(m); /* Yes, it still exists, in modules! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
755 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
756 return m; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
757 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
758 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
759 PyObject * |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
760 PyImport_AddModule(const char *name) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
761 { |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
762 PyObject *nameobj, *module; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
763 nameobj = PyUnicode_FromString(name); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
764 if (nameobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
765 return NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
766 module = PyImport_AddModuleObject(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
767 Py_DECREF(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
768 return module; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
769 } |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
770 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
771 |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
772 /* Remove name from sys.modules, if it's there. */ |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
773 static void |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
774 remove_module(PyObject *name) |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
775 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
776 PyObject *modules = PyImport_GetModuleDict(); |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
777 if (PyDict_GetItem(modules, name) == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
778 return; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
779 if (PyDict_DelItem(modules, name) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
780 Py_FatalError("import: deleting existing key in" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
781 "sys.modules failed"); |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
782 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
783 |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
784 static PyObject * get_sourcefile(PyObject *filename); |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
785 static PyObject *make_source_pathname(PyObject *pathname); |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
786 |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
787 /* Execute a code object in a module and return the module object |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
788 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
789 * removed from sys.modules, to avoid leaving damaged module objects |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
790 * in sys.modules. The caller may wish to restore the original |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
791 * module object (if any) in this case; PyImport_ReloadModule is an |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
792 * example. |
| 60648 | 793 * |
| 794 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer | |
| 795 * interface. The other two exist primarily for backward compatibility. | |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
796 */ |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
797 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
798 PyImport_ExecCodeModule(char *name, PyObject *co) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
799 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
800 return PyImport_ExecCodeModuleWithPathnames( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
801 name, co, (char *)NULL, (char *)NULL); |
|
7232
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
802 } |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
803 |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
804 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
805 PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname) |
|
7232
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
806 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
807 return PyImport_ExecCodeModuleWithPathnames( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
808 name, co, pathname, (char *)NULL); |
| 60648 | 809 } |
| 810 | |
| 811 PyObject * | |
| 812 PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
813 char *cpathname) |
| 60648 | 814 { |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
815 PyObject *m = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
816 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
817 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
818 nameobj = PyUnicode_FromString(name); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
819 if (nameobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
820 return NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
821 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
822 if (pathname != NULL) { |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
823 pathobj = PyUnicode_DecodeFSDefault(pathname); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
824 if (pathobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
825 goto error; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
826 } else |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
827 pathobj = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
828 if (cpathname != NULL) { |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
829 cpathobj = PyUnicode_DecodeFSDefault(cpathname); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
830 if (cpathobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
831 goto error; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
832 } else |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
833 cpathobj = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
834 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
835 error: |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
836 Py_DECREF(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
837 Py_XDECREF(pathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
838 Py_XDECREF(cpathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
839 return m; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
840 } |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
841 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
842 PyObject* |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
843 PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
844 PyObject *cpathname) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
845 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
846 PyObject *modules = PyImport_GetModuleDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
847 PyObject *m, *d, *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
848 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
849 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
850 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
851 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
852 /* If the module is being reloaded, we get the old module back |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
853 and re-use its dict to exec the new code. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
854 d = PyModule_GetDict(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
855 if (PyDict_GetItemString(d, "__builtins__") == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
856 if (PyDict_SetItemString(d, "__builtins__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
857 PyEval_GetBuiltins()) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
858 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
859 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
860 /* Remember the filename as the __file__ attribute */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
861 if (pathname != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
862 v = get_sourcefile(pathname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
863 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
864 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
865 } |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
866 else |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
867 v = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
868 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
869 v = ((PyCodeObject *)co)->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
870 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
871 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
872 if (PyDict_SetItemString(d, "__file__", v) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
873 PyErr_Clear(); /* Not important enough to report */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
874 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
875 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
876 /* Remember the pyc path name as the __cached__ attribute. */ |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
877 if (cpathname != NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
878 v = cpathname; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
879 else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
880 v = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
881 if (PyDict_SetItemString(d, "__cached__", v) != 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
882 PyErr_Clear(); /* Not important enough to report */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
883 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66650
diff
changeset
|
884 v = PyEval_EvalCode(co, d, d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
885 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
886 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
887 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
888 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
889 if ((m = PyDict_GetItem(modules, name)) == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
890 PyErr_Format(PyExc_ImportError, |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
891 "Loaded module %R not found in sys.modules", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
892 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
893 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
894 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
895 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
896 Py_INCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
897 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
898 return m; |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
899 |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
900 error: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
901 remove_module(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
902 return NULL; |
| 6 | 903 } |
| 904 | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
905 |
|
73063
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
906 /* Like rightmost_sep, but operate on unicode objects. */ |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
907 static Py_ssize_t |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
908 rightmost_sep_obj(PyObject* o, Py_ssize_t start, Py_ssize_t end) |
|
73063
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
909 { |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
910 Py_ssize_t found, i; |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
911 Py_UCS4 c; |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
912 for (found = -1, i = start; i < end; i++) { |
|
73063
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
913 c = PyUnicode_READ_CHAR(o, i); |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
914 if (c == SEP |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
915 #ifdef ALTSEP |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
916 || c == ALTSEP |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
917 #endif |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
918 ) |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
919 { |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
920 found = i; |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
921 } |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
922 } |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
923 return found; |
|
1959b2332c6a
Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents:
72960
diff
changeset
|
924 } |
| 60648 | 925 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
926 |
| 60648 | 927 /* Given a pathname to a Python byte compiled file, return the path to the |
| 928 source file, if the path matches the PEP 3147 format. This does not check | |
| 929 for any file existence, however, if the pyc file name does not match PEP | |
| 930 3147 style, NULL is returned. buf must be at least as big as pathname; | |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
931 the resulting path will always be shorter. |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
932 |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
933 (...)/__pycache__/foo.<tag>.pyc -> (...)/foo.py */ |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
934 |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
935 static PyObject* |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
936 make_source_pathname(PyObject *path) |
| 60648 | 937 { |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
938 Py_ssize_t left, right, dot0, dot1, len; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
939 Py_ssize_t i, j; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
940 PyObject *result; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
941 int kind; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
942 void *data; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
943 |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
944 len = PyUnicode_GET_LENGTH(path); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
945 if (len > MAXPATHLEN) |
| 72475 | 946 return NULL; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
947 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
948 /* Look back two slashes from the end. In between these two slashes |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
949 must be the string __pycache__ or this is not a PEP 3147 style |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
950 path. It's possible for there to be only one slash. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
951 */ |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
952 right = rightmost_sep_obj(path, 0, len); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
953 if (right == -1) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
954 return NULL; |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
955 left = rightmost_sep_obj(path, 0, right); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
956 if (left == -1) |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
957 left = 0; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
958 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
959 left++; |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
960 if (right-left != sizeof(CACHEDIR)-1) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
961 return NULL; |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
962 for (i = 0; i < sizeof(CACHEDIR)-1; i++) |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
963 if (PyUnicode_READ_CHAR(path, left+i) != CACHEDIR[i]) |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
964 return NULL; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
965 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
966 /* Now verify that the path component to the right of the last slash |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
967 has two dots in it. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
968 */ |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
969 dot0 = PyUnicode_FindChar(path, '.', right+1, len, 1); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
970 if (dot0 < 0) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
971 return NULL; |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
972 dot1 = PyUnicode_FindChar(path, '.', dot0+1, len, 1); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
973 if (dot1 < 0) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
974 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
975 /* Too many dots? */ |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
976 if (PyUnicode_FindChar(path, '.', dot1+1, len, 1) != -1) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
977 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
978 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
979 /* This is a PEP 3147 path. Start by copying everything from the |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
980 start of pathname up to and including the leftmost slash. Then |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
981 copy the file's basename, removing the magic tag and adding a .py |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
982 suffix. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
983 */ |
|
73065
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
984 result = PyUnicode_New(left + (dot0-right) + 2, |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
985 PyUnicode_MAX_CHAR_VALUE(path)); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
986 if (!result) |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
987 return NULL; |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
988 kind = PyUnicode_KIND(result); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
989 data = PyUnicode_DATA(result); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
990 PyUnicode_CopyCharacters(result, 0, path, 0, (i = left)); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
991 PyUnicode_CopyCharacters(result, left, path, right+1, |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
992 (j = dot0-right)); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
993 PyUnicode_WRITE(kind, data, i+j, 'p'); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
994 PyUnicode_WRITE(kind, data, i+j+1, 'y'); |
|
6fa4386d48a9
Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73064
diff
changeset
|
995 return result; |
| 60648 | 996 } |
| 997 | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
998 |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
999 static void |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1000 update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname) |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1001 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1002 PyObject *constants, *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1003 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1004 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1005 if (PyUnicode_Compare(co->co_filename, oldname)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1006 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1007 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1008 tmp = co->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1009 co->co_filename = newname; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1010 Py_INCREF(co->co_filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1011 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1012 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1013 constants = co->co_consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1014 n = PyTuple_GET_SIZE(constants); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1015 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1016 tmp = PyTuple_GET_ITEM(constants, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1017 if (PyCode_Check(tmp)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1018 update_code_filenames((PyCodeObject *)tmp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1019 oldname, newname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1020 } |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1021 } |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1022 |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1023 static void |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1024 update_compiled_module(PyCodeObject *co, PyObject *newname) |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1025 { |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1026 PyObject *oldname; |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1027 |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1028 if (PyUnicode_Compare(co->co_filename, newname) == 0) |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
1029 return; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1030 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1031 oldname = co->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1032 Py_INCREF(oldname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1033 update_code_filenames(co, oldname, newname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1034 Py_DECREF(oldname); |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1035 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1036 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1037 static PyObject * |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1038 imp_fix_co_filename(PyObject *self, PyObject *args) |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1039 { |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1040 PyObject *co; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1041 PyObject *file_path; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1042 |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1043 if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path)) |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1044 return NULL; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1045 |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1046 if (!PyCode_Check(co)) { |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1047 PyErr_SetString(PyExc_TypeError, |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1048 "first argument must be a code object"); |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1049 return NULL; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1050 } |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1051 |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1052 if (!PyUnicode_Check(file_path)) { |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1053 PyErr_SetString(PyExc_TypeError, |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1054 "second argument must be a string"); |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1055 return NULL; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1056 } |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1057 |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1058 update_compiled_module((PyCodeObject*)co, file_path); |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1059 |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1060 Py_RETURN_NONE; |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
1061 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1062 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1063 |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1064 /* Get source file -> unicode or None |
|
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1065 * Returns the path to the py file if available, else the given path |
|
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1066 */ |
|
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1067 static PyObject * |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1068 get_sourcefile(PyObject *filename) |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1069 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1070 Py_ssize_t len; |
| 72475 | 1071 Py_UCS4 *fileuni; |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1072 PyObject *py; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1073 struct stat statbuf; |
|
74058
2a140b01d343
import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73884
diff
changeset
|
1074 int err; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1075 |
| 72475 | 1076 len = PyUnicode_GET_LENGTH(filename); |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1077 if (len == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1078 Py_RETURN_NONE; |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1079 |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1080 /* don't match *.pyc or *.pyo? */ |
| 72475 | 1081 fileuni = PyUnicode_AsUCS4Copy(filename); |
| 1082 if (!fileuni) | |
| 1083 return NULL; | |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1084 if (len < 5 |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1085 || fileuni[len-4] != '.' |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1086 || (fileuni[len-3] != 'p' && fileuni[len-3] != 'P') |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1087 || (fileuni[len-2] != 'y' && fileuni[len-2] != 'Y')) |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1088 goto unchanged; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1089 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1090 /* Start by trying to turn PEP 3147 path into source path. If that |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1091 * fails, just chop off the trailing character, i.e. legacy pyc path |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1092 * to py. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1093 */ |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1094 py = make_source_pathname(filename); |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1095 if (py == NULL) { |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1096 PyErr_Clear(); |
| 72475 | 1097 py = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, fileuni, len - 1); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1098 } |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1099 if (py == NULL) |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1100 goto error; |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1101 |
|
74058
2a140b01d343
import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73884
diff
changeset
|
1102 err = _Py_stat(py, &statbuf); |
|
2a140b01d343
import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73884
diff
changeset
|
1103 if (err == -2) |
|
2a140b01d343
import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73884
diff
changeset
|
1104 goto error; |
|
2a140b01d343
import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73884
diff
changeset
|
1105 if (err == 0 && S_ISREG(statbuf.st_mode)) { |
|
72563
1b203e741fb2
Issue 13085: Fix some memory leaks. Patch by Stefan Krah.
Martin v. Löwis <martin@v.loewis.de>
parents:
72489
diff
changeset
|
1106 PyMem_Free(fileuni); |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1107 return py; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1108 } |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1109 Py_DECREF(py); |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1110 goto unchanged; |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1111 |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1112 error: |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1113 PyErr_Clear(); |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1114 unchanged: |
| 72475 | 1115 PyMem_Free(fileuni); |
|
68721
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1116 Py_INCREF(filename); |
|
f6507eb8e689
Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68720
diff
changeset
|
1117 return filename; |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
1118 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1119 |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1120 /* Forward */ |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1121 static struct _frozen * find_frozen(PyObject *); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1122 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1123 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1124 /* Helper to test for built-in module */ |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1125 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1126 static int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1127 is_builtin(PyObject *name) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1128 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1129 int i, cmp; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1130 for (i = 0; PyImport_Inittab[i].name != NULL; i++) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1131 cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1132 if (cmp == 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1133 if (PyImport_Inittab[i].initfunc == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1134 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1135 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1136 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1137 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1138 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1139 return 0; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1140 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1141 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1142 |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1143 /* Return an importer object for a sys.path/pkg.__path__ item 'p', |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1144 possibly by fetching it from the path_importer_cache dict. If it |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1145 wasn't yet cached, traverse path_hooks until a hook is found |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1146 that can handle the path item. Return None if no hook could; |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1147 this tells our caller it should fall back to the builtin |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1148 import mechanism. Cache the result in path_importer_cache. |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1149 Returns a borrowed reference. */ |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1150 |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1151 static PyObject * |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1152 get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1153 PyObject *p) |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1154 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1155 PyObject *importer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1156 Py_ssize_t j, nhooks; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1157 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1158 /* These conditions are the caller's responsibility: */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1159 assert(PyList_Check(path_hooks)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1160 assert(PyDict_Check(path_importer_cache)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1161 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1162 nhooks = PyList_Size(path_hooks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1163 if (nhooks < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1164 return NULL; /* Shouldn't happen */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1165 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1166 importer = PyDict_GetItem(path_importer_cache, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1167 if (importer != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1168 return importer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1169 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1170 /* set path_importer_cache[p] to None to avoid recursion */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1171 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1172 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1173 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1174 for (j = 0; j < nhooks; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1175 PyObject *hook = PyList_GetItem(path_hooks, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1176 if (hook == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1177 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1178 importer = PyObject_CallFunctionObjArgs(hook, p, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1179 if (importer != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1180 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1181 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1182 if (!PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1183 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1184 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1185 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1186 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1187 if (importer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1188 importer = PyObject_CallFunctionObjArgs( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1189 (PyObject *)&PyNullImporter_Type, p, NULL |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1190 ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1191 if (importer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1192 if (PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1193 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1194 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1195 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1196 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1197 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1198 if (importer != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1199 int err = PyDict_SetItem(path_importer_cache, p, importer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1200 Py_DECREF(importer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1201 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1202 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1203 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1204 return importer; |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1205 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1206 |
|
43897
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
1207 PyAPI_FUNC(PyObject *) |
|
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
1208 PyImport_GetImporter(PyObject *path) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1209 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1210 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1211 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1212 if ((path_hooks = PySys_GetObject("path_hooks"))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1213 importer = get_path_importer(path_importer_cache, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1214 path_hooks, path); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1216 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1217 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1218 return importer; |
|
43897
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
1219 } |
|
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
1220 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1221 |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1222 #ifdef MS_COREDLL |
|
68715
bab42673674a
Issue #3080: _PyWin_FindRegisteredModule() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68713
diff
changeset
|
1223 extern FILE *_PyWin_FindRegisteredModule(PyObject *, struct filedescr **, |
|
bab42673674a
Issue #3080: _PyWin_FindRegisteredModule() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68713
diff
changeset
|
1224 PyObject **p_path); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1225 #endif |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1226 |
|
1410
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1362
diff
changeset
|
1227 |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1228 static int init_builtin(PyObject *); /* Forward */ |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1229 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1230 /* Initialize a built-in module. |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1231 Return 1 for success, 0 if the module is not found, and -1 with |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1232 an exception set if the initialization failed. */ |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1233 |
|
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1234 static int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1235 init_builtin(PyObject *name) |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1236 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1237 struct _inittab *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1238 |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1239 if (_PyImport_FindExtensionObject(name, name) != NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1240 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1241 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1242 for (p = PyImport_Inittab; p->name != NULL; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1243 PyObject *mod; |
|
74504
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
1244 PyModuleDef *def; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1245 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1246 if (p->initfunc == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1247 PyErr_Format(PyExc_ImportError, |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1248 "Cannot re-init internal module %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1249 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1250 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1251 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1252 mod = (*p->initfunc)(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1253 if (mod == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1254 return -1; |
|
74504
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
1255 /* Remember pointer to module init function. */ |
|
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
1256 def = PyModule_GetDef(mod); |
|
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
1257 def->m_base.m_init = p->initfunc; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1258 if (_PyImport_FixupExtensionObject(mod, name, name) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1259 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1260 /* FixupExtension has put the module into sys.modules, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1261 so we can release our own reference. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1262 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1263 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1264 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1265 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1266 return 0; |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1267 } |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1268 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1269 |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1270 /* Frozen modules */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1271 |
|
3683
ec39264311ff
struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents:
3590
diff
changeset
|
1272 static struct _frozen * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1273 find_frozen(PyObject *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1274 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1275 struct _frozen *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1276 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1277 if (name == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1278 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1279 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1280 for (p = PyImport_FrozenModules; ; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1281 if (p->name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1282 return NULL; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1283 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1284 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1285 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1286 return p; |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1287 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1288 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1289 static PyObject * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1290 get_frozen_object(PyObject *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1291 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1292 struct _frozen *p = find_frozen(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1293 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1294 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1295 if (p == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1296 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1297 "No such frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1298 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1299 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1300 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1301 if (p->code == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1302 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1303 "Excluded frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1304 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1305 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1306 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1307 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1308 if (size < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1309 size = -size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1310 return PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1311 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1312 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1313 static PyObject * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1314 is_frozen_package(PyObject *name) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1315 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1316 struct _frozen *p = find_frozen(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1317 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1318 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1319 if (p == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1320 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1321 "No such frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1322 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1323 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1324 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1325 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1326 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1327 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1328 if (size < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1329 Py_RETURN_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1330 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1331 Py_RETURN_FALSE; |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1332 } |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1333 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1334 |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1335 /* Initialize a frozen module. |
|
52073
56983cfdf5d4
Fix a typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents:
51996
diff
changeset
|
1336 Return 1 for success, 0 if the module is not found, and -1 with |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1337 an exception set if the initialization failed. |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1338 This function is also used from frozenmain.c */ |
|
2294
6263e2fd9398
init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents:
2270
diff
changeset
|
1339 |
|
6263e2fd9398
init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents:
2270
diff
changeset
|
1340 int |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1341 PyImport_ImportFrozenModuleObject(PyObject *name) |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1342 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1343 struct _frozen *p; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1344 PyObject *co, *m, *path; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1345 int ispackage; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1346 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1347 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1348 p = find_frozen(name); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1349 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1350 if (p == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1351 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1352 if (p->code == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1353 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1354 "Excluded frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1355 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1356 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1357 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1358 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1359 ispackage = (size < 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1360 if (ispackage) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1361 size = -size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1362 co = PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1363 if (co == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1364 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1365 if (!PyCode_Check(co)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1366 PyErr_Format(PyExc_TypeError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1367 "frozen object %R is not a code object", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1368 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1369 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1370 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1371 if (ispackage) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1372 /* Set __path__ to the package name */ |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1373 PyObject *d, *l; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1374 int err; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1375 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1376 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1377 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1378 d = PyModule_GetDict(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1379 l = PyList_New(1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1380 if (l == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1381 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1382 } |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1383 Py_INCREF(name); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1384 PyList_SET_ITEM(l, 0, name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1385 err = PyDict_SetItemString(d, "__path__", l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1386 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1387 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1388 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1389 } |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1390 path = PyUnicode_FromString("<frozen>"); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1391 if (path == NULL) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1392 goto err_return; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1393 m = PyImport_ExecCodeModuleObject(name, co, path, NULL); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1394 Py_DECREF(path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1395 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1396 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1397 Py_DECREF(co); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1398 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1399 return 1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
1400 err_return: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1401 Py_DECREF(co); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1402 return -1; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1403 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1404 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1405 int |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1406 PyImport_ImportFrozenModule(char *name) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1407 { |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1408 PyObject *nameobj; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1409 int ret; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1410 nameobj = PyUnicode_InternFromString(name); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1411 if (nameobj == NULL) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1412 return -1; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1413 ret = PyImport_ImportFrozenModuleObject(nameobj); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1414 Py_DECREF(nameobj); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1415 return ret; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1416 } |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1417 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1418 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1419 /* Import a module, either built-in, frozen, or external, and return |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
1420 its module object WITH INCREMENTED REFERENCE COUNT */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1421 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1422 PyObject * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35757
diff
changeset
|
1423 PyImport_ImportModule(const char *name) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1424 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1425 PyObject *pname; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1426 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1427 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1428 pname = PyUnicode_FromString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1429 if (pname == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1430 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1431 result = PyImport_Import(pname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1432 Py_DECREF(pname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1433 return result; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1434 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1435 |
|
44441
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1436 /* Import a module without blocking |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1437 * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1438 * At first it tries to fetch the module from sys.modules. If the module was |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1439 * never loaded before it loads it with PyImport_ImportModule() unless another |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1440 * thread holds the import lock. In the latter case the function raises an |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1441 * ImportError instead of blocking. |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1442 * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1443 * Returns the module object with incremented ref count. |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1444 */ |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1445 PyObject * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1446 PyImport_ImportModuleNoBlock(const char *name) |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1447 { |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1448 PyObject *nameobj, *modules, *result; |
|
72169
cd1978dbac08
Remove unused variable if Python is build without threads
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
1449 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1450 long me; |
|
72169
cd1978dbac08
Remove unused variable if Python is build without threads
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
1451 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1452 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1453 /* Try to get the module from sys.modules[name] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1454 modules = PyImport_GetModuleDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1455 if (modules == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1456 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1457 |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1458 nameobj = PyUnicode_FromString(name); |
|
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1459 if (nameobj == NULL) |
|
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1460 return NULL; |
|
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1461 result = PyDict_GetItem(modules, nameobj); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1462 if (result != NULL) { |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1463 Py_DECREF(nameobj); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1464 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1465 return result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1466 } |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1467 PyErr_Clear(); |
|
48946
3b9608118f8d
Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
1468 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1469 /* check the import lock |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1470 * me might be -1 but I ignore the error here, the lock function |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1471 * takes care of the problem */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1472 me = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1473 if (import_lock_thread == -1 || import_lock_thread == me) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1474 /* no thread or me is holding the lock */ |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1475 result = PyImport_Import(nameobj); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1476 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1477 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1478 PyErr_Format(PyExc_ImportError, |
|
68726
23fe237afa81
Issue #3080: Use %R to format module name in error messages
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68725
diff
changeset
|
1479 "Failed to import %R because the import lock" |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1480 "is held by another thread.", |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1481 nameobj); |
|
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1482 result = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1483 } |
|
48946
3b9608118f8d
Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
1484 #else |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1485 result = PyImport_Import(nameobj); |
|
48946
3b9608118f8d
Merged revisions 66045,66048-66049,66053,66060,66062-66063,66065,66067,66071-66074,66080,66082-66083,66090-66093,66097-66099,66103,66105,66110,66118 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
1486 #endif |
|
68724
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1487 Py_DECREF(nameobj); |
|
e55e7f197649
Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68723
diff
changeset
|
1488 return result; |
|
44441
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1489 } |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1490 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1491 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1492 PyObject * |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1493 PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1494 PyObject *locals, PyObject *given_fromlist, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1495 int level) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1496 { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1497 _Py_IDENTIFIER(__import__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1498 _Py_IDENTIFIER(__package__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1499 _Py_IDENTIFIER(__path__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1500 _Py_IDENTIFIER(__name__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1501 _Py_IDENTIFIER(_find_and_load); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1502 _Py_IDENTIFIER(_handle_fromlist); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1503 _Py_static_string(single_dot, "."); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1504 PyObject *abs_name = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1505 PyObject *builtins_import = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1506 PyObject *final_mod = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1507 PyObject *mod = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1508 PyObject *package = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1509 PyObject *globals = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1510 PyObject *fromlist = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1511 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1512 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1513 /* Make sure to use default values so as to not have |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1514 PyObject_CallMethodObjArgs() truncate the parameter list because of a |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1515 NULL argument. */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1516 if (given_globals == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1517 globals = PyDict_New(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1518 if (globals == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1519 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1520 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1521 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1522 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1523 /* Only have to care what given_globals is if it will be used |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1524 fortsomething. */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1525 if (level > 0 && !PyDict_Check(given_globals)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1526 PyErr_SetString(PyExc_TypeError, "globals must be a dict"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1527 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1528 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1529 globals = given_globals; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1530 Py_INCREF(globals); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1531 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1532 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1533 if (given_fromlist == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1534 fromlist = PyList_New(0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1535 if (fromlist == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1536 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1537 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1538 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1539 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1540 fromlist = given_fromlist; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1541 Py_INCREF(fromlist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1542 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1543 if (name == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1544 PyErr_SetString(PyExc_ValueError, "Empty module name"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1545 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1546 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1547 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1548 /* The below code is importlib.__import__() & _gcd_import(), ported to C |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1549 for added performance. */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1550 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1551 if (!PyUnicode_Check(name)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1552 PyErr_SetString(PyExc_TypeError, "module name must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1553 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1554 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1555 else if (PyUnicode_READY(name) < 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1556 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1557 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1558 if (level < 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1559 PyErr_SetString(PyExc_ValueError, "level must be >= 0"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1560 goto error; |
|
75824
daed636a3536
Fixes Issue #14331: Use significantly less stack space when importing modules by
Gregory P. Smith <greg@krypto.org>
parents:
75176
diff
changeset
|
1561 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1562 else if (level > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1563 package = _PyDict_GetItemId(globals, &PyId___package__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1564 if (package != NULL && package != Py_None) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1565 Py_INCREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1566 if (!PyUnicode_Check(package)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1567 PyErr_SetString(PyExc_TypeError, "package must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1568 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1569 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1570 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1571 else { |
|
76380
68f9ad6a3b13
Issue #14592: A relative import will raise a KeyError if __package__
Brett Cannon <brett@python.org>
parents:
76379
diff
changeset
|
1572 package = _PyDict_GetItemId(globals, &PyId___name__); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1573 if (package == NULL) { |
|
76380
68f9ad6a3b13
Issue #14592: A relative import will raise a KeyError if __package__
Brett Cannon <brett@python.org>
parents:
76379
diff
changeset
|
1574 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1575 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1576 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1577 else if (!PyUnicode_Check(package)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1578 PyErr_SetString(PyExc_TypeError, "__name__ must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1579 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1580 Py_INCREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1581 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1582 if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) { |
| 76304 | 1583 PyObject *partition = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1584 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1585 if (borrowed_dot == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1586 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1587 } |
| 76304 | 1588 partition = PyUnicode_RPartition(package, borrowed_dot); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1589 Py_DECREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1590 if (partition == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1591 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1592 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1593 package = PyTuple_GET_ITEM(partition, 0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1594 Py_INCREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1595 Py_DECREF(partition); |
|
68725
7c67aa3ab531
Issue #3080: Use Unicode for the "The Magnum Opus of dotted-name import"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68724
diff
changeset
|
1596 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1597 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1598 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1599 if (PyDict_GetItem(interp->modules, package) == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1600 PyErr_Format(PyExc_SystemError, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1601 "Parent module %R not loaded, cannot perform relative " |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1602 "import", package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1603 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1604 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1605 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1606 else { /* level == 0 */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1607 if (PyUnicode_GET_LENGTH(name) == 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1608 PyErr_SetString(PyExc_ValueError, "Empty module name"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1609 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1610 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1611 package = Py_None; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1612 Py_INCREF(package); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1613 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1614 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1615 if (level > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1616 Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1617 PyObject *base = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1618 int level_up = 1; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1619 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1620 for (level_up = 1; level_up < level; level_up += 1) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1621 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1622 if (last_dot == -2) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1623 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1624 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1625 else if (last_dot == -1) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1626 PyErr_SetString(PyExc_ValueError, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1627 "attempted relative import beyond top-level " |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1628 "package"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1629 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1630 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1631 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1632 base = PyUnicode_Substring(package, 0, last_dot); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1633 if (PyUnicode_GET_LENGTH(name) > 0) { |
| 76361 | 1634 PyObject *borrowed_dot, *seq = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1635 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1636 borrowed_dot = _PyUnicode_FromId(&single_dot); |
| 76361 | 1637 seq = PyTuple_Pack(2, base, name); |
| 1638 Py_DECREF(base); | |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1639 if (borrowed_dot == NULL || seq == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1640 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1641 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1642 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1643 abs_name = PyUnicode_Join(borrowed_dot, seq); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1644 Py_DECREF(seq); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1645 if (abs_name == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1646 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1647 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1648 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1649 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1650 abs_name = base; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1651 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1652 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1653 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1654 abs_name = name; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1655 Py_INCREF(abs_name); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1656 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1657 |
| 76307 | 1658 #ifdef WITH_THREAD |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1659 _PyImport_AcquireLock(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1660 #endif |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1661 /* From this point forward, goto error_with_unlock! */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1662 if (PyDict_Check(globals)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1663 builtins_import = _PyDict_GetItemId(globals, &PyId___import__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1664 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1665 if (builtins_import == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1666 builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1667 if (builtins_import == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1668 Py_FatalError("__import__ missing"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1669 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1670 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1671 Py_INCREF(builtins_import); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1672 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1673 mod = PyDict_GetItem(interp->modules, abs_name); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1674 if (mod == Py_None) { |
|
76328
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1675 PyObject *msg = PyUnicode_FromFormat("import of %R halted; " |
|
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1676 "None in sys.modules", abs_name); |
|
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1677 if (msg != NULL) { |
|
76379
7a32b9380ffd
Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents:
76371
diff
changeset
|
1678 PyErr_SetImportError(msg, abs_name, NULL); |
|
7a32b9380ffd
Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents:
76371
diff
changeset
|
1679 Py_DECREF(msg); |
|
76328
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1680 } |
|
76358
feeb1ca9e93c
Fix reference loss on Py_None when None is encountered in sys.modules.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76342
diff
changeset
|
1681 mod = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1682 goto error_with_unlock; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1683 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1684 else if (mod != NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1685 Py_INCREF(mod); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1686 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1687 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1688 mod = _PyObject_CallMethodObjIdArgs(interp->importlib, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1689 &PyId__find_and_load, abs_name, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1690 builtins_import, NULL); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1691 if (mod == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1692 goto error_with_unlock; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1693 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1694 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1695 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1696 if (PyObject_Not(fromlist)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1697 if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1698 PyObject *front = NULL; |
| 76307 | 1699 PyObject *partition = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1700 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1701 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1702 if (borrowed_dot == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1703 goto error_with_unlock; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1704 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1705 |
| 76307 | 1706 partition = PyUnicode_Partition(name, borrowed_dot); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1707 if (partition == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1708 goto error_with_unlock; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1709 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1710 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1711 front = PyTuple_GET_ITEM(partition, 0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1712 Py_INCREF(front); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1713 Py_DECREF(partition); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1714 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1715 if (level == 0) { |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1716 final_mod = PyDict_GetItem(interp->modules, front); |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1717 Py_DECREF(front); |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1718 if (final_mod == NULL) { |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1719 PyErr_Format(PyExc_KeyError, |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1720 "%R not in sys.modules as expected", front); |
|
76329
005fd1fe31ab
Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents:
76328
diff
changeset
|
1721 } |
|
005fd1fe31ab
Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents:
76328
diff
changeset
|
1722 else { |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76381
diff
changeset
|
1723 Py_INCREF(final_mod); |
|
76329
005fd1fe31ab
Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents:
76328
diff
changeset
|
1724 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1725 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1726 else { |
| 76362 | 1727 Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) - |
| 1728 PyUnicode_GET_LENGTH(front); | |
| 1729 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name); | |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1730 PyObject *to_return = PyUnicode_Substring(abs_name, 0, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1731 abs_name_len - cut_off); |
| 76362 | 1732 Py_DECREF(front); |
| 1733 if (to_return == NULL) { | |
| 1734 goto error_with_unlock; | |
| 1735 } | |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1736 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1737 final_mod = PyDict_GetItem(interp->modules, to_return); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1738 Py_DECREF(to_return); |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1739 if (final_mod == NULL) { |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1740 PyErr_Format(PyExc_KeyError, |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1741 "%R not in sys.modules as expected", |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1742 to_return); |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1743 } |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1744 else { |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1745 Py_INCREF(final_mod); |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1746 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1747 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1748 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1749 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1750 final_mod = mod; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1751 Py_INCREF(mod); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1752 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1753 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1754 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1755 final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1756 &PyId__handle_fromlist, mod, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1757 fromlist, builtins_import, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1758 NULL); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1759 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1760 error_with_unlock: |
| 76307 | 1761 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1762 if (_PyImport_ReleaseLock() < 0) { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1763 PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1764 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1765 #endif |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1766 error: |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1767 Py_XDECREF(abs_name); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1768 Py_XDECREF(builtins_import); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1769 Py_XDECREF(mod); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1770 Py_XDECREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1771 Py_XDECREF(globals); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1772 Py_XDECREF(fromlist); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1773 return final_mod; |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
1774 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
1775 |
|
68739
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1776 PyObject * |
|
70374
a9126e8770e5
make PyImport_ImportModuleLevel's first arg const like similiar functions (closes #12173)
Benjamin Peterson <benjamin@python.org>
parents:
69463
diff
changeset
|
1777 PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, |
|
68739
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1778 PyObject *fromlist, int level) |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1779 { |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1780 PyObject *nameobj, *mod; |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1781 nameobj = PyUnicode_FromString(name); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1782 if (nameobj == NULL) |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1783 return NULL; |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1784 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals, |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1785 fromlist, level); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1786 Py_DECREF(nameobj); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1787 return mod; |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1788 } |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1789 |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1790 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1791 /* Re-import a module of any kind and return its module object, WITH |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1792 INCREMENTED REFERENCE COUNT */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1793 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1794 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1795 PyImport_ReloadModule(PyObject *m) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1796 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1797 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1798 PyObject *modules_reloading = interp->modules_reloading; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1799 PyObject *modules = PyImport_GetModuleDict(); |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1800 PyObject *loader = NULL, *existing_m = NULL; |
|
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1801 PyObject *name; |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1802 Py_ssize_t subname_start; |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1803 PyObject *newm = NULL; |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1804 _Py_IDENTIFIER(__loader__); |
|
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1805 _Py_IDENTIFIER(load_module); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1806 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1807 if (modules_reloading == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1808 Py_FatalError("PyImport_ReloadModule: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1809 "no modules_reloading dictionary!"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1810 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1811 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1812 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1813 if (m == NULL || !PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1814 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1815 "reload() argument must be module"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1816 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1817 } |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1818 name = PyModule_GetNameObject(m); |
|
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1819 if (name == NULL || PyUnicode_READY(name) == -1) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1820 return NULL; |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1821 if (m != PyDict_GetItem(modules, name)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1822 PyErr_Format(PyExc_ImportError, |
|
68738
c4361bab6914
Issue #3080: Use repr() to format the module name on error
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68737
diff
changeset
|
1823 "reload(): module %R not in sys.modules", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1824 name); |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1825 Py_DECREF(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1826 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1827 } |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1828 existing_m = PyDict_GetItem(modules_reloading, name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1829 if (existing_m != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1830 /* Due to a recursive reload, this module is already |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1831 being reloaded. */ |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1832 Py_DECREF(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1833 Py_INCREF(existing_m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1834 return existing_m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1835 } |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1836 if (PyDict_SetItem(modules_reloading, name, m) < 0) { |
|
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1837 Py_DECREF(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1838 return NULL; |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1839 } |
|
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1840 |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1841 subname_start = PyUnicode_FindChar(name, '.', 0, |
|
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1842 PyUnicode_GET_LENGTH(name), -1); |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1843 if (subname_start != -1) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1844 PyObject *parentname, *parent; |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1845 parentname = PyUnicode_Substring(name, 0, subname_start); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1846 if (parentname == NULL) { |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1847 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1848 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1849 parent = PyDict_GetItem(modules, parentname); |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1850 Py_XDECREF(parent); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1851 if (parent == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1852 PyErr_Format(PyExc_ImportError, |
|
68738
c4361bab6914
Issue #3080: Use repr() to format the module name on error
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68737
diff
changeset
|
1853 "reload(): parent %R not in sys.modules", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1854 parentname); |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1855 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1856 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1857 } |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1858 |
|
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1859 loader = _PyObject_GetAttrId(m, &PyId___loader__); |
|
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1860 if (loader == NULL) { |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1861 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1862 } |
|
76333
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1863 newm = _PyObject_CallMethodId(loader, &PyId_load_module, "O", name); |
|
4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1864 Py_DECREF(loader); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1865 if (newm == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1866 /* load_module probably removed name from modules because of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1867 * the error. Put back the original module object. We're |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1868 * going to return NULL in this case regardless of whether |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1869 * replacing name succeeds, so the return value is ignored. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1870 */ |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1871 PyDict_SetItem(modules, name, m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1872 } |
|
68729
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1873 |
|
156818529636
Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68728
diff
changeset
|
1874 error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1875 imp_modules_reloading_clear(); |
|
73198
a938d0258abe
Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents:
73110
diff
changeset
|
1876 Py_DECREF(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1877 return newm; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1878 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1879 |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1880 |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1881 /* Higher-level import emulator which emulates the "import" statement |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1882 more accurately -- it invokes the __import__() function from the |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1883 builtins of the current globals. This means that the import is |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1884 done using whatever import hooks are installed in the current |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1885 environment. |
|
9680
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
1886 A dummy list ["__doc__"] is passed as the 4th argument so that |
|
42862
ed1594a16bdb
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42859
diff
changeset
|
1887 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache")) |
|
9680
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
1888 will return <module "gencache"> instead of <module "win32com">. */ |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1889 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1890 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1891 PyImport_Import(PyObject *module_name) |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1892 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1893 static PyObject *silly_list = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1894 static PyObject *builtins_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1895 static PyObject *import_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1896 PyObject *globals = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1897 PyObject *import = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1898 PyObject *builtins = NULL; |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1899 PyObject *modules = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1900 PyObject *r = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1901 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1902 /* Initialize constant string objects */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1903 if (silly_list == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1904 import_str = PyUnicode_InternFromString("__import__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1905 if (import_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1906 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1907 builtins_str = PyUnicode_InternFromString("__builtins__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1908 if (builtins_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1909 return NULL; |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1910 silly_list = PyList_New(0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1911 if (silly_list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1912 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1913 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1914 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1915 /* Get the builtins from current globals */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1916 globals = PyEval_GetGlobals(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1917 if (globals != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1918 Py_INCREF(globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1919 builtins = PyObject_GetItem(globals, builtins_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1920 if (builtins == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1921 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1922 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1923 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1924 /* No globals -- use standard builtins, and fake globals */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1925 builtins = PyImport_ImportModuleLevel("builtins", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1926 NULL, NULL, NULL, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1927 if (builtins == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1928 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1929 globals = Py_BuildValue("{OO}", builtins_str, builtins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1930 if (globals == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1931 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1932 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1933 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1934 /* Get the __import__ function from the builtins */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1935 if (PyDict_Check(builtins)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1936 import = PyObject_GetItem(builtins, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1937 if (import == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1938 PyErr_SetObject(PyExc_KeyError, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1939 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1940 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1941 import = PyObject_GetAttr(builtins, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1942 if (import == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1943 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1944 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1945 /* Call the __import__ function with the proper argument list |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1946 Always use absolute import here. |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1947 Calling for side-effect of import. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1948 r = PyObject_CallFunction(import, "OOOOi", module_name, globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1949 globals, silly_list, 0, NULL); |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1950 if (r == NULL) |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1951 goto err; |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1952 Py_DECREF(r); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1953 |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1954 modules = PyImport_GetModuleDict(); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1955 r = PyDict_GetItem(modules, module_name); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1956 if (r != NULL) |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1957 Py_INCREF(r); |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1958 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1959 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1960 Py_XDECREF(globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1961 Py_XDECREF(builtins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1962 Py_XDECREF(import); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1963 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1964 return r; |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1965 } |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1966 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1967 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1968 /* Module 'imp' provides Python access to the primitives used for |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1969 importing modules. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1970 */ |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1971 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1972 static PyObject * |
| 60648 | 1973 imp_make_magic(long magic) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1974 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1975 char buf[4]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1976 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1977 buf[0] = (char) ((magic >> 0) & 0xff); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1978 buf[1] = (char) ((magic >> 8) & 0xff); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1979 buf[2] = (char) ((magic >> 16) & 0xff); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1980 buf[3] = (char) ((magic >> 24) & 0xff); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1981 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1982 return PyBytes_FromStringAndSize(buf, 4); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1983 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1984 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1985 static PyObject * |
| 60648 | 1986 imp_get_magic(PyObject *self, PyObject *noargs) |
| 1987 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1988 return imp_make_magic(pyc_magic); |
| 60648 | 1989 } |
| 1990 | |
| 1991 static PyObject * | |
| 1992 imp_get_tag(PyObject *self, PyObject *noargs) | |
| 1993 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
1994 return PyUnicode_FromString(pyc_tag); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1995 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1996 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1997 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
1998 imp_get_suffixes(PyObject *self, PyObject *noargs) |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1999 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2000 PyObject *list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2001 struct filedescr *fdp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2002 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2003 list = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2004 if (list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2005 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2006 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2007 PyObject *item = Py_BuildValue("ssi", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2008 fdp->suffix, fdp->mode, fdp->type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2009 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2010 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2011 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2012 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2013 if (PyList_Append(list, item) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2014 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2015 Py_DECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2016 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2017 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2018 Py_DECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2019 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2020 return list; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2021 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2022 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2023 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2024 imp_init_builtin(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2025 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
2026 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2027 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2028 PyObject *m; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
2029 if (!PyArg_ParseTuple(args, "U:init_builtin", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2030 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2031 ret = init_builtin(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2032 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2033 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2034 if (ret == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2035 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2036 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2037 } |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
2038 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2039 Py_XINCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2040 return m; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2041 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2042 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2043 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2044 imp_init_frozen(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2045 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2046 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2047 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2048 PyObject *m; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2049 if (!PyArg_ParseTuple(args, "U:init_frozen", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2050 return NULL; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2051 ret = PyImport_ImportFrozenModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2052 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2053 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2054 if (ret == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2055 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2056 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2057 } |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2058 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2059 Py_XINCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2060 return m; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2061 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2062 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2063 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2064 imp_get_frozen_object(PyObject *self, PyObject *args) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
2065 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2066 PyObject *name; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2067 |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2068 if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2069 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2070 return get_frozen_object(name); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
2071 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
2072 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2073 static PyObject * |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
2074 imp_is_frozen_package(PyObject *self, PyObject *args) |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
2075 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2076 PyObject *name; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2077 |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2078 if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2079 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2080 return is_frozen_package(name); |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
2081 } |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
2082 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
2083 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2084 imp_is_builtin(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2085 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
2086 PyObject *name; |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
2087 if (!PyArg_ParseTuple(args, "U:is_builtin", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2088 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2089 return PyLong_FromLong(is_builtin(name)); |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2090 } |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2091 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2092 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2093 imp_is_frozen(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2094 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2095 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2096 struct _frozen *p; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
2097 if (!PyArg_ParseTuple(args, "U:is_frozen", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2098 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2099 p = find_frozen(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2100 return PyBool_FromLong((long) (p == NULL ? 0 : p->size)); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2101 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2102 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2103 static FILE * |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
2104 get_file(PyObject *pathname, PyObject *fob, char *mode) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2105 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2106 FILE *fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2107 if (mode[0] == 'U') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2108 mode = "r" PY_STDIOTEXTMODE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2109 if (fob == NULL) { |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
2110 fp = _Py_fopen(pathname, mode); |
|
74060
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2111 if (!fp) { |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2112 if (!PyErr_Occurred()) |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2113 PyErr_SetFromErrno(PyExc_IOError); |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2114 return NULL; |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2115 } |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2116 return fp; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2117 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2118 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2119 int fd = PyObject_AsFileDescriptor(fob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2120 if (fd == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2121 return NULL; |
|
74060
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2122 if (!_PyVerify_fd(fd)) { |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2123 PyErr_SetFromErrno(PyExc_IOError); |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2124 return NULL; |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2125 } |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2126 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2127 /* the FILE struct gets a new fd, so that it can be closed |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2128 * independently of the file descriptor given |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2129 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2130 fd = dup(fd); |
|
74060
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2131 if (fd == -1) { |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2132 PyErr_SetFromErrno(PyExc_IOError); |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2133 return NULL; |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2134 } |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2135 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2136 fp = fdopen(fd, mode); |
|
74060
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2137 if (!fp) { |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2138 PyErr_SetFromErrno(PyExc_IOError); |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2139 return NULL; |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2140 } |
|
f44ab94cd28b
(Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents:
74058
diff
changeset
|
2141 return fp; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2142 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2143 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2144 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2145 #ifdef HAVE_DYNAMIC_LOADING |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2146 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2147 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2148 imp_load_dynamic(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2149 { |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2150 PyObject *name, *pathname, *fob = NULL, *mod; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2151 FILE *fp; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2152 |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2153 if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic", |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2154 &name, PyUnicode_FSDecoder, &pathname, &fob)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2155 return NULL; |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2156 if (fob != NULL) { |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2157 fp = get_file(NULL, fob, "r"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2158 if (fp == NULL) { |
|
68826
3114f26d5d54
Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68823
diff
changeset
|
2159 Py_DECREF(pathname); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2160 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2161 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2162 } |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2163 else |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2164 fp = NULL; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2165 mod = _PyImport_LoadDynamicModule(name, pathname, fp); |
|
68826
3114f26d5d54
Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68823
diff
changeset
|
2166 Py_DECREF(pathname); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2167 if (fp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2168 fclose(fp); |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
2169 return mod; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2170 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2171 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2172 #endif /* HAVE_DYNAMIC_LOADING */ |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2173 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2174 static PyObject * |
|
44567
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2175 imp_reload(PyObject *self, PyObject *v) |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2176 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2177 return PyImport_ReloadModule(v); |
|
44567
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2178 } |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2179 |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2180 PyDoc_STRVAR(doc_reload, |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2181 "reload(module) -> module\n\ |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2182 \n\ |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2183 Reload the module. The module must have been successfully imported before."); |
|
cdc285bd0efb
Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents:
44441
diff
changeset
|
2184 |
| 60648 | 2185 |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2186 /* Doc strings */ |
|
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2187 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2188 PyDoc_STRVAR(doc_imp, |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76329
diff
changeset
|
2189 "(Extremely) low-level import machinery bits as used by importlib and imp."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2190 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2191 PyDoc_STRVAR(doc_get_magic, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2192 "get_magic() -> string\n\ |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2193 Return the magic number for .pyc or .pyo files."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2194 |
| 60648 | 2195 PyDoc_STRVAR(doc_get_tag, |
| 2196 "get_tag() -> string\n\ | |
| 2197 Return the magic tag for .pyc or .pyo files."); | |
| 2198 | |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2199 PyDoc_STRVAR(doc_get_suffixes, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2200 "get_suffixes() -> [(suffix, mode, type), ...]\n\ |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2201 Return a list of (suffix, mode, type) tuples describing the files\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2202 that find_module() looks for."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
2203 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
2204 PyDoc_STRVAR(doc_lock_held, |
|
32879
d3d609d657fd
lock_held() docs: Use True/False instead of 1/0. The LaTeX docs were
Tim Peters <tim.peters@gmail.com>
parents:
32878
diff
changeset
|
2205 "lock_held() -> boolean\n\ |
|
d3d609d657fd
lock_held() docs: Use True/False instead of 1/0. The LaTeX docs were
Tim Peters <tim.peters@gmail.com>
parents:
32878
diff
changeset
|
2206 Return True if the import lock is currently held, else False.\n\ |
|
d3d609d657fd
lock_held() docs: Use True/False instead of 1/0. The LaTeX docs were
Tim Peters <tim.peters@gmail.com>
parents:
32878
diff
changeset
|
2207 On platforms without threads, return False."); |
|
19596
1be18ef869a4
Add a new function imp.lock_held(), and use it to skip test_threaded_import
Tim Peters <tim.peters@gmail.com>
parents:
19238
diff
changeset
|
2208 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2209 PyDoc_STRVAR(doc_acquire_lock, |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2210 "acquire_lock() -> None\n\ |
|
27853
5620b0786271
Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents:
27852
diff
changeset
|
2211 Acquires the interpreter's import lock for the current thread.\n\ |
|
5620b0786271
Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents:
27852
diff
changeset
|
2212 This lock should be used by import hooks to ensure thread-safety\n\ |
|
5620b0786271
Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents:
27852
diff
changeset
|
2213 when importing modules.\n\ |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2214 On platforms without threads, this function does nothing."); |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2215 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2216 PyDoc_STRVAR(doc_release_lock, |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2217 "release_lock() -> None\n\ |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2218 Release the interpreter's import lock.\n\ |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2219 On platforms without threads, this function does nothing."); |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
2220 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2221 static PyMethodDef imp_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2222 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
2223 {"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2224 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2225 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2226 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2227 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2228 {"reload", imp_reload, METH_O, doc_reload}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2229 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2230 {"is_frozen_package", imp_is_frozen_package, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2231 {"init_builtin", imp_init_builtin, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2232 {"init_frozen", imp_init_frozen, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2233 {"is_builtin", imp_is_builtin, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2234 {"is_frozen", imp_is_frozen, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2235 #ifdef HAVE_DYNAMIC_LOADING |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2236 {"load_dynamic", imp_load_dynamic, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2237 #endif |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
2238 {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2239 {NULL, NULL} /* sentinel */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2240 }; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2241 |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8613
diff
changeset
|
2242 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2243 setint(PyObject *d, char *name, int value) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2244 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2245 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2246 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2247 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2248 v = PyLong_FromLong((long)value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2249 err = PyDict_SetItemString(d, name, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2250 Py_XDECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2251 return err; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2252 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2253 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2254 typedef struct { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2255 PyObject_HEAD |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2256 } NullImporter; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2257 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2258 static int |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2259 NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2260 { |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2261 #ifndef MS_WINDOWS |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2262 PyObject *path; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2263 struct stat statbuf; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2264 int rv; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2265 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2266 if (!_PyArg_NoKeywords("NullImporter()", kwds)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2267 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2268 |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2269 if (!PyArg_ParseTuple(args, "O&:NullImporter", |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2270 PyUnicode_FSConverter, &path)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2271 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2272 |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2273 if (PyBytes_GET_SIZE(path) == 0) { |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2274 Py_DECREF(path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2275 PyErr_SetString(PyExc_ImportError, "empty pathname"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2276 return -1; |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2277 } |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2278 |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2279 rv = stat(PyBytes_AS_STRING(path), &statbuf); |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2280 Py_DECREF(path); |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2281 if (rv == 0) { |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2282 /* it exists */ |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2283 if (S_ISDIR(statbuf.st_mode)) { |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2284 /* it's a directory */ |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2285 PyErr_SetString(PyExc_ImportError, "existing directory"); |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2286 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2287 } |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2288 } |
|
50991
a823c9f3a452
Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
50619
diff
changeset
|
2289 #else /* MS_WINDOWS */ |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2290 PyObject *pathobj; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2291 DWORD rv; |
|
65008
c620fe87c703
Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64838
diff
changeset
|
2292 wchar_t *path; |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2293 |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2294 if (!_PyArg_NoKeywords("NullImporter()", kwds)) |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2295 return -1; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2296 |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2297 if (!PyArg_ParseTuple(args, "U:NullImporter", |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2298 &pathobj)) |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2299 return -1; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2300 |
| 72475 | 2301 if (PyUnicode_GET_LENGTH(pathobj) == 0) { |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2302 PyErr_SetString(PyExc_ImportError, "empty pathname"); |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2303 return -1; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2304 } |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2305 |
|
65157
e3ae5b00ba15
PyUnicode_AsWideCharString() takes a PyObject*, not a PyUnicodeObject*
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65027
diff
changeset
|
2306 path = PyUnicode_AsWideCharString(pathobj, NULL); |
|
65008
c620fe87c703
Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64838
diff
changeset
|
2307 if (path == NULL) |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2308 return -1; |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2309 /* see issue1293 and issue3677: |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2310 * stat() on Windows doesn't recognise paths like |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2311 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs. |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2312 */ |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2313 rv = GetFileAttributesW(path); |
|
65008
c620fe87c703
Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64838
diff
changeset
|
2314 PyMem_Free(path); |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2315 if (rv != INVALID_FILE_ATTRIBUTES) { |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2316 /* it exists */ |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2317 if (rv & FILE_ATTRIBUTE_DIRECTORY) { |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2318 /* it's a directory */ |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2319 PyErr_SetString(PyExc_ImportError, "existing directory"); |
|
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2320 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2321 } |
|
63945
03e884fac4db
Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63857
diff
changeset
|
2322 } |
|
50991
a823c9f3a452
Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents:
50619
diff
changeset
|
2323 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2324 return 0; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2325 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2326 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2327 static PyObject * |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2328 NullImporter_find_module(NullImporter *self, PyObject *args) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2329 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2330 Py_RETURN_NONE; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2331 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2332 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2333 static PyMethodDef NullImporter_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2334 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2335 "Always return None" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2336 }, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2337 {NULL} /* Sentinel */ |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2338 }; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2339 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2340 |
|
43897
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
2341 PyTypeObject PyNullImporter_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2342 PyVarObject_HEAD_INIT(NULL, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2343 "imp.NullImporter", /*tp_name*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2344 sizeof(NullImporter), /*tp_basicsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2345 0, /*tp_itemsize*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2346 0, /*tp_dealloc*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2347 0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2348 0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2349 0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2350 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2351 0, /*tp_repr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2352 0, /*tp_as_number*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2353 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2354 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2355 0, /*tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2356 0, /*tp_call*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2357 0, /*tp_str*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2358 0, /*tp_getattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2359 0, /*tp_setattro*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2360 0, /*tp_as_buffer*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2361 Py_TPFLAGS_DEFAULT, /*tp_flags*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2362 "Null importer object", /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2363 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2364 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2365 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2366 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2367 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2368 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2369 NullImporter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2370 0, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2371 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2372 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2373 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2374 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2375 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2376 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2377 (initproc)NullImporter_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2378 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2379 PyType_GenericNew /* tp_new */ |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2380 }; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2381 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
2382 static struct PyModuleDef impmodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2383 PyModuleDef_HEAD_INIT, |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76329
diff
changeset
|
2384 "_imp", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2385 doc_imp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2386 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2387 imp_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2388 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2389 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2390 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2391 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
2392 }; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
2393 |
|
30311
f003e48f562d
Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents:
29812
diff
changeset
|
2394 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
2395 PyInit_imp(void) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2396 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2397 PyObject *m, *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2398 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2399 if (PyType_Ready(&PyNullImporter_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2400 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2401 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2402 m = PyModule_Create(&impmodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2403 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2404 goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2405 d = PyModule_GetDict(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2406 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2407 goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2408 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2409 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2410 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2411 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2412 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2413 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2414 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2415 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2416 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2417 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2418 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2419 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2420 Py_INCREF(&PyNullImporter_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2421 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2422 return m; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2423 failure: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2424 Py_XDECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2425 return NULL; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2426 } |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2427 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2428 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
2429 /* API for embedding applications that want to add their own entries |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
2430 to the table of built-in modules. This should normally be called |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
2431 *before* Py_Initialize(). When the table resize fails, -1 is |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
2432 returned and the existing table is unchanged. |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2433 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2434 After a similar function by Just van Rossum. */ |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2435 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2436 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2437 PyImport_ExtendInittab(struct _inittab *newtab) |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2438 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2439 static struct _inittab *our_copy = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2440 struct _inittab *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2441 int i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2442 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2443 /* Count the number of entries in both tables */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2444 for (n = 0; newtab[n].name != NULL; n++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2445 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2446 if (n == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2447 return 0; /* Nothing to do */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2448 for (i = 0; PyImport_Inittab[i].name != NULL; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2449 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2450 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2451 /* Allocate new memory for the combined table */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2452 p = our_copy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2453 PyMem_RESIZE(p, struct _inittab, i+n+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2454 if (p == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2455 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2456 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2457 /* Copy the tables into the new memory */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2458 if (our_copy != PyImport_Inittab) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2459 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2460 PyImport_Inittab = our_copy = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2461 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2462 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2463 return 0; |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2464 } |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2465 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2466 /* Shorthand to add a single entry given a name and a function */ |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2467 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2468 int |
|
52721
54e093bd887e
Merged revisions 71031 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents:
52547
diff
changeset
|
2469 PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void)) |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2470 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2471 struct _inittab newtab[2]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2472 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2473 memset(newtab, '\0', sizeof newtab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2474 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2475 newtab[0].name = (char *)name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2476 newtab[0].initfunc = initfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2477 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
2478 return PyImport_ExtendInittab(newtab); |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
2479 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
2480 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
2481 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
2482 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
2483 #endif |
