annotate Python/import.c @ 68721:f6507eb8e689

Issue #3080: get_sourcefile(), make_source_pathname(), load_package() Use Unicode for module name and path in get_sourcefile(), make_source_pathname() and load_package() functions.
author Victor Stinner <victor.stinner@haypocalc.com>
date Mon, 14 Mar 2011 13:33:46 -0400
parents 09aaac73d9cf
children d24decc8c97e
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)
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
105 */
54889
3aaf2e065db0 Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52721
diff changeset
106
64638
20a2153b0dda Fix incorrect comment regarding MAGIC and TAG in import.c
Nick Coghlan <ncoghlan@gmail.com>
parents: 64621
diff changeset
107 /* 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
108 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
109 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
110 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
111 care of any bytecode changes that occur during development.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
112 */
64621
252895d49157 bump magic number for DELETE_DEREF
Benjamin Peterson <benjamin@python.org>
parents: 64594
diff changeset
113 #define MAGIC (3180 | ((long)'\r'<<16) | ((long)'\n'<<24))
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
114 #define TAG "cpython-32"
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
115 #define CACHEDIR "__pycache__"
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
116 static const Py_UNICODE CACHEDIR_UNICODE[] = {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
117 '_', '_', 'p', 'y', 'c', 'a', 'c', 'h', 'e', '_', '_', '\0'};
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
118 /* Current magic word and string tag as globals. */
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
119 static long pyc_magic = MAGIC;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
120 static const char *pyc_tag = TAG;
12543
c8dbd5f70288 Marc-Andre Lemburg:
Guido van Rossum <guido@python.org>
parents: 12536
diff changeset
121
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
122 /* 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
123 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
124
6541
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
125 /* 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
126 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
127
43605
a2bb76d11d66 Patch 1267 by Christian Heimes.
Guido van Rossum <guido@python.org>
parents: 43569
diff changeset
128 /* Method from Parser/tokenizer.c */
43632
0067a6ab4854 Issue 1267, continued.
Guido van Rossum <guido@python.org>
parents: 43608
diff changeset
129 extern char * PyTokenizer_FindEncoding(int);
43605
a2bb76d11d66 Patch 1267 by Christian Heimes.
Guido van Rossum <guido@python.org>
parents: 43569
diff changeset
130
6541
b2dfff06789c Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents: 6454
diff changeset
131 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
132
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
133 /* 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
134 struct filedescr * _PyImport_Filetab = NULL;
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
135
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
136 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
137 {".py", "U", PY_SOURCE},
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23879
diff changeset
138 #ifdef MS_WINDOWS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
139 {".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
140 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
141 {".pyc", "rb", PY_COMPILED},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
142 {0, 0}
11602
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
143 };
5738ad737114 In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
144
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
145
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
146 /* Initialize things */
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
147
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
148 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
149 _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
150 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
151 const struct filedescr *scan;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
152 struct filedescr *filetab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
153 int countD = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
154 int countS = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
155
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
156 /* prepare _PyImport_Filetab: copy entries from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
157 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
158 */
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
159 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
160 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
161 ++countD;
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
162 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
163 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
164 ++countS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
165 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
166 if (filetab == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
167 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
168 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
169 memcpy(filetab, _PyImport_DynLoadFiletab,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
170 countD * sizeof(struct filedescr));
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
171 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
172 memcpy(filetab + countD, _PyImport_StandardFiletab,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
173 countS * sizeof(struct filedescr));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
174 filetab[countD + countS].suffix = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
175
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
176 _PyImport_Filetab = filetab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
177
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
178 if (Py_OptimizeFlag) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
179 /* 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
180 for (; filetab->suffix != NULL; filetab++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
181 if (strcmp(filetab->suffix, ".pyc") == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
182 filetab->suffix = ".pyo";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
183 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
184 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
185 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
186
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
187 void
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
188 _PyImportHooks_Init(void)
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
189 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
190 PyObject *v, *path_hooks = NULL, *zimpimport;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
191 int err = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
192
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
193 /* adding sys.path_hooks and sys.path_importer_cache, setting up
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
194 zipimport */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
195 if (PyType_Ready(&PyNullImporter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
196 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
197
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
198 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
199 PySys_WriteStderr("# installing zipimport hook\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
200
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
201 v = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
202 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
203 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
204 err = PySys_SetObject("meta_path", v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
205 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
206 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
207 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
208 v = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
209 if (v == NULL)
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 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
212 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
213 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
214 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
215 path_hooks = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
216 if (path_hooks == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
217 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
218 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
219 if (err) {
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
220 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
221 PyErr_Print();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
222 Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
223 "path_importer_cache, or NullImporter failed"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
224 );
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
225 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
226
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
227 zimpimport = PyImport_ImportModule("zipimport");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
228 if (zimpimport == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
229 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
230 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
231 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
232 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
233 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
234 PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
235 "zipimporter");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
236 Py_DECREF(zimpimport);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
237 if (zipimporter == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
238 PyErr_Clear(); /* No zipimporter object -- okay */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
239 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
240 PySys_WriteStderr(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
241 "# can't import zipimport.zipimporter\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
242 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
243 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
244 /* sys.path_hooks.append(zipimporter) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
245 err = PyList_Append(path_hooks, zipimporter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
246 Py_DECREF(zipimporter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
247 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
248 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
249 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
250 PySys_WriteStderr(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
251 "# installed zipimport hook\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
252 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
253 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
254 Py_DECREF(path_hooks);
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
255 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
256
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
257 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
258 _PyImport_Fini(void)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
259 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
260 Py_XDECREF(extensions);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
261 extensions = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
262 PyMem_DEL(_PyImport_Filetab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
263 _PyImport_Filetab = NULL;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
264 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
265
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
266
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
267 /* 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
268 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
269 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
270
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
271 #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
272
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 9187
diff changeset
273 #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
274
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9431
diff changeset
275 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
276 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
277 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
278
56382
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
279 void
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
280 _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
281 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
282 long me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
283 if (me == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
284 return; /* Too bad */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
285 if (import_lock == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
286 import_lock = PyThread_allocate_lock();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
287 if (import_lock == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
288 return; /* Nothing much we can do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
289 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
290 if (import_lock_thread == me) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
291 import_lock_level++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
292 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
293 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
294 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
295 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
296 PyThreadState *tstate = PyEval_SaveThread();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
297 PyThread_acquire_lock(import_lock, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
298 PyEval_RestoreThread(tstate);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
299 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
300 import_lock_thread = me;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
301 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
302 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
303
56382
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
304 int
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
305 _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
306 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
307 long me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
308 if (me == -1 || import_lock == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
309 return 0; /* Too bad */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
310 if (import_lock_thread != me)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
311 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
312 import_lock_level--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
313 if (import_lock_level == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
314 import_lock_thread = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
315 PyThread_release_lock(import_lock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
316 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
317 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
318 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
319
59235
58c35495a934 Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 59213
diff changeset
320 /* 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
321 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
322 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
323 (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
324
724bbd489ad4 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 35542
diff changeset
325 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
326 _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
327 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
328 if (import_lock != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
329 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
330 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
331 /* 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
332 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
333 PyThread_acquire_lock(import_lock, 0);
68708
a9d6c7e15456 import.c: replace tab by spaces
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68258
diff changeset
334 /* 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
335 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
336 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
337 } 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
338 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
339 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
340 }
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
341 }
724bbd489ad4 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 35542
diff changeset
342
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
343 #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
344
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
345 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
346 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
347 {
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
348 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
349 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
350 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
351 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
352 #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
353 }
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
354
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
355 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
356 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
357 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
358 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
359 _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
360 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
361 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
362 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
363 }
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
364
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
365 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
366 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
367 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
368 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
369 if (_PyImport_ReleaseLock() < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
370 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
371 "not holding the import lock");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
372 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
373 }
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
374 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
375 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
376 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
377 }
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
378
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
379 static void
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
380 imp_modules_reloading_clear(void)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
381 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
382 PyInterpreterState *interp = PyThreadState_Get()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
383 if (interp->modules_reloading != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
384 PyDict_Clear(interp->modules_reloading);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
385 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
386
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
387 /* Helper for sys */
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
388
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
389 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
390 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
391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
392 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
393 if (interp->modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
394 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
395 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
396 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
397
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
398
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
399 /* 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
400 static char* sys_deletes[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
401 "path", "argv", "ps1", "ps2",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
402 "last_type", "last_value", "last_traceback",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
403 "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
404 /* misc stuff */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
405 "flags", "float_info",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
406 NULL
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
407 };
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
408
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
409 static char* sys_files[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
410 "stdin", "__stdin__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
411 "stdout", "__stdout__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
412 "stderr", "__stderr__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
413 NULL
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
414 };
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
415
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
416
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
417 /* Un-initialize things, as good as we can */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
418
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
419 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
420 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
421 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
422 Py_ssize_t pos, ndone;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
423 PyObject *key, *value, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
424 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
425 PyObject *modules = interp->modules;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
426
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
427 if (modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
428 return; /* Already done */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
429
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
430 /* 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
431 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
432 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
433 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
434 destruction order. Sigh. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
435
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
436 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
437 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
438 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
439 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
440 PySys_WriteStderr("# clear builtins._\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
441 PyDict_SetItemString(dict, "_", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
442 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
443 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
444 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
445 char **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
446 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
447 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
448 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
449 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
450 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
451 PyDict_SetItemString(dict, *p, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
452 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
453 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
454 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
455 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
456 v = PyDict_GetItemString(dict, *(p+1));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
457 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
458 v = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
459 PyDict_SetItemString(dict, *p, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
460 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
461 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
462
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
463 /* First, delete __main__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
464 value = PyDict_GetItemString(modules, "__main__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
465 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
466 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
467 PySys_WriteStderr("# cleanup __main__\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
468 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
469 PyDict_SetItemString(modules, "__main__", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
470 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
471
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
472 /* 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
473 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
474 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
475 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
476 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
477 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
478 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
479
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
480 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
481 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
482 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
483 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
484 re-imported. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
485
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
486 /* 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
487 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
488 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
489 ndone = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
490 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
491 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
492 if (value->ob_refcnt != 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
493 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
494 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
495 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
496 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
497 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
498 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
499 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
500 PySys_FormatStderr(
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
501 "# cleanup[1] %U\n", key);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
502 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
503 PyDict_SetItem(modules, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
504 ndone++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
505 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
506 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
507 } while (ndone > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
508
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
509 /* 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
510 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
511 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
512 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
513 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
514 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
515 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
516 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
517 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
518 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
519 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
520 PyDict_SetItem(modules, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
521 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
522 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
523
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
524 /* Next, 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
525 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
526 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
527 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
528 PySys_WriteStderr("# cleanup sys\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
529 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
530 PyDict_SetItemString(modules, "sys", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
531 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
532 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
533 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
534 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
535 PySys_WriteStderr("# cleanup builtins\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
536 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
537 PyDict_SetItemString(modules, "builtins", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
538 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
539
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
540 /* 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
541 PyDict_Clear(modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
542 interp->modules = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
543 Py_DECREF(modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
544 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
545 }
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
546
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
547
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
548 /* 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
549
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
550 long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
551 PyImport_GetMagicNumber(void)
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
552 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
553 return pyc_magic;
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
554 }
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
555
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
557 const char *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
558 PyImport_GetMagicTag(void)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
559 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
560 return pyc_tag;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
561 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
562
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
563 /* 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
564 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
565 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
566 (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
567 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
568 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
569 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
570 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
571 _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
572
62385
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
573 Modules which do support multiple initialization set their m_size
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
574 field to a non-negative number (indicating the size of the
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
575 module-specific state). They are still recorded in the extensions
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
576 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
577 */
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
578
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
579 int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
580 _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
581 PyObject *filename)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
583 PyObject *modules, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
584 struct PyModuleDef *def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
585 if (extensions == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
586 extensions = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
587 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
588 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
589 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
590 if (mod == NULL || !PyModule_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
591 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
592 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
593 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
594 def = PyModule_GetDef(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
595 if (!def) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
596 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
597 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
598 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
599 modules = PyImport_GetModuleDict();
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
600 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
601 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
602 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
603 PyDict_DelItem(modules, name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
604 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
605 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
606 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
607 if (def->m_base.m_copy) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
608 /* Somebody already imported the module,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
609 likely under a different name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
610 XXX this should really not happen. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
611 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
612 def->m_base.m_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
613 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
614 dict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
615 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
616 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
617 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
618 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
619 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
620 }
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
621 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
622 return 0;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
623 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
624
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
625 int
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
626 _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
627 {
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
628 int res;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
629 PyObject *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
630 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
631 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
632 return -1;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
633 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
634 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
635 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
636 }
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
637
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
638 PyObject *
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
639 _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
640 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
641 PyObject *mod, *mdict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
642 PyModuleDef* def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
643 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
644 return NULL;
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
645 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
646 if (def == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
647 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
648 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
649 /* Module does not support repeated initialization */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
650 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
651 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
652 mod = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
653 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
654 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
655 mdict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
656 if (mdict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
657 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
658 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
659 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
660 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
661 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
662 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
663 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
664 mod = def->m_base.m_init();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
665 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
666 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
667 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
668 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
669 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
670 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
671 PyDict_DelItem(PyImport_GetModuleDict(), name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
672 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
673 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
674 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
675 if (Py_VerboseFlag)
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
676 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
677 name, filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
678 return mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
679
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
682 PyObject *
68110
44cc9ef43127 Issue #3080: Mark _PyImport_FindBuiltin() argument as constant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68107
diff changeset
683 _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
684 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
685 PyObject *res, *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
686 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
687 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
688 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
689 res = _PyImport_FindExtensionObject(nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
690 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
691 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
692 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
693
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
694 /* 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
695 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
696 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
697 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
698 '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
699
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
700 PyObject *
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
701 PyImport_AddModuleObject(PyObject *name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
702 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
703 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
704 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
705
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
706 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
707 PyModule_Check(m))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
708 return m;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
709 m = PyModule_NewObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
710 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
711 return NULL;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
712 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
713 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
714 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
715 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
716 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
717
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
718 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
719 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
720
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
721 PyObject *
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
722 PyImport_AddModule(const char *name)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
723 {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
724 PyObject *nameobj, *module;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
725 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
726 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
727 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
728 module = PyImport_AddModuleObject(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
729 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
730 return module;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
731 }
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
732
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
733
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
734 /* 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
735 static void
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
736 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
737 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
738 PyObject *modules = PyImport_GetModuleDict();
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
739 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
740 return;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
741 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
742 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
743 "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
744 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
745
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
746 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
747 static PyObject *make_source_pathname(PyObject *pathname);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
748 static char *make_compiled_pathname(char *pathname, char *buf, size_t buflen,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
749 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
750
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
751 /* 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
752 * 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
753 * 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
754 * 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
755 * 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
756 * example.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
757 *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
758 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
759 * 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
760 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
761 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
762 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
763 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
764 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
765 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
766 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
767
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
768 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
769 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
770 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
771 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
772 name, co, pathname, (char *)NULL);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
773 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
774
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
775 PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
776 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
777 char *cpathname)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
778 {
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
779 PyObject *m = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
780 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
781
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
782 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
783 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
784 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
785
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
786 if (pathname != NULL) {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
787 pathobj = PyUnicode_DecodeFSDefault(pathname);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
788 if (pathobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
789 goto error;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
790 } else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
791 pathobj = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
792 if (cpathname != NULL) {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
793 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
794 if (cpathobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
795 goto error;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
796 } else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
797 cpathobj = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
798 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
799 error:
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
800 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
801 Py_XDECREF(pathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
802 Py_XDECREF(cpathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
803 return m;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
804 }
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
805
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
806 PyObject*
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
807 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
808 PyObject *cpathname)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
809 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
810 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
811 PyObject *m, *d, *v;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
812
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
813 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
814 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
815 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
816 /* 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
817 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
818 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
819 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
820 if (PyDict_SetItemString(d, "__builtins__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
821 PyEval_GetBuiltins()) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
822 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
823 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
824 /* 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
825 if (pathname != NULL) {
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
826 v = get_sourcefile(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
827 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
828 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
829 }
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
830 else
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
831 v = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
832 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
833 v = ((PyCodeObject *)co)->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
834 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
835 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
836 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
837 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
838 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
839
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
840 /* 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
841 if (cpathname != NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
842 v = cpathname;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
843 else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
844 v = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
845 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
846 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
847
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66650
diff changeset
848 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
849 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
850 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
851 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
852
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
853 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
854 PyErr_Format(PyExc_ImportError,
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
855 "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
856 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
857 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
858 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
859
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
860 Py_INCREF(m);
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 return m;
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
863
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
864 error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
865 remove_module(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
866 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
869
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
870 /* Like strrchr(string, '/') but searches for the rightmost of either SEP
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
871 or ALTSEP, if the latter is defined.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
872 */
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
873 static char *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
874 rightmost_sep(char *s)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
875 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
876 char *found, c;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
877 for (found = NULL; (c = *s); s++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
878 if (c == SEP
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
879 #ifdef ALTSEP
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
880 || c == ALTSEP
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
881 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
882 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
883 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
884 found = s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
885 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
886 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
887 return found;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
888 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
889
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
890
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
891 /* Like strrchr(string, '/') but searches for the rightmost of either SEP
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
892 or ALTSEP, if the latter is defined.
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
893 */
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
894 static Py_UNICODE*
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
895 rightmost_sep_unicode(Py_UNICODE *s)
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
896 {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
897 Py_UNICODE *found, c;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
898 for (found = NULL; (c = *s); s++) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
899 if (c == SEP
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
900 #ifdef ALTSEP
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
901 || c == ALTSEP
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
902 #endif
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
903 )
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
904 {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
905 found = s;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
906 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
907 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
908 return found;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
909 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
910
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
911
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
912 /* 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
913 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
914 for the compiled file, or NULL if there's no space in the buffer.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
915 Doesn't set an exception. */
609
0ad5b35e3ad8 Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents: 510
diff changeset
916
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
917 static char *
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
918 make_compiled_pathname(char *pathname, char *buf, size_t buflen, int debug)
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
919 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
920 /* foo.py -> __pycache__/foo.<tag>.pyc */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
921 size_t len = strlen(pathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
922 size_t i, save;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
923 char *pos;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
924 int sep = SEP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
925
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
926 /* Sanity check that the buffer has roughly enough space to hold what
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
927 will eventually be the full path to the compiled file. The 5 extra
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
928 bytes include the slash afer __pycache__, the two extra dots, the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
929 extra trailing character ('c' or 'o') and null. This isn't exact
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
930 because the contents of the buffer can affect how many actual
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
931 characters of the string get into the buffer. We'll do a final
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
932 sanity check before writing the extension to ensure we do not
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
933 overflow the buffer.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
934 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
935 if (len + strlen(CACHEDIR) + strlen(pyc_tag) + 5 > buflen)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
936 return NULL;
18992
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
937
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
938 /* Find the last path separator and copy everything from the start of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
939 the source string up to and including the separator.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
940 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
941 if ((pos = rightmost_sep(pathname)) == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
942 i = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
943 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
944 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
945 sep = *pos;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
946 i = pos - pathname + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
947 strncpy(buf, pathname, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
948 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
949
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
950 save = i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
951 buf[i++] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
952 /* Add __pycache__/ */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
953 strcat(buf, CACHEDIR);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
954 i += strlen(CACHEDIR) - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
955 buf[i++] = sep;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
956 buf[i++] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
957 /* Add the base filename, but remove the .py or .pyw extension, since
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
958 the tag name must go before the extension.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
959 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
960 strcat(buf, pathname + save);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
961 if ((pos = strrchr(buf, '.')) != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
962 *++pos = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
963 strcat(buf, pyc_tag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
964 /* The length test above assumes that we're only adding one character
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
965 to the end of what would normally be the extension. What if there
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
966 is no extension, or the string ends in '.' or '.p', and otherwise
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
967 fills the buffer? By appending 4 more characters onto the string
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
968 here, we could overrun the buffer.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
969
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
970 As a simple example, let's say buflen=32 and the input string is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
971 'xxx.py'. strlen() would be 6 and the test above would yield:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
972
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
973 (6 + 11 + 10 + 5 == 32) > 32
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
974
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
975 which is false and so the name mangling would continue. This would
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
976 be fine because we'd end up with this string in buf:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
977
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
978 __pycache__/xxx.cpython-32.pyc\0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
979
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
980 strlen(of that) == 30 + the nul fits inside a 32 character buffer.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
981 We can even handle an input string of say 'xxxxx' above because
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
982 that's (5 + 11 + 10 + 5 == 31) > 32 which is also false. Name
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
983 mangling that yields:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
984
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
985 __pycache__/xxxxxcpython-32.pyc\0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
986
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
987 which is 32 characters including the nul, and thus fits in the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
988 buffer. However, an input string of 'xxxxxx' would yield a result
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
989 string of:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
990
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
991 __pycache__/xxxxxxcpython-32.pyc\0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
992
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
993 which is 33 characters long (including the nul), thus overflowing
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
994 the buffer, even though the first test would fail, i.e.: the input
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
995 string is also 6 characters long, so 32 > 32 is false.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
996
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
997 The reason the first test fails but we still overflow the buffer is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
998 that the test above only expects to add one extra character to be
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
999 added to the extension, and here we're adding three (pyc). We
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1000 don't add the first dot, so that reclaims one of expected
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1001 positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1002 dot - 1 expected extra == 1 overflowed).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1003
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1004 The best we can do is ensure that we still have enough room in the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1005 target buffer before we write the extension. Because it's always
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1006 only the extension that can cause the overflow, and never the other
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1007 path bytes we've written, it's sufficient to just do one more test
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1008 here. Still, the assertion that follows can't hurt.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1009 */
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1010 #if 0
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1011 printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen);
18992
7fa1f87ca6b2 Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents: 18933
diff changeset
1012 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1013 if (strlen(buf) + 5 > buflen)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1014 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1015 strcat(buf, debug ? ".pyc" : ".pyo");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1016 assert(strlen(buf) < buflen);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1017 return buf;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1018 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1019
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1020
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1021 /* 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
1022 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
1023 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
1024 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
1025 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
1026
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1027 (...)/__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
1028
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1029 static PyObject*
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1030 make_source_pathname(PyObject *pathobj)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1031 {
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1032 Py_UNICODE buf[MAXPATHLEN];
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1033 Py_UNICODE *pathname;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1034 Py_UNICODE *left, *right, *dot0, *dot1, sep;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1035 size_t i, j;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1036
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1037 if (PyUnicode_GET_SIZE(pathobj) > MAXPATHLEN)
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1038 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1039 pathname = PyUnicode_AS_UNICODE(pathobj);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1040
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1041 /* 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
1042 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
1043 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
1044 */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1045 right = rightmost_sep_unicode(pathname);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1046 if (right == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1047 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1048 sep = *right;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1049 *right = '\0';
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1050 left = rightmost_sep_unicode(pathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1051 *right = sep;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1052 if (left == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1053 left = pathname;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1054 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1055 left++;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1056 if (right-left != Py_UNICODE_strlen(CACHEDIR_UNICODE) ||
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1057 Py_UNICODE_strncmp(left, CACHEDIR_UNICODE, right-left) != 0)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1058 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1059
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1060 /* 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
1061 has two dots in it.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1062 */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1063 if ((dot0 = Py_UNICODE_strchr(right + 1, '.')) == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1064 return NULL;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1065 if ((dot1 = Py_UNICODE_strchr(dot0 + 1, '.')) == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1066 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1067 /* Too many dots? */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1068 if (Py_UNICODE_strchr(dot1 + 1, '.') != NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1069 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1070
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1071 /* 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
1072 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
1073 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
1074 suffix.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1075 */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1076 Py_UNICODE_strncpy(buf, pathname, (i=left-pathname));
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1077 Py_UNICODE_strncpy(buf+i, right+1, (j=dot0-right));
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1078 buf[i+j] = 'p';
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1079 buf[i+j+1] = 'y';
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1080 return PyUnicode_FromUnicode(buf, i+j+2);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1081 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1082
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1083 /* 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
1084 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
1085 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
1086 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
1087 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
1088 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
1089
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1090 static FILE *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1091 check_compiled_module(char *pathname, time_t mtime, char *cpathname)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1092 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1093 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1094 long magic;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1095 long pyc_mtime;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1096
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1097 fp = fopen(cpathname, "rb");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1098 if (fp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1099 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1100 magic = PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1101 if (magic != pyc_magic) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1102 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1103 PySys_WriteStderr("# %s has bad magic\n", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1104 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1105 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1106 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1107 pyc_mtime = PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1108 if (pyc_mtime != mtime) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1109 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1110 PySys_WriteStderr("# %s has bad mtime\n", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1111 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1112 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1113 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1114 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1115 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1116 return fp;
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1117 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1118
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1119
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1120 /* 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
1121
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1122 static PyCodeObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1123 read_compiled_module(char *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
1124 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1125 PyObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1126
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1127 co = PyMarshal_ReadLastObjectFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1128 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1129 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1130 if (!PyCode_Check(co)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1131 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1132 "Non-code object in %.200s", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1133 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1134 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1135 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1136 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
1137 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1138
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1139
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1140 /* 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
1141 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
1142
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1143 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1144 load_compiled_module(char *name, char *cpathname, FILE *fp)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1146 long magic;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1147 PyCodeObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1148 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1149
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1150 magic = PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1151 if (magic != pyc_magic) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1152 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1153 "Bad magic number in %.200s", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1154 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1155 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1156 (void) PyMarshal_ReadLongFromFile(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1157 co = read_compiled_module(cpathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1158 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1159 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1160 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1161 PySys_WriteStderr("import %s # precompiled from %s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1162 name, cpathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1163 m = PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1164 name, (PyObject *)co, cpathname, cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1165 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1166
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1167 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
1168 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1169
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1170 /* 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
1171
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1172 static PyCodeObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35678
diff changeset
1173 parse_source_module(const char *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
1174 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1175 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1176 mod_ty mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1177 PyCompilerFlags flags;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1178 PyArena *arena = PyArena_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1179 if (arena == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1180 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1181
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1182 flags.cf_flags = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1183 mod = PyParser_ASTFromFile(fp, pathname, NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1184 Py_file_input, 0, 0, &flags,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1185 NULL, arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1186 if (mod) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1187 co = PyAST_Compile(mod, pathname, NULL, arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1188 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1189 PyArena_Free(arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1190 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
1191 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1192
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1193
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
1194 /* Helper to open a bytecode file for writing in exclusive mode */
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
1195
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
1196 static FILE *
45471
7dd2c1746267 Merged revisions 60990-61002 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
1197 open_exclusive(char *filename, mode_t mode)
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
1198 {
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
1199 #if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1200 /* Use O_EXCL to avoid a race condition when another process tries to
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1201 write the same file. When that happens, our open() call fails,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1202 which is just fine (since it's only a cache).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1203 XXX If the file exists and is writable but the directory is not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1204 writable, the file will never be written. Oh well.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1205 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1206 int fd;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1207 (void) unlink(filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1208 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
14921
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
1209 #ifdef O_BINARY
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1210 |O_BINARY /* necessary for Windows */
14921
3db8b8031a6a The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents: 14708
diff changeset
1211 #endif
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 26461
diff changeset
1212 #ifdef __VMS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1213 , mode, "ctxt=bin", "shr=nil"
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 26461
diff changeset
1214 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1215 , mode
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 26461
diff changeset
1216 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1217 );
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1218 if (fd < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1219 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1220 return fdopen(fd, "wb");
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
1221 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1222 /* Best we can do -- on Windows this can't happen anyway */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1223 return fopen(filename, "wb");
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
1224 #endif
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
1225 }
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
1226
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
1227
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1228 /* 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
1229 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
1230 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
1231 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
1232
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1233 static void
45471
7dd2c1746267 Merged revisions 60990-61002 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
1234 write_compiled_module(PyCodeObject *co, char *cpathname, 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
1235 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1236 FILE *fp;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1237 char *dirpath;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1238 time_t mtime = srcstat->st_mtime;
55331
c7042127196a Merged revisions 74058 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 52721
diff changeset
1239 #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
1240 mode_t mode = srcstat->st_mode & ~S_IEXEC;
55331
c7042127196a Merged revisions 74058 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 52721
diff changeset
1241 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1242 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1243 mode_t dirmode = (srcstat->st_mode |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1244 S_IXUSR | S_IXGRP | S_IXOTH |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1245 S_IWUSR | S_IWGRP | S_IWOTH);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1246 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1247 int saved;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1248
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1249 /* Ensure that the __pycache__ directory exists. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1250 dirpath = rightmost_sep(cpathname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1251 if (dirpath == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1252 if (Py_VerboseFlag)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1253 PySys_WriteStderr(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1254 "# no %s path found %s\n",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1255 CACHEDIR, cpathname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1256 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1257 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1258 saved = *dirpath;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1259 *dirpath = '\0';
64594
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1260
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1261 #ifdef MS_WINDOWS
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1262 if (_mkdir(cpathname) < 0 && errno != EEXIST) {
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1263 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1264 if (mkdir(cpathname, dirmode) < 0 && errno != EEXIST) {
64594
84217b2d8c0c Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64439
diff changeset
1265 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1266 *dirpath = saved;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1267 if (Py_VerboseFlag)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1268 PySys_WriteStderr(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1269 "# cannot create cache dir %s\n", cpathname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1270 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1271 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1272 *dirpath = saved;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1273
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1274 fp = open_exclusive(cpathname, mode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1275 if (fp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1276 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1277 PySys_WriteStderr(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1278 "# can't create %s\n", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1279 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1280 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1281 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1282 /* First write a 0 for mtime */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1283 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
1284 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1285 if (fflush(fp) != 0 || ferror(fp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1286 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1287 PySys_WriteStderr("# can't write %s\n", cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1288 /* Don't keep partial file */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1289 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1290 (void) unlink(cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1291 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1292 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1293 /* Now write the true mtime */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1294 fseek(fp, 4L, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1295 assert(mtime < LONG_MAX);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1296 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1297 fflush(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1298 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1299 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1300 PySys_WriteStderr("# wrote %s\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
1301 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1302
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1303 static void
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1304 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
1305 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1306 PyObject *constants, *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1307 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1308
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1309 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
1310 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1311
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1312 tmp = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1313 co->co_filename = newname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1314 Py_INCREF(co->co_filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1315 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1316
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1317 constants = co->co_consts;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1318 n = PyTuple_GET_SIZE(constants);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1319 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1320 tmp = PyTuple_GET_ITEM(constants, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1321 if (PyCode_Check(tmp))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1322 update_code_filenames((PyCodeObject *)tmp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1323 oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1324 }
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1325 }
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1326
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1327 static int
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1328 update_compiled_module(PyCodeObject *co, char *pathname)
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1329 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1330 PyObject *oldname, *newname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1331
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1332 newname = PyUnicode_DecodeFSDefault(pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1333 if (newname == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1334 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1335
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1336 if (!PyUnicode_Compare(co->co_filename, newname)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1337 Py_DECREF(newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1338 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1339 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1340
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1341 oldname = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1342 Py_INCREF(oldname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1343 update_code_filenames(co, oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1344 Py_DECREF(oldname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1345 Py_DECREF(newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1346 return 1;
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
1347 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1348
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1349 /* 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
1350 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
1351 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
1352
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1353 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1354 load_source_module(char *name, char *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
1355 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1356 struct stat st;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1357 FILE *fpc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1358 char buf[MAXPATHLEN+1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1359 char *cpathname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1360 PyCodeObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1361 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1362
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1363 if (fstat(fileno(fp), &st) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1364 PyErr_Format(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1365 "unable to get file status from '%s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1366 pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1367 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1368 }
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
1369 #if SIZEOF_TIME_T > 4
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1370 /* Python's .pyc timestamp handling presumes that the timestamp fits
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1371 in 4 bytes. This will be fine until sometime in the year 2038,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1372 when a 4-byte signed time_t will overflow.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1373 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1374 if (st.st_mtime >> 32) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1375 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1376 "modification time overflows a 4 byte field");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1377 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1378 }
13226
12437deb0680 Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13181
diff changeset
1379 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1380 cpathname = make_compiled_pathname(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1381 pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1382 if (cpathname != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1383 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1384 co = read_compiled_module(cpathname, fpc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1385 fclose(fpc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1386 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1387 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1388 if (update_compiled_module(co, pathname) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1389 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1390 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1391 PySys_WriteStderr("import %s # precompiled from %s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1392 name, cpathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1393 pathname = cpathname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1394 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1395 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1396 co = parse_source_module(pathname, fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1397 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1398 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1399 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1400 PySys_WriteStderr("import %s # from %s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1401 name, pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1402 if (cpathname) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1403 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
1404 if (ro == NULL || !PyObject_IsTrue(ro))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1405 write_compiled_module(co, cpathname, &st);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1406 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1407 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1408 m = PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1409 name, (PyObject *)co, pathname, cpathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1410 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1411
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1412 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
1413 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1414
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
1415 /* 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
1416 * 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
1417 */
73e1bf179a01 Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents: 44567
diff changeset
1418 static PyObject *
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1419 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
1420 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1421 Py_ssize_t len;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1422 Py_UNICODE *fileuni;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1423 PyObject *py;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1424 struct stat statbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1425
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1426 len = PyUnicode_GET_SIZE(filename);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1427 if (len == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1428 Py_RETURN_NONE;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1429
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1430 /* don't match *.pyc or *.pyo? */
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1431 fileuni = PyUnicode_AS_UNICODE(filename);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1432 if (len < 5
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1433 || fileuni[len-4] != '.'
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1434 || (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
1435 || (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
1436 goto unchanged;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1437
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1438 /* 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
1439 * 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
1440 * to py.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1441 */
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1442 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
1443 if (py == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1444 PyErr_Clear();
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1445 py = PyUnicode_FromUnicode(fileuni, len - 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
1446 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1447 if (py == NULL)
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1448 goto error;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1449
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1450 if (_Py_stat(py, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1451 return py;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1452 Py_DECREF(py);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1453 goto unchanged;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1454
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1455 error:
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1456 PyErr_Clear();
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1457 unchanged:
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1458 Py_INCREF(filename);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1459 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
1460 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1461
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1462 /* Forward */
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1463 static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
68718
bdf5820f5a39 Issue #3080: Remove useless name buffer from find_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68717
diff changeset
1464 static struct filedescr *find_module(char *, const char *, PyObject *,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1465 char *, size_t, FILE **, PyObject **);
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1466 static struct _frozen * find_frozen(PyObject *);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1467
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1468 /* 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
1469 REFERENCE COUNT */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1470
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1471 static PyObject *
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1472 load_package(PyObject *name, PyObject *pathname)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1473 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1474 PyObject *m, *d;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1475 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
1476 int err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1477 char buf[MAXPATHLEN+1];
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1478 FILE *fp = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1479 struct filedescr *fdp;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1480 char *namestr;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1481
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1482 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1483 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1484 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1485 if (Py_VerboseFlag)
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1486 PySys_FormatStderr("import %U # directory %U\n",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1487 name, pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1488 file = get_sourcefile(pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1489 if (file == NULL)
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1490 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1491 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
1492 if (path_list == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1493 Py_DECREF(file);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1494 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1495 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1496 d = PyModule_GetDict(m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1497 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
1498 Py_DECREF(file);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1499 if (err == 0)
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1500 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
1501 if (err != 0) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1502 Py_DECREF(path_list);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1503 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1504 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1505 namestr = _PyUnicode_AsString(name);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1506 if (namestr == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1507 goto error;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1508 fdp = find_module(namestr, "__init__", path_list, buf, sizeof(buf), &fp, NULL);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1509 Py_DECREF(path_list);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1510 if (fdp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1511 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1512 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1513 Py_INCREF(m);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1514 return m;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1515 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1516 else
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1517 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1518 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
1519 m = load_module(namestr, fp, buf, fdp->type, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1520 if (fp != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1521 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1522 return m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1523 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1524
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1525
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1526 /* Helper to test for built-in module */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1527
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1528 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1529 is_builtin(PyObject *name)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1530 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1531 int i, cmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1532 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
1533 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
1534 if (cmp == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1535 if (PyImport_Inittab[i].initfunc == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1536 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1537 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1538 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1539 }
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 return 0;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1542 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1543
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1544
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1545 /* 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
1546 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
1547 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
1548 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
1549 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
1550 import mechanism. Cache the result in path_importer_cache.
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1551 Returns a borrowed reference. */
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1552
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1553 static PyObject *
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1554 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
1555 PyObject *p)
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1556 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1557 PyObject *importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1558 Py_ssize_t j, nhooks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1559
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1560 /* 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
1561 assert(PyList_Check(path_hooks));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1562 assert(PyDict_Check(path_importer_cache));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1563
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1564 nhooks = PyList_Size(path_hooks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1565 if (nhooks < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1566 return NULL; /* Shouldn't happen */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1567
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1568 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
1569 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1570 return importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1571
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1572 /* 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
1573 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
1574 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1575
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1576 for (j = 0; j < nhooks; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1577 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
1578 if (hook == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1579 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1580 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1581 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1582 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1583
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1584 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1585 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1586 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1587 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1588 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1589 if (importer == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1590 importer = PyObject_CallFunctionObjArgs(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1591 (PyObject *)&PyNullImporter_Type, p, NULL
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1592 );
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1593 if (importer == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1594 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1595 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1596 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1597 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1598 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1599 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1600 if (importer != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1601 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
1602 Py_DECREF(importer);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1603 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1604 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1605 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1606 return importer;
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1607 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1608
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1609 PyAPI_FUNC(PyObject *)
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1610 PyImport_GetImporter(PyObject *path) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1611 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
1612
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1613 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
1614 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
1615 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
1616 path_hooks, path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1617 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1618 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1619 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
1620 return importer;
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1621 }
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
1622
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1623 /* 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
1624 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
1625 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
1626
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1627 #ifdef MS_COREDLL
68715
bab42673674a Issue #3080: _PyWin_FindRegisteredModule() returns the path as Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68713
diff changeset
1628 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
1629 PyObject **p_path);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1630 #endif
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1631
68718
bdf5820f5a39 Issue #3080: Remove useless name buffer from find_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68717
diff changeset
1632 static int case_ok(char *, Py_ssize_t, Py_ssize_t, const char *);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
1633 static int find_init_module(char *); /* Forward */
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
1634 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
1635
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1636 /* 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
1637 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
1638
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1639 -1: error: a Python error occurred
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1640 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
1641 important enough to be reported.
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1642 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
1643 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
1644 and *buf is the path */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1645
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1646 static int
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1647 find_module_path(char *fullname, const char *name, PyObject *path,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1648 PyObject *path_hooks, PyObject *path_importer_cache,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1649 char *buf, size_t buflen,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1650 PyObject **p_loader, struct filedescr **p_fd)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1651 {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1652 PyObject *path_bytes;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1653 const char *base;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1654 Py_ssize_t len;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1655 size_t namelen;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1656 struct stat statbuf;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1657 static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1658
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1659 if (PyUnicode_Check(path)) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1660 path_bytes = PyUnicode_EncodeFSDefault(path);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1661 if (path_bytes == NULL)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1662 return -1;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1663 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1664 else if (PyBytes_Check(path)) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1665 Py_INCREF(path);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1666 path_bytes = path;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1667 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1668 else
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1669 return 0;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1670
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1671 namelen = strlen(name);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1672 base = PyBytes_AS_STRING(path_bytes);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1673 len = PyBytes_GET_SIZE(path_bytes);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1674 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1675 Py_DECREF(path_bytes);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1676 return 0; /* Too long */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1677 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1678 strcpy(buf, base);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1679 Py_DECREF(path_bytes);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1680
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1681 if (strlen(buf) != len) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1682 return 0; /* path_bytes contains '\0' */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1683 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1684
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1685 /* sys.path_hooks import hook */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1686 if (p_loader != NULL) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1687 PyObject *importer;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1688
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1689 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
1690 path_hooks, path);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1691 if (importer == NULL) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1692 return -1;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1693 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1694 /* Note: importer is a borrowed reference */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1695 if (importer != Py_None) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1696 PyObject *loader;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1697 loader = PyObject_CallMethod(importer,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1698 "find_module",
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1699 "s", fullname);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1700 if (loader == NULL)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1701 return -1; /* error */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1702 if (loader != Py_None) {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1703 /* a loader was found */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1704 *p_loader = loader;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1705 *p_fd = &importhookdescr;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1706 return 2;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1707 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1708 Py_DECREF(loader);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1709 return 0;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1710 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1711 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1712 /* 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
1713
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1714 if (len > 0 && buf[len-1] != SEP
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1715 #ifdef ALTSEP
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1716 && buf[len-1] != ALTSEP
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1717 #endif
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1718 )
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1719 buf[len++] = SEP;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1720 strcpy(buf+len, name);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1721 len += namelen;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1722
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1723 /* 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
1724 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
1725 #ifdef HAVE_STAT
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1726 if (stat(buf, &statbuf) == 0 && /* it exists */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1727 S_ISDIR(statbuf.st_mode) && /* it's a directory */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1728 case_ok(buf, len, namelen, name)) { /* case matches */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1729 if (find_init_module(buf)) { /* and has __init__.py */
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1730 *p_fd = &fd_package;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1731 return 2;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1732 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1733 else {
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1734 int err;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1735 PyObject *unicode = PyUnicode_DecodeFSDefault(buf);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1736 if (unicode == NULL)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1737 return -1;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1738 err = PyErr_WarnFormat(PyExc_ImportWarning, 1,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1739 "Not importing directory '%U': missing __init__.py",
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1740 unicode);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1741 Py_DECREF(unicode);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1742 if (err)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1743 return -1;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1744 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1745 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1746 #endif
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1747 return 1;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1748 }
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1749
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1750 /* Find a module in search_path_list. For each path, try
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1751 find_module_filename() or try each _PyImport_Filetab suffix.
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1752
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1753 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
1754 *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
1755 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
1756
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1757 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
1758
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1759 static struct filedescr*
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1760 find_module_path_list(char *fullname, const char *name,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1761 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
1762 PyObject *path_importer_cache,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1763 char *buf, size_t buflen,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1764 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
1765 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1766 Py_ssize_t i, npath;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1767 size_t len, namelen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1768 struct filedescr *fdp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1769 char *filemode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1770 FILE *fp = NULL;
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1771 #if defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1772 size_t saved_len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1773 size_t saved_namelen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1774 char *saved_buf = NULL;
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1775 #endif
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1776
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1777 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
1778 namelen = strlen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1779 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
1780 PyObject *path;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1781 int ok;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1782
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1783 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
1784 if (path == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1785 return NULL;
68720
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 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
1788 path_hooks, path_importer_cache,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1789 buf, buflen,
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1790 p_loader, &fdp);
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1791 if (ok < 0)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1792 return NULL;
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1793 if (ok == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1794 continue;
68720
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1795 if (ok == 2)
09aaac73d9cf Issue #3080: Create find_module_path() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68719
diff changeset
1796 return fdp;
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 len = strlen(buf);
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1799 #if defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1800 /* take a snapshot of the module spec for restoration
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1801 * after the 8 character DLL hackery
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1802 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1803 saved_buf = strdup(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1804 saved_len = len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1805 saved_namelen = namelen;
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1806 #endif /* PYOS_OS2 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1807 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42622
diff changeset
1808 #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1809 /* OS/2 limits DLLs to 8 character names (w/o
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1810 extension)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1811 * so if the name is longer than that and its a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1812 * dynamically loaded module we're going to try,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1813 * truncate the name before trying
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1814 */
68718
bdf5820f5a39 Issue #3080: Remove useless name buffer from find_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68717
diff changeset
1815 if (strlen(name) > 8) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1816 /* is this an attempt to load a C extension? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1817 const struct filedescr *scan;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1818 scan = _PyImport_DynLoadFiletab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1819 while (scan->suffix != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1820 if (!strcmp(scan->suffix, fdp->suffix))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1821 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1822 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1823 scan++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1824 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1825 if (scan->suffix != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1826 /* yes, so truncate the name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1827 namelen = 8;
68718
bdf5820f5a39 Issue #3080: Remove useless name buffer from find_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68717
diff changeset
1828 len -= strlen(name) - namelen;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1829 buf[len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1830 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1831 }
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1832 #endif /* PYOS_OS2 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1833 strcpy(buf+len, fdp->suffix);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1834 if (Py_VerboseFlag > 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1835 PySys_WriteStderr("# trying %s\n", buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1836 filemode = fdp->mode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1837 if (filemode[0] == 'U')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1838 filemode = "r" PY_STDIOTEXTMODE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1839 fp = fopen(buf, filemode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1840 if (fp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1841 if (case_ok(buf, len, namelen, name))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1842 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1843 else { /* continue search */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1844 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1845 fp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1846 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1847 }
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1848 #if defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1849 /* restore the saved snapshot */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1850 strcpy(buf, saved_buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1851 len = saved_len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1852 namelen = saved_namelen;
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1853 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1854 }
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1855 #if defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1856 /* don't need/want the module name snapshot anymore */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1857 if (saved_buf)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1858 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1859 free(saved_buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1860 saved_buf = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1861 }
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
1862 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1863 if (fp != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1864 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1865 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1866 if (fp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1867 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1868 "No module named %.200s", name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1869 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1870 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1871 *p_fp = fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1872 return fdp;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1873 }
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
1874
68719
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1875 /* Find a module:
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1876
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1877 - 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
1878 - try find_frozen()
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1879 - try is_builtin()
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1880 - try _PyWin_FindRegisteredModule() (Windows only)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1881 - 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
1882 NULL) or sys.path
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1883
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1884 Return:
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1885
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1886 - &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
1887 - &fd_frozen (PY_FROZEN) if it is frozen
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1888 - &fd_package (PKG_DIRECTORY) and write the filename into *buf
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1889 if it is a package
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1890 - &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
1891 importer loader was found
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1892 - 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
1893 PY_CODERESOURCE: see _PyImport_Filetab), write the filename into
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1894 *buf and the pointer to the open file into *p_fp
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1895 - NULL on error
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1896
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1897 By default, write an empty string into *buf, and *p_fp and *p_loader (if
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1898 set) are set to NULL. Eg. *buf is an empty string for a builtin package. */
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1899
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1900 static struct filedescr *
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1901 find_module(char *fullname, const char *name, PyObject *search_path_list,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1902 char *buf, size_t buflen, FILE **p_fp, PyObject **p_loader)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1903 {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1904 Py_ssize_t i, npath;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1905 static struct filedescr fd_frozen = {"", "", PY_FROZEN};
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1906 static struct filedescr fd_builtin = {"", "", C_BUILTIN};
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1907 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
1908 PyObject *fullname_obj, *nameobj;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1909
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1910 *buf = '\0';
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1911 *p_fp = NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1912 if (p_loader != NULL)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1913 *p_loader = NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1914
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1915 if (strlen(name) > MAXPATHLEN) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1916 PyErr_SetString(PyExc_OverflowError,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1917 "module name is too long");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1918 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1919 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1920
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1921 /* sys.meta_path import hook */
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1922 if (p_loader != NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1923 PyObject *meta_path;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1924
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1925 meta_path = PySys_GetObject("meta_path");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1926 if (meta_path == NULL || !PyList_Check(meta_path)) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1927 PyErr_SetString(PyExc_ImportError,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1928 "sys.meta_path must be a list of "
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1929 "import hooks");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1930 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1931 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1932 Py_INCREF(meta_path); /* zap guard */
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1933 npath = PyList_Size(meta_path);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1934 for (i = 0; i < npath; i++) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1935 PyObject *loader;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1936 PyObject *hook = PyList_GetItem(meta_path, i);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1937 loader = PyObject_CallMethod(hook, "find_module",
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1938 "sO", fullname,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1939 search_path_list != NULL ?
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1940 search_path_list : Py_None);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1941 if (loader == NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1942 Py_DECREF(meta_path);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1943 return NULL; /* true error */
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1944 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1945 if (loader != Py_None) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1946 /* a loader was found */
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1947 *p_loader = loader;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1948 Py_DECREF(meta_path);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1949 return &importhookdescr;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1950 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1951 Py_DECREF(loader);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1952 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1953 Py_DECREF(meta_path);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1954 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1955
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1956 if (fullname != NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1957 fullname_obj = PyUnicode_FromString(fullname);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1958 if (fullname == NULL)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1959 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1960 if (find_frozen(fullname_obj) != NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1961 Py_DECREF(fullname_obj);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1962 strcpy(buf, fullname);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1963 return &fd_frozen;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1964 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1965 Py_DECREF(fullname_obj);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1966 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1967
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1968 if (search_path_list == NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1969 #ifdef MS_COREDLL
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1970 FILE *fp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1971 struct filedescr *fdp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1972 PyObject *filename, *filename_bytes;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1973 #endif
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1974 nameobj = PyUnicode_FromString(name);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1975 if (nameobj == NULL)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1976 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1977 if (is_builtin(nameobj)) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1978 Py_DECREF(nameobj);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1979 strcpy(buf, name);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1980 return &fd_builtin;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1981 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1982 #ifdef MS_COREDLL
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1983 fp = _PyWin_FindRegisteredModule(nameobj, &fdp, &filename);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1984 if (fp != NULL) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1985 Py_DECREF(nameobj);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1986 filename_bytes = PyUnicode_EncodeFSDefault(filename);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1987 Py_DECREF(filename);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1988 if (filename_bytes == NULL)
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1989 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1990 strncpy(buf, PyBytes_AS_STRING(filename_bytes), buflen);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1991 buf[buflen-1] = '\0';
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1992 Py_DECREF(filename_bytes);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1993 *p_fp = fp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1994 return fdp;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1995 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1996 else if (PyErr_Occurred())
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1997 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1998 #endif
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
1999 Py_DECREF(nameobj);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2000 search_path_list = PySys_GetObject("path");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2001 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2002
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2003 if (search_path_list == NULL || !PyList_Check(search_path_list)) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2004 PyErr_SetString(PyExc_ImportError,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2005 "sys.path must be a list of directory names");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2006 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2007 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2008
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2009 path_hooks = PySys_GetObject("path_hooks");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2010 if (path_hooks == NULL || !PyList_Check(path_hooks)) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2011 PyErr_SetString(PyExc_ImportError,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2012 "sys.path_hooks must be a list of "
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2013 "import hooks");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2014 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2015 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2016 path_importer_cache = PySys_GetObject("path_importer_cache");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2017 if (path_importer_cache == NULL ||
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2018 !PyDict_Check(path_importer_cache)) {
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2019 PyErr_SetString(PyExc_ImportError,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2020 "sys.path_importer_cache must be a dict");
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2021 return NULL;
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2022 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2023
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2024 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
2025 search_path_list, path_hooks,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2026 path_importer_cache,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2027 buf, buflen,
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2028 p_fp, p_loader);
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2029 }
a4d797b9ff63 Issue #3080: Create find_module_path_list() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68718
diff changeset
2030
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
2031 /* case_ok(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
2032 * 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
2033 * /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
2034 * ^ ^ ^ ^
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2035 * |--------------------- buf ---------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2036 * |------------------- len ------------------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2037 * |------ name -------|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2038 * |----- namelen -----|
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2039 * 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
2040 * 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
2041 *
f55f35dc5320 More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents: 16896
diff changeset
2042 * 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
2043 * 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
2044 *
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2045 * case_ok() is to return 1 if there's a case-sensitive match for
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2046 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2047 * 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
2048 *
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2049 * case_ok() is used to implement case-sensitive import semantics even
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2050 * 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
2051 * 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
2052 * 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
2053 */
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2054
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2055 /* First we may need a pile of platform-specific header files; the sequence
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2056 * of #if's here should match the sequence in the body of case_ok().
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2057 */
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2058 #if defined(MS_WINDOWS)
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2059 #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
2060
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2061 #elif defined(DJGPP)
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2062 #include <dir.h>
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2063
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2064 #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
2065 #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
2066 #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
2067
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2068 #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
2069 #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
2070 #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
2071 #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
2072 #include <os2.h>
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2073 #endif
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2074
7290
72d531d54572 Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents: 7232
diff changeset
2075 static int
68718
bdf5820f5a39 Issue #3080: Remove useless name buffer from find_module()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68717
diff changeset
2076 case_ok(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
2077 {
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2078 /* 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
2079 * match the sequence just above.
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2080 */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2081
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2082 /* MS_WINDOWS */
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2083 #if defined(MS_WINDOWS)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2084 WIN32_FIND_DATA data;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2085 HANDLE h;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2086
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2087 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2088 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2089
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2090 h = FindFirstFile(buf, &data);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2091 if (h == INVALID_HANDLE_VALUE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2092 PyErr_Format(PyExc_NameError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2093 "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
2094 name, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2095 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2096 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2097 FindClose(h);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2098 return strncmp(data.cFileName, name, namelen) == 0;
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2099
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2100 /* DJGPP */
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2101 #elif defined(DJGPP)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2102 struct ffblk ffblk;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2103 int done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2104
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2105 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2106 return 1;
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 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
2109 if (done) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2110 PyErr_Format(PyExc_NameError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2111 "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
2112 name, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2113 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2114 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2115 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
2116
34961
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2117 /* new-fangled macintosh (macosx) or Cygwin */
4a33c58c319c Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents: 33680
diff changeset
2118 #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
2119 DIR *dirp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2120 struct dirent *dp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2121 char dirname[MAXPATHLEN + 1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2122 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
2123
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2124 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2125 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2126
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2127 /* 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
2128 if (dirlen <= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2129 dirname[0] = '.';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2130 dirname[1] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2131 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2132 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2133 assert(dirlen <= MAXPATHLEN);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2134 memcpy(dirname, buf, dirlen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2135 dirname[dirlen] = '\0';
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 /* 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
2138 dirp = opendir(dirname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2139 if (dirp) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2140 char *nameWithExt = buf + len - namelen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2141 while ((dp = readdir(dirp)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2142 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
2143 #ifdef _DIRENT_HAVE_D_NAMELEN
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2144 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
2145 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2146 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
2147 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2148 if (thislen >= namelen &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2149 strcmp(dp->d_name, nameWithExt) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2150 (void)closedir(dirp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2151 return 1; /* Found */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2152 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2153 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2154 (void)closedir(dirp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2155 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2156 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
2157
22054
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2158 /* OS/2 */
5cbcfde3ad55 OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 21886
diff changeset
2159 #elif defined(PYOS_OS2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2160 HDIR hdir = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2161 ULONG srchcnt = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2162 FILEFINDBUF3 ffbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2163 APIRET rc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2164
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2165 if (Py_GETENV("PYTHONCASEOK") != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2166 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2167
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2168 rc = DosFindFirst(buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2169 &hdir,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2170 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
2171 &ffbuf, sizeof(ffbuf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2172 &srchcnt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2173 FIL_STANDARD);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2174 if (rc != NO_ERROR)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2175 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2176 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
2177
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2178 /* 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
2179 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2180 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
2181
16828
3b05212c1616 Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents: 16712
diff changeset
2182 #endif
7305
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
2183 }
067e4813c6d6 Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents: 7290
diff changeset
2184
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2185 #ifdef HAVE_STAT
63985
953010c0b168 Issue #9425: Create private _Py_stat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63945
diff changeset
2186
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2187 /* Helper to look for __init__.py or __init__.py[co] in potential package */
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2188 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2189 find_init_module(char *buf)
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2190 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2191 const size_t save_len = strlen(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2192 size_t i = save_len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2193 char *pname; /* pointer to start of __init__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2194 struct stat statbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2195
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2196 /* For calling case_ok(buf, len, namelen, name):
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2197 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2198 * ^ ^ ^ ^
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2199 * |--------------------- buf ---------------------|
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2200 * |------------------- len ------------------|
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2201 * |------ name -------|
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2202 * |----- namelen -----|
18388
06332b3c4335 SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents: 17642
diff changeset
2203 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2204 if (save_len + 13 >= MAXPATHLEN)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2205 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2206 buf[i++] = SEP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2207 pname = buf + i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2208 strcpy(pname, "__init__.py");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2209 if (stat(buf, &statbuf) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2210 if (case_ok(buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2211 save_len + 9, /* len("/__init__") */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2212 8, /* len("__init__") */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2213 pname)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2214 buf[save_len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2215 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2216 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2217 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2218 i += strlen(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2219 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2220 if (stat(buf, &statbuf) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2221 if (case_ok(buf,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2222 save_len + 9, /* len("/__init__") */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2223 8, /* len("__init__") */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2224 pname)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2225 buf[save_len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2226 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2227 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2228 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2229 buf[save_len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2230 return 0;
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2231 }
16947
b25131bc6ec7 RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents: 16932
diff changeset
2232
6542
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2233 #endif /* HAVE_STAT */
62bdb1cbe0f5 New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents: 6541
diff changeset
2234
1410
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1362
diff changeset
2235
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2236 static int init_builtin(PyObject *); /* Forward */
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2237
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2238 static PyObject*
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2239 load_builtin(PyObject *name, int type)
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2240 {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2241 PyObject *m, *modules;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2242 int err;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2243
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2244 if (type == C_BUILTIN)
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2245 err = init_builtin(name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2246 else
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2247 err = PyImport_ImportFrozenModuleObject(name);
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2248 if (err < 0)
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2249 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2250 if (err == 0) {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2251 PyErr_Format(PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2252 "Purported %s module %R not found",
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2253 type == C_BUILTIN ? "builtin" : "frozen",
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2254 name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2255 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2256 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2257
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2258 modules = PyImport_GetModuleDict();
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2259 m = PyDict_GetItem(modules, name);
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2260 if (m == NULL) {
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2261 PyErr_Format(
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2262 PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2263 "%s module %R not properly initialized",
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2264 type == C_BUILTIN ? "builtin" : "frozen",
63857
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2265 name);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2266 return NULL;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2267 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2268 Py_INCREF(m);
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2269 return m;
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2270 }
10c95c0f34d3 Issue #9425: Create load_builtin() subfunction
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62570
diff changeset
2271
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2272 /* 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
2273 its module object WITH INCREMENTED REFERENCE COUNT */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2274
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2275 static PyObject *
55584
5fbac09c0e91 Merged revisions 74264 via svnmerge from
Georg Brandl <georg@python.org>
parents: 55331
diff changeset
2276 load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2277 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2278 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2279
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2280 /* 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
2281 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2282 case PY_SOURCE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2283 case PY_COMPILED:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2284 if (fp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2285 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2286 "file object required for import (type code %d)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2287 type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2288 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2289 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2290 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2291
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2292 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2293
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2294 case PY_SOURCE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2295 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
2296 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2297
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2298 case PY_COMPILED:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2299 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
2300 break;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2301
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2302 #ifdef HAVE_DYNAMIC_LOADING
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2303 case C_EXTENSION: {
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2304 PyObject *nameobj, *pathobj;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2305 nameobj = PyUnicode_FromString(name);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2306 if (nameobj == NULL)
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2307 return NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2308 pathobj = PyUnicode_DecodeFSDefault(pathname);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2309 if (pathobj == NULL) {
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2310 Py_DECREF(nameobj);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2311 return NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2312 }
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2313 m = _PyImport_LoadDynamicModule(nameobj, pathobj, fp);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2314 Py_DECREF(nameobj);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2315 Py_DECREF(pathobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2316 break;
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2317 }
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
2318 #endif
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2319
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2320 case PKG_DIRECTORY: {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2321 PyObject *nameobj, *pathobj;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2322 nameobj = PyUnicode_FromString(name);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2323 if (nameobj == NULL)
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2324 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2325 pathobj = PyUnicode_DecodeFSDefault(pathname);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2326 if (pathobj == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2327 Py_DECREF(nameobj);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2328 return NULL;
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2329 }
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2330 m = load_package(nameobj, pathobj);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2331 Py_DECREF(nameobj);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2332 Py_DECREF(pathobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2333 break;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
2334 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2335
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2336 case C_BUILTIN:
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2337 case PY_FROZEN: {
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2338 PyObject *nameobj = PyUnicode_FromString(name);
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2339 if (nameobj == NULL)
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2340 return NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2341 m = load_builtin(nameobj, type);
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
2342 Py_DECREF(nameobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2343 break;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2344 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2345
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2346 case IMP_HOOK: {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2347 if (loader == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2348 PyErr_SetString(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2349 "import hook without loader");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2350 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2351 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2352 m = PyObject_CallMethod(loader, "load_module", "s", name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2353 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2354 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2355
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2356 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2357 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2358 "Don't know how to import %.200s (type code %d)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2359 name, type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2360 m = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2361
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2362 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2363
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2364 return m;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2365 }
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
2366
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
2367
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2368 /* 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
2369 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
2370 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
2371
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
2372 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2373 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
2374 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2375 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2376
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2377 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
2378 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2379
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2380 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
2381 PyObject *mod;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2382 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
2383 if (p->initfunc == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2384 PyErr_Format(PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2385 "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
2386 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2387 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2388 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2389 if (Py_VerboseFlag)
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2390 PySys_FormatStderr("import %U # builtin\n", name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2391 mod = (*p->initfunc)();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2392 if (mod == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2393 return -1;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
2394 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
2395 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2396 /* 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
2397 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
2398 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2399 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2400 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2401 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2402 return 0;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
2403 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2404
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2405
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2406 /* 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
2407
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
2408 static struct _frozen *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2409 find_frozen(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2410 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2411 struct _frozen *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2412
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2413 if (name == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2414 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2415
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2416 for (p = PyImport_FrozenModules; ; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2417 if (p->name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2418 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2419 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
2420 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2421 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2422 return p;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2423 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2424
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2425 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2426 get_frozen_object(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2427 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2428 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2429 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2430
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2431 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2432 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2433 "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
2434 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2435 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2436 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2437 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2438 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2439 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2440 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2441 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2442 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2443 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2444 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2445 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2446 return PyMarshal_ReadObjectFromString((char *)p->code, size);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2447 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2448
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2449 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2450 is_frozen_package(PyObject *name)
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2451 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2452 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2453 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2454
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2455 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2456 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2457 "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
2458 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2459 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2460 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2461
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2462 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2463
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2464 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2465 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2466 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2467 Py_RETURN_FALSE;
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2468 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2469
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
2470
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2471 /* Initialize a frozen module.
52073
56983cfdf5d4 Fix a typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents: 51996
diff changeset
2472 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
2473 an exception set if the initialization failed.
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
2474 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
2475
6263e2fd9398 init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents: 2270
diff changeset
2476 int
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2477 PyImport_ImportFrozenModuleObject(PyObject *name)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
2478 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2479 struct _frozen *p;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2480 PyObject *co, *m, *path;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2481 int ispackage;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2482 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2483
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2484 p = find_frozen(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2485
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2486 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2487 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2488 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2489 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2490 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2491 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2492 return -1;
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 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2495 ispackage = (size < 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2496 if (ispackage)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2497 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2498 if (Py_VerboseFlag)
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2499 PySys_FormatStderr("import %U # frozen%s\n",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2500 name, ispackage ? " package" : "");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2501 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
2502 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2503 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2504 if (!PyCode_Check(co)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2505 PyErr_Format(PyExc_TypeError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2506 "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
2507 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2508 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2509 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2510 if (ispackage) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2511 /* Set __path__ to the package name */
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2512 PyObject *d, *l;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2513 int err;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2514 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2515 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2516 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2517 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2518 l = PyList_New(1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2519 if (l == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2520 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2521 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2522 Py_INCREF(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2523 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
2524 err = PyDict_SetItemString(d, "__path__", l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2525 Py_DECREF(l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2526 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2527 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2528 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2529 path = PyUnicode_FromString("<frozen>");
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2530 if (path == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2531 goto err_return;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2532 m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2533 Py_DECREF(path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2534 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2535 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2536 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2537 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2538 return 1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
2539 err_return:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2540 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2541 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
2542 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2543
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2544 int
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2545 PyImport_ImportFrozenModule(char *name)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2546 {
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2547 PyObject *nameobj;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2548 int ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2549 nameobj = PyUnicode_InternFromString(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2550 if (nameobj == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2551 return -1;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2552 ret = PyImport_ImportFrozenModuleObject(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2553 Py_DECREF(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2554 return ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2555 }
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
2556
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2557
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
2558 /* 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
2559 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
2560
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2561 PyObject *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35757
diff changeset
2562 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
2563 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2564 PyObject *pname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2565 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2566
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2567 pname = PyUnicode_FromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2568 if (pname == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2569 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2570 result = PyImport_Import(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2571 Py_DECREF(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2572 return result;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2573 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2574
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2575 /* Import a module without blocking
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2576 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2577 * 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
2578 * 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
2579 * 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
2580 * ImportError instead of blocking.
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2581 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2582 * 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
2583 */
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2584 PyObject *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2585 PyImport_ImportModuleNoBlock(const char *name)
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2586 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2587 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2588 PyObject *modules;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2589 long me;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2590
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2591 /* 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
2592 modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2593 if (modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2594 return NULL;
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 result = PyDict_GetItemString(modules, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2597 if (result != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2598 Py_INCREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2599 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2600 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2601 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2602 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2603 }
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
2604 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2605 /* check the import lock
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2606 * 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
2607 * takes care of the problem */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2608 me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2609 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
2610 /* no thread or me is holding the lock */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2611 return PyImport_ImportModule(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2612 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2613 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2614 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2615 "Failed to import %.200s because the import lock"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2616 "is held by another thread.",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2617 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2618 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2619 }
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
2620 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2621 return PyImport_ImportModule(name);
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
2622 #endif
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2623 }
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
2624
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2625 /* Forward declarations for helper routines */
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2626 static PyObject *get_parent(PyObject *globals, char *buf,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2627 Py_ssize_t *p_buflen, int level);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
2628 static PyObject *load_next(PyObject *mod, PyObject *altmod,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2629 char **p_name, char *buf, Py_ssize_t *p_buflen);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
2630 static int mark_miss(char *name);
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
2631 static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2632 char *buf, Py_ssize_t buflen, int recursive);
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13266
diff changeset
2633 static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2634
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2635 /* The Magnum Opus of dotted-name import :-) */
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2636
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
2637 static PyObject *
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2638 import_module_level(char *name, PyObject *globals, PyObject *locals,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2639 PyObject *fromlist, int level)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
2640 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2641 char buf[MAXPATHLEN+1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2642 Py_ssize_t buflen = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2643 PyObject *parent, *head, *next, *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2644
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2645 if (strchr(name, '/') != NULL
44617
a29adc3b0f26 Merged revisions 59864-59882 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44587
diff changeset
2646 #ifdef MS_WINDOWS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2647 || strchr(name, '\\') != NULL
44617
a29adc3b0f26 Merged revisions 59864-59882 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44587
diff changeset
2648 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2649 ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2650 PyErr_SetString(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2651 "Import by filename is not supported.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2652 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2653 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2654
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2655 parent = get_parent(globals, buf, &buflen, level);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2656 if (parent == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2657 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2658
64085
4df0d2a13aa1 Merged revisions 81214,82302,82465,83090-83091,84097,84099 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61467
diff changeset
2659 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
4df0d2a13aa1 Merged revisions 81214,82302,82465,83090-83091,84097,84099 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61467
diff changeset
2660 &buflen);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2661 if (head == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2662 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2663
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2664 tail = head;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2665 Py_INCREF(tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2666 while (name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2667 next = load_next(tail, tail, &name, buf, &buflen);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2668 Py_DECREF(tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2669 if (next == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2670 Py_DECREF(head);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2671 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2672 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2673 tail = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2674 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2675 if (tail == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2676 /* If tail is Py_None, both get_parent and load_next found
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2677 an empty module name: someone called __import__("") or
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2678 doctored faulty bytecode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2679 Py_DECREF(tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2680 Py_DECREF(head);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2681 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2682 "Empty module name");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2683 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2684 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2685
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2686 if (fromlist != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2687 if (fromlist == Py_None || !PyObject_IsTrue(fromlist))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2688 fromlist = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2689 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2690
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2691 if (fromlist == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2692 Py_DECREF(tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2693 return head;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2694 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2695
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2696 Py_DECREF(head);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2697 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2698 Py_DECREF(tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2699 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2700 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2701
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2702 return tail;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2703 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2704
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2705 PyObject *
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2706 PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2707 PyObject *fromlist, int level)
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2708 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2709 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2710 _PyImport_AcquireLock();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2711 result = import_module_level(name, globals, locals, fromlist, level);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2712 if (_PyImport_ReleaseLock() < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2713 Py_XDECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2714 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2715 "not holding the import lock");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2716 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2717 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2718 return result;
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
2719 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
2720
32156
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2721 /* Return the package that an import is being performed in. If globals comes
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2722 from the module foo.bar.bat (not itself a package), this returns the
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2723 sys.modules entry for foo.bar. If globals is from a package's __init__.py,
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
2724 the package's entry in sys.modules is returned, as a borrowed reference.
32156
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2725
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2726 The *name* of the returned package is returned in buf, with the length of
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2727 the name in *p_buflen.
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2728
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2729 If globals doesn't come from a package or a module in a package, or a
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2730 corresponding entry is not found in sys.modules, Py_None is returned.
56a4ec066621 starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents: 31851
diff changeset
2731 */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2732 static PyObject *
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
2733 get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2734 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2735 static PyObject *namestr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2736 static PyObject *pathstr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2737 static PyObject *pkgstr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2738 PyObject *pkgname, *modname, *modpath, *modules, *parent;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2739 int orig_level = level;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2740
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2741 if (globals == NULL || !PyDict_Check(globals) || !level)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2742 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2743
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2744 if (namestr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2745 namestr = PyUnicode_InternFromString("__name__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2746 if (namestr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2747 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2748 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2749 if (pathstr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2750 pathstr = PyUnicode_InternFromString("__path__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2751 if (pathstr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2752 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2753 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2754 if (pkgstr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2755 pkgstr = PyUnicode_InternFromString("__package__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2756 if (pkgstr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2757 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2758 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2759
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2760 *buf = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2761 *p_buflen = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2762 pkgname = PyDict_GetItem(globals, pkgstr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2763
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2764 if ((pkgname != NULL) && (pkgname != Py_None)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2765 /* __package__ is set, so use it */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2766 char *pkgname_str;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2767 Py_ssize_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2768
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2769 if (!PyUnicode_Check(pkgname)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2770 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2771 "__package__ set to non-string");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2772 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2773 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2774 pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2775 if (len == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2776 if (level > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2777 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2778 "Attempted relative import in non-package");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2779 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2780 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2781 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2782 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2783 if (len > MAXPATHLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2784 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2785 "Package name too long");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2786 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2787 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2788 strcpy(buf, pkgname_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2789 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2790 /* __package__ not set, so figure it out and set it */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2791 modname = PyDict_GetItem(globals, namestr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2792 if (modname == NULL || !PyUnicode_Check(modname))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2793 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2794
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2795 modpath = PyDict_GetItem(globals, pathstr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2796 if (modpath != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2797 /* __path__ is set, so modname is already the package name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2798 char *modname_str;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2799 Py_ssize_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2800 int error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2801
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2802 modname_str = _PyUnicode_AsStringAndSize(modname, &len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2803 if (len > MAXPATHLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2804 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2805 "Module name too long");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2806 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2807 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2808 strcpy(buf, modname_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2809 error = PyDict_SetItem(globals, pkgstr, modname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2810 if (error) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2811 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2812 "Could not set __package__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2813 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2814 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2815 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2816 /* Normal module, so work out the package name if any */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2817 char *start = _PyUnicode_AsString(modname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2818 char *lastdot = strrchr(start, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2819 size_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2820 int error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2821 if (lastdot == NULL && level > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2822 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2823 "Attempted relative import in non-package");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2824 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2825 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2826 if (lastdot == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2827 error = PyDict_SetItem(globals, pkgstr, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2828 if (error) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2829 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2830 "Could not set __package__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2831 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2832 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2833 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2834 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2835 len = lastdot - start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2836 if (len >= MAXPATHLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2837 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2838 "Module name too long");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2839 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2840 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2841 strncpy(buf, start, len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2842 buf[len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2843 pkgname = PyUnicode_FromString(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2844 if (pkgname == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2845 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2846 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2847 error = PyDict_SetItem(globals, pkgstr, pkgname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2848 Py_DECREF(pkgname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2849 if (error) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2850 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2851 "Could not set __package__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2852 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2853 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2854 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2855 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2856 while (--level > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2857 char *dot = strrchr(buf, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2858 if (dot == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2859 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2860 "Attempted relative import beyond "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2861 "toplevel package");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2862 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2863 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2864 *dot = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2865 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2866 *p_buflen = strlen(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2867
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2868 modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2869 parent = PyDict_GetItemString(modules, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2870 if (parent == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2871 if (orig_level < 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2872 PyObject *err_msg = PyBytes_FromFormat(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2873 "Parent module '%.200s' not found "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2874 "while handling absolute import", buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2875 if (err_msg == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2876 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2877 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2878 if (!PyErr_WarnEx(PyExc_RuntimeWarning,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2879 PyBytes_AsString(err_msg), 1)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2880 *buf = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2881 *p_buflen = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2882 parent = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2883 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2884 Py_DECREF(err_msg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2885 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2886 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2887 "Parent module '%.200s' not loaded, "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2888 "cannot perform relative import", buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2889 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2890 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2891 return parent;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2892 /* We expect, but can't guarantee, if parent != None, that:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2893 - parent.__name__ == buf
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2894 - parent.__dict__ is globals
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2895 If this is violated... Who cares? */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2896 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2897
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2898 /* altmod is either None or same as mod */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2899 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2900 load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2901 Py_ssize_t *p_buflen)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2902 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2903 char *name = *p_name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2904 char *dot = strchr(name, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2905 size_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2906 char *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2907 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2908
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2909 if (strlen(name) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2910 /* completely empty module name should only happen in
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2911 'from . import' (or '__import__("")')*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2912 Py_INCREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2913 *p_name = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2914 return mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2915 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2916
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2917 if (dot == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2918 *p_name = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2919 len = strlen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2920 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2921 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2922 *p_name = dot+1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2923 len = dot-name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2924 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2925 if (len == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2926 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2927 "Empty module name");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2928 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2929 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2930
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2931 p = buf + *p_buflen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2932 if (p != buf)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2933 *p++ = '.';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2934 if (p+len-buf >= MAXPATHLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2935 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2936 "Module name too long");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2937 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2938 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2939 strncpy(p, name, len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2940 p[len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2941 *p_buflen = p+len-buf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2942
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2943 result = import_submodule(mod, p, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2944 if (result == Py_None && altmod != mod) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2945 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2946 /* Here, altmod must be None and mod must not be None */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2947 result = import_submodule(altmod, p, p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2948 if (result != NULL && result != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2949 if (mark_miss(buf) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2950 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2951 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2952 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2953 strncpy(buf, name, len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2954 buf[len] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2955 *p_buflen = len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2956 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2957 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2958 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2959 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2960
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2961 if (result == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2962 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2963 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2964 "No module named %.200s", name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2965 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2966 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2967
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2968 return result;
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2969 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2970
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2971 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
2972 mark_miss(char *name)
6252
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
2973 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2974 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2975 return PyDict_SetItemString(modules, name, Py_None);
6252
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
2976 }
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
2977
6429db5d0af7 Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents: 6250
diff changeset
2978 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
2979 ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2980 int recursive)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
2981 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2982 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2983
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2984 if (!PyObject_HasAttrString(mod, "__path__"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2985 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2986
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2987 for (i = 0; ; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2988 PyObject *item = PySequence_GetItem(fromlist, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2989 int hasit;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2990 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2991 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2992 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2993 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2994 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2995 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2996 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2997 if (!PyUnicode_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2998 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
2999 "Item in ``from list'' not a string");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3000 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3001 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3002 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3003 if (PyUnicode_AS_UNICODE(item)[0] == '*') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3004 PyObject *all;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3005 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3006 /* See if the package defines __all__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3007 if (recursive)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3008 continue; /* Avoid endless recursion */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3009 all = PyObject_GetAttrString(mod, "__all__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3010 if (all == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3011 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3012 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3013 int ret = ensure_fromlist(mod, all, buf, buflen, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3014 Py_DECREF(all);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3015 if (!ret)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3016 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3017 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3018 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3019 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3020 hasit = PyObject_HasAttr(mod, item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3021 if (!hasit) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3022 PyObject *item8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3023 char *subname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3024 PyObject *submod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3025 char *p;
61597
b5ba7ea4246b Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
3026 item8 = PyUnicode_EncodeFSDefault(item);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3027 if (!item8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3028 PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3029 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3030 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3031 subname = PyBytes_AS_STRING(item8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3032 if (buflen + strlen(subname) >= MAXPATHLEN) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3033 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3034 "Module name too long");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3035 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3036 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3037 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3038 p = buf + buflen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3039 *p++ = '.';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3040 strcpy(p, subname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3041 submod = import_submodule(mod, subname, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3042 Py_DECREF(item8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3043 Py_XDECREF(submod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3044 if (submod == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3045 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3046 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3047 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3048 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3049 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3050 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3051
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3052 /* NOTREACHED */
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
3053 }
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
3054
29501
6c6b321d1d10 Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 28392
diff changeset
3055 static int
6c6b321d1d10 Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 28392
diff changeset
3056 add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3057 PyObject *modules)
29501
6c6b321d1d10 Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 28392
diff changeset
3058 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3059 if (mod == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3060 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3061 /* Irrespective of the success of this load, make a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3062 reference to it in the parent package module. A copy gets
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3063 saved in the modules dictionary under the full name, so get a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3064 reference from there, if need be. (The exception is when the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3065 load failed with a SyntaxError -- then there's no trace in
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3066 sys.modules. In that case, of course, do nothing extra.) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3067 if (submod == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3068 submod = PyDict_GetItemString(modules, fullname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3069 if (submod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3070 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3071 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3072 if (PyModule_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3073 /* We can't use setattr here since it can give a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3074 * spurious warning if the submodule name shadows a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3075 * builtin name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3076 PyObject *dict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3077 if (!dict)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3078 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3079 if (PyDict_SetItemString(dict, subname, submod) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3080 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3081 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3082 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3083 if (PyObject_SetAttrString(mod, subname, submod) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3084 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3085 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3086 return 1;
29501
6c6b321d1d10 Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 28392
diff changeset
3087 }
6c6b321d1d10 Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 28392
diff changeset
3088
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
3089 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3090 import_submodule(PyObject *mod, char *subname, char *fullname)
6249
f10aad73e029 Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents: 6243
diff changeset
3091 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3092 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3093 PyObject *m = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3094
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3095 /* Require:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3096 if mod == None: subname == fullname
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3097 else: mod.__name__ + "." + subname == fullname
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3098 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3099
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3100 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3101 Py_INCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3102 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3103 else {
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3104 PyObject *path, *loader;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3105 char buf[MAXPATHLEN+1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3106 struct filedescr *fdp;
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3107 FILE *fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3108
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3109 if (mod == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3110 path = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3111 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3112 path = PyObject_GetAttrString(mod, "__path__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3113 if (path == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3114 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3115 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3116 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3117 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3118 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3119
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3120 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3121 &fp, &loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3122 Py_XDECREF(path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3123 if (fdp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3124 if (!PyErr_ExceptionMatches(PyExc_ImportError))
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 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3127 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3128 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3129 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3130 m = load_module(fullname, fp, buf, fdp->type, loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3131 Py_XDECREF(loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3132 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3133 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3134 if (!add_submodule(mod, m, fullname, subname, modules)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3135 Py_XDECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3136 m = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3137 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3138 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3139
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3140 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
3141 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3142
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3143
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3144 /* 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
3145 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
3146
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3147 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3148 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
3149 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3150 PyInterpreterState *interp = PyThreadState_Get()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3151 PyObject *modules_reloading = interp->modules_reloading;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3152 PyObject *modules = PyImport_GetModuleDict();
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3153 PyObject *path = NULL, *loader, *existing_m = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3154 char *name, *subname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3155 char buf[MAXPATHLEN+1];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3156 struct filedescr *fdp;
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3157 FILE *fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3158 PyObject *newm;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3159
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3160 if (modules_reloading == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3161 Py_FatalError("PyImport_ReloadModule: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3162 "no modules_reloading dictionary!");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3163 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3164 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3165
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3166 if (m == NULL || !PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3167 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3168 "reload() argument must be module");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3169 return NULL;
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 name = (char*)PyModule_GetName(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3172 if (name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3173 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3174 if (m != PyDict_GetItemString(modules, name)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3175 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3176 "reload(): module %.200s not in sys.modules",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3177 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3178 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3179 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3180 existing_m = PyDict_GetItemString(modules_reloading, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3181 if (existing_m != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3182 /* 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
3183 being reloaded. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3184 Py_INCREF(existing_m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3185 return existing_m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3186 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3187 if (PyDict_SetItemString(modules_reloading, name, m) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3188 return NULL;
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 subname = strrchr(name, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3191 if (subname == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3192 subname = name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3193 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3194 PyObject *parentname, *parent;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3195 parentname = PyUnicode_FromStringAndSize(name, (subname-name));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3196 if (parentname == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3197 imp_modules_reloading_clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3198 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3199 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3200 parent = PyDict_GetItem(modules, parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3201 if (parent == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3202 PyErr_Format(PyExc_ImportError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3203 "reload(): parent %U not in sys.modules",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3204 parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3205 Py_DECREF(parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3206 imp_modules_reloading_clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3207 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3208 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3209 Py_DECREF(parentname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3210 subname++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3211 path = PyObject_GetAttrString(parent, "__path__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3212 if (path == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3213 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3214 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3215 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3216 Py_XDECREF(path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3217
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3218 if (fdp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3219 Py_XDECREF(loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3220 imp_modules_reloading_clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3221 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3222 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3223
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3224 newm = load_module(name, fp, buf, fdp->type, loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3225 Py_XDECREF(loader);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3226
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3227 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3228 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3229 if (newm == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3230 /* 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
3231 * 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
3232 * 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
3233 * 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
3234 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3235 PyDict_SetItemString(modules, name, m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3236 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3237 imp_modules_reloading_clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3238 return newm;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
3239 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3240
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3241
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3242 /* 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
3243 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
3244 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
3245 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
3246 environment.
9680
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
3247 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
3248 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
3249 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
3250
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3251 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3252 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
3253 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3254 static PyObject *silly_list = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3255 static PyObject *builtins_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3256 static PyObject *import_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3257 PyObject *globals = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3258 PyObject *import = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3259 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
3260 PyObject *modules = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3261 PyObject *r = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3262
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3263 /* Initialize constant string objects */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3264 if (silly_list == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3265 import_str = PyUnicode_InternFromString("__import__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3266 if (import_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3267 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3268 builtins_str = PyUnicode_InternFromString("__builtins__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3269 if (builtins_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3270 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
3271 silly_list = PyList_New(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3272 if (silly_list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3273 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3274 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3275
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3276 /* Get the builtins from current globals */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3277 globals = PyEval_GetGlobals();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3278 if (globals != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3279 Py_INCREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3280 builtins = PyObject_GetItem(globals, builtins_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3281 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3282 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3283 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3284 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3285 /* 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
3286 builtins = PyImport_ImportModuleLevel("builtins",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3287 NULL, NULL, NULL, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3288 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3289 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3290 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
3291 if (globals == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3292 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3293 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3294
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3295 /* 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
3296 if (PyDict_Check(builtins)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3297 import = PyObject_GetItem(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3298 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3299 PyErr_SetObject(PyExc_KeyError, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3300 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3301 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3302 import = PyObject_GetAttr(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3303 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3304 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3305
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3306 /* 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
3307 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
3308 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
3309 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
3310 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
3311 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
3312 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
3313 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
3314
dd3080b80dda PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents: 64638
diff changeset
3315 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
3316 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
3317 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
3318 Py_INCREF(r);
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3319
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3320 err:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3321 Py_XDECREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3322 Py_XDECREF(builtins);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3323 Py_XDECREF(import);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3324
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3325 return r;
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3326 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3327
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
3328
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3329 /* 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
3330 importing modules.
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3331 */
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3332
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3333 static PyObject *
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3334 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
3335 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3336 char buf[4];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3337
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3338 buf[0] = (char) ((magic >> 0) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3339 buf[1] = (char) ((magic >> 8) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3340 buf[2] = (char) ((magic >> 16) & 0xff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3341 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
3342
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3343 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
3344 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3345
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3346 static PyObject *
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3347 imp_get_magic(PyObject *self, PyObject *noargs)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3348 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3349 return imp_make_magic(pyc_magic);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3350 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3351
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3352 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3353 imp_get_tag(PyObject *self, PyObject *noargs)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3354 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3355 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
3356 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3357
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3358 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
3359 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
3360 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3361 PyObject *list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3362 struct filedescr *fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3363
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3364 list = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3365 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3366 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3367 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
3368 PyObject *item = Py_BuildValue("ssi",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3369 fdp->suffix, fdp->mode, fdp->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3370 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3371 Py_DECREF(list);
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3374 if (PyList_Append(list, item) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3375 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3376 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3377 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3378 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3379 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3380 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3381 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
3382 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3383
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3384 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3385 call_find_module(char *name, PyObject *path)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3386 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3387 extern int fclose(FILE *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3388 PyObject *fob, *ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3389 PyObject *pathobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3390 struct filedescr *fdp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3391 char pathname[MAXPATHLEN+1];
68717
d52f471fbbeb Issue #3080: find_module() initialize buf and *p_fp
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68716
diff changeset
3392 FILE *fp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3393 int fd = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3394 char *found_encoding = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3395 char *encoding = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3396
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3397 pathname[0] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3398 if (path == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3399 path = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3400 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3401 if (fdp == NULL)
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 if (fp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3404 fd = fileno(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3405 if (fd != -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3406 fd = dup(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3407 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3408 fp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3409 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3410 if (fd != -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3411 if (strchr(fdp->mode, 'b') == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3412 /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3413 memory. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3414 found_encoding = PyTokenizer_FindEncoding(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3415 lseek(fd, 0, 0); /* Reset position */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3416 if (found_encoding == NULL && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3417 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3418 encoding = (found_encoding != NULL) ? found_encoding :
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3419 (char*)PyUnicode_GetDefaultEncoding();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3420 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3421 fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3422 (char*)encoding, NULL, NULL, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3423 if (fob == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3424 close(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3425 PyMem_FREE(found_encoding);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3426 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3427 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3428 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3429 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3430 fob = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3431 Py_INCREF(fob);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3432 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3433 pathobj = PyUnicode_DecodeFSDefault(pathname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3434 ret = Py_BuildValue("NN(ssi)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3435 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
3436 PyMem_FREE(found_encoding);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3437
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3438 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3439 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3440
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3441 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3442 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
3443 {
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3444 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3445 PyObject *ret, *path = NULL;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3446 if (!PyArg_ParseTuple(args, "O&|O:find_module",
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3447 PyUnicode_FSConverter, &name,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3448 &path))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3449 return NULL;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3450 ret = call_find_module(PyBytes_AS_STRING(name), path);
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3451 Py_DECREF(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3452 return ret;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3453 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3454
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3455 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3456 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
3457 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3458 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3459 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3460 PyObject *m;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3461 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
3462 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3463 ret = init_builtin(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3464 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3465 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3466 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3467 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3468 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3469 }
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3470 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3471 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3472 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
3473 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3474
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3475 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3476 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
3477 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3478 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3479 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3480 PyObject *m;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3481 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
3482 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3483 ret = PyImport_ImportFrozenModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3484 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3485 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3486 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3487 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3488 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3489 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3490 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3491 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3492 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
3493 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3494
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3495 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3496 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
3497 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3498 PyObject *name;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3499
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3500 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
3501 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3502 return get_frozen_object(name);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
3503 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
3504
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3505 static PyObject *
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3506 imp_is_frozen_package(PyObject *self, PyObject *args)
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3507 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3508 PyObject *name;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3509
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3510 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
3511 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3512 return is_frozen_package(name);
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3513 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3514
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
3515 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3516 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
3517 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3518 PyObject *name;
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
3519 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
3520 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3521 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
3522 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
3523
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3524 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3525 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
3526 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3527 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3528 struct _frozen *p;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
3529 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
3530 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3531 p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3532 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
3533 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3534
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3535 static FILE *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3536 get_file(char *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
3537 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3538 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3539 if (mode[0] == 'U')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3540 mode = "r" PY_STDIOTEXTMODE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3541 if (fob == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3542 fp = fopen(pathname, mode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3543 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3544 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3545 int fd = PyObject_AsFileDescriptor(fob);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3546 if (fd == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3547 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3548 if (!_PyVerify_fd(fd))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3549 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3550 /* 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
3551 * independently of the file descriptor given
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3552 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3553 fd = dup(fd);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3554 if (fd == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3555 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3556 fp = fdopen(fd, mode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3557 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3558 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3559 return fp;
52545
2d80c2797501 get_file() no longer leaks a FILE structure. If given a file descriptor, it calls dup() to get a new handle. Then both the FILE object and the fd can be closed.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52480
diff changeset
3560 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3561 PyErr_SetFromErrno(PyExc_IOError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3562 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
3563 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3564
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3565 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3566 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
3567 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3568 char *name;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3569 PyObject *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3570 PyObject *fob = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3571 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3572 FILE *fp;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3573 if (!PyArg_ParseTuple(args, "sO&|O:load_compiled",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3574 &name,
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3575 PyUnicode_FSConverter, &pathname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3576 &fob))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3577 return NULL;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3578 fp = get_file(PyBytes_AS_STRING(pathname), fob, "rb");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3579 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
3580 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3581 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3582 }
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3583 m = load_compiled_module(name, PyBytes_AS_STRING(pathname), fp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3584 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
3585 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3586 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
3587 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3588
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3589 #ifdef HAVE_DYNAMIC_LOADING
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3590
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3591 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3592 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
3593 {
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3594 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
3595 FILE *fp;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3596
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3597 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
3598 &name, PyUnicode_FSDecoder, &pathname, &fob))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3599 return NULL;
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3600 if (fob != NULL) {
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3601 fp = get_file(NULL, fob, "r");
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3602 if (fp == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3603 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3604 }
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3605 else
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3606 fp = NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3607 mod = _PyImport_LoadDynamicModule(name, pathname, fp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3608 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3609 fclose(fp);
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
3610 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
3611 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3612
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3613 #endif /* HAVE_DYNAMIC_LOADING */
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3614
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3615 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3616 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
3617 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3618 char *name;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3619 PyObject *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3620 PyObject *fob = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3621 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3622 FILE *fp;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3623 if (!PyArg_ParseTuple(args, "sO&|O:load_source",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3624 &name,
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3625 PyUnicode_FSConverter, &pathname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3626 &fob))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3627 return NULL;
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3628 fp = get_file(PyBytes_AS_STRING(pathname), fob, "r");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3629 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
3630 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3631 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3632 }
66650
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3633 m = load_source_module(name, PyBytes_AS_STRING(pathname), fp);
523a6fc53a70 import: use PyUnicode_FSConverter to support bytes path and PEP 383
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66599
diff changeset
3634 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3635 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3636 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
3637 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3638
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3639 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3640 imp_load_module(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3641 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3642 char *name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3643 PyObject *fob;
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3644 PyObject *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3645 PyObject * ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3646 char *suffix; /* Unused */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3647 char *mode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3648 int type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3649 FILE *fp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3650
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3651 if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3652 &name, &fob,
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3653 PyUnicode_FSConverter, &pathname,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3654 &suffix, &mode, &type))
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 if (*mode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3657 /* 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
3658 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
3659 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
3660
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3661 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
3662 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3663 "invalid file open mode %.200s", mode);
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3664 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3665 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3666 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3667 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3668 if (fob == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3669 fp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3670 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3671 fp = get_file(NULL, fob, mode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3672 if (fp == NULL) {
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3673 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3674 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3675 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3676 }
65382
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3677 ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL);
90052889ce3d imp_load_module() uses PyUnicode_FSConverter() to support surrogates in module
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65380
diff changeset
3678 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3679 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3680 fclose(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3681 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3682 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3683
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3684 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3685 imp_load_package(PyObject *self, PyObject *args)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3686 {
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3687 PyObject *name, *pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3688 PyObject * ret;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3689 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
3690 &name, PyUnicode_FSDecoder, &pathname))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3691 return NULL;
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3692 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
3693 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3694 return ret;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3695 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3696
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3697 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3698 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
3699 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3700 char *name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3701 if (!PyArg_ParseTuple(args, "s:new_module", &name))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3702 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3703 return PyModule_New(name);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3704 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3705
44567
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3706 static PyObject *
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3707 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
3708 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3709 return PyImport_ReloadModule(v);
44567
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3710 }
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3711
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3712 PyDoc_STRVAR(doc_reload,
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3713 "reload(module) -> module\n\
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3714 \n\
cdc285bd0efb Issue #1762972: Readded the reload() function as imp.reload()
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
3715 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
3716
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3717 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3718 imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3719 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3720 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
3721
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3722 char buf[MAXPATHLEN+1];
65380
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3723 PyObject *pathbytes;
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3724 char *cpathname;
65391
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3725 PyObject *debug_override = NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3726 int debug = !Py_OptimizeFlag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3727
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3728 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
3729 args, kws, "O&|O", kwlist,
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3730 PyUnicode_FSConverter, &pathbytes, &debug_override))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3731 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3732
65391
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3733 if (debug_override != NULL &&
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3734 (debug = PyObject_IsTrue(debug_override)) < 0) {
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3735 Py_DECREF(pathbytes);
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3736 return NULL;
f98c3e2fd055 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 65383
diff changeset
3737 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3738
65380
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3739 cpathname = make_compiled_pathname(
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3740 PyBytes_AS_STRING(pathbytes),
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3741 buf, MAXPATHLEN+1, debug);
844ed6dddc03 imp.cache_from_source() uses PyUnicode_FSConverter() to support surrogates in
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65349
diff changeset
3742 Py_DECREF(pathbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3743
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3744 if (cpathname == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3745 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
3746 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3747 }
65383
292b1df01bad Fix imp_cache_from_source(): Decode make_compiled_pathname() result from the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65382
diff changeset
3748 return PyUnicode_DecodeFSDefault(buf);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3749 }
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 PyDoc_STRVAR(doc_cache_from_source,
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3752 "Given the path to a .py file, return the path to its .pyc/.pyo file.\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3753 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3754 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
3755 .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
3756 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
3757 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3758 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
3759 the value of __debug__ instead.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3760
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3761 static PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3762 imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3763 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3764 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
3765 PyObject *pathname, *source;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3766
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3767 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
3768 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
3769 PyUnicode_FSDecoder, &pathname))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3770 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3771
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3772 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
3773 if (source == NULL) {
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3774 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
3775 pathname);
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3776 Py_DECREF(pathname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3777 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
3778 }
68721
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3779 Py_DECREF(pathname);
f6507eb8e689 Issue #3080: get_sourcefile(), make_source_pathname(), load_package()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68720
diff changeset
3780 return source;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3781 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3782
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3783 PyDoc_STRVAR(doc_source_from_cache,
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3784 "Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3785 \n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3786 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
3787 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
3788 does not conform to PEP 3147 format, ValueError will be raised.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3789
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3790 /* Doc strings */
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
3791
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3792 PyDoc_STRVAR(doc_imp,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3793 "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
3794 __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
3795
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3796 PyDoc_STRVAR(doc_find_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3797 "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
3798 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
3799 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
3800 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
3801 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
3802
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3803 PyDoc_STRVAR(doc_load_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3804 "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
3805 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
3806 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
3807
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3808 PyDoc_STRVAR(doc_get_magic,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3809 "get_magic() -> string\n\
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3810 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
3811
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3812 PyDoc_STRVAR(doc_get_tag,
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3813 "get_tag() -> string\n\
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3814 Return the magic tag for .pyc or .pyo files.");
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
3815
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3816 PyDoc_STRVAR(doc_get_suffixes,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3817 "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
3818 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
3819 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
3820
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3821 PyDoc_STRVAR(doc_new_module,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3822 "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
3823 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
3824 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
3825
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
3826 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
3827 "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
3828 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
3829 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
3830
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
3831 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
3832 "acquire_lock() -> None\n\
27853
5620b0786271 Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents: 27852
diff changeset
3833 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
3834 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
3835 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
3836 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
3837
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
3838 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
3839 "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
3840 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
3841 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
3842
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
3843 static PyMethodDef imp_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3844 {"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
3845 {"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
3846 {"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
3847 {"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
3848 {"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
3849 {"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
3850 {"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
3851 {"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
3852 {"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
3853 {"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
3854 {"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
3855 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
3856 {"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
3857 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
3858 /* The rest are obsolete */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3859 {"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
3860 {"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
3861 {"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
3862 {"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
3863 {"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
3864 {"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
3865 {"load_compiled", imp_load_compiled, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3866 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3867 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
3868 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3869 {"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
3870 {"load_source", imp_load_source, METH_VARARGS},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3871 {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
3872 };
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
3873
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 8613
diff changeset
3874 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
3875 setint(PyObject *d, char *name, int value)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3876 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3877 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3878 int err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3879
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3880 v = PyLong_FromLong((long)value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3881 err = PyDict_SetItemString(d, name, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3882 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3883 return err;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3884 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
3885
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3886 typedef struct {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3887 PyObject_HEAD
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3888 } NullImporter;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3889
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3890 static int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3891 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
3892 {
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3893 #ifndef MS_WINDOWS
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3894 PyObject *path;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3895 struct stat statbuf;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3896 int rv;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3897
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3898 if (!_PyArg_NoKeywords("NullImporter()", kwds))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3899 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3900
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3901 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
3902 PyUnicode_FSConverter, &path))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3903 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3904
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3905 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
3906 Py_DECREF(path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3907 PyErr_SetString(PyExc_ImportError, "empty pathname");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3908 return -1;
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3909 }
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3910
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3911 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
3912 Py_DECREF(path);
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3913 if (rv == 0) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3914 /* it exists */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3915 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
3916 /* it's a directory */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3917 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
3918 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3919 }
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3920 }
50991
a823c9f3a452 Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 50619
diff changeset
3921 #else /* MS_WINDOWS */
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3922 PyObject *pathobj;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3923 DWORD rv;
65008
c620fe87c703 Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64838
diff changeset
3924 wchar_t *path;
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3925
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3926 if (!_PyArg_NoKeywords("NullImporter()", kwds))
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 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
3930 &pathobj))
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3931 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3932
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3933 if (PyUnicode_GET_SIZE(pathobj) == 0) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3934 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
3935 return -1;
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
65157
e3ae5b00ba15 PyUnicode_AsWideCharString() takes a PyObject*, not a PyUnicodeObject*
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65027
diff changeset
3938 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
3939 if (path == NULL)
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3940 return -1;
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3941 /* see issue1293 and issue3677:
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3942 * 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
3943 * "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
3944 */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3945 rv = GetFileAttributesW(path);
65008
c620fe87c703 Issue #9979: Use PyUnicode_AsWideCharString() in import.c
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64838
diff changeset
3946 PyMem_Free(path);
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3947 if (rv != INVALID_FILE_ATTRIBUTES) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3948 /* it exists */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3949 if (rv & FILE_ATTRIBUTE_DIRECTORY) {
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3950 /* it's a directory */
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3951 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
3952 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3953 }
63945
03e884fac4db Issue #9425: NullImporter constructor is fully unicode compliant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63857
diff changeset
3954 }
50991
a823c9f3a452 Merged revisions 68457 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 50619
diff changeset
3955 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3956 return 0;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3957 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3958
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3959 static PyObject *
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3960 NullImporter_find_module(NullImporter *self, PyObject *args)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3961 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3962 Py_RETURN_NONE;
39442
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
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3965 static PyMethodDef NullImporter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3966 {"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
3967 "Always return None"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3968 },
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3969 {NULL} /* Sentinel */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3970 };
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3971
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
3972
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
3973 PyTypeObject PyNullImporter_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3974 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3975 "imp.NullImporter", /*tp_name*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3976 sizeof(NullImporter), /*tp_basicsize*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3977 0, /*tp_itemsize*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3978 0, /*tp_dealloc*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3979 0, /*tp_print*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3980 0, /*tp_getattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3981 0, /*tp_setattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3982 0, /*tp_reserved*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3983 0, /*tp_repr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3984 0, /*tp_as_number*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3985 0, /*tp_as_sequence*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3986 0, /*tp_as_mapping*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3987 0, /*tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3988 0, /*tp_call*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3989 0, /*tp_str*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3990 0, /*tp_getattro*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3991 0, /*tp_setattro*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3992 0, /*tp_as_buffer*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3993 Py_TPFLAGS_DEFAULT, /*tp_flags*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3994 "Null importer object", /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3995 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3996 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3997 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3998 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
3999 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4000 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4001 NullImporter_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4002 0, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4003 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4004 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4005 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4006 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4007 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4008 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4009 (initproc)NullImporter_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4010 0, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4011 PyType_GenericNew /* tp_new */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4012 };
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4013
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4014 static struct PyModuleDef impmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4015 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4016 "imp",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4017 doc_imp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4018 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4019 imp_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4020 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4021 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4022 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4023 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4024 };
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
4025
30311
f003e48f562d Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents: 29812
diff changeset
4026 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
4027 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
4028 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4029 PyObject *m, *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4030
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4031 if (PyType_Ready(&PyNullImporter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4032 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4033
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4034 m = PyModule_Create(&impmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4035 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4036 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4037 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4038 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4039 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4040
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4041 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
4042 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
4043 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
4044 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
4045 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
4046 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
4047 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
4048 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
4049 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
4050 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
4051
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4052 Py_INCREF(&PyNullImporter_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4053 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
4054 return m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
4055 failure:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4056 Py_XDECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4057 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
4058 }
8330
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
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
4061 /* 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
4062 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
4063 *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
4064 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
4065
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4066 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
4067
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4068 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
4069 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
4070 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4071 static struct _inittab *our_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4072 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4073 int i, n;
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 /* 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
4076 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
4077 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4078 if (n == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4079 return 0; /* Nothing to do */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4080 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
4081 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4082
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4083 /* 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
4084 p = our_copy;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4085 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
4086 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4087 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4088
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4089 /* 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
4090 if (our_copy != PyImport_Inittab)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4091 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
4092 PyImport_Inittab = our_copy = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4093 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
4094
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4095 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
4096 }
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4097
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4098 /* 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
4099
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
4100 int
52721
54e093bd887e Merged revisions 71031 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 52547
diff changeset
4101 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
4102 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4103 struct _inittab newtab[2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4104
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4105 memset(newtab, '\0', sizeof newtab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4106
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4107 newtab[0].name = (char *)name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4108 newtab[0].initfunc = initfunc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4109
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
4110 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
4111 }
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
4112
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
4113 #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
4114 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
4115 #endif