annotate Python/import.c @ 76329:005fd1fe31ab

Issue #14582: Import returns the module returned by a loader instead of sys.modules when possible. This is being done for two reasons. One is to gain a little bit of performance by skipping an unnecessary dict lookup in sys.modules. But the other (and main) reason is to be a little bit more clear in how things should work from the perspective of import's interactions with loaders. Otherwise loaders can easily forget to return the module even though PEP 302 explicitly states they are expected to return the module they loaded.
author Brett Cannon <brett@python.org>
date Sun, 15 Apr 2012 15:24:04 -0400
parents c9fb9f5e16e7
children d777f854a66e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Module definition and import implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
44 Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
45 number also includes a new "magic tag", i.e. a human readable string used
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
46 to represent the magic number in __pycache__ directories. When you change
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
47 the magic number, you must also set a new unique magic tag. Generally this
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
48 can be named after the Python major version of the magic number bump, but
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
49 it can really be anything, as long as it's different than anything else
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
50 that's come before. The tags are included in the following table, starting
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
51 with Python 3.2a0.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
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
cf5928fab108 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 24071
diff changeset
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
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34961
diff changeset
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
f7727fc043a9 fix comment
Benjamin Peterson <benjamin@python.org>
parents: 75714
diff changeset
107 3210 (added size modulo 2**32 to the pyc header)
f7727fc043a9 fix comment
Benjamin Peterson <benjamin@python.org>
parents: 75714
diff changeset
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
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
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
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
123 #define CACHEDIR "__pycache__"
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
124 /* Current magic word and string tag as globals. */
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
125 static long pyc_magic = MAGIC;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
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
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
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;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72866
diff changeset
156 _Py_IDENTIFIER(__path__);
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
157
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
158 /* Initialize things */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
159
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
160 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
161 _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
162 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
163 const struct filedescr *scan;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
164 struct filedescr *filetab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
165 int countD = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
166 int countS = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
167
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
168 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
169 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
170 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
171
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
172 /* prepare _PyImport_Filetab: copy entries from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
173 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
174 */
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
175 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
176 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
177 ++countD;
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
178 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
179 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
180 ++countS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
181 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
182 if (filetab == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
183 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
184 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
185 memcpy(filetab, _PyImport_DynLoadFiletab,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
186 countD * sizeof(struct filedescr));
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
187 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
188 memcpy(filetab + countD, _PyImport_StandardFiletab,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
189 countS * sizeof(struct filedescr));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
190 filetab[countD + countS].suffix = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
191
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
192 _PyImport_Filetab = filetab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
193
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
194 if (Py_OptimizeFlag) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
195 /* 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
196 for (; filetab->suffix != NULL; filetab++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
197 if (strcmp(filetab->suffix, ".pyc") == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
198 filetab->suffix = ".pyo";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
199 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
200 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
201 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
202
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
203 void
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
204 _PyImportHooks_Init(void)
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
205 {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
206 PyObject *v, *path_hooks = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
207 int err = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
208
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
209 if (PyType_Ready(&PyNullImporter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
210 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
211
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
212 /* 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
213 v = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
214 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
215 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
216 err = PySys_SetObject("meta_path", v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
217 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
218 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
219 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
220 v = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
221 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
222 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
223 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
224 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
225 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
226 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
227 path_hooks = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
228 if (path_hooks == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
229 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
230 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
231 if (err) {
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
232 error:
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
233 PyErr_Print();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
234 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
235 "path_importer_cache, or NullImporter failed"
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
236 );
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
237 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
238 Py_DECREF(path_hooks);
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
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
241 void
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
242 _PyImportZip_Init(void)
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
243 {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
244 PyObject *path_hooks, *zimpimport;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
245 int err = 0;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
246
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
247 path_hooks = PySys_GetObject("path_hooks");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
248 if (path_hooks == NULL)
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
249 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
250
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
251 if (Py_VerboseFlag)
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
252 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
253
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
254 zimpimport = PyImport_ImportModule("zipimport");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
255 if (zimpimport == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
256 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
257 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
258 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
259 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
260 else {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72866
diff changeset
261 _Py_IDENTIFIER(zipimporter);
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
262 PyObject *zipimporter = _PyObject_GetAttrId(zimpimport,
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
263 &PyId_zipimporter);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
264 Py_DECREF(zimpimport);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
265 if (zipimporter == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
266 PyErr_Clear(); /* No zipimporter object -- okay */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
267 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
268 PySys_WriteStderr(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
269 "# can't import zipimport.zipimporter\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
270 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
271 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
272 /* sys.path_hooks.append(zipimporter) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
273 err = PyList_Append(path_hooks, zipimporter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
274 Py_DECREF(zipimporter);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
275 if (err < 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
276 goto error;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
277 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
278 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
279 PySys_WriteStderr(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
280 "# installed zipimport hook\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
281 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
282 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
283
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
284 return;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
285
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
286 error:
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
287 PyErr_Print();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
288 Py_FatalError("initializing zipimport or NullImporter failed");
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
289 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
290
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
291 /* 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
292 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
293 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
294
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 #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
296
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 9187
diff changeset
297 #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
298
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
299 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
300 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
301 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
302
56382
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
303 void
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
304 _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
305 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
306 long me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
307 if (me == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
308 return; /* Too bad */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
309 if (import_lock == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
310 import_lock = PyThread_allocate_lock();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
311 if (import_lock == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
312 return; /* Nothing much we can do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
313 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
314 if (import_lock_thread == me) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
315 import_lock_level++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
316 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
317 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
318 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
319 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
320 PyThreadState *tstate = PyEval_SaveThread();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
321 PyThread_acquire_lock(import_lock, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
322 PyEval_RestoreThread(tstate);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
323 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
324 import_lock_thread = me;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
325 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
326 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
327
56382
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
328 int
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
329 _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
330 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
331 long me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
332 if (me == -1 || import_lock == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
333 return 0; /* Too bad */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
334 if (import_lock_thread != me)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
335 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
336 import_lock_level--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
337 if (import_lock_level == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
338 import_lock_thread = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
339 PyThread_release_lock(import_lock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
340 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
341 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
342 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
343
59235
58c35495a934 Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 59213
diff changeset
344 /* 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
345 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
346 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
347 (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
348
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 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 _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
351 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
352 if (import_lock != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
353 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
354 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
355 /* 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
356 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
357 PyThread_acquire_lock(import_lock, 0);
68708
a9d6c7e15456 import.c: replace tab by spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68258
diff changeset
358 /* 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
359 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
360 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
361 } 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
362 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
363 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
364 }
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
365 }
724bbd489ad4 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 35542
diff changeset
366
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
367 #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
368
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
369 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
370 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
371 {
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
372 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
373 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
374 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
375 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
376 #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
377 }
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
378
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
379 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
380 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
381 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
382 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
383 _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
384 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
385 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
386 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
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
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
389 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
390 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
391 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
392 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
393 if (_PyImport_ReleaseLock() < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
394 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
395 "not holding the import lock");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
396 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
397 }
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
398 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
399 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
400 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
401 }
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
402
73205
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
403 void
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
404 _PyImport_Fini(void)
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
405 {
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
406 Py_XDECREF(extensions);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
407 extensions = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
408 PyMem_DEL(_PyImport_Filetab);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
409 _PyImport_Filetab = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
410 #ifdef WITH_THREAD
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
411 if (import_lock != NULL) {
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
412 PyThread_free_lock(import_lock);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
413 import_lock = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
414 }
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
415 #endif
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
416 }
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
417
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
418 static void
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
419 imp_modules_reloading_clear(void)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
420 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
421 PyInterpreterState *interp = PyThreadState_Get()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
422 if (interp->modules_reloading != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
423 PyDict_Clear(interp->modules_reloading);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
424 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
425
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
426 /* Helper for sys */
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
427
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
428 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
429 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
430 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
431 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
432 if (interp->modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
433 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
434 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
435 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
436
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
437
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
438 /* 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
439 static char* sys_deletes[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
440 "path", "argv", "ps1", "ps2",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
441 "last_type", "last_value", "last_traceback",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
442 "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
443 /* misc stuff */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
444 "flags", "float_info",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
445 NULL
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
446 };
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
447
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
448 static char* sys_files[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
449 "stdin", "__stdin__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
450 "stdout", "__stdout__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
451 "stderr", "__stderr__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
452 NULL
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
453 };
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
454
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
455
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
456 /* Un-initialize things, as good as we can */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
457
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
458 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
459 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
460 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
461 Py_ssize_t pos, ndone;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
462 PyObject *key, *value, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
463 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
464 PyObject *modules = interp->modules;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
465
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
466 if (modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
467 return; /* Already done */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
468
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
469 /* 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
470 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
471 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
472 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
473 destruction order. Sigh. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
474
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
475 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
476 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
477 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
478 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
479 PySys_WriteStderr("# clear builtins._\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
480 PyDict_SetItemString(dict, "_", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
481 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
482 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
483 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
484 char **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
485 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
486 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
487 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
488 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
489 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
490 PyDict_SetItemString(dict, *p, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
491 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
492 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
493 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
494 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
495 v = PyDict_GetItemString(dict, *(p+1));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
496 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
497 v = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
498 PyDict_SetItemString(dict, *p, v);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
502 /* First, delete __main__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
503 value = PyDict_GetItemString(modules, "__main__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
504 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
505 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
506 PySys_WriteStderr("# cleanup __main__\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
507 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
508 PyDict_SetItemString(modules, "__main__", Py_None);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
511 /* 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
512 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
513 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
514 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
515 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
516 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
517 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
518
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
519 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
520 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
521 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
522 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
523 re-imported. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
524
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
525 /* 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
526 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
527 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
528 ndone = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
529 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
530 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
531 if (value->ob_refcnt != 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
532 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
533 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
534 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
535 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
536 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
537 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
538 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
539 PySys_FormatStderr(
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
540 "# cleanup[1] %U\n", key);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
541 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
542 PyDict_SetItem(modules, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
543 ndone++;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
546 } while (ndone > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
547
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
548 /* 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
549 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
550 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
551 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
552 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
553 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
554 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
555 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
556 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
557 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
558 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
559 PyDict_SetItem(modules, key, Py_None);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
563 /* 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
564 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
565 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
566 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
567 PySys_WriteStderr("# cleanup sys\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
568 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
569 PyDict_SetItemString(modules, "sys", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
570 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
571 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
572 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
573 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
574 PySys_WriteStderr("# cleanup builtins\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
575 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
576 PyDict_SetItemString(modules, "builtins", Py_None);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
579 /* 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
580 PyDict_Clear(modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
581 interp->modules = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
582 Py_DECREF(modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
583 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
584 }
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
585
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
586
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
587 /* 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
588
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
589 long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
590 PyImport_GetMagicNumber(void)
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
591 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
592 return pyc_magic;
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
593 }
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
594
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
596 const char *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
597 PyImport_GetMagicTag(void)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
598 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
599 return pyc_tag;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
600 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
601
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
602 /* 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
603 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
604 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
605 (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
606 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
607 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
608 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
609 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
610 _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
611
62385
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
612 Modules which do support multiple initialization set their m_size
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
613 field to a non-negative number (indicating the size of the
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
614 module-specific state). They are still recorded in the extensions
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
615 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
616 */
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
617
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
618 int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
619 _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
620 PyObject *filename)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
622 PyObject *modules, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
623 struct PyModuleDef *def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
624 if (extensions == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
625 extensions = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
626 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
627 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
628 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
629 if (mod == NULL || !PyModule_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
630 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
631 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
632 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
633 def = PyModule_GetDef(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
634 if (!def) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
635 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
636 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
637 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
638 modules = PyImport_GetModuleDict();
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
639 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
640 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
641 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
642 PyDict_DelItem(modules, name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
643 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
644 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
645 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
646 if (def->m_base.m_copy) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
647 /* Somebody already imported the module,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
648 likely under a different name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
649 XXX this should really not happen. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
650 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
651 def->m_base.m_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
652 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
653 dict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
654 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
655 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
656 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
657 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
658 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
659 }
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
660 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
661 return 0;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
662 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
663
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
664 int
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
665 _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
666 {
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
667 int res;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
668 PyObject *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
669 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
670 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
671 return -1;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
672 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
673 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
674 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
675 }
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
676
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
677 PyObject *
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
678 _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
679 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
680 PyObject *mod, *mdict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
681 PyModuleDef* def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
682 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
683 return NULL;
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
684 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
685 if (def == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
686 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
687 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
688 /* Module does not support repeated initialization */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
689 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
690 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
691 mod = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
692 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
693 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
694 mdict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
695 if (mdict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
696 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
697 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
698 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
699 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
700 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
701 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
702 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
703 mod = def->m_base.m_init();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
704 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
705 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
706 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
707 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
708 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
709 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
710 PyDict_DelItem(PyImport_GetModuleDict(), name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
711 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
712 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
713 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
714 if (Py_VerboseFlag)
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
715 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
716 name, filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
717 return mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
718
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
719 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
721 PyObject *
68110
44cc9ef43127 Issue #3080: Mark _PyImport_FindBuiltin() argument as constant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68107
diff changeset
722 _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
723 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
724 PyObject *res, *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
725 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
726 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
727 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
728 res = _PyImport_FindExtensionObject(nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
729 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
730 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
731 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
732
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
733 /* 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
734 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
735 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
736 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
737 '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
738
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
739 PyObject *
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
740 PyImport_AddModuleObject(PyObject *name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
741 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
742 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
743 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
744
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
745 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
746 PyModule_Check(m))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
747 return m;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
748 m = PyModule_NewObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
749 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
750 return NULL;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
751 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
752 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
753 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
754 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
755 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
756
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
757 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
758 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
759
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
760 PyObject *
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
761 PyImport_AddModule(const char *name)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
762 {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
763 PyObject *nameobj, *module;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
764 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
765 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
766 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
767 module = PyImport_AddModuleObject(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
768 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
769 return module;
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
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
772
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
773 /* 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
774 static void
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
775 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
776 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
777 PyObject *modules = PyImport_GetModuleDict();
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
778 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
779 return;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
780 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
781 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
782 "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
783 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
784
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
785 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
786 static PyObject *make_source_pathname(PyObject *pathname);
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
787 static PyObject* make_compiled_pathname(PyObject *pathname, int debug);
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
788
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
789 /* 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
790 * 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
791 * 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
792 * 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
793 * 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
794 * example.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
795 *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
796 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
797 * 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
798 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
799 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
800 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
801 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
802 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
803 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
804 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
805
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
806 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
807 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
808 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
809 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
810 name, co, pathname, (char *)NULL);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
811 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
812
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
813 PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
814 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
815 char *cpathname)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
816 {
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
817 PyObject *m = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
818 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
819
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
820 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
821 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
822 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
823
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
824 if (pathname != NULL) {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
825 pathobj = PyUnicode_DecodeFSDefault(pathname);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
826 if (pathobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
827 goto error;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
828 } else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
829 pathobj = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
830 if (cpathname != NULL) {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
831 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
832 if (cpathobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
833 goto error;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
834 } else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
835 cpathobj = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
836 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
837 error:
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
838 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
839 Py_XDECREF(pathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
840 Py_XDECREF(cpathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
841 return m;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
842 }
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
843
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
844 PyObject*
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
845 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
846 PyObject *cpathname)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
847 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
848 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
849 PyObject *m, *d, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
850
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
851 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
852 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
853 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
854 /* 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
855 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
856 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
857 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
858 if (PyDict_SetItemString(d, "__builtins__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
859 PyEval_GetBuiltins()) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
860 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
861 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
862 /* 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
863 if (pathname != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
864 v = get_sourcefile(pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
865 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
866 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
867 }
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
868 else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
869 v = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
870 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
871 v = ((PyCodeObject *)co)->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
872 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
873 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
874 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
875 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
876 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
877
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
878 /* 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
879 if (cpathname != NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
880 v = cpathname;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
881 else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
882 v = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
883 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
884 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
885
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66650
diff changeset
886 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
887 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
888 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
889 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
890
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
891 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
892 PyErr_Format(PyExc_ImportError,
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
893 "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
894 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
895 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
896 }
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 Py_INCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
899
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
900 return m;
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
901
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
902 error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
903 remove_module(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
904 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
907
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
908 /* Like strrchr(string, '/') but searches for the rightmost of either SEP
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
909 or ALTSEP, if the latter is defined.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
910 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
911 static Py_UCS4*
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
912 rightmost_sep(Py_UCS4 *s)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
913 {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
914 Py_UCS4 *found, c;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
915 for (found = NULL; (c = *s); s++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
916 if (c == SEP
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
917 #ifdef ALTSEP
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
918 || c == ALTSEP
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
919 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
920 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
921 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
922 found = s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
923 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
924 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
925 return found;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
926 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
927
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
928 /* 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
929 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
930 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
931 {
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
932 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
933 Py_UCS4 c;
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
934 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
935 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
936 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
937 #ifdef ALTSEP
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
938 || c == ALTSEP
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
939 #endif
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
940 )
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
941 {
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
942 found = i;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
943 }
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
944 }
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
945 return found;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
946 }
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
947
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
948 /* Given a pathname for a Python source file, fill a buffer with the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
949 pathname for the corresponding compiled file. Return the pathname
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
950 for the compiled file, or NULL if there's no space in the buffer.
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
951 Doesn't set an exception.
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
952
73064
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
953 foo.py -> __pycache__/foo.<tag>.pyc
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
954
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
955 pathstr is assumed to be "ready".
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
956 */
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
957
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
958 static PyObject*
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
959 make_compiled_pathname(PyObject *pathstr, int debug)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
960 {
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
961 PyObject *result;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
962 Py_ssize_t fname, ext, len, i, pos, taglen;
73066
4cfff313ce65 Drop unused macros. Use CACHEDIR consistently.
Martin v. Löwis <martin@v.loewis.de>
parents: 73065
diff changeset
963 Py_ssize_t pycache_len = sizeof(CACHEDIR) - 1;
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
964 int kind;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
965 void *data;
73110
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
966 Py_UCS4 lastsep;
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
967
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
968 /* Compute the output string size. */
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
969 len = PyUnicode_GET_LENGTH(pathstr);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
970 /* If there is no separator, this returns -1, so
73110
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
971 fname will be 0. */
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
972 fname = rightmost_sep_obj(pathstr, 0, len) + 1;
73110
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
973 /* Windows: re-use the last separator character (/ or \\) when
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
974 appending the __pycache__ path. */
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
975 if (fname > 0)
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
976 lastsep = PyUnicode_READ_CHAR(pathstr, fname -1);
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
977 else
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
978 lastsep = SEP;
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
979 ext = fname - 1;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
980 for(i = fname; i < len; i++)
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
981 if (PyUnicode_READ_CHAR(pathstr, i) == '.')
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
982 ext = i + 1;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
983 if (ext < fname)
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
984 /* No dot in filename; use entire filename */
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
985 ext = len;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
986
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
987 /* result = pathstr[:fname] + "__pycache__" + SEP +
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
988 pathstr[fname:ext] + tag + ".py[co]" */
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
989 taglen = strlen(pyc_tag);
73067
17d046568f0c Fix off-by-one error.
Martin v. Löwis <martin@v.loewis.de>
parents: 73066
diff changeset
990 result = PyUnicode_New(ext + pycache_len + 1 + taglen + 4,
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
991 PyUnicode_MAX_CHAR_VALUE(pathstr));
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
992 if (!result)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
993 return NULL;
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
994 kind = PyUnicode_KIND(result);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
995 data = PyUnicode_DATA(result);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
996 PyUnicode_CopyCharacters(result, 0, pathstr, 0, fname);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
997 pos = fname;
73067
17d046568f0c Fix off-by-one error.
Martin v. Löwis <martin@v.loewis.de>
parents: 73066
diff changeset
998 for (i = 0; i < pycache_len; i++)
73066
4cfff313ce65 Drop unused macros. Use CACHEDIR consistently.
Martin v. Löwis <martin@v.loewis.de>
parents: 73065
diff changeset
999 PyUnicode_WRITE(kind, data, pos++, CACHEDIR[i]);
73110
63ffa07f9258 Fix test_imp failure under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 73068
diff changeset
1000 PyUnicode_WRITE(kind, data, pos++, lastsep);
73063
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1001 PyUnicode_CopyCharacters(result, pos, pathstr,
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1002 fname, ext - fname);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1003 pos += ext - fname;
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1004 for (i = 0; pyc_tag[i]; i++)
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1005 PyUnicode_WRITE(kind, data, pos++, pyc_tag[i]);
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1006 PyUnicode_WRITE(kind, data, pos++, '.');
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1007 PyUnicode_WRITE(kind, data, pos++, 'p');
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1008 PyUnicode_WRITE(kind, data, pos++, 'y');
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1009 PyUnicode_WRITE(kind, data, pos++, debug ? 'c' : 'o');
1959b2332c6a Reformulate make_compiled_pathname in terms of unicode objects.
Martin v. Löwis <martin@v.loewis.de>
parents: 72960
diff changeset
1010 return result;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1011 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1012
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1013
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1014 /* Given a pathname to a Python byte compiled file, return the path to the
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1015 source file, if the path matches the PEP 3147 format. This does not check
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1016 for any file existence, however, if the pyc file name does not match PEP
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1017 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
1018 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
1019
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1020 (...)/__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
1021
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1022 static PyObject*
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1023 make_source_pathname(PyObject *path)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1024 {
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1025 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
1026 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
1027 PyObject *result;
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1028 int kind;
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1029 void *data;
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1030
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1031 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
1032 if (len > MAXPATHLEN)
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1033 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1034
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1035 /* 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
1036 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
1037 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
1038 */
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1039 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
1040 if (right == -1)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1041 return NULL;
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1042 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
1043 if (left == -1)
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1044 left = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1045 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1046 left++;
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1047 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
1048 return NULL;
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1049 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
1050 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
1051 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1052
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1053 /* 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
1054 has two dots in it.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1055 */
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1056 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
1057 if (dot0 < 0)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1058 return NULL;
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1059 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
1060 if (dot1 < 0)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1061 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1062 /* Too many dots? */
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1063 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
1064 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1065
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1066 /* 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
1067 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
1068 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
1069 suffix.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1070 */
73065
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1071 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
1072 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
1073 if (!result)
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1074 return NULL;
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1075 kind = PyUnicode_KIND(result);
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1076 data = PyUnicode_DATA(result);
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1077 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
1078 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
1079 (j = dot0-right));
6fa4386d48a9 Rewrite make_source_pathname using Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73064
diff changeset
1080 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
1081 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
1082 return result;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1083 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1084
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1085 /* Given a pathname for a Python source file, its time of last
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1086 modification, and a pathname for a compiled file, check whether the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1087 compiled file represents the same version of the source. If so,
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1088 return a FILE pointer for the compiled file, positioned just after
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1089 the header; if not, return NULL.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1090 Doesn't set an exception. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1091
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1092 static FILE *
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1093 check_compiled_module(PyObject *pathname, struct stat *srcstat, PyObject *cpathname)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1094 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1095 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1096 long magic;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1097 long pyc_mtime;
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1098 long pyc_size;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1099
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1100 fp = _Py_fopen(cpathname, "rb");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1101 if (fp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1102 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1103 magic = PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1104 if (magic != pyc_magic) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1105 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1106 PySys_FormatStderr("# %R has bad magic\n", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1107 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1108 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1109 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1110 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1111 if (pyc_mtime != srcstat->st_mtime) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1112 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1113 PySys_FormatStderr("# %R has bad mtime\n", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1114 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1115 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1116 }
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1117 pyc_size = PyMarshal_ReadLongFromFile(fp);
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1118 if (pyc_size != (srcstat->st_size & 0xFFFFFFFF)) {
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1119 if (Py_VerboseFlag)
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1120 PySys_FormatStderr("# %R has bad size\n", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1121 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1122 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1123 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1124 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1125 PySys_FormatStderr("# %R matches %R\n", cpathname, pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1126 return fp;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1127 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1128
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1129
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1130 /* Read a code object from a file and check it for validity */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1131
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1132 static PyCodeObject *
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1133 read_compiled_module(PyObject *cpathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1134 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1135 PyObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1136
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1137 co = PyMarshal_ReadLastObjectFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1138 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1139 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1140 if (!PyCode_Check(co)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1141 PyErr_Format(PyExc_ImportError,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1142 "Non-code object in %R", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1143 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1144 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1145 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1146 return (PyCodeObject *)co;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1147 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1148
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1149
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1150 /* Load a module from a compiled file, execute it, and return its
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1151 module object WITH INCREMENTED REFERENCE COUNT */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1152
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1153 static PyObject *
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1154 load_compiled_module(PyObject *name, PyObject *cpathname, FILE *fp)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1155 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1156 long magic;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1157 PyCodeObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1158 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1159
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1160 magic = PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1161 if (magic != pyc_magic) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1162 PyErr_Format(PyExc_ImportError,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1163 "Bad magic number in %R", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1164 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1165 }
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1166 /* Skip mtime and size */
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1167 (void) PyMarshal_ReadLongFromFile(fp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1168 (void) PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1169 co = read_compiled_module(cpathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1170 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1171 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1172 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1173 PySys_FormatStderr("import %U # precompiled from %R\n",
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1174 name, cpathname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1175 m = PyImport_ExecCodeModuleObject(name, (PyObject *)co,
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1176 cpathname, cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1177 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1178
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1179 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
1180 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1181
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1182 /* Parse a source file and return the corresponding code object */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1183
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1184 static PyCodeObject *
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1185 parse_source_module(PyObject *pathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1186 {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1187 PyCodeObject *co;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1188 PyObject *pathbytes;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1189 mod_ty mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1190 PyCompilerFlags flags;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1191 PyArena *arena;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1192
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1193 pathbytes = PyUnicode_EncodeFSDefault(pathname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1194 if (pathbytes == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1195 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1196
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1197 arena = PyArena_New();
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1198 if (arena == NULL) {
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1199 Py_DECREF(pathbytes);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1200 return NULL;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1201 }
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1202
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1203 flags.cf_flags = 0;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1204 mod = PyParser_ASTFromFile(fp, PyBytes_AS_STRING(pathbytes), NULL,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1205 Py_file_input, 0, 0, &flags,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1206 NULL, arena);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1207 if (mod != NULL)
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1208 co = PyAST_Compile(mod, PyBytes_AS_STRING(pathbytes), NULL, arena);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1209 else
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1210 co = NULL;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1211 Py_DECREF(pathbytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1212 PyArena_Free(arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1213 return co;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1214 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1215
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1216 /* Write a compiled module to a file, placing the time of last
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1217 modification of its source into the header.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1218 Errors are ignored, if a write error occurs an attempt is made to
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1219 remove the file. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1220
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1221 static void
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1222 write_compiled_module(PyCodeObject *co, PyObject *cpathname,
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1223 struct stat *srcstat)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1224 {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1225 Py_UCS4 *cpathname_ucs4;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1226 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1227 time_t mtime = srcstat->st_mtime;
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1228 long size = srcstat->st_size & 0xFFFFFFFF;
73577
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1229 PyObject *cpathname_tmp;
55331
c7042127196a Merged revisions 74058 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 52721
diff changeset
1230 #ifdef MS_WINDOWS /* since Windows uses different permissions */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1231 mode_t mode = srcstat->st_mode & ~S_IEXEC;
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1232 wchar_t *wdirname, *wpathname, *wpathname_tmp;
55331
c7042127196a Merged revisions 74058 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 52721
diff changeset
1233 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1234 mode_t dirmode = (srcstat->st_mode |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1235 S_IXUSR | S_IXGRP | S_IXOTH |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1236 S_IWUSR | S_IWGRP | S_IWOTH);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1237 PyObject *dirbytes;
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1238 PyObject *cpathbytes, *cpathbytes_tmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1239 #endif
73477
a9f10c3eff69 Issue #13303: Fix bytecode file default permission.
Charles-François Natali <neologix@free.fr>
parents: 73324
diff changeset
1240 int fd;
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1241 PyObject *dirname;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1242 Py_UCS4 *dirsep;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1243 int res, ok;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1244
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1245 /* Ensure that the __pycache__ directory exists. */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1246 cpathname_ucs4 = PyUnicode_AsUCS4Copy(cpathname);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1247 if (!cpathname_ucs4)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1248 return;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1249 dirsep = rightmost_sep(cpathname_ucs4);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1250 if (dirsep == NULL) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1251 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1252 PySys_FormatStderr("# no %s path found %R\n", CACHEDIR, cpathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1253 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1254 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1255 dirname = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1256 cpathname_ucs4,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1257 dirsep - cpathname_ucs4);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1258 PyMem_Free(cpathname_ucs4);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1259 if (dirname == NULL) {
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1260 PyErr_Clear();
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1261 return;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1262 }
64594
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1263
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1264 #ifdef MS_WINDOWS
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1265 wdirname = PyUnicode_AsUnicode(dirname);
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1266 if (wdirname == NULL) {
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1267 PyErr_Clear();
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1268 return;
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1269 }
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1270 res = CreateDirectoryW(wdirname, NULL);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1271 ok = (res != 0);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1272 if (!ok && GetLastError() == ERROR_ALREADY_EXISTS)
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1273 ok = 1;
64594
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1274 #else
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1275 dirbytes = PyUnicode_EncodeFSDefault(dirname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1276 if (dirbytes == NULL) {
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1277 PyErr_Clear();
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1278 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1279 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1280 res = mkdir(PyBytes_AS_STRING(dirbytes), dirmode);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1281 Py_DECREF(dirbytes);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1282 if (0 <= res)
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1283 ok = 1;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1284 else
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1285 ok = (errno == EEXIST);
64594
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1286 #endif
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1287 if (!ok) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1288 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1289 PySys_FormatStderr("# cannot create cache dir %R\n", dirname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1290 Py_DECREF(dirname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1291 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1292 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1293 Py_DECREF(dirname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1294
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1295 /* We first write to a tmp file and then take advantage
73577
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1296 of atomic renaming (which *should* be true even under Windows).
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1297 As in importlib, we use id(something) to generate a pseudo-random
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1298 filename. mkstemp() can't be used since it doesn't allow specifying
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1299 the file access permissions.
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1300 */
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1301 cpathname_tmp = PyUnicode_FromFormat("%U.%zd",
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1302 cpathname, (Py_ssize_t) co);
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1303 if (cpathname_tmp == NULL) {
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1304 PyErr_Clear();
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1305 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1306 }
73577
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1307 #ifdef MS_WINDOWS
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1308 wpathname = PyUnicode_AsUnicode(cpathname);
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1309 if (wpathname == NULL) {
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1310 PyErr_Clear();
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1311 return;
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1312 }
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1313 wpathname_tmp = PyUnicode_AsUnicode(cpathname_tmp);
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1314 if (wpathname_tmp == NULL) {
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1315 PyErr_Clear();
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1316 return;
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1317 }
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1318
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1319 (void)DeleteFileW(wpathname_tmp);
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1320 fd = _wopen(wpathname_tmp,
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1321 O_EXCL | O_CREAT | O_WRONLY | O_BINARY,
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1322 mode);
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1323 if (0 <= fd)
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1324 fp = fdopen(fd, "wb");
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1325 else
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1326 fp = NULL;
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1327 #else
73577
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1328 cpathbytes_tmp = PyUnicode_EncodeFSDefault(cpathname_tmp);
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1329 Py_DECREF(cpathname_tmp);
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1330 if (cpathbytes_tmp == NULL) {
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1331 PyErr_Clear();
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1332 return;
cea2d28f2855 Use PyUnicode_FromFormat() to create the temporary file name.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73574
diff changeset
1333 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1334 cpathbytes = PyUnicode_EncodeFSDefault(cpathname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1335 if (cpathbytes == NULL) {
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1336 PyErr_Clear();
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1337 return;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1338 }
73477
a9f10c3eff69 Issue #13303: Fix bytecode file default permission.
Charles-François Natali <neologix@free.fr>
parents: 73324
diff changeset
1339 fd = open(PyBytes_AS_STRING(cpathbytes_tmp),
a9f10c3eff69 Issue #13303: Fix bytecode file default permission.
Charles-François Natali <neologix@free.fr>
parents: 73324
diff changeset
1340 O_CREAT | O_EXCL | O_WRONLY, 0666);
73264
740baff4f169 Issue #13303: Fix a race condition in the bytecode file creation.
Charles-François Natali <neologix@free.fr>
parents: 73227
diff changeset
1341 if (0 <= fd)
740baff4f169 Issue #13303: Fix a race condition in the bytecode file creation.
Charles-François Natali <neologix@free.fr>
parents: 73227
diff changeset
1342 fp = fdopen(fd, "wb");
740baff4f169 Issue #13303: Fix a race condition in the bytecode file creation.
Charles-François Natali <neologix@free.fr>
parents: 73227
diff changeset
1343 else
740baff4f169 Issue #13303: Fix a race condition in the bytecode file creation.
Charles-François Natali <neologix@free.fr>
parents: 73227
diff changeset
1344 fp = NULL;
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1345 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1346 if (fp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1347 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1348 PySys_FormatStderr(
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1349 "# can't create %R\n", cpathname);
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1350 #ifdef MS_WINDOWS
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1351 Py_DECREF(cpathname_tmp);
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1352 #else
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1353 Py_DECREF(cpathbytes);
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1354 Py_DECREF(cpathbytes_tmp);
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1355 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1356 return;
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 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1359 /* First write a 0 for mtime and size */
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1360 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1361 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1362 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1363 fflush(fp);
74612
2b62348a1c03 Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74597 74611
diff changeset
1364 /* Now write the true mtime and size (as 32-bit fields) */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1365 fseek(fp, 4L, 0);
74611
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1366 assert(mtime <= 0xFFFFFFFF);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1367 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1368 PyMarshal_WriteLongToFile(size, fp, Py_MARSHAL_VERSION);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1369 if (fflush(fp) != 0 || ferror(fp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1370 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1371 PySys_FormatStderr("# can't write %R\n", cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1372 /* Don't keep partial file */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1373 fclose(fp);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1374 #ifdef MS_WINDOWS
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1375 (void)DeleteFileW(wpathname_tmp);
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1376 Py_DECREF(cpathname_tmp);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1377 #else
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1378 (void) unlink(PyBytes_AS_STRING(cpathbytes_tmp));
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1379 Py_DECREF(cpathbytes);
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1380 Py_DECREF(cpathbytes_tmp);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1381 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1382 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1383 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1384 fclose(fp);
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1385 /* Do a (hopefully) atomic rename */
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1386 #ifdef MS_WINDOWS
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1387 if (!MoveFileExW(wpathname_tmp, wpathname, MOVEFILE_REPLACE_EXISTING)) {
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1388 if (Py_VerboseFlag)
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1389 PySys_FormatStderr("# can't write %R\n", cpathname);
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1390 /* Don't keep tmp file */
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1391 (void) DeleteFileW(wpathname_tmp);
73573
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1392 Py_DECREF(cpathname_tmp);
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1393 return;
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1394 }
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1395 Py_DECREF(cpathname_tmp);
b75b41237380 Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73477
diff changeset
1396 #else
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1397 if (rename(PyBytes_AS_STRING(cpathbytes_tmp),
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1398 PyBytes_AS_STRING(cpathbytes))) {
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1399 if (Py_VerboseFlag)
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1400 PySys_FormatStderr("# can't write %R\n", cpathname);
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1401 /* Don't keep tmp file */
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1402 unlink(PyBytes_AS_STRING(cpathbytes_tmp));
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1403 Py_DECREF(cpathbytes);
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1404 Py_DECREF(cpathbytes_tmp);
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1405 return;
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1406 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1407 Py_DECREF(cpathbytes);
72960
c16063765d3a Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
1408 Py_DECREF(cpathbytes_tmp);
69463
e4e92d68ba3a Close #11619: write_compiled_module() doesn't encode the filename
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69148
diff changeset
1409 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1410 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1411 PySys_FormatStderr("# wrote %R\n", cpathname);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1412 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1413
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1414 static void
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1415 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
1416 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1417 PyObject *constants, *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1418 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1419
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1420 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
1421 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1422
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1423 tmp = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1424 co->co_filename = newname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1425 Py_INCREF(co->co_filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1426 Py_DECREF(tmp);
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 constants = co->co_consts;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1429 n = PyTuple_GET_SIZE(constants);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1430 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1431 tmp = PyTuple_GET_ITEM(constants, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1432 if (PyCode_Check(tmp))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1433 update_code_filenames((PyCodeObject *)tmp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1434 oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1435 }
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1436 }
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1437
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1438 static void
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1439 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
1440 {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1441 PyObject *oldname;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1442
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1443 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
1444 return;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1445
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1446 oldname = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1447 Py_INCREF(oldname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1448 update_code_filenames(co, oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1449 Py_DECREF(oldname);
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1450 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1451
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1452 static PyObject *
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1453 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
1454 {
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1455 PyObject *co;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1456 PyObject *file_path;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1457
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1458 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
1459 return NULL;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1460
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1461 if (!PyCode_Check(co)) {
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1462 PyErr_SetString(PyExc_TypeError,
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1463 "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
1464 return NULL;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1465 }
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1466
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1467 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
1468 PyErr_SetString(PyExc_TypeError,
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1469 "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
1470 return NULL;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1471 }
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1472
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1473 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
1474
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1475 Py_RETURN_NONE;
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1476 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1477
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1478 /* Load a source module from a given file and return its module
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1479 object WITH INCREMENTED REFERENCE COUNT. If there's a matching
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
1480 byte-compiled file, use that instead. */
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1481
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1482 static PyObject *
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1483 load_source_module(PyObject *name, PyObject *pathname, FILE *fp)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1484 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1485 struct stat st;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1486 FILE *fpc;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1487 PyObject *cpathname = NULL, *cpathbytes = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1488 PyCodeObject *co;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1489 PyObject *m = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1490
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1491 if (fstat(fileno(fp), &st) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1492 PyErr_Format(PyExc_RuntimeError,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1493 "unable to get file status from %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1494 pathname);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1495 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1496 }
74611
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1497 if (sizeof st.st_mtime > 4) {
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1498 /* Python's .pyc timestamp handling presumes that the timestamp fits
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1499 in 4 bytes. Since the code only does an equality comparison,
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1500 ordering is not important and we can safely ignore the higher bits
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1501 (collisions are extremely unlikely).
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1502 */
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1503 st.st_mtime &= 0xFFFFFFFF;
c79d0a7ac79d Port import fixes from 2.7.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74596
diff changeset
1504 }
73064
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
1505 if (PyUnicode_READY(pathname) < 0)
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
1506 return NULL;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1507 cpathname = make_compiled_pathname(pathname, !Py_OptimizeFlag);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1508
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1509 if (cpathname != NULL)
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 74060
diff changeset
1510 fpc = check_compiled_module(pathname, &st, cpathname);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1511 else
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1512 fpc = NULL;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1513
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1514 if (fpc) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1515 co = read_compiled_module(cpathname, fpc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1516 fclose(fpc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1517 if (co == NULL)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1518 goto error;
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1519 update_compiled_module(co, pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1520 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1521 PySys_FormatStderr("import %U # precompiled from %R\n",
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1522 name, cpathname);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1523 m = PyImport_ExecCodeModuleObject(name, (PyObject *)co,
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1524 cpathname, cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1525 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1526 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1527 co = parse_source_module(pathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1528 if (co == NULL)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1529 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1530 if (Py_VerboseFlag)
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1531 PySys_FormatStderr("import %U # from %R\n",
68738
c4361bab6914 Issue #3080: Use repr() to format the module name on error
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68737
diff changeset
1532 name, pathname);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1533 if (cpathname != NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1534 PyObject *ro = PySys_GetObject("dont_write_bytecode");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1535 if (ro == NULL || !PyObject_IsTrue(ro))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1536 write_compiled_module(co, cpathname, &st);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1537 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1538 m = PyImport_ExecCodeModuleObject(name, (PyObject *)co,
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1539 pathname, cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1540 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1541 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1542
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1543 error:
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1544 Py_XDECREF(cpathbytes);
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
1545 Py_XDECREF(cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1546 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
1547 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1548
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
1549 /* 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
1550 * 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
1551 */
73e1bf179a01 Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents: 44567
diff changeset
1552 static PyObject *
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1553 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
1554 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1555 Py_ssize_t len;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1556 Py_UCS4 *fileuni;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1557 PyObject *py;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1558 struct stat statbuf;
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1559 int err;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1560
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1561 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
1562 if (len == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1563 Py_RETURN_NONE;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1564
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1565 /* don't match *.pyc or *.pyo? */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1566 fileuni = PyUnicode_AsUCS4Copy(filename);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1567 if (!fileuni)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1568 return NULL;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1569 if (len < 5
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1570 || fileuni[len-4] != '.'
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1571 || (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
1572 || (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
1573 goto unchanged;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1574
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1575 /* 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
1576 * 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
1577 * to py.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1578 */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1579 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
1580 if (py == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1581 PyErr_Clear();
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1582 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
1583 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1584 if (py == NULL)
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1585 goto error;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1586
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1587 err = _Py_stat(py, &statbuf);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1588 if (err == -2)
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1589 goto error;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1590 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
1591 PyMem_Free(fileuni);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1592 return py;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1593 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1594 Py_DECREF(py);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1595 goto unchanged;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1596
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1597 error:
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1598 PyErr_Clear();
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1599 unchanged:
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1600 PyMem_Free(fileuni);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1601 Py_INCREF(filename);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1602 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
1603 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1604
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1605 /* Forward */
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
1606 static PyObject *load_module(PyObject *, FILE *, PyObject *, int, PyObject *);
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
1607 static struct filedescr *find_module(PyObject *, PyObject *, PyObject *,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1608 PyObject **, FILE **, PyObject **);
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1609 static struct _frozen * find_frozen(PyObject *);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1610
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1611 /* Load a package and return its module object WITH INCREMENTED
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1612 REFERENCE COUNT */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1613
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1614 static PyObject *
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1615 load_package(PyObject *name, PyObject *pathname)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1616 {
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
1617 PyObject *m, *d, *bufobj;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1618 PyObject *file = NULL, *path_list = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1619 int err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1620 FILE *fp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1621 struct filedescr *fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1622
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1623 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1624 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1625 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1626 if (Py_VerboseFlag)
68738
c4361bab6914 Issue #3080: Use repr() to format the module name on error
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68737
diff changeset
1627 PySys_FormatStderr("import %U # directory %R\n",
c4361bab6914 Issue #3080: Use repr() to format the module name on error
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68737
diff changeset
1628 name, pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1629 file = get_sourcefile(pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1630 if (file == NULL)
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1631 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1632 path_list = Py_BuildValue("[O]", file);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1633 if (path_list == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1634 Py_DECREF(file);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1635 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1636 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1637 d = PyModule_GetDict(m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1638 err = PyDict_SetItemString(d, "__file__", file);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1639 Py_DECREF(file);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1640 if (err == 0)
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1641 err = PyDict_SetItemString(d, "__path__", path_list);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1642 if (err != 0) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1643 Py_DECREF(path_list);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1644 return NULL;
75824
daed636a3536 Fixes Issue #14331: Use significantly less stack space when importing modules by
Gregory P. Smith <greg@krypto.org>
parents: 75176
diff changeset
1645 }
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
1646 fdp = find_module(name, initstr, path_list,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1647 &bufobj, &fp, NULL);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1648 Py_DECREF(path_list);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1649 if (fdp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1650 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1651 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1652 Py_INCREF(m);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1653 return m;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1654 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1655 else
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1656 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1657 }
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1658 m = load_module(name, fp, bufobj, fdp->type, NULL);
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1659 Py_XDECREF(bufobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1660 if (fp != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1661 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1662 return m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1663 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1664
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1665
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1666 /* Helper to test for built-in module */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1667
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1668 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1669 is_builtin(PyObject *name)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1670 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1671 int i, cmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1672 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
1673 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
1674 if (cmp == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1675 if (PyImport_Inittab[i].initfunc == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1676 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1677 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1678 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1679 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1680 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1681 return 0;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1682 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1683
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1684
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1685 /* 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
1686 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
1687 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
1688 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
1689 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
1690 import mechanism. Cache the result in path_importer_cache.
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1691 Returns a borrowed reference. */
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1692
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1693 static PyObject *
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1694 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
1695 PyObject *p)
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1696 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1697 PyObject *importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1698 Py_ssize_t j, nhooks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1699
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1700 /* 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
1701 assert(PyList_Check(path_hooks));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1702 assert(PyDict_Check(path_importer_cache));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1703
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1704 nhooks = PyList_Size(path_hooks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1705 if (nhooks < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1706 return NULL; /* Shouldn't happen */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1707
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1708 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
1709 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1710 return importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1711
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1712 /* 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
1713 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
1714 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1715
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1716 for (j = 0; j < nhooks; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1717 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
1718 if (hook == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1719 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1720 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1721 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1722 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1723
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1724 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1725 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1726 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1727 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1728 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1729 if (importer == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1730 importer = PyObject_CallFunctionObjArgs(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1731 (PyObject *)&PyNullImporter_Type, p, NULL
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1732 );
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1733 if (importer == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1734 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1735 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1736 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1737 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1738 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1739 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1740 if (importer != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1741 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
1742 Py_DECREF(importer);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1743 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1744 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1745 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1746 return importer;
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1747 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1748
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1749 PyAPI_FUNC(PyObject *)
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1750 PyImport_GetImporter(PyObject *path) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1751 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
1752
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1753 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
1754 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
1755 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
1756 path_hooks, path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1757 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1758 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1759 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
1760 return importer;
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1761 }
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1762
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1763 /* Search the path (default sys.path) for a module. Return the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1764 corresponding filedescr struct, and (via return arguments) the
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1765 pathname and an open file. Return NULL if the module is not found. */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1766
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1767 #ifdef MS_COREDLL
68715
bab42673674a Issue #3080: _PyWin_FindRegisteredModule() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68713
diff changeset
1768 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
1769 PyObject **p_path);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1770 #endif
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1771
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1772 /* Forward */
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1773 static int case_ok(PyObject *, Py_ssize_t, PyObject *);
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1774 static int find_init_module(PyObject *);
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1775 static struct filedescr importhookdescr = {"", "", IMP_HOOK};
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
1776
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1777 /* Get the path of a module: get its importer and call importer.find_module()
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1778 hook, or check if the module if a package (if path/__init__.py exists).
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1779
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1780 -1: error: a Python error occurred
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1781 0: ignore: an error occurred because of invalid data, but the error is not
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1782 important enough to be reported.
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1783 1: get path: module not found, but *buf contains its path
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1784 2: found: *p_fd is the file descriptor (IMP_HOOK or PKG_DIRECTORY)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1785 and *buf is the path */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1786
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1787 static int
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
1788 find_module_path(PyObject *fullname, PyObject *name, PyObject *path,
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1789 PyObject *path_hooks, PyObject *path_importer_cache,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1790 PyObject **p_path, PyObject **p_loader, struct filedescr **p_fd)
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1791 {
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1792 PyObject *path_unicode, *filename = NULL;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1793 Py_ssize_t len, pos;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1794 struct stat statbuf;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1795 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1796 int err, result, addsep;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1797
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1798 if (PyUnicode_Check(path)) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1799 Py_INCREF(path);
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1800 path_unicode = path;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1801 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1802 else if (PyBytes_Check(path)) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1803 path_unicode = PyUnicode_DecodeFSDefaultAndSize(
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1804 PyBytes_AS_STRING(path), PyBytes_GET_SIZE(path));
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1805 if (path_unicode == NULL)
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1806 return -1;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1807 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1808 else
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1809 return 0;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1810
72718
c97ba8f80935 Fix find_module_path(): make the string ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72584
diff changeset
1811 if (PyUnicode_READY(path_unicode))
c97ba8f80935 Fix find_module_path(): make the string ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72584
diff changeset
1812 return -1;
c97ba8f80935 Fix find_module_path(): make the string ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72584
diff changeset
1813
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1814 len = PyUnicode_GET_LENGTH(path_unicode);
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1815 if (PyUnicode_FindChar(path_unicode, 0, 0, len, 1) != -1) {
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1816 result = 0;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1817 goto out; /* path contains '\0' */
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1818 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1819
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1820 /* sys.path_hooks import hook */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1821 if (p_loader != NULL) {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72866
diff changeset
1822 _Py_IDENTIFIER(find_module);
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1823 PyObject *importer;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1824
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1825 importer = get_path_importer(path_importer_cache,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1826 path_hooks, path);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1827 if (importer == NULL) {
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1828 result = -1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1829 goto out;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1830 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1831 /* Note: importer is a borrowed reference */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1832 if (importer != Py_None) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1833 PyObject *loader;
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72718
diff changeset
1834 loader = _PyObject_CallMethodId(importer,
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72718
diff changeset
1835 &PyId_find_module, "O", fullname);
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1836 if (loader == NULL) {
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1837 result = -1; /* error */
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1838 goto out;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1839 }
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1840 if (loader != Py_None) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1841 /* a loader was found */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1842 *p_loader = loader;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1843 *p_fd = &importhookdescr;
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1844 result = 2;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1845 goto out;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1846 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1847 Py_DECREF(loader);
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1848 result = 0;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1849 goto out;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1850 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1851 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1852 /* no hook was found, use builtin import */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1853
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1854 addsep = 0;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1855 if (len > 0 && PyUnicode_READ_CHAR(path_unicode, len-1) != SEP
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1856 #ifdef ALTSEP
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1857 && PyUnicode_READ_CHAR(path_unicode, len-1) != ALTSEP
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1858 #endif
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1859 )
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1860 addsep = 1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1861 filename = PyUnicode_New(len + PyUnicode_GET_LENGTH(name) + addsep,
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1862 Py_MAX(PyUnicode_MAX_CHAR_VALUE(path_unicode),
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1863 PyUnicode_MAX_CHAR_VALUE(name)));
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1864 if (filename == NULL) {
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1865 result = -1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1866 goto out;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
1867 }
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1868 PyUnicode_CopyCharacters(filename, 0, path_unicode, 0, len);
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1869 pos = len;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1870 if (addsep)
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1871 PyUnicode_WRITE(PyUnicode_KIND(filename),
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1872 PyUnicode_DATA(filename),
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1873 pos++, SEP);
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
1874 PyUnicode_CopyCharacters(filename, pos, name, 0,
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1875 PyUnicode_GET_LENGTH(name));
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1876
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1877 /* Check for package import (buf holds a directory name,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1878 and there's an __init__ module in that directory */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1879 #ifdef HAVE_STAT
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1880 err = _Py_stat(filename, &statbuf);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1881 if (err == -2) {
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1882 result = -1;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1883 goto out;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1884 }
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1885 if (err == 0 && /* it exists */
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1886 S_ISDIR(statbuf.st_mode)) /* it's a directory */
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1887 {
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1888 int match;
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1889
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1890 match = case_ok(filename, 0, name);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1891 if (match < 0) {
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1892 result = -1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1893 goto out;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1894 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1895 if (match) { /* case matches */
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1896 if (find_init_module(filename)) { /* and has __init__.py */
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1897 *p_path = filename;
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1898 filename = NULL;
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1899 *p_fd = &fd_package;
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1900 result = 2;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1901 goto out;
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1902 }
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1903 else {
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1904 int err;
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1905 err = PyErr_WarnFormat(PyExc_ImportWarning, 1,
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1906 "Not importing directory %R: missing __init__.py",
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1907 filename);
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1908 if (err) {
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1909 result = -1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1910 goto out;
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
1911 }
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
1912 }
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1913 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1914 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1915 #endif
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1916 *p_path = filename;
73068
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1917 filename = NULL;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1918 result = 1;
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1919 out:
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1920 Py_DECREF(path_unicode);
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1921 Py_XDECREF(filename);
eef1027ab2f0 Rewrite find_module_path using unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73067
diff changeset
1922 return result;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1923 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1924
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1925 /* Find a module in search_path_list. For each path, try
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
1926 find_module_path() or try each _PyImport_Filetab suffix.
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1927
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1928 If the module is found, return a file descriptor, write the path in
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1929 *p_filename, write the pointer to the file object into *p_fp, and (if
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1930 p_loader is not NULL) the loader into *p_loader.
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1931
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1932 Otherwise, raise an exception and return NULL. */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1933
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1934 static struct filedescr*
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
1935 find_module_path_list(PyObject *fullname, PyObject *name,
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1936 PyObject *search_path_list, PyObject *path_hooks,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1937 PyObject *path_importer_cache,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1938 PyObject **p_path, FILE **p_fp, PyObject **p_loader)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1939 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1940 Py_ssize_t i, npath;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1941 struct filedescr *fdp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1942 char *filemode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1943 FILE *fp = NULL;
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1944 PyObject *prefix, *filename;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1945 int match;
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1946 int err;
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1947
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1948 npath = PyList_Size(search_path_list);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1949 for (i = 0; i < npath; i++) {
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1950 PyObject *path;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1951 int ok;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1952
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1953 path = PyList_GetItem(search_path_list, i);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1954 if (path == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1955 return NULL;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1956
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1957 prefix = NULL;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1958 ok = find_module_path(fullname, name, path,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1959 path_hooks, path_importer_cache,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1960 &prefix, p_loader, &fdp);
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1961 if (ok < 0)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1962 return NULL;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1963 if (ok == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1964 continue;
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1965 if (ok == 2) {
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1966 *p_path = prefix;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1967 return fdp;
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1968 }
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1969
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1970 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
72454
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1971 struct stat statbuf;
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1972
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1973 filemode = fdp->mode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1974 if (filemode[0] == 'U')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1975 filemode = "r" PY_STDIOTEXTMODE;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1976
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1977 filename = PyUnicode_FromFormat("%U%s", prefix, fdp->suffix);
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1978 if (filename == NULL) {
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1979 Py_DECREF(prefix);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1980 return NULL;
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
1981 }
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1982
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1983 if (Py_VerboseFlag > 1)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1984 PySys_FormatStderr("# trying %R\n", filename);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1985
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1986 err = _Py_stat(filename, &statbuf);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1987 if (err == -2) {
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1988 Py_DECREF(prefix);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1989 Py_DECREF(filename);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1990 return NULL;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1991 }
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
1992 if (err != 0 || S_ISDIR(statbuf.st_mode)) {
73884
174fbbed8747 Followup to a541bda2f5e2: Add a short comment.
Charles-François Natali <neologix@free.fr>
parents: 73879
diff changeset
1993 /* it doesn't exist, or it's a directory */
72454
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1994 Py_DECREF(filename);
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1995 continue;
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1996 }
8c6fea5794b2 Merge 3.2: Issue #7732: Don't open a directory as a file anymore while
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72388 72453
diff changeset
1997
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1998 fp = _Py_fopen(filename, filemode);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
1999 if (fp == NULL) {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2000 Py_DECREF(filename);
70900
7731d2ab4fd4 find_module_path_list() fails if _Py_fopen() failed and raised an exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70894
diff changeset
2001 if (PyErr_Occurred()) {
7731d2ab4fd4 find_module_path_list() fails if _Py_fopen() failed and raised an exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70894
diff changeset
2002 Py_DECREF(prefix);
7731d2ab4fd4 find_module_path_list() fails if _Py_fopen() failed and raised an exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70894
diff changeset
2003 return NULL;
7731d2ab4fd4 find_module_path_list() fails if _Py_fopen() failed and raised an exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70894
diff changeset
2004 }
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2005 continue;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2006 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2007 match = case_ok(filename, -(Py_ssize_t)strlen(fdp->suffix), name);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2008 if (match < 0) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2009 Py_DECREF(prefix);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2010 Py_DECREF(filename);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2011 return NULL;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2012 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2013 if (match) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2014 Py_DECREF(prefix);
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2015 *p_path = filename;
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2016 *p_fp = fp;
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2017 return fdp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2018 }
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2019 Py_DECREF(filename);
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2020
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2021 fclose(fp);
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2022 fp = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2023 }
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2024 Py_DECREF(prefix);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2025 }
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2026 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
2027 "No module named %R", name);
68732
c4ccf02456d6 Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68731
diff changeset
2028 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
2029 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
2030
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2031 /* Find a module:
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2032
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2033 - try find_module() of each sys.meta_path hook
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2034 - try find_frozen()
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2035 - try is_builtin()
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2036 - try _PyWin_FindRegisteredModule() (Windows only)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2037 - otherwise, call find_module_path_list() with search_path_list (if not
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2038 NULL) or sys.path
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2039
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2040 fullname can be NULL, but only if p_loader is NULL.
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2041
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2042 Return:
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2043
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2044 - &fd_builtin (C_BUILTIN) if it is a builtin
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2045 - &fd_frozen (PY_FROZEN) if it is frozen
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2046 - &fd_package (PKG_DIRECTORY) and write the filename into *p_path
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2047 if it is a package
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2048 - &importhookdescr (IMP_HOOK) and write the loader into *p_loader if a
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2049 importer loader was found
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2050 - a file descriptor (PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE or
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2051 PY_CODERESOURCE: see _PyImport_Filetab), write the filename into
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2052 *p_path and the pointer to the open file into *p_fp
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2053 - NULL on error
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2054
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2055 By default, *p_path, *p_fp and *p_loader (if set) are set to NULL.
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2056 Eg. *p_path is set to NULL for a builtin package.
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2057 */
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2058
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2059 static struct filedescr *
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
2060 find_module(PyObject *fullname, PyObject *name, PyObject *search_path_list,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2061 PyObject **p_path, FILE **p_fp, PyObject **p_loader)
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2062 {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2063 Py_ssize_t i, npath;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2064 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2065 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2066 PyObject *path_hooks, *path_importer_cache;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2067
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2068 *p_path = NULL;
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2069 *p_fp = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2070 if (p_loader != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2071 *p_loader = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2072
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2073 /* sys.meta_path import hook */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2074 if (p_loader != NULL) {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72866
diff changeset
2075 _Py_IDENTIFIER(find_module);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2076 PyObject *meta_path;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2077
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2078 meta_path = PySys_GetObject("meta_path");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2079 if (meta_path == NULL || !PyList_Check(meta_path)) {
72385
4247f5e221c6 Fix the import machinery if there is an error on sys.path or sys.meta_path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72169
diff changeset
2080 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2081 "sys.meta_path must be a list of "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2082 "import hooks");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2083 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2084 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2085 Py_INCREF(meta_path); /* zap guard */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2086 npath = PyList_Size(meta_path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2087 for (i = 0; i < npath; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2088 PyObject *loader;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2089 PyObject *hook = PyList_GetItem(meta_path, i);
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72718
diff changeset
2090 loader = _PyObject_CallMethodId(hook, &PyId_find_module,
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
2091 "OO", fullname,
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2092 search_path_list != NULL ?
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2093 search_path_list : Py_None);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2094 if (loader == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2095 Py_DECREF(meta_path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2096 return NULL; /* true error */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2097 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2098 if (loader != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2099 /* a loader was found */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2100 *p_loader = loader;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2101 Py_DECREF(meta_path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2102 return &importhookdescr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2103 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2104 Py_DECREF(loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2105 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2106 Py_DECREF(meta_path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2107 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2108
68731
c1a5a7dca1ec Issue #3080: find_module() sets an empty path for builtin and frozen modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68730
diff changeset
2109 if (find_frozen(fullname) != NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2110 return &fd_frozen;
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2111
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2112 if (search_path_list == NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2113 #ifdef MS_COREDLL
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2114 FILE *fp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2115 struct filedescr *fdp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2116 #endif
68731
c1a5a7dca1ec Issue #3080: find_module() sets an empty path for builtin and frozen modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68730
diff changeset
2117 if (is_builtin(name))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2118 return &fd_builtin;
4111
90216e907345 PYTHONWIN -> MS_COREDLL
Guido van Rossum <guido@python.org>
parents: 3964
diff changeset
2119 #ifdef MS_COREDLL
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2120 fp = _PyWin_FindRegisteredModule(name, &fdp, p_path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2121 if (fp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2122 *p_fp = fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2123 return fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2124 }
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2125 else if (PyErr_Occurred())
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2126 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2127 #endif
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2128 search_path_list = PySys_GetObject("path");
61467
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
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2131 if (search_path_list == NULL || !PyList_Check(search_path_list)) {
72385
4247f5e221c6 Fix the import machinery if there is an error on sys.path or sys.meta_path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72169
diff changeset
2132 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2133 "sys.path must be a list of directory names");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2134 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2135 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2136
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2137 path_hooks = PySys_GetObject("path_hooks");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2138 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
72385
4247f5e221c6 Fix the import machinery if there is an error on sys.path or sys.meta_path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72169
diff changeset
2139 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2140 "sys.path_hooks must be a list of "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2141 "import hooks");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2142 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2143 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2144 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
2145 if (path_importer_cache == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2146 !PyDict_Check(path_importer_cache)) {
72385
4247f5e221c6 Fix the import machinery if there is an error on sys.path or sys.meta_path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72169
diff changeset
2147 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2148 "sys.path_importer_cache must be a dict");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2149 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2150 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2151
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2152 return find_module_path_list(fullname, name,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2153 search_path_list, path_hooks,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2154 path_importer_cache,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
2155 p_path, p_fp, p_loader);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2156 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
2157
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2158 /* case_bytes(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2159 * The arguments here are tricky, best shown by example:
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2160 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2161 * ^ ^ ^ ^
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2162 * |--------------------- buf ---------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2163 * |------------------- len ------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2164 * |------ name -------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2165 * |----- namelen -----|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2166 * buf is the full path, but len only counts up to (& exclusive of) the
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2167 * extension. name is the module name, also exclusive of extension.
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2168 *
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2169 * We've already done a successful stat() or fopen() on buf, so know that
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2170 * there's some match, possibly case-insensitive.
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2171 *
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2172 * case_bytes() is to return 1 if there's a case-sensitive match for
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2173 * name, else 0. case_bytes() is also to return 1 if envar PYTHONCASEOK
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2174 * exists.
16902
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2175 *
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2176 * case_bytes() is used to implement case-sensitive import semantics even
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2177 * on platforms with case-insensitive filesystems. It's trivial to implement
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2178 * for case-sensitive filesystems. It's pretty much a cross-platform
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2179 * nightmare for systems with case-insensitive filesystems.
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2180 */
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2181
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2182 /* First we may need a pile of platform-specific header files; the sequence
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2183 * of #if's here should match the sequence in the body of case_bytes().
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2184 */
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2185 #if defined(MS_WINDOWS)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2186 #include <windows.h>
15802
eb1767b068fe SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents: 15401
diff changeset
2187
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2188 #elif defined(DJGPP)
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2189 #include <dir.h>
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2190
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2191 #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2192 #include <sys/types.h>
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2193 #include <dirent.h>
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2194
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2195 #elif defined(PYOS_OS2)
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2196 #define INCL_DOS
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2197 #define INCL_DOSERRORS
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2198 #define INCL_NOPMAPI
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2199 #include <os2.h>
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2200 #endif
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2201
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2202 #if defined(DJGPP) \
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2203 || ((defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) \
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2204 && defined(HAVE_DIRENT_H)) \
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2205 || defined(PYOS_OS2)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2206 # define USE_CASE_OK_BYTES
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2207 #endif
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2208
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2209
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2210 #ifdef USE_CASE_OK_BYTES
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2211 static int
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2212 case_bytes(char *buf, Py_ssize_t len, Py_ssize_t namelen, const char *name)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2213 {
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2214 /* Pick a platform-specific implementation; the sequence of #if's here should
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2215 * match the sequence just above.
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2216 */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2217
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2218 /* DJGPP */
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2219 #if defined(DJGPP)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2220 struct ffblk ffblk;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2221 int done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2222
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2223 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2224 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2225
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2226 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2227 if (done) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2228 PyErr_Format(PyExc_NameError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2229 "Can't find file for module %.100s\n(filename %.300s)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2230 name, buf);
68823
15f9eca5e956 Issue #3080: On DJGPP, case_bytes() returns -1 to signal an error if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68768
diff changeset
2231 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2232 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2233 return strncmp(ffblk.ff_name, name, namelen) == 0;
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2234
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2235 /* new-fangled macintosh (macosx) or Cygwin */
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2236 #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2237 DIR *dirp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2238 struct dirent *dp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2239 char dirname[MAXPATHLEN + 1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2240 const int dirlen = len - namelen - 1; /* don't want trailing SEP */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2241
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2242 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2243 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2244
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2245 /* Copy the dir component into dirname; substitute "." if empty */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2246 if (dirlen <= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2247 dirname[0] = '.';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2248 dirname[1] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2249 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2250 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2251 assert(dirlen <= MAXPATHLEN);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2252 memcpy(dirname, buf, dirlen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2253 dirname[dirlen] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2254 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2255 /* Open the directory and search the entries for an exact match. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2256 dirp = opendir(dirname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2257 if (dirp) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2258 char *nameWithExt = buf + len - namelen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2259 while ((dp = readdir(dirp)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2260 const int thislen =
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2261 #ifdef _DIRENT_HAVE_D_NAMELEN
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2262 dp->d_namlen;
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2263 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2264 strlen(dp->d_name);
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2265 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2266 if (thislen >= namelen &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2267 strcmp(dp->d_name, nameWithExt) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2268 (void)closedir(dirp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2269 return 1; /* Found */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2270 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2271 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2272 (void)closedir(dirp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2273 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2274 return 0 ; /* Not found */
16880
bdcd79873924 In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents: 16830
diff changeset
2275
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2276 /* OS/2 */
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2277 #elif defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2278 HDIR hdir = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2279 ULONG srchcnt = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2280 FILEFINDBUF3 ffbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2281 APIRET rc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2282
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2283 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2284 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2285
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2286 rc = DosFindFirst(buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2287 &hdir,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2288 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2289 &ffbuf, sizeof(ffbuf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2290 &srchcnt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2291 FIL_STANDARD);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2292 if (rc != NO_ERROR)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2293 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2294 return strncmp(ffbuf.achName, name, namelen) == 0;
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2295
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2296 /* assuming it's a case-sensitive filesystem, so there's nothing to do! */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2297 #else
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2298 # error "USE_CASE_OK_BYTES is not correctly defined"
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2299 #endif
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2300 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2301 #endif
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2302
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2303 /*
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2304 * Check if a filename case matchs the name case. We've already done a
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2305 * successful stat() or fopen() on buf, so know that there's some match,
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2306 * possibly case-insensitive.
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2307 *
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2308 * case_ok() is to return 1 if there's a case-sensitive match for name, 0 if it
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2309 * the filename doesn't match, or -1 on error. case_ok() is also to return 1
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2310 * if envar PYTHONCASEOK exists.
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2311 *
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2312 * case_ok() is used to implement case-sensitive import semantics even
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2313 * on platforms with case-insensitive filesystems. It's trivial to implement
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2314 * for case-sensitive filesystems. It's pretty much a cross-platform
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2315 * nightmare for systems with case-insensitive filesystems.
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2316 */
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2317
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2318 static int
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2319 case_ok(PyObject *filename, Py_ssize_t prefix_delta, PyObject *name)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2320 {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2321 #ifdef MS_WINDOWS
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2322 WIN32_FIND_DATAW data;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2323 HANDLE h;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2324 int cmp;
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2325 wchar_t *wfilename, *wname;
72866
4be55c2c2356 Fix typo in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72861
diff changeset
2326 Py_ssize_t wname_len;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2327
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2328 if (Py_GETENV("PYTHONCASEOK") != NULL)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2329 return 1;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2330
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2331 wfilename = PyUnicode_AsUnicode(filename);
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2332 if (wfilename == NULL)
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2333 return -1;
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2334
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2335 h = FindFirstFileW(wfilename, &data);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2336 if (h == INVALID_HANDLE_VALUE) {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2337 PyErr_Format(PyExc_NameError,
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2338 "Can't find file for module %R\n(filename %R)",
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2339 name, filename);
73592
a16d2a8a07cc Catch PyUnicode_AS_UNICODE() errors
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73577
diff changeset
2340 return -1;
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2341 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2342 FindClose(h);
72861
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2343
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2344 wname = PyUnicode_AsUnicodeAndSize(name, &wname_len);
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2345 if (wname == NULL)
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2346 return -1;
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2347
6358e5d29dea Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72848
diff changeset
2348 cmp = wcsncmp(data.cFileName, wname, wname_len);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2349 return cmp == 0;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2350 #elif defined(USE_CASE_OK_BYTES)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2351 int match;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2352 PyObject *filebytes, *namebytes;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2353 filebytes = PyUnicode_EncodeFSDefault(filename);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2354 if (filebytes == NULL)
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2355 return -1;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2356 namebytes = PyUnicode_EncodeFSDefault(name);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2357 if (namebytes == NULL) {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2358 Py_DECREF(filebytes);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2359 return -1;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2360 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2361 match = case_bytes(
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2362 PyBytes_AS_STRING(filebytes),
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2363 PyBytes_GET_SIZE(filebytes) + prefix_delta,
68741
f8d6f6797909 Issue #3080: Fix case_ok() using case_bytes()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68739
diff changeset
2364 PyBytes_GET_SIZE(namebytes),
f8d6f6797909 Issue #3080: Fix case_ok() using case_bytes()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68739
diff changeset
2365 PyBytes_AS_STRING(namebytes));
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2366 Py_DECREF(filebytes);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2367 Py_DECREF(namebytes);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2368 return match;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2369 #else
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2370 /* assuming it's a case-sensitive filesystem, so there's nothing to do! */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2371 return 1;
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
2372
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2373 #endif
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
2374 }
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
2375
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2376 #ifdef HAVE_STAT
63985
953010c0b168 Issue #9425: Create private _Py_stat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63945
diff changeset
2377
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2378 /* Helper to look for __init__.py or __init__.py[co] in potential package.
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2379 Return 1 if __init__ was found, 0 if not, or -1 on error. */
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2380 static int
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2381 find_init_module(PyObject *directory)
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2382 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2383 struct stat statbuf;
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2384 PyObject *filename;
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2385 int match;
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2386 int err;
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2387
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2388 filename = PyUnicode_FromFormat("%U%c__init__.py", directory, SEP);
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2389 if (filename == NULL)
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2390 return -1;
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2391 err = _Py_stat(filename, &statbuf);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2392 if (err == -2)
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2393 return -1;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2394 if (err == 0) {
68742
dc38c4d65cd9 Issue #3080: Fix call to case_ok() in find_init_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68741
diff changeset
2395 /* 3=len(".py") */
dc38c4d65cd9 Issue #3080: Fix call to case_ok() in find_init_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68741
diff changeset
2396 match = case_ok(filename, -3, initstr);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2397 if (match < 0) {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2398 Py_DECREF(filename);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2399 return -1;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2400 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2401 if (match) {
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2402 Py_DECREF(filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2403 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2405 }
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2406 Py_DECREF(filename);
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2407
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2408 filename = PyUnicode_FromFormat("%U%c__init__.py%c",
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2409 directory, SEP, Py_OptimizeFlag ? 'o' : 'c');
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2410 if (filename == NULL)
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2411 return -1;
74058
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2412 err = _Py_stat(filename, &statbuf);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2413 if (err == -2) {
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2414 Py_DECREF(filename);
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2415 return -1;
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2416 }
2a140b01d343 import.c now catchs _Py_stat() exceptions
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73884
diff changeset
2417 if (err == 0) {
68742
dc38c4d65cd9 Issue #3080: Fix call to case_ok() in find_init_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68741
diff changeset
2418 /* 4=len(".pyc") */
dc38c4d65cd9 Issue #3080: Fix call to case_ok() in find_init_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68741
diff changeset
2419 match = case_ok(filename, -4, initstr);
68734
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2420 if (match < 0) {
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2421 Py_DECREF(filename);
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2422 return -1;
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2423 }
066b399a8477 Issue #3080: case_ok() expects Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68733
diff changeset
2424 if (match) {
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2425 Py_DECREF(filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2426 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2427 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2428 }
68733
298a70b27497 Issue #3080: find_init_module() expects Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68732
diff changeset
2429 Py_DECREF(filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2430 return 0;
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2431 }
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
2432
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2433 #endif /* HAVE_STAT */
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2434
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
2435
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2436 static int init_builtin(PyObject *); /* Forward */
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2437
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2438 static PyObject*
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2439 load_builtin(PyObject *name, int type)
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2440 {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2441 PyObject *m, *modules;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2442 int err;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2443
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2444 if (type == C_BUILTIN)
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2445 err = init_builtin(name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2446 else
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2447 err = PyImport_ImportFrozenModuleObject(name);
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2448 if (err < 0)
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2449 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2450 if (err == 0) {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2451 PyErr_Format(PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2452 "Purported %s module %R not found",
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2453 type == C_BUILTIN ? "builtin" : "frozen",
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2454 name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2455 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2456 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2457
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2458 modules = PyImport_GetModuleDict();
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2459 m = PyDict_GetItem(modules, name);
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2460 if (m == NULL) {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2461 PyErr_Format(
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2462 PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2463 "%s module %R not properly initialized",
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2464 type == C_BUILTIN ? "builtin" : "frozen",
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2465 name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2466 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2467 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2468 Py_INCREF(m);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2469 return m;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2470 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2471
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2472 /* Load an external module using the default search path and return
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
2473 its module object WITH INCREMENTED REFERENCE COUNT */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2474
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2475 static PyObject *
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
2476 load_module(PyObject *name, FILE *fp, PyObject *pathname, int type, PyObject *loader)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2477 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2478 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2479
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2480 /* First check that there's an open file (if we need one) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2481 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2482 case PY_SOURCE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2483 case PY_COMPILED:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2484 if (fp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2485 PyErr_Format(PyExc_ValueError,
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
2486 "file object required for import (type code %d)",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2487 type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2488 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2489 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2490 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2491
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2492 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2493
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2494 case PY_SOURCE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2495 m = load_source_module(name, pathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2496 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2497
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2498 case PY_COMPILED:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2499 m = load_compiled_module(name, pathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2500 break;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2501
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2502 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2503 case C_EXTENSION:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2504 m = _PyImport_LoadDynamicModule(name, pathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2505 break;
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2506 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2507
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2508 case PKG_DIRECTORY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2509 m = load_package(name, pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2510 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2511
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2512 case C_BUILTIN:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2513 case PY_FROZEN:
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
2514 m = load_builtin(name, type);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2515 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2516
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2517 case IMP_HOOK: {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72866
diff changeset
2518 _Py_IDENTIFIER(load_module);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2519 if (loader == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2520 PyErr_SetString(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2521 "import hook without loader");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2522 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2523 }
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72718
diff changeset
2524 m = _PyObject_CallMethodId(loader, &PyId_load_module, "O", name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2525 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2526 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2527
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2528 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2529 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
2530 "Don't know how to import %R (type code %d)",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2531 name, type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2532 m = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2533
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2534 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2535
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2536 return m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2537 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
2538
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2539
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2540 /* 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
2541 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
2542 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
2543
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
2544 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2545 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
2546 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2547 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2548
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2549 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
2550 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2551
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2552 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
2553 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
2554 PyModuleDef *def;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2555 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
2556 if (p->initfunc == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2557 PyErr_Format(PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2558 "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
2559 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2560 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2561 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2562 mod = (*p->initfunc)();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2563 if (mod == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2564 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
2565 /* 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
2566 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
2567 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
2568 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
2569 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2570 /* 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
2571 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
2572 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2573 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2574 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2575 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2576 return 0;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
2577 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2578
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2579
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2580 /* 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
2581
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
2582 static struct _frozen *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2583 find_frozen(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2584 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2585 struct _frozen *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2586
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2587 if (name == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2588 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2589
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2590 for (p = PyImport_FrozenModules; ; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2591 if (p->name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2592 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2593 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
2594 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2595 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2596 return p;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2597 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2598
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2599 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2600 get_frozen_object(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2601 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2602 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2603 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2604
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2605 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2606 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2607 "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
2608 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2609 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2610 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2611 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2612 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2613 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2614 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2615 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2616 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2617 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2618 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2619 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2620 return PyMarshal_ReadObjectFromString((char *)p->code, size);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2621 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2622
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2623 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2624 is_frozen_package(PyObject *name)
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2625 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2626 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2627 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2628
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2629 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2630 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2631 "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
2632 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2633 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2634 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2635
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2636 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2637
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2638 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2639 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2640 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2641 Py_RETURN_FALSE;
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2642 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2643
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2644
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2645 /* Initialize a frozen module.
52073
56983cfdf5d4 Fix a typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents: 51996
diff changeset
2646 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
2647 an exception set if the initialization failed.
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2648 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
2649
6263e2fd9398 init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents: 2270
diff changeset
2650 int
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2651 PyImport_ImportFrozenModuleObject(PyObject *name)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2652 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2653 struct _frozen *p;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2654 PyObject *co, *m, *path;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2655 int ispackage;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2656 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2657
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2658 p = find_frozen(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2659
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2660 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2661 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2662 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2663 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2664 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2665 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2666 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2667 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2668 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2669 ispackage = (size < 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2670 if (ispackage)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2671 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2672 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
2673 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2674 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2675 if (!PyCode_Check(co)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2676 PyErr_Format(PyExc_TypeError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2677 "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
2678 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2679 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2680 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2681 if (ispackage) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2682 /* Set __path__ to the package name */
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2683 PyObject *d, *l;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2684 int err;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2685 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2686 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2687 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2688 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2689 l = PyList_New(1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2690 if (l == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2691 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2692 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2693 Py_INCREF(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2694 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
2695 err = PyDict_SetItemString(d, "__path__", l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2696 Py_DECREF(l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2697 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2698 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2699 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2700 path = PyUnicode_FromString("<frozen>");
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2701 if (path == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2702 goto err_return;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2703 m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2704 Py_DECREF(path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2705 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2706 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2707 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2708 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2709 return 1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
2710 err_return:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2711 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2712 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
2713 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2714
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2715 int
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2716 PyImport_ImportFrozenModule(char *name)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2717 {
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2718 PyObject *nameobj;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2719 int ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2720 nameobj = PyUnicode_InternFromString(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2721 if (nameobj == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2722 return -1;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2723 ret = PyImport_ImportFrozenModuleObject(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2724 Py_DECREF(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2725 return ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2726 }
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2727
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2728
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2729 /* 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
2730 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
2731
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2732 PyObject *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35757
diff changeset
2733 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
2734 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2735 PyObject *pname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2736 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2737
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2738 pname = PyUnicode_FromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2739 if (pname == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2740 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2741 result = PyImport_Import(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2742 Py_DECREF(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2743 return result;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2744 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2745
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2746 /* Import a module without blocking
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2747 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2748 * 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
2749 * 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
2750 * 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
2751 * ImportError instead of blocking.
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2752 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2753 * 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
2754 */
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2755 PyObject *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2756 PyImport_ImportModuleNoBlock(const char *name)
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2757 {
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2758 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
2759 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2760 long me;
72169
cd1978dbac08 Remove unused variable if Python is build without threads
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68257
diff changeset
2761 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2762
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2763 /* 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
2764 modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2765 if (modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2766 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2767
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2768 nameobj = PyUnicode_FromString(name);
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2769 if (nameobj == NULL)
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2770 return NULL;
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2771 result = PyDict_GetItem(modules, nameobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2772 if (result != NULL) {
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2773 Py_DECREF(nameobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2774 Py_INCREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2775 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2776 }
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2777 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
2778 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2779 /* check the import lock
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2780 * 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
2781 * takes care of the problem */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2782 me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2783 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
2784 /* 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
2785 result = PyImport_Import(nameobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2786 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2787 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2788 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
2789 "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
2790 "is held by another thread.",
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2791 nameobj);
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2792 result = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2793 }
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
2794 #else
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2795 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
2796 #endif
68724
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2797 Py_DECREF(nameobj);
e55e7f197649 Issue #3080: PyImport_ImportModuleNoBlock() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68723
diff changeset
2798 return result;
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2799 }
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2800
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2801
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2802 PyObject *
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2803 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
2804 PyObject *locals, PyObject *given_fromlist,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2805 int level)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2806 {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2807 _Py_IDENTIFIER(__import__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2808 _Py_IDENTIFIER(__package__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2809 _Py_IDENTIFIER(__path__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2810 _Py_IDENTIFIER(__name__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2811 _Py_IDENTIFIER(_find_and_load);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2812 _Py_IDENTIFIER(_handle_fromlist);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2813 _Py_static_string(single_dot, ".");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2814 PyObject *abs_name = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2815 PyObject *builtins_import = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2816 PyObject *final_mod = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2817 PyObject *mod = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2818 PyObject *package = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2819 PyObject *globals = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2820 PyObject *fromlist = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2821 PyInterpreterState *interp = PyThreadState_GET()->interp;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2822
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2823 /* 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
2824 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
2825 NULL argument. */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2826 if (given_globals == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2827 globals = PyDict_New();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2828 if (globals == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2829 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2830 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2831 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2832 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2833 /* 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
2834 fortsomething. */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2835 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
2836 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
2837 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2838 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2839 globals = given_globals;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2840 Py_INCREF(globals);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2841 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2842
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2843 if (given_fromlist == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2844 fromlist = PyList_New(0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2845 if (fromlist == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2846 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2847 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2848 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2849 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2850 fromlist = given_fromlist;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2851 Py_INCREF(fromlist);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2852 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2853 if (name == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2854 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
2855 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2856 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2857
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2858 /* 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
2859 for added performance. */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2860
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2861 if (!PyUnicode_Check(name)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2862 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
2863 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2864 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2865 else if (PyUnicode_READY(name) < 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2866 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2867 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2868 if (level < 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2869 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
2870 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
2871 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2872 else if (level > 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2873 package = _PyDict_GetItemId(globals, &PyId___package__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2874 if (package != NULL && package != Py_None) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2875 Py_INCREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2876 if (!PyUnicode_Check(package)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2877 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
2878 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2879 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2880 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2881 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2882 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2883 if (package == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2884 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2885 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2886 else if (!PyUnicode_Check(package)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2887 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
2888 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2889 Py_INCREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2890
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2891 if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) {
76304
6cfb6fb18e1f Undo a C99 idiom.
Brett Cannon <brett@python.org>
parents: 76303
diff changeset
2892 PyObject *partition = NULL;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2893 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
2894 if (borrowed_dot == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2895 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2896 }
76304
6cfb6fb18e1f Undo a C99 idiom.
Brett Cannon <brett@python.org>
parents: 76303
diff changeset
2897 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
2898 Py_DECREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2899 if (partition == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2900 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2901 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2902 package = PyTuple_GET_ITEM(partition, 0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2903 Py_INCREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2904 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
2905 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2906 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2907
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2908 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
2909 PyErr_Format(PyExc_SystemError,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2910 "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
2911 "import", package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2912 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2913 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2914 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2915 else { /* level == 0 */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2916 if (PyUnicode_GET_LENGTH(name) == 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2917 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
2918 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2919 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2920 package = Py_None;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2921 Py_INCREF(package);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2922 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2923
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2924 if (level > 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2925 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
2926 PyObject *base = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2927 int level_up = 1;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2928
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2929 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
2930 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
2931 if (last_dot == -2) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2932 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2933 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2934 else if (last_dot == -1) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2935 PyErr_SetString(PyExc_ValueError,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2936 "attempted relative import beyond top-level "
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2937 "package");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2938 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2939 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2940 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2941 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
2942 if (PyUnicode_GET_LENGTH(name) > 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2943 PyObject *borrowed_dot = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2944 PyObject *seq = PyTuple_Pack(2, base, name);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2945
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2946 borrowed_dot = _PyUnicode_FromId(&single_dot);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2947 if (borrowed_dot == NULL || seq == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2948 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2949 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2950
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2951 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
2952 Py_DECREF(seq);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2953 if (abs_name == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2954 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2955 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2956 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2957 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2958 abs_name = base;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2959 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2960 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2961 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2962 abs_name = name;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2963 Py_INCREF(abs_name);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2964 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2965
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
2966 #ifdef WITH_THREAD
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2967 _PyImport_AcquireLock();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2968 #endif
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2969 /* 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
2970 if (PyDict_Check(globals)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2971 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
2972 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2973 if (builtins_import == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2974 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
2975 if (builtins_import == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2976 Py_FatalError("__import__ missing");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2977 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2978 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2979 Py_INCREF(builtins_import);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2980
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2981 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
2982 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
2983 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
2984 "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
2985 if (msg != NULL) {
c9fb9f5e16e7 Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents: 76312
diff changeset
2986 PyErr_SetFromImportErrorWithName(msg, abs_name);
c9fb9f5e16e7 Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents: 76312
diff changeset
2987 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2988 goto error_with_unlock;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2989 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2990 else if (mod != NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2991 Py_INCREF(mod);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2992 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2993 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2994 mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2995 &PyId__find_and_load, abs_name,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2996 builtins_import, NULL);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2997 if (mod == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2998 goto error_with_unlock;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
2999 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3000 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3001
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3002 if (PyObject_Not(fromlist)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3003 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
3004 PyObject *front = NULL;
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
3005 PyObject *partition = NULL;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3006 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
3007
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3008 if (borrowed_dot == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3009 goto error_with_unlock;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3010 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3011
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
3012 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
3013 if (partition == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3014 goto error_with_unlock;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3015 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3016
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3017 front = PyTuple_GET_ITEM(partition, 0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3018 Py_INCREF(front);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3019 Py_DECREF(partition);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3020
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3021 if (level == 0) {
76329
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3022 if (PyUnicode_GET_LENGTH(name) ==
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3023 PyUnicode_GET_LENGTH(front)) {
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3024 final_mod = mod;
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3025 }
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3026 else {
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3027 final_mod = PyDict_GetItem(interp->modules, front);
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3028 if (final_mod == NULL) {
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3029 PyErr_Format(PyExc_KeyError,
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3030 "%R not in sys.modules as expected", front);
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3031 }
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3032 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3033 Py_DECREF(front);
76312
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3034 if (final_mod == NULL) {
76329
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3035 goto error_with_unlock;
76312
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3036 }
76329
005fd1fe31ab Issue #14582: Import returns the module returned by a loader instead
Brett Cannon <brett@python.org>
parents: 76328
diff changeset
3037 Py_INCREF(final_mod);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3038 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3039 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3040 Py_ssize_t cut_off = PyUnicode_GetLength(name) -
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3041 PyUnicode_GetLength(front);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3042 Py_ssize_t abs_name_len = PyUnicode_GetLength(abs_name);
76312
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3043 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
3044 abs_name_len - cut_off);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3045
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3046 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
3047 Py_DECREF(to_return);
76312
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3048 if (final_mod == NULL) {
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3049 PyErr_Format(PyExc_KeyError,
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3050 "%R not in sys.modules as expected",
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3051 to_return);
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3052 }
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3053 else {
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3054 Py_INCREF(final_mod);
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
3055 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3056 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3057 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3058 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3059 final_mod = mod;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3060 Py_INCREF(mod);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3061 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3062 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3063 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3064 final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3065 &PyId__handle_fromlist, mod,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3066 fromlist, builtins_import,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3067 NULL);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3068 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3069 error_with_unlock:
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
3070 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3071 if (_PyImport_ReleaseLock() < 0) {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3072 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
3073 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3074 #endif
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3075 error:
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3076 Py_XDECREF(abs_name);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3077 Py_XDECREF(builtins_import);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3078 Py_XDECREF(mod);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3079 Py_XDECREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3080 Py_XDECREF(globals);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3081 Py_XDECREF(fromlist);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
3082 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
3083 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
3084
68739
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3085 PyObject *
70374
a9126e8770e5 make PyImport_ImportModuleLevel's first arg const like similiar functions (closes #12173)
Benjamin Peterson <benjamin@python.org>
parents: 69463
diff changeset
3086 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
3087 PyObject *fromlist, int level)
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3088 {
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3089 PyObject *nameobj, *mod;
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3090 nameobj = PyUnicode_FromString(name);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3091 if (nameobj == NULL)
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3092 return NULL;
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3093 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3094 fromlist, level);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3095 Py_DECREF(nameobj);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3096 return mod;
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3097 }
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3098
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
3099
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3100 /* 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
3101 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
3102
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3103 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3104 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
3105 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3106 PyInterpreterState *interp = PyThreadState_Get()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3107 PyObject *modules_reloading = interp->modules_reloading;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3108 PyObject *modules = PyImport_GetModuleDict();
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3109 PyObject *path_list = NULL, *loader = NULL, *existing_m = NULL;
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3110 PyObject *name, *bufobj, *subname;
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3111 Py_ssize_t subname_start;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3112 struct filedescr *fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3113 FILE *fp = NULL;
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3114 PyObject *newm = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3115
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3116 if (modules_reloading == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3117 Py_FatalError("PyImport_ReloadModule: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3118 "no modules_reloading dictionary!");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3119 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3120 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3121
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3122 if (m == NULL || !PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3123 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3124 "reload() argument must be module");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3125 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3126 }
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3127 name = PyModule_GetNameObject(m);
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3128 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
3129 return NULL;
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3130 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
3131 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
3132 "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
3133 name);
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3134 Py_DECREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3135 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3136 }
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3137 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
3138 if (existing_m != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3139 /* 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
3140 being reloaded. */
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3141 Py_DECREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3142 Py_INCREF(existing_m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3143 return existing_m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3144 }
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3145 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
3146 Py_DECREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3147 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
3148 }
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3149
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3150 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
3151 PyUnicode_GET_LENGTH(name), -1);
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3152 if (subname_start == -1) {
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3153 Py_INCREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3154 subname = name;
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3155 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3156 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3157 PyObject *parentname, *parent;
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3158 Py_ssize_t len;
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3159 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
3160 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
3161 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3162 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3163 parent = PyDict_GetItem(modules, parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3164 if (parent == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3165 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
3166 "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
3167 parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3168 Py_DECREF(parentname);
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3169 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3170 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3171 Py_DECREF(parentname);
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
3172 path_list = _PyObject_GetAttrId(parent, &PyId___path__);
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3173 if (path_list == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3174 PyErr_Clear();
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3175 subname_start++;
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3176 len = PyUnicode_GET_LENGTH(name) - (subname_start + 1);
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3177 subname = PyUnicode_Substring(name, subname_start, len);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3178 }
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3179 if (subname == NULL)
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3180 goto error;
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3181 fdp = find_module(name, subname, path_list,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3182 &bufobj, &fp, &loader);
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3183 Py_DECREF(subname);
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3184 Py_XDECREF(path_list);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3185
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3186 if (fdp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3187 Py_XDECREF(loader);
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3188 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3189 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3190
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3191 newm = load_module(name, fp, bufobj, fdp->type, loader);
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3192 Py_XDECREF(bufobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3193 Py_XDECREF(loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3194
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3195 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3196 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3197 if (newm == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3198 /* 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
3199 * 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
3200 * 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
3201 * 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
3202 */
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3203 PyDict_SetItem(modules, name, m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3204 }
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3205
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3206 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3207 imp_modules_reloading_clear();
73198
a938d0258abe Port PyImport_ReloadModule to Unicode API.
Martin v. Löwis <martin@v.loewis.de>
parents: 73110
diff changeset
3208 Py_DECREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3209 return newm;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3210 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3211
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3212
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3213 /* 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
3214 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
3215 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
3216 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
3217 environment.
9680
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
3218 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
3219 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
3220 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
3221
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3222 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3223 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
3224 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3225 static PyObject *silly_list = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3226 static PyObject *builtins_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3227 static PyObject *import_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3228 PyObject *globals = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3229 PyObject *import = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3230 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
3231 PyObject *modules = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3232 PyObject *r = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3233
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3234 /* Initialize constant string objects */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3235 if (silly_list == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3236 import_str = PyUnicode_InternFromString("__import__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3237 if (import_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3238 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3239 builtins_str = PyUnicode_InternFromString("__builtins__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3240 if (builtins_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3241 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
3242 silly_list = PyList_New(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3243 if (silly_list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3244 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3245 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3246
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3247 /* Get the builtins from current globals */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3248 globals = PyEval_GetGlobals();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3249 if (globals != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3250 Py_INCREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3251 builtins = PyObject_GetItem(globals, builtins_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3252 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3253 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3254 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3255 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3256 /* 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
3257 builtins = PyImport_ImportModuleLevel("builtins",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3258 NULL, NULL, NULL, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3259 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3260 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3261 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
3262 if (globals == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3263 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3264 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3265
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3266 /* 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
3267 if (PyDict_Check(builtins)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3268 import = PyObject_GetItem(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3269 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3270 PyErr_SetObject(PyExc_KeyError, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3271 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3272 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3273 import = PyObject_GetAttr(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3274 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3275 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3276
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3277 /* 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
3278 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
3279 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
3280 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
3281 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
3282 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
3283 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
3284 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
3285
dd3080b80dda PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents: 64638
diff changeset
3286 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
3287 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
3288 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
3289 Py_INCREF(r);
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3290
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3291 err:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3292 Py_XDECREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3293 Py_XDECREF(builtins);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3294 Py_XDECREF(import);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3295
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3296 return r;
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3297 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3298
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3299
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3300 /* 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
3301 importing modules.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3302 */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3303
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3304 static PyObject *
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3305 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
3306 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3307 char buf[4];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3308
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3309 buf[0] = (char) ((magic >> 0) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3310 buf[1] = (char) ((magic >> 8) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3311 buf[2] = (char) ((magic >> 16) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3312 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
3313
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3314 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
3315 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3316
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3317 static PyObject *
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3318 imp_get_magic(PyObject *self, PyObject *noargs)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3319 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3320 return imp_make_magic(pyc_magic);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3321 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3322
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3323 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3324 imp_get_tag(PyObject *self, PyObject *noargs)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3325 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3326 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
3327 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3328
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3329 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
3330 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
3331 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3332 PyObject *list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3333 struct filedescr *fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3334
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3335 list = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3336 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3337 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3338 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
3339 PyObject *item = Py_BuildValue("ssi",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3340 fdp->suffix, fdp->mode, fdp->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3341 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3342 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3343 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3344 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3345 if (PyList_Append(list, item) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3346 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3347 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3348 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3349 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3350 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3351 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3352 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
3353 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3354
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3355 static PyObject *
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3356 call_find_module(PyObject *name, PyObject *path_list)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3357 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3358 extern int fclose(FILE *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3359 PyObject *fob, *ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3360 PyObject *pathobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3361 struct filedescr *fdp;
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3362 FILE *fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3363 int fd = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3364 char *found_encoding = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3365 char *encoding = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3366
68730
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3367 if (path_list == Py_None)
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3368 path_list = NULL;
fe1d421ca3fa Issue #3080: Rename some path variables to path_list
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68729
diff changeset
3369 fdp = find_module(NULL, name, path_list,
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3370 &pathobj, &fp, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3371 if (fdp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3372 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3373 if (fp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3374 fd = fileno(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3375 if (fd != -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3376 fd = dup(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3377 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3378 fp = NULL;
75175
963a0fba98e0 In find_module(), do not silence fileno() and dup() errors.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74611
diff changeset
3379 if (fd == -1)
963a0fba98e0 In find_module(), do not silence fileno() and dup() errors.
Antoine Pitrou <solipsis@pitrou.net>
parents: 74611
diff changeset
3380 return PyErr_SetFromErrno(PyExc_OSError);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3381 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3382 if (fd != -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3383 if (strchr(fdp->mode, 'b') == NULL) {
69148
7b8d625eb6e4 Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68887
diff changeset
3384 /* PyTokenizer_FindEncodingFilename() returns PyMem_MALLOC'ed
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3385 memory. */
69148
7b8d625eb6e4 Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68887
diff changeset
3386 found_encoding = PyTokenizer_FindEncodingFilename(fd, pathobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3387 lseek(fd, 0, 0); /* Reset position */
75176
cbfd2bf80db0 Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75175
diff changeset
3388 if (found_encoding == NULL && PyErr_Occurred()) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3389 Py_XDECREF(pathobj);
75176
cbfd2bf80db0 Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75175
diff changeset
3390 close(fd);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3391 return NULL;
75176
cbfd2bf80db0 Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75175
diff changeset
3392 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3393 encoding = (found_encoding != NULL) ? found_encoding :
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3394 (char*)PyUnicode_GetDefaultEncoding();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3395 }
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3396 fob = PyFile_FromFd(fd, NULL, fdp->mode, -1,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3397 (char*)encoding, NULL, NULL, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3398 if (fob == NULL) {
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3399 Py_XDECREF(pathobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3400 close(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3401 PyMem_FREE(found_encoding);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3402 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3403 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3405 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3406 fob = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3407 Py_INCREF(fob);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3408 }
68735
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3409 if (pathobj == NULL) {
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3410 Py_INCREF(Py_None);
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3411 pathobj = Py_None;
9aec6f0e4076 Issue #3080: find_module() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68734
diff changeset
3412 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3413 ret = Py_BuildValue("NN(ssi)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3414 fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3415 PyMem_FREE(found_encoding);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3416
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3417 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3418 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3419
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3420 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3421 imp_find_module(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
3422 {
68729
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3423 PyObject *name, *path_list = NULL;
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3424 if (!PyArg_ParseTuple(args, "U|O:find_module",
156818529636 Issue #3080: find_module() expects module fullname and subname as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68728
diff changeset
3425 &name, &path_list))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3426 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
3427 return call_find_module(name, path_list);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3428 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3429
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3430 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3431 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
3432 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3433 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3434 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3435 PyObject *m;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3436 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
3437 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3438 ret = init_builtin(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3439 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3440 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3441 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3442 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3443 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3444 }
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3445 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3446 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3447 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
3448 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3449
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3450 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3451 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
3452 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3453 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3454 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3455 PyObject *m;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3456 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
3457 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3458 ret = PyImport_ImportFrozenModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3459 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3460 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3461 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3462 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3463 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3464 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3465 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3466 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3467 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
3468 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3469
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3470 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3471 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
3472 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3473 PyObject *name;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3474
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3475 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
3476 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3477 return get_frozen_object(name);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
3478 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
3479
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3480 static PyObject *
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3481 imp_is_frozen_package(PyObject *self, PyObject *args)
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3482 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3483 PyObject *name;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3484
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3485 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
3486 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3487 return is_frozen_package(name);
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3488 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3489
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3490 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3491 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
3492 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3493 PyObject *name;
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3494 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
3495 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3496 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
3497 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3498
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3499 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3500 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
3501 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3502 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3503 struct _frozen *p;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3504 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
3505 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3506 p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3507 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
3508 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3509
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3510 static FILE *
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3511 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
3512 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3513 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3514 if (mode[0] == 'U')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3515 mode = "r" PY_STDIOTEXTMODE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3516 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
3517 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
3518 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
3519 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
3520 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
3521 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
3522 }
f44ab94cd28b (Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 74058
diff changeset
3523 return fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3524 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3525 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3526 int fd = PyObject_AsFileDescriptor(fob);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3527 if (fd == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3528 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
3529 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
3530 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
3531 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
3532 }
f44ab94cd28b (Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 74058
diff changeset
3533
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3534 /* 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
3535 * independently of the file descriptor given
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3536 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3537 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
3538 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
3539 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
3540 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
3541 }
f44ab94cd28b (Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 74058
diff changeset
3542
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3543 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
3544 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
3545 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
3546 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
3547 }
f44ab94cd28b (Merge 3.2) Handle correctly _Py_fopen() error: don't replace the exception
Victor Stinner <victor.stinner@haypocalc.com>
parents: 74058
diff changeset
3548 return fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3549 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3550 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3551
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3552 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3553 imp_load_compiled(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
3554 {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3555 PyObject *name, *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3556 PyObject *fob = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3557 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3558 FILE *fp;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3559 if (!PyArg_ParseTuple(args, "UO&|O:load_compiled",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3560 &name,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3561 PyUnicode_FSDecoder, &pathname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3562 &fob))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3563 return NULL;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3564 fp = get_file(pathname, fob, "rb");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3565 if (fp == NULL) {
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3566 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3567 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3568 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3569 m = load_compiled_module(name, pathname, fp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3570 fclose(fp);
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3571 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3572 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
3573 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3574
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3575 #ifdef HAVE_DYNAMIC_LOADING
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3576
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3577 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3578 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
3579 {
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3580 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
3581 FILE *fp;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3582
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3583 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
3584 &name, PyUnicode_FSDecoder, &pathname, &fob))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3585 return NULL;
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3586 if (fob != NULL) {
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3587 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
3588 if (fp == NULL) {
68826
3114f26d5d54 Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68823
diff changeset
3589 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3590 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3591 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3592 }
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3593 else
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3594 fp = NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3595 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
3596 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3597 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3598 fclose(fp);
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3599 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
3600 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3601
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3602 #endif /* HAVE_DYNAMIC_LOADING */
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3603
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3604 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3605 imp_load_source(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
3606 {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3607 PyObject *name, *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3608 PyObject *fob = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3609 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3610 FILE *fp;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3611 if (!PyArg_ParseTuple(args, "UO&|O:load_source",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3612 &name,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3613 PyUnicode_FSDecoder, &pathname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3614 &fob))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3615 return NULL;
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3616 fp = get_file(pathname, fob, "r");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3617 if (fp == NULL) {
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3618 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3619 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3620 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3621 m = load_source_module(name, pathname, fp);
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3622 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3623 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3624 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
3625 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3626
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3627 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3628 imp_load_module(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3629 {
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3630 PyObject *name, *fob, *pathname, *pathname_obj, *ret;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3631 char *suffix; /* Unused */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3632 char *mode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3633 int type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3634 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3635
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3636 if (!PyArg_ParseTuple(args, "UOO(ssi):load_module",
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3637 &name, &fob, &pathname_obj, &suffix, &mode, &type))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3638 return NULL;
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3639 if (pathname_obj != Py_None) {
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3640 if (!PyUnicode_FSDecoder(pathname_obj, &pathname))
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3641 return NULL;
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3642 }
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3643 else
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3644 pathname = NULL;
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3645
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3646 if (*mode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3647 /* Mode must start with 'r' or 'U' and must not contain '+'.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3648 Implicit in this test is the assumption that the mode
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3649 may contain other modifiers like 'b' or 't'. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3650
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3651 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3652 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3653 "invalid file open mode %.200s", mode);
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3654 Py_XDECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3655 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3656 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3657 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3658 if (fob == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3659 fp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3660 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3661 fp = get_file(NULL, fob, mode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3662 if (fp == NULL) {
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3663 Py_XDECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3664 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3665 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3666 }
68723
64c21f364519 Issue #3080: load_module() expects name and path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68722
diff changeset
3667 ret = load_module(name, fp, pathname, type, NULL);
68768
7f4a4e393058 Issue #3080: imp.load_module() accepts None for the module path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68742
diff changeset
3668 Py_XDECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3669 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3670 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3671 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3672 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3673
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3674 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3675 imp_load_package(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3676 {
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3677 PyObject *name, *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3678 PyObject * ret;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3679 if (!PyArg_ParseTuple(args, "UO&:load_package",
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3680 &name, PyUnicode_FSDecoder, &pathname))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3681 return NULL;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3682 ret = load_package(name, pathname);
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3683 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3684 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3685 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3686
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3687 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3688 imp_new_module(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
3689 {
68736
c17bc2026145 Issue #3080: imp.new_module() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68735
diff changeset
3690 PyObject *name;
c17bc2026145 Issue #3080: imp.new_module() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68735
diff changeset
3691 if (!PyArg_ParseTuple(args, "U:new_module", &name))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3692 return NULL;
68736
c17bc2026145 Issue #3080: imp.new_module() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68735
diff changeset
3693 return PyModule_NewObject(name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3694 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3695
44567
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3696 static PyObject *
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3697 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
3698 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3699 return PyImport_ReloadModule(v);
44567
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3700 }
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3701
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3702 PyDoc_STRVAR(doc_reload,
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3703 "reload(module) -> module\n\
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3704 \n\
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3705 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
3706
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3707 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3708 imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3709 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3710 static char *kwlist[] = {"path", "debug_override", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3711
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3712 PyObject *pathname, *cpathname;
65391
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3713 PyObject *debug_override = NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3714 int debug = !Py_OptimizeFlag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3715
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3716 if (!PyArg_ParseTupleAndKeywords(
65380
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3717 args, kws, "O&|O", kwlist,
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3718 PyUnicode_FSDecoder, &pathname, &debug_override))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3719 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3720
65391
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3721 if (debug_override != NULL &&
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3722 (debug = PyObject_IsTrue(debug_override)) < 0) {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3723 Py_DECREF(pathname);
65391
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3724 return NULL;
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3725 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3726
73064
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
3727 if (PyUnicode_READY(pathname) < 0)
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
3728 return NULL;
fdb0ccf1f4b3 Add ready checks for make_compiled_pathname.
Martin v. Löwis <martin@v.loewis.de>
parents: 73063
diff changeset
3729
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
3730 cpathname = make_compiled_pathname(pathname, debug);
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3731 Py_DECREF(pathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3732
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3733 if (cpathname == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3734 PyErr_Format(PyExc_SystemError, "path buffer too short");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3735 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3736 }
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
3737 return cpathname;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3738 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3739
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3740 PyDoc_STRVAR(doc_cache_from_source,
73321
425591f6c2a5 Add signatures to the docstring of functions added to imp by PEP 3147
Éric Araujo <merwok@netwok.org>
parents: 73205
diff changeset
3741 "cache_from_source(path, [debug_override]) -> path\n\
425591f6c2a5 Add signatures to the docstring of functions added to imp by PEP 3147
Éric Araujo <merwok@netwok.org>
parents: 73205
diff changeset
3742 Given the path to a .py file, return the path to its .pyc/.pyo file.\n\
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3743 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3744 The .py file does not need to exist; this simply returns the path to the\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3745 .pyc/.pyo file calculated as if the .py file were imported. The extension\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3746 will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3747 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3748 If debug_override is not None, then it must be a boolean and is taken as\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3749 the value of __debug__ instead.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3750
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3751 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3752 imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3753 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3754 static char *kwlist[] = {"path", NULL};
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3755 PyObject *pathname, *source;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3756
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3757 if (!PyArg_ParseTupleAndKeywords(
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3758 args, kws, "O&", kwlist,
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3759 PyUnicode_FSDecoder, &pathname))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3760 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3761
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3762 source = make_source_pathname(pathname);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3763 if (source == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3764 PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %R",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3765 pathname);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3766 Py_DECREF(pathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3767 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3768 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3769 Py_DECREF(pathname);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3770 return source;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3771 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3772
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3773 PyDoc_STRVAR(doc_source_from_cache,
73321
425591f6c2a5 Add signatures to the docstring of functions added to imp by PEP 3147
Éric Araujo <merwok@netwok.org>
parents: 73205
diff changeset
3774 "source_from_cache(path) -> path\n\
425591f6c2a5 Add signatures to the docstring of functions added to imp by PEP 3147
Éric Araujo <merwok@netwok.org>
parents: 73205
diff changeset
3775 Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3776 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3777 The .pyc/.pyo file does not need to exist; this simply returns the path to\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3778 the .py file calculated to correspond to the .pyc/.pyo file. If path\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3779 does not conform to PEP 3147 format, ValueError will be raised.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3780
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3781 /* Doc strings */
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3782
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3783 PyDoc_STRVAR(doc_imp,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3784 "This module provides the components needed to build your own\n\
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3785 __import__ function. Undocumented functions are obsolete.");
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3786
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3787 PyDoc_STRVAR(doc_find_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3788 "find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3789 Search for a module. If path is omitted or None, search for a\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3790 built-in, frozen or special module and continue search in sys.path.\n\
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3791 The module name cannot contain '.'; to search for a submodule of a\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3792 package, pass the submodule name and the package's __path__.");
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3793
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3794 PyDoc_STRVAR(doc_load_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3795 "load_module(name, file, filename, (suffix, mode, type)) -> module\n\
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3796 Load a module, given information returned by find_module().\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3797 The module name must include the full package name, if any.");
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3798
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3799 PyDoc_STRVAR(doc_get_magic,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3800 "get_magic() -> string\n\
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3801 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
3802
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3803 PyDoc_STRVAR(doc_get_tag,
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3804 "get_tag() -> string\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3805 Return the magic tag for .pyc or .pyo files.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3806
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3807 PyDoc_STRVAR(doc_get_suffixes,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3808 "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
3809 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
3810 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
3811
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3812 PyDoc_STRVAR(doc_new_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3813 "new_module(name) -> module\n\
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3814 Create a new module. Do not enter it in sys.modules.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3815 The module name must include the full package name, if any.");
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3816
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3817 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
3818 "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
3819 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
3820 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
3821
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
3822 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
3823 "acquire_lock() -> None\n\
27853
5620b0786271 Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents: 27852
diff changeset
3824 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
3825 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
3826 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
3827 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
3828
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
3829 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
3830 "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
3831 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
3832 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
3833
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3834 static PyMethodDef imp_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3835 {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3836 {"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
3837 {"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
3838 {"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
3839 {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3840 {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3841 {"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
3842 {"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
3843 {"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
3844 {"reload", imp_reload, METH_O, doc_reload},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3845 {"cache_from_source", (PyCFunction)imp_cache_from_source,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3846 METH_VARARGS | METH_KEYWORDS, doc_cache_from_source},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3847 {"source_from_cache", (PyCFunction)imp_source_from_cache,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3848 METH_VARARGS | METH_KEYWORDS, doc_source_from_cache},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3849 /* The rest are obsolete */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3850 {"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
3851 {"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
3852 {"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
3853 {"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
3854 {"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
3855 {"is_frozen", imp_is_frozen, METH_VARARGS},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3856 {"load_compiled", imp_load_compiled, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3857 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3858 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3859 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3860 {"load_package", imp_load_package, METH_VARARGS},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3861 {"load_source", imp_load_source, METH_VARARGS},
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
3862 {"_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
3863 {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
3864 };
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3865
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8613
diff changeset
3866 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3867 setint(PyObject *d, char *name, int value)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3868 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3869 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3870 int err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3871
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3872 v = PyLong_FromLong((long)value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3873 err = PyDict_SetItemString(d, name, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3874 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3875 return err;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3876 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3877
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3878 typedef struct {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3879 PyObject_HEAD
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3880 } NullImporter;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3881
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3882 static int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3883 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
3884 {
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3885 #ifndef MS_WINDOWS
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3886 PyObject *path;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3887 struct stat statbuf;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3888 int rv;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3889
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3890 if (!_PyArg_NoKeywords("NullImporter()", kwds))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3891 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3892
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3893 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
3894 PyUnicode_FSConverter, &path))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3895 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3896
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3897 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
3898 Py_DECREF(path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3899 PyErr_SetString(PyExc_ImportError, "empty pathname");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3900 return -1;
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3901 }
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3902
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3903 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
3904 Py_DECREF(path);
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3905 if (rv == 0) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3906 /* it exists */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3907 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
3908 /* it's a directory */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3909 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
3910 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3911 }
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3912 }
50991
a823c9f3a452 Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 50619
diff changeset
3913 #else /* MS_WINDOWS */
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3914 PyObject *pathobj;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3915 DWORD rv;
65008
c620fe87c703 Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64838
diff changeset
3916 wchar_t *path;
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3917
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3918 if (!_PyArg_NoKeywords("NullImporter()", kwds))
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3919 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3920
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3921 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
3922 &pathobj))
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3923 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3924
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72454
diff changeset
3925 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
3926 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
3927 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3928 }
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3929
65157
e3ae5b00ba15 PyUnicode_AsWideCharString() takes a PyObject*, not a PyUnicodeObject*
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65027
diff changeset
3930 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
3931 if (path == NULL)
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3932 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3933 /* see issue1293 and issue3677:
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3934 * 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
3935 * "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
3936 */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3937 rv = GetFileAttributesW(path);
65008
c620fe87c703 Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64838
diff changeset
3938 PyMem_Free(path);
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3939 if (rv != INVALID_FILE_ATTRIBUTES) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3940 /* it exists */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3941 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3942 /* it's a directory */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3943 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
3944 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3945 }
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3946 }
50991
a823c9f3a452 Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 50619
diff changeset
3947 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3948 return 0;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3949 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3950
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3951 static PyObject *
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3952 NullImporter_find_module(NullImporter *self, PyObject *args)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3953 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3954 Py_RETURN_NONE;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3955 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3956
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3957 static PyMethodDef NullImporter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3958 {"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
3959 "Always return None"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3960 },
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3961 {NULL} /* Sentinel */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3962 };
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3963
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3964
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
3965 PyTypeObject PyNullImporter_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3966 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3967 "imp.NullImporter", /*tp_name*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3968 sizeof(NullImporter), /*tp_basicsize*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3969 0, /*tp_itemsize*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3970 0, /*tp_dealloc*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3971 0, /*tp_print*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3972 0, /*tp_getattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3973 0, /*tp_setattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3974 0, /*tp_reserved*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3975 0, /*tp_repr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3976 0, /*tp_as_number*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3977 0, /*tp_as_sequence*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3978 0, /*tp_as_mapping*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3979 0, /*tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3980 0, /*tp_call*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3981 0, /*tp_str*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3982 0, /*tp_getattro*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3983 0, /*tp_setattro*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3984 0, /*tp_as_buffer*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3985 Py_TPFLAGS_DEFAULT, /*tp_flags*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3986 "Null importer object", /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3987 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3988 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3989 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3990 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3991 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3992 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3993 NullImporter_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3994 0, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3995 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3996 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3997 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3998 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3999 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4000 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4001 (initproc)NullImporter_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4002 0, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4003 PyType_GenericNew /* tp_new */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4004 };
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4005
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4006 static struct PyModuleDef impmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4007 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4008 "imp",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4009 doc_imp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4010 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4011 imp_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4012 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4013 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4014 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4015 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4016 };
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4017
30311
f003e48f562d Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents: 29812
diff changeset
4018 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
4019 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
4020 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4021 PyObject *m, *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4022
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4023 if (PyType_Ready(&PyNullImporter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4024 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4025
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4026 m = PyModule_Create(&impmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4027 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4028 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4029 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4030 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4031 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4032
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4033 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
4034 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
4035 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
4036 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
4037 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
4038 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
4039 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
4040 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
4041 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
4042 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
4043
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4044 Py_INCREF(&PyNullImporter_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4045 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
4046 return m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
4047 failure:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4048 Py_XDECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4049 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
4050 }
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4051
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4052
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
4053 /* 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
4054 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
4055 *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
4056 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
4057
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4058 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
4059
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4060 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
4061 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
4062 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4063 static struct _inittab *our_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4064 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4065 int i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4066
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4067 /* 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
4068 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
4069 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4070 if (n == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4071 return 0; /* Nothing to do */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4072 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
4073 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4074
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4075 /* 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
4076 p = our_copy;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4077 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
4078 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4079 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4080
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4081 /* 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
4082 if (our_copy != PyImport_Inittab)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4083 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
4084 PyImport_Inittab = our_copy = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4085 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
4086
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4087 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
4088 }
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4089
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4090 /* 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
4091
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4092 int
52721
54e093bd887e Merged revisions 71031 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 52547
diff changeset
4093 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
4094 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4095 struct _inittab newtab[2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4096
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4097 memset(newtab, '\0', sizeof newtab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4098
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4099 newtab[0].name = (char *)name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4100 newtab[0].initfunc = initfunc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4101
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4102 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
4103 }
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
4104
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
4105 #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
4106 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
4107 #endif