annotate Python/import.c @ 76640:eb68502731dd

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