Mercurial > cpython-lru_cache-weakref
annotate Python/import.c @ 61774:55e2368f72f2 2.6
Merged revisions 81380 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r81380 | brett.cannon | 2010-05-20 11:37:55 -0700 (Thu, 20 May 2010) | 8 lines
Turned out that if you used explicit relative import syntax
(e.g. from .os import sep) and it failed, import would still try the implicit
relative import semantics of an absolute import (from os import sep). That's
not right, so when level is negative, only do explicit relative import
semantics.
Fixes issue #7902. Thanks to Meador Inge for the patch.
........
| author | Brett Cannon <bcannon@gmail.com> |
|---|---|
| date | Thu, 20 May 2010 18:41:08 +0000 |
| parents | e38335d4df91 |
| children | 787b969d37f0 |
| rev | line source |
|---|---|
|
145
853b736a6a9e
Added copyright notice.
Guido van Rossum <guido@python.org>
parents:
141
diff
changeset
|
1 |
| 6 | 2 /* Module definition and import implementation */ |
| 3 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
4 #include "Python.h" |
| 6 | 5 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
6 #include "Python-ast.h" |
|
41526
708c8c5fc173
Make pythoncore compile cleanly with VisualStudio 2005. Used an explicit typecast to get a 64 bit integer, and undefined the Yield macro that conflicts with winbase.h
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
41178
diff
changeset
|
7 #undef Yield /* undefine macro conflicting with winbase.h */ |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
8 #include "pyarena.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
9 #include "pythonrun.h" |
| 6 | 10 #include "errcode.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
11 #include "marshal.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
12 #include "code.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
13 #include "compile.h" |
| 926 | 14 #include "eval.h" |
|
675
5aff9f8fd299
Move SEP to osdefs.h. Use MAXPATHLEN from osdefs.h.
Guido van Rossum <guido@python.org>
parents:
630
diff
changeset
|
15 #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
|
16 #include "importdl.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
17 |
|
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
|
18 #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
|
19 #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
|
20 #endif |
|
37655
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
21 #ifdef __cplusplus |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
22 extern "C" { |
|
37655
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
23 #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
|
24 |
|
45492
97a1972b672e
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
Christian Heimes <christian@cheimes.de>
parents:
45470
diff
changeset
|
25 #ifdef MS_WINDOWS |
|
97a1972b672e
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
Christian Heimes <christian@cheimes.de>
parents:
45470
diff
changeset
|
26 /* for stat.st_mode */ |
|
97a1972b672e
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
Christian Heimes <christian@cheimes.de>
parents:
45470
diff
changeset
|
27 typedef unsigned short mode_t; |
|
97a1972b672e
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
Christian Heimes <christian@cheimes.de>
parents:
45470
diff
changeset
|
28 #endif |
|
97a1972b672e
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
Christian Heimes <christian@cheimes.de>
parents:
45470
diff
changeset
|
29 |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
30 extern time_t PyOS_GetLastModificationTime(char *, FILE *); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
31 /* In getmtime.c */ |
|
1351
e149c77d173c
Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents:
1293
diff
changeset
|
32 |
|
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
|
33 /* 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
|
34 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
|
35 |
|
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
|
36 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
|
37 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
|
38 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
|
39 |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32294
diff
changeset
|
40 The magic numbers must be spaced apart atleast 2 values, as the |
|
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32294
diff
changeset
|
41 -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
|
42 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
|
43 |
|
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
|
44 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
|
45 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
|
46 10. |
|
25085
5fe4d93df429
Because MWH changed the bytecode again, moved the magic number *back*
Guido van Rossum <guido@python.org>
parents:
24844
diff
changeset
|
47 |
|
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
|
48 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
|
49 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
|
50 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
|
51 Python 1.5.2: 20121 |
|
37209
c844305aa8ed
Found this in an old email message from Hartmut Goebel.
Skip Montanaro <skip@pobox.com>
parents:
37086
diff
changeset
|
52 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 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
|
58 Python 2.2: 60717 |
|
23851
d6ae544acd24
Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents:
23832
diff
changeset
|
59 Python 2.3a0: 62011 |
| 24844 | 60 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
|
61 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
|
62 Python 2.4a0: 62041 |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
32882
diff
changeset
|
63 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
|
64 Python 2.4b1: 62061 |
| 35008 | 65 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
|
66 Python 2.5a0: 62081 (ast-branch) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36501
diff
changeset
|
67 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
|
68 Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) |
|
39300
b745b3fd66a6
Patch #1531113: Fix augmented assignment with yield expressions.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39253
diff
changeset
|
69 Python 2.5b3: 62101 (fix wrong code: for x, in ...) |
|
b745b3fd66a6
Patch #1531113: Fix augmented assignment with yield expressions.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39253
diff
changeset
|
70 Python 2.5b3: 62111 (fix wrong code: x += yield) |
|
39365
75bf77367da3
There were really two issues
Neal Norwitz <nnorwitz@gmail.com>
parents:
39363
diff
changeset
|
71 Python 2.5c1: 62121 (fix wrong lnotab with for loops and |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
72 storing constants that should have been removed) |
|
39753
8dcb882ec3e1
Bug #1520864 (again): unpacking singleton tuples in list comprehensions and
Neal Norwitz <nnorwitz@gmail.com>
parents:
39468
diff
changeset
|
73 Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) |
|
44334
07aa19170a67
Speed-up dictionary constructor by about 10%.
Raymond Hettinger <python@rcn.com>
parents:
44116
diff
changeset
|
74 Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) |
|
45703
343597c7d682
Speed up with statements by storing the __exit__ method on the stack instead of in a temp variable (bumps the magic number for pyc files)
Nick Coghlan <ncoghlan@gmail.com>
parents:
45492
diff
changeset
|
75 Python 2.6a1: 62161 (WITH_CLEANUP optimization) |
|
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
|
76 . |
|
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
|
77 */ |
|
45703
343597c7d682
Speed up with statements by storing the __exit__ method on the stack instead of in a temp variable (bumps the magic number for pyc files)
Nick Coghlan <ncoghlan@gmail.com>
parents:
45492
diff
changeset
|
78 #define MAGIC (62161 | ((long)'\r'<<16) | ((long)'\n'<<24)) |
|
487
77b80a91d357
New magic word; and check it.
Guido van Rossum <guido@python.org>
parents:
340
diff
changeset
|
79 |
| 12543 | 80 /* Magic word as global; note that _PyImport_Init() can change the |
|
13181
6f4669814884
another typo caught by Rob Hooft
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
81 value of this global to accommodate for alterations of how the |
| 12543 | 82 compiler works which are enabled by command line switches. */ |
|
46138
a0ea3a0efc71
Build bots are working again - removing the hack
Christian Heimes <christian@cheimes.de>
parents:
46136
diff
changeset
|
83 static long pyc_magic = MAGIC; |
| 12543 | 84 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
85 /* See _PyImport_FixupExtension() below */ |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
86 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
|
87 |
|
6541
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
88 /* 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
|
89 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
|
90 |
|
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
91 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
|
92 |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
93 /* 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
|
94 struct filedescr * _PyImport_Filetab = NULL; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
95 |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
96 #ifdef RISCOS |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
97 static const struct filedescr _PyImport_StandardFiletab[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
98 {"/py", "U", PY_SOURCE}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
99 {"/pyc", "rb", PY_COMPILED}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
100 {0, 0} |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
101 }; |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
102 #else |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
103 static const struct filedescr _PyImport_StandardFiletab[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
104 {".py", "U", PY_SOURCE}, |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23879
diff
changeset
|
105 #ifdef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
106 {".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
|
107 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
108 {".pyc", "rb", PY_COMPILED}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
109 {0, 0} |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
110 }; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
111 #endif |
|
11602
5738ad737114
In _PyImport_Init(), dynamically construct the table of legal suffixes
Guido van Rossum <guido@python.org>
parents:
10530
diff
changeset
|
112 |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
113 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
114 /* Initialize things */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
115 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
116 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
117 _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
|
118 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
119 const struct filedescr *scan; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
120 struct filedescr *filetab; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
121 int countD = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
122 int countS = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
123 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
124 /* prepare _PyImport_Filetab: copy entries from |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
125 _PyImport_DynLoadFiletab and _PyImport_StandardFiletab. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
126 */ |
|
42734
9087337f3a3f
Second half of #1752175: #ifdef out references to PyImport_DynLoadFiletab if HAVE_DYNAMIC_LOADING is not defined.
Georg Brandl <georg@python.org>
parents:
42688
diff
changeset
|
127 #ifdef HAVE_DYNAMIC_LOADING |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
128 for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
129 ++countD; |
|
42734
9087337f3a3f
Second half of #1752175: #ifdef out references to PyImport_DynLoadFiletab if HAVE_DYNAMIC_LOADING is not defined.
Georg Brandl <georg@python.org>
parents:
42688
diff
changeset
|
130 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
131 for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
132 ++countS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
133 filetab = PyMem_NEW(struct filedescr, countD + countS + 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
134 if (filetab == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
135 Py_FatalError("Can't initialize import file table."); |
|
42734
9087337f3a3f
Second half of #1752175: #ifdef out references to PyImport_DynLoadFiletab if HAVE_DYNAMIC_LOADING is not defined.
Georg Brandl <georg@python.org>
parents:
42688
diff
changeset
|
136 #ifdef HAVE_DYNAMIC_LOADING |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
137 memcpy(filetab, _PyImport_DynLoadFiletab, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
138 countD * sizeof(struct filedescr)); |
|
42734
9087337f3a3f
Second half of #1752175: #ifdef out references to PyImport_DynLoadFiletab if HAVE_DYNAMIC_LOADING is not defined.
Georg Brandl <georg@python.org>
parents:
42688
diff
changeset
|
139 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
140 memcpy(filetab + countD, _PyImport_StandardFiletab, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
141 countS * sizeof(struct filedescr)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
142 filetab[countD + countS].suffix = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
143 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
144 _PyImport_Filetab = filetab; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
145 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
146 if (Py_OptimizeFlag) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
147 /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
148 for (; filetab->suffix != NULL; filetab++) { |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
149 #ifndef RISCOS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
150 if (strcmp(filetab->suffix, ".pyc") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
151 filetab->suffix = ".pyo"; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
152 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
153 if (strcmp(filetab->suffix, "/pyc") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
154 filetab->suffix = "/pyo"; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
155 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
156 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
157 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
158 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
159 if (Py_UnicodeFlag) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
160 /* Fix the pyc_magic so that byte compiled code created |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
161 using the all-Unicode method doesn't interfere with |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
162 code created in normal operation mode. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
163 pyc_magic = MAGIC + 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
164 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
165 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
166 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
167 void |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
168 _PyImportHooks_Init(void) |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
169 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
170 PyObject *v, *path_hooks = NULL, *zimpimport; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
171 int err = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
172 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
173 /* adding sys.path_hooks and sys.path_importer_cache, setting up |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
174 zipimport */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
175 if (PyType_Ready(&PyNullImporter_Type) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
176 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
177 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
178 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
179 PySys_WriteStderr("# installing zipimport hook\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
180 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
181 v = PyList_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
182 if (v == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
183 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
184 err = PySys_SetObject("meta_path", v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
185 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
186 if (err) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
187 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
188 v = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
189 if (v == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
190 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
191 err = PySys_SetObject("path_importer_cache", v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
192 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
193 if (err) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
194 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
195 path_hooks = PyList_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
196 if (path_hooks == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
197 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
198 err = PySys_SetObject("path_hooks", path_hooks); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
199 if (err) { |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
200 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
201 PyErr_Print(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
202 Py_FatalError("initializing sys.meta_path, sys.path_hooks, " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
203 "path_importer_cache, or NullImporter failed" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
204 ); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
205 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
206 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
207 zimpimport = PyImport_ImportModule("zipimport"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
208 if (zimpimport == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
209 PyErr_Clear(); /* No zip import module -- okay */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
210 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
211 PySys_WriteStderr("# can't import zipimport\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
212 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
213 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
214 PyObject *zipimporter = PyObject_GetAttrString(zimpimport, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
215 "zipimporter"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
216 Py_DECREF(zimpimport); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
217 if (zipimporter == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
218 PyErr_Clear(); /* No zipimporter object -- okay */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
219 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
220 PySys_WriteStderr( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
221 "# can't import zipimport.zipimporter\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
222 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
223 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
224 /* sys.path_hooks.append(zipimporter) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
225 err = PyList_Append(path_hooks, zipimporter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
226 Py_DECREF(zipimporter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
227 if (err) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
228 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
229 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
230 PySys_WriteStderr( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
231 "# installed zipimport hook\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
232 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
233 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
234 Py_DECREF(path_hooks); |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
235 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
236 |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
237 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
238 _PyImport_Fini(void) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
239 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
240 Py_XDECREF(extensions); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
241 extensions = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
242 PyMem_DEL(_PyImport_Filetab); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
243 _PyImport_Filetab = NULL; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
244 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
245 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
246 |
|
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
|
247 /* 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
|
248 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
|
249 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
|
250 |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
251 #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
|
252 |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9187
diff
changeset
|
253 #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
|
254 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9431
diff
changeset
|
255 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
|
256 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
|
257 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
|
258 |
|
56008
1ad9f2bda20a
Merged revisions 74841 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
55330
diff
changeset
|
259 void |
|
1ad9f2bda20a
Merged revisions 74841 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
55330
diff
changeset
|
260 _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
|
261 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
262 long me = PyThread_get_thread_ident(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
263 if (me == -1) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
264 return; /* Too bad */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
265 if (import_lock == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
266 import_lock = PyThread_allocate_lock(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
267 if (import_lock == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
268 return; /* Nothing much we can do. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
269 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
270 if (import_lock_thread == me) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
271 import_lock_level++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
272 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
273 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
274 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
275 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
276 PyThreadState *tstate = PyEval_SaveThread(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
277 PyThread_acquire_lock(import_lock, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
278 PyEval_RestoreThread(tstate); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
279 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
280 import_lock_thread = me; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
281 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
|
282 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
283 |
|
56008
1ad9f2bda20a
Merged revisions 74841 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
55330
diff
changeset
|
284 int |
|
1ad9f2bda20a
Merged revisions 74841 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
55330
diff
changeset
|
285 _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
|
286 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
287 long me = PyThread_get_thread_ident(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
288 if (me == -1 || import_lock == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
289 return 0; /* Too bad */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
290 if (import_lock_thread != me) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
291 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
292 import_lock_level--; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
293 if (import_lock_level == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
294 import_lock_thread = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
295 PyThread_release_lock(import_lock); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
296 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
297 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
|
298 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
299 |
|
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
|
300 /* This function is called from PyOS_AfterFork to ensure that newly |
|
59226
d5f50ae4f1f7
Merged revisions 78527,78531 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
56008
diff
changeset
|
301 created child processes do not share locks with the parent. |
|
d5f50ae4f1f7
Merged revisions 78527,78531 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
56008
diff
changeset
|
302 We now acquire the import lock around fork() calls but on some platforms |
|
d5f50ae4f1f7
Merged revisions 78527,78531 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
56008
diff
changeset
|
303 (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
|
304 |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
305 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
|
306 _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
|
307 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
308 if (import_lock != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
309 import_lock = PyThread_allocate_lock(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
310 import_lock_thread = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
311 import_lock_level = 0; |
|
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
|
312 } |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
313 |
|
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
|
314 #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
|
315 |
|
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
|
316 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
317 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
|
318 { |
|
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
|
319 #ifdef WITH_THREAD |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
320 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
|
321 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
322 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
|
323 #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
|
324 } |
|
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
|
325 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
326 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
327 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
|
328 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
329 #ifdef WITH_THREAD |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
330 _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
|
331 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
332 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
333 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
|
334 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
335 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
336 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
337 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
|
338 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
339 #ifdef WITH_THREAD |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
340 if (_PyImport_ReleaseLock() < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
341 PyErr_SetString(PyExc_RuntimeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
342 "not holding the import lock"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
343 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
344 } |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
345 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
346 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
347 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
|
348 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
349 |
|
41128
45ce388ec59a
Bug #742342: make Python stop segfaulting on infinitely-recursive reload()s. Fixed by patch #922167.
Collin Winter <collinw@gmail.com>
parents:
41102
diff
changeset
|
350 static void |
| 41139 | 351 imp_modules_reloading_clear(void) |
|
41128
45ce388ec59a
Bug #742342: make Python stop segfaulting on infinitely-recursive reload()s. Fixed by patch #922167.
Collin Winter <collinw@gmail.com>
parents:
41102
diff
changeset
|
352 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
353 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
354 if (interp->modules_reloading != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
355 PyDict_Clear(interp->modules_reloading); |
|
41128
45ce388ec59a
Bug #742342: make Python stop segfaulting on infinitely-recursive reload()s. Fixed by patch #922167.
Collin Winter <collinw@gmail.com>
parents:
41102
diff
changeset
|
356 } |
|
45ce388ec59a
Bug #742342: make Python stop segfaulting on infinitely-recursive reload()s. Fixed by patch #922167.
Collin Winter <collinw@gmail.com>
parents:
41102
diff
changeset
|
357 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
358 /* Helper for sys */ |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
359 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
360 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
361 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
|
362 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
363 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
364 if (interp->modules == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
365 Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
366 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
|
367 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
368 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
369 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
370 /* 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
|
371 static char* sys_deletes[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
372 "path", "argv", "ps1", "ps2", "exitfunc", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
373 "exc_type", "exc_value", "exc_traceback", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
374 "last_type", "last_value", "last_traceback", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
375 "path_hooks", "path_importer_cache", "meta_path", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
376 /* misc stuff */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
377 "flags", "float_info", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
378 NULL |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
379 }; |
|
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
380 |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
381 static char* sys_files[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
382 "stdin", "__stdin__", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
383 "stdout", "__stdout__", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
384 "stderr", "__stderr__", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
385 NULL |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
386 }; |
|
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
387 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
388 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
389 /* Un-initialize things, as good as we can */ |
| 86 | 390 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
391 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
392 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
|
393 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
394 Py_ssize_t pos, ndone; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
395 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
396 PyObject *key, *value, *dict; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
397 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
398 PyObject *modules = interp->modules; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
399 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
400 if (modules == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
401 return; /* Already done */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
402 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
403 /* Delete some special variables first. These are common |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
404 places where user values hide and people complain when their |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
405 destructors fail. Since the modules containing them are |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
406 deleted *last* of all, they would come too late in the normal |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
407 destruction order. Sigh. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
408 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
409 value = PyDict_GetItemString(modules, "__builtin__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
410 if (value != NULL && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
411 dict = PyModule_GetDict(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
412 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
413 PySys_WriteStderr("# clear __builtin__._\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
414 PyDict_SetItemString(dict, "_", Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
415 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
416 value = PyDict_GetItemString(modules, "sys"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
417 if (value != NULL && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
418 char **p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
419 PyObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
420 dict = PyModule_GetDict(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
421 for (p = sys_deletes; *p != NULL; p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
422 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
423 PySys_WriteStderr("# clear sys.%s\n", *p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
424 PyDict_SetItemString(dict, *p, Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
425 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
426 for (p = sys_files; *p != NULL; p+=2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
427 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
428 PySys_WriteStderr("# restore sys.%s\n", *p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
429 v = PyDict_GetItemString(dict, *(p+1)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
430 if (v == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
431 v = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
432 PyDict_SetItemString(dict, *p, v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
433 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
434 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
435 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
436 /* First, delete __main__ */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
437 value = PyDict_GetItemString(modules, "__main__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
438 if (value != NULL && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
439 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
440 PySys_WriteStderr("# cleanup __main__\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
441 _PyModule_Clear(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
442 PyDict_SetItemString(modules, "__main__", Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
443 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
444 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
445 /* The special treatment of __builtin__ here is because even |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
446 when it's not referenced as a module, its dictionary is |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
447 referenced by almost every module's __builtins__. Since |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
448 deleting a module clears its dictionary (even if there are |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
449 references left to it), we need to delete the __builtin__ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
450 module last. Likewise, we don't delete sys until the very |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
451 end because it is implicitly referenced (e.g. by print). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
452 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
453 Also note that we 'delete' modules by replacing their entry |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
454 in the modules dict with None, rather than really deleting |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
455 them; this avoids a rehash of the modules dictionary and |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
456 also marks them as "non existent" so they won't be |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
457 re-imported. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
458 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
459 /* Next, repeatedly delete modules with a reference count of |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
460 one (skipping __builtin__ and sys) and delete them */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
461 do { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
462 ndone = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
463 pos = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
464 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
465 if (value->ob_refcnt != 1) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
466 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
467 if (PyString_Check(key) && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
468 name = PyString_AS_STRING(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
469 if (strcmp(name, "__builtin__") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
470 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
471 if (strcmp(name, "sys") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
472 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
473 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
474 PySys_WriteStderr( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
475 "# cleanup[1] %s\n", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
476 _PyModule_Clear(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
477 PyDict_SetItem(modules, key, Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
478 ndone++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
479 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
480 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
481 } while (ndone > 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
482 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
483 /* Next, delete all modules (still skipping __builtin__ and sys) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
484 pos = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
485 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
486 if (PyString_Check(key) && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
487 name = PyString_AS_STRING(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
488 if (strcmp(name, "__builtin__") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
489 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
490 if (strcmp(name, "sys") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
491 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
492 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
493 PySys_WriteStderr("# cleanup[2] %s\n", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
494 _PyModule_Clear(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
495 PyDict_SetItem(modules, key, Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
496 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
497 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
498 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
499 /* Next, delete sys and __builtin__ (in that order) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
500 value = PyDict_GetItemString(modules, "sys"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
501 if (value != NULL && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
502 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
503 PySys_WriteStderr("# cleanup sys\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
504 _PyModule_Clear(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
505 PyDict_SetItemString(modules, "sys", Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
506 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
507 value = PyDict_GetItemString(modules, "__builtin__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
508 if (value != NULL && PyModule_Check(value)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
509 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
510 PySys_WriteStderr("# cleanup __builtin__\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
511 _PyModule_Clear(value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
512 PyDict_SetItemString(modules, "__builtin__", Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
513 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
514 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
515 /* Finally, clear and delete the modules directory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
516 PyDict_Clear(modules); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
517 interp->modules = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
518 Py_DECREF(modules); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
519 Py_CLEAR(interp->modules_reloading); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
520 } |
|
166
28923e44254c
Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
521 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
522 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
523 /* Helper for pythonrun.c -- return magic number */ |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
524 |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
525 long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
526 PyImport_GetMagicNumber(void) |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
527 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
528 return pyc_magic; |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
529 } |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
530 |
| 6 | 531 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
532 /* 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
|
533 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
|
534 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
|
535 (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
|
536 modules), containing these modules. A copy of the module's |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
537 dictionary is stored by calling _PyImport_FixupExtension() |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
538 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
|
539 copy can be retrieved from there by calling |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
540 _PyImport_FindExtension(). */ |
| 6 | 541 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
542 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
543 _PyImport_FixupExtension(char *name, char *filename) |
| 6 | 544 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
545 PyObject *modules, *mod, *dict, *copy; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
546 if (extensions == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
547 extensions = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
548 if (extensions == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
549 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
550 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
551 modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
552 mod = PyDict_GetItemString(modules, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
553 if (mod == NULL || !PyModule_Check(mod)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
554 PyErr_Format(PyExc_SystemError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
555 "_PyImport_FixupExtension: module %.200s not loaded", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
556 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
557 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
558 dict = PyModule_GetDict(mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
559 if (dict == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
560 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
561 copy = PyDict_Copy(dict); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
562 if (copy == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
563 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
564 PyDict_SetItemString(extensions, filename, copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
565 Py_DECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
566 return copy; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
567 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
568 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
569 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
570 _PyImport_FindExtension(char *name, char *filename) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
571 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
572 PyObject *dict, *mod, *mdict; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
573 if (extensions == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
574 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
575 dict = PyDict_GetItemString(extensions, filename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
576 if (dict == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
577 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
578 mod = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
579 if (mod == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
580 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
581 mdict = PyModule_GetDict(mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
582 if (mdict == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
583 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
584 if (PyDict_Update(mdict, dict)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
585 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
586 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
587 PySys_WriteStderr("import %s # previously loaded (%s)\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
588 name, filename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
589 return mod; |
| 6 | 590 } |
| 591 | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
592 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
593 /* 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
|
594 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
|
595 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
|
596 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
|
597 '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
|
598 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
599 PyObject * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35757
diff
changeset
|
600 PyImport_AddModule(const char *name) |
|
40
f28ac7f621c7
Added reload() functionality.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
601 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
602 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
603 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
604 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
605 if ((m = PyDict_GetItemString(modules, name)) != NULL && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
606 PyModule_Check(m)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
607 return m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
608 m = PyModule_New(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
609 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
610 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
611 if (PyDict_SetItemString(modules, name, m) != 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
612 Py_DECREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
613 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
614 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
615 Py_DECREF(m); /* Yes, it still exists, in modules! */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
616 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
617 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
|
618 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
619 |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
620 /* 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
|
621 static void |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
622 _RemoveModule(const char *name) |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
623 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
624 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
625 if (PyDict_GetItemString(modules, name) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
626 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
627 if (PyDict_DelItemString(modules, name) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
628 Py_FatalError("import: deleting existing key in" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
629 "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
|
630 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
631 |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
632 /* 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
|
633 * 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
|
634 * 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
|
635 * 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
|
636 * 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
|
637 * example. |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
638 */ |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
639 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
640 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
|
641 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
642 return PyImport_ExecCodeModuleEx(name, co, (char *)NULL); |
|
7232
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
643 } |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
644 |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
645 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
646 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
|
647 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
648 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
649 PyObject *m, *d, *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
650 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
651 m = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
652 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
653 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
654 /* If the module is being reloaded, we get the old module back |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
655 and re-use its dict to exec the new code. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
656 d = PyModule_GetDict(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
657 if (PyDict_GetItemString(d, "__builtins__") == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
658 if (PyDict_SetItemString(d, "__builtins__", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
659 PyEval_GetBuiltins()) != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
660 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
661 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
662 /* Remember the filename as the __file__ attribute */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
663 v = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
664 if (pathname != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
665 v = PyString_FromString(pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
666 if (v == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
667 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
668 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
669 if (v == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
670 v = ((PyCodeObject *)co)->co_filename; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
671 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
672 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
673 if (PyDict_SetItemString(d, "__file__", v) != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
674 PyErr_Clear(); /* Not important enough to report */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
675 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
676 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
677 v = PyEval_EvalCode((PyCodeObject *)co, d, d); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
678 if (v == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
679 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
680 Py_DECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
681 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
682 if ((m = PyDict_GetItemString(modules, name)) == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
683 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
684 "Loaded module %.200s not found in sys.modules", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
685 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
686 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
687 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
688 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
689 Py_INCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
690 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
691 return m; |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
692 |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
693 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
694 _RemoveModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
695 return NULL; |
| 6 | 696 } |
| 697 | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
698 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
699 /* Given a pathname for a Python source file, fill a buffer with the |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
700 pathname for the corresponding compiled file. Return the pathname |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
701 for the compiled file, or NULL if there's no space in the buffer. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
702 Doesn't set an exception. */ |
|
609
0ad5b35e3ad8
Support for dynamic loading added.
Guido van Rossum <guido@python.org>
parents:
510
diff
changeset
|
703 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
704 static char * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
705 make_compiled_pathname(char *pathname, char *buf, size_t buflen) |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
706 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
707 size_t len = strlen(pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
708 if (len+2 > buflen) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
709 return NULL; |
|
18992
7fa1f87ca6b2
Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
710 |
|
24071
8142f8d668a0
Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents:
23879
diff
changeset
|
711 #ifdef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
712 /* Treat .pyw as if it were .py. The case of ".pyw" must match |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
713 that used in _PyImport_StandardFiletab. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
714 if (len >= 4 && strcmp(&pathname[len-4], ".pyw") == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
715 --len; /* pretend 'w' isn't there */ |
|
18992
7fa1f87ca6b2
Derived from SF patch #446899 Permit import of .pyw under Windows, from
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
716 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
717 memcpy(buf, pathname, len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
718 buf[len] = Py_OptimizeFlag ? 'o' : 'c'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
719 buf[len+1] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
720 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
721 return buf; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
722 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
723 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
724 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
725 /* Given a pathname for a Python source file, its time of last |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
726 modification, and a pathname for a compiled file, check whether the |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
727 compiled file represents the same version of the source. If so, |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
728 return a FILE pointer for the compiled file, positioned just after |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
729 the header; if not, return NULL. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
730 Doesn't set an exception. */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
731 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
732 static FILE * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
733 check_compiled_module(char *pathname, time_t mtime, char *cpathname) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
734 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
735 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
736 long magic; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
737 long pyc_mtime; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
738 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
739 fp = fopen(cpathname, "rb"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
740 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
741 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
742 magic = PyMarshal_ReadLongFromFile(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
743 if (magic != pyc_magic) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
744 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
745 PySys_WriteStderr("# %s has bad magic\n", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
746 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
747 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
748 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
749 pyc_mtime = PyMarshal_ReadLongFromFile(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
750 if (pyc_mtime != mtime) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
751 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
752 PySys_WriteStderr("# %s has bad mtime\n", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
753 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
754 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
755 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
756 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
757 PySys_WriteStderr("# %s matches %s\n", cpathname, pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
758 return fp; |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
759 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
760 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
761 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
762 /* Read a code object from a file and check it for validity */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
763 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
764 static PyCodeObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
765 read_compiled_module(char *cpathname, FILE *fp) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
766 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
767 PyObject *co; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
768 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
769 co = PyMarshal_ReadLastObjectFromFile(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
770 if (co == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
771 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
772 if (!PyCode_Check(co)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
773 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
774 "Non-code object in %.200s", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
775 Py_DECREF(co); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
776 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
777 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
778 return (PyCodeObject *)co; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
779 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
780 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
781 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
782 /* Load a module from a compiled file, execute it, and return its |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
783 module object WITH INCREMENTED REFERENCE COUNT */ |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
784 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
785 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
786 load_compiled_module(char *name, char *cpathname, FILE *fp) |
| 6 | 787 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
788 long magic; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
789 PyCodeObject *co; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
790 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
791 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
792 magic = PyMarshal_ReadLongFromFile(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
793 if (magic != pyc_magic) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
794 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
795 "Bad magic number in %.200s", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
796 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
797 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
798 (void) PyMarshal_ReadLongFromFile(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
799 co = read_compiled_module(cpathname, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
800 if (co == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
801 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
802 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
803 PySys_WriteStderr("import %s # precompiled from %s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
804 name, cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
805 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
806 Py_DECREF(co); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
807 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
808 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
|
809 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
810 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
811 /* Parse a source file and return the corresponding code object */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
812 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
813 static PyCodeObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
814 parse_source_module(const char *pathname, FILE *fp) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
815 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
816 PyCodeObject *co = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
817 mod_ty mod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
818 PyCompilerFlags flags; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
819 PyArena *arena = PyArena_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
820 if (arena == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
821 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
822 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
823 flags.cf_flags = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
824 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
825 mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
826 NULL, arena); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
827 if (mod) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
828 co = PyAST_Compile(mod, pathname, NULL, arena); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
829 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
830 PyArena_Free(arena); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
831 return co; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
832 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
833 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
834 |
|
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
|
835 /* Helper to open a bytecode file for writing in exclusive mode */ |
|
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
836 |
|
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
|
837 static FILE * |
|
45470
3915d5f650fa
Issue #2051 and patch from Alexander Belopolsky:
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
838 open_exclusive(char *filename, mode_t mode) |
|
14708
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
839 { |
|
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
|
840 #if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
841 /* Use O_EXCL to avoid a race condition when another process tries to |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
842 write the same file. When that happens, our open() call fails, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
843 which is just fine (since it's only a cache). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
844 XXX If the file exists and is writable but the directory is not |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
845 writable, the file will never be written. Oh well. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
846 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
847 int fd; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
848 (void) unlink(filename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
849 fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC |
|
14921
3db8b8031a6a
The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents:
14708
diff
changeset
|
850 #ifdef O_BINARY |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
851 |O_BINARY /* necessary for Windows */ |
|
14921
3db8b8031a6a
The 2.0b2 change to write .pyc files in exclusive mode (if possible)
Tim Peters <tim.peters@gmail.com>
parents:
14708
diff
changeset
|
852 #endif |
|
26550
b9c912e2c3c0
Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents:
26461
diff
changeset
|
853 #ifdef __VMS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
854 , mode, "ctxt=bin", "shr=nil" |
|
26550
b9c912e2c3c0
Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents:
26461
diff
changeset
|
855 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
856 , mode |
|
26550
b9c912e2c3c0
Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents:
26461
diff
changeset
|
857 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
858 ); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
859 if (fd < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
860 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
861 return fdopen(fd, "wb"); |
|
14708
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
862 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
863 /* Best we can do -- on Windows this can't happen anyway */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
864 return fopen(filename, "wb"); |
|
14708
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
865 #endif |
|
89b2aee43e0b
On Unix, use O_EXCL when creating the .pyc/.pyo files, to avoid a race condition
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
866 } |
|
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
|
867 |
|
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
|
868 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
869 /* Write a compiled module to a file, placing the time of last |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
870 modification of its source into the header. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
871 Errors are ignored, if a write error occurs an attempt is made to |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
872 remove the file. */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
873 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
874 static void |
|
45470
3915d5f650fa
Issue #2051 and patch from Alexander Belopolsky:
Christian Heimes <christian@cheimes.de>
parents:
45059
diff
changeset
|
875 write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
876 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
877 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
878 time_t mtime = srcstat->st_mtime; |
|
55330
f20705875e80
Merged revisions 73870,73879,73899-73900,73905-73906 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
50786
diff
changeset
|
879 #ifdef MS_WINDOWS /* since Windows uses different permissions */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
880 mode_t mode = srcstat->st_mode & ~S_IEXEC; |
|
55330
f20705875e80
Merged revisions 73870,73879,73899-73900,73905-73906 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
50786
diff
changeset
|
881 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
882 mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
883 #endif |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
884 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
885 fp = open_exclusive(cpathname, mode); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
886 if (fp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
887 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
888 PySys_WriteStderr( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
889 "# can't create %s\n", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
890 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
891 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
892 PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
893 /* First write a 0 for mtime */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
894 PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
895 PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
896 if (fflush(fp) != 0 || ferror(fp)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
897 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
898 PySys_WriteStderr("# can't write %s\n", cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
899 /* Don't keep partial file */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
900 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
901 (void) unlink(cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
902 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
903 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
904 /* Now write the true mtime */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
905 fseek(fp, 4L, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
906 assert(mtime < LONG_MAX); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
907 PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
908 fflush(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
909 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
910 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
911 PySys_WriteStderr("# wrote %s\n", cpathname); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
912 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
913 |
|
50618
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
914 static void |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
915 update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname) |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
916 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
917 PyObject *constants, *tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
918 Py_ssize_t i, n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
919 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
920 if (!_PyString_Eq(co->co_filename, oldname)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
921 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
922 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
923 tmp = co->co_filename; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
924 co->co_filename = newname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
925 Py_INCREF(co->co_filename); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
926 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
927 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
928 constants = co->co_consts; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
929 n = PyTuple_GET_SIZE(constants); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
930 for (i = 0; i < n; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
931 tmp = PyTuple_GET_ITEM(constants, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
932 if (PyCode_Check(tmp)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
933 update_code_filenames((PyCodeObject *)tmp, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
934 oldname, newname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
935 } |
|
50618
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
936 } |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
937 |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
938 static int |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
939 update_compiled_module(PyCodeObject *co, char *pathname) |
|
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
940 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
941 PyObject *oldname, *newname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
942 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
943 if (strcmp(PyString_AsString(co->co_filename), pathname) == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
944 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
945 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
946 newname = PyString_FromString(pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
947 if (newname == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
948 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
949 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
950 oldname = co->co_filename; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
951 Py_INCREF(oldname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
952 update_code_filenames(co, oldname, newname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
953 Py_DECREF(oldname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
954 Py_DECREF(newname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
955 return 1; |
|
50618
617199769bd3
Merged revisions 68360 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
48920
diff
changeset
|
956 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
957 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
958 /* Load a source module from a given file and return its module |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
959 object WITH INCREMENTED REFERENCE COUNT. If there's a matching |
|
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
960 byte-compiled file, use that instead. */ |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
961 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
962 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
963 load_source_module(char *name, char *pathname, FILE *fp) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
964 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
965 struct stat st; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
966 FILE *fpc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
967 char buf[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
968 char *cpathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
969 PyCodeObject *co; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
970 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
971 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
972 if (fstat(fileno(fp), &st) != 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
973 PyErr_Format(PyExc_RuntimeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
974 "unable to get file status from '%s'", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
975 pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
976 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
977 } |
|
13226
12437deb0680
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13181
diff
changeset
|
978 #if SIZEOF_TIME_T > 4 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
979 /* Python's .pyc timestamp handling presumes that the timestamp fits |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
980 in 4 bytes. This will be fine until sometime in the year 2038, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
981 when a 4-byte signed time_t will overflow. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
982 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
983 if (st.st_mtime >> 32) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
984 PyErr_SetString(PyExc_OverflowError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
985 "modification time overflows a 4 byte field"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
986 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
987 } |
|
13226
12437deb0680
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
13181
diff
changeset
|
988 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
989 cpathname = make_compiled_pathname(pathname, buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
990 (size_t)MAXPATHLEN + 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
991 if (cpathname != NULL && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
992 (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
993 co = read_compiled_module(cpathname, fpc); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
994 fclose(fpc); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
995 if (co == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
996 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
997 if (update_compiled_module(co, pathname) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
998 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
999 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1000 PySys_WriteStderr("import %s # precompiled from %s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1001 name, cpathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1002 pathname = cpathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1003 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1004 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1005 co = parse_source_module(pathname, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1006 if (co == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1007 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1008 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1009 PySys_WriteStderr("import %s # from %s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1010 name, pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1011 if (cpathname) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1012 PyObject *ro = PySys_GetObject("dont_write_bytecode"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1013 if (ro == NULL || !PyObject_IsTrue(ro)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1014 write_compiled_module(co, cpathname, &st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1015 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1016 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1017 m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1018 Py_DECREF(co); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1019 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1020 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
|
1021 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1022 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1023 |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1024 /* Forward */ |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1025 static PyObject *load_module(char *, FILE *, char *, int, PyObject *); |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1026 static struct filedescr *find_module(char *, char *, PyObject *, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1027 char *, size_t, FILE **, PyObject **); |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
1028 static struct _frozen *find_frozen(char *name); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1029 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1030 /* Load a package and return its module object WITH INCREMENTED |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1031 REFERENCE COUNT */ |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1032 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1033 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1034 load_package(char *name, char *pathname) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1035 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1036 PyObject *m, *d; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1037 PyObject *file = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1038 PyObject *path = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1039 int err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1040 char buf[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1041 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1042 struct filedescr *fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1043 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1044 m = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1045 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1046 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1047 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1048 PySys_WriteStderr("import %s # directory %s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1049 name, pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1050 d = PyModule_GetDict(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1051 file = PyString_FromString(pathname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1052 if (file == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1053 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1054 path = Py_BuildValue("[O]", file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1055 if (path == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1056 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1057 err = PyDict_SetItemString(d, "__file__", file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1058 if (err == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1059 err = PyDict_SetItemString(d, "__path__", path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1060 if (err != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1061 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1062 buf[0] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1063 fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1064 if (fdp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1065 if (PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1066 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1067 Py_INCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1068 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1069 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1070 m = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1071 goto cleanup; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1072 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1073 m = load_module(name, fp, buf, fdp->type, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1074 if (fp != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1075 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1076 goto cleanup; |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
1077 |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
1078 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1079 m = NULL; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1080 cleanup: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1081 Py_XDECREF(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1082 Py_XDECREF(file); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1083 return m; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1084 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1085 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1086 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1087 /* Helper to test for built-in module */ |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1088 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1089 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1090 is_builtin(char *name) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1091 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1092 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1093 for (i = 0; PyImport_Inittab[i].name != NULL; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1094 if (strcmp(name, PyImport_Inittab[i].name) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1095 if (PyImport_Inittab[i].initfunc == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1096 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1097 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1098 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1099 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1100 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1101 return 0; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1102 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1103 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1104 |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1105 /* 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
|
1106 possibly by fetching it from the path_importer_cache dict. If it |
|
39901
f90ba306c287
Very minor grammatical fix in a comment.
Brett Cannon <bcannon@gmail.com>
parents:
39827
diff
changeset
|
1107 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
|
1108 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
|
1109 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
|
1110 import mechanism. Cache the result in path_importer_cache. |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1111 Returns a borrowed reference. */ |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1112 |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1113 static PyObject * |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1114 get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1115 PyObject *p) |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1116 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1117 PyObject *importer; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1118 Py_ssize_t j, nhooks; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1119 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1120 /* These conditions are the caller's responsibility: */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1121 assert(PyList_Check(path_hooks)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1122 assert(PyDict_Check(path_importer_cache)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1123 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1124 nhooks = PyList_Size(path_hooks); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1125 if (nhooks < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1126 return NULL; /* Shouldn't happen */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1127 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1128 importer = PyDict_GetItem(path_importer_cache, p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1129 if (importer != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1130 return importer; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1131 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1132 /* set path_importer_cache[p] to None to avoid recursion */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1133 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1134 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1135 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1136 for (j = 0; j < nhooks; j++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1137 PyObject *hook = PyList_GetItem(path_hooks, j); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1138 if (hook == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1139 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1140 importer = PyObject_CallFunctionObjArgs(hook, p, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1141 if (importer != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1142 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1143 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1144 if (!PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1145 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1146 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1147 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1148 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1149 if (importer == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1150 importer = PyObject_CallFunctionObjArgs( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1151 (PyObject *)&PyNullImporter_Type, p, NULL |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1152 ); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1153 if (importer == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1154 if (PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1155 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1156 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1157 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1158 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1159 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1160 if (importer != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1161 int err = PyDict_SetItem(path_importer_cache, p, importer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1162 Py_DECREF(importer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1163 if (err != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1164 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1165 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1166 return importer; |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1167 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1168 |
|
43895
4cec0c6392c1
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
Nick Coghlan <ncoghlan@gmail.com>
parents:
43792
diff
changeset
|
1169 PyAPI_FUNC(PyObject *) |
|
4cec0c6392c1
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
Nick Coghlan <ncoghlan@gmail.com>
parents:
43792
diff
changeset
|
1170 PyImport_GetImporter(PyObject *path) { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1171 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1172 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1173 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1174 if ((path_hooks = PySys_GetObject("path_hooks"))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1175 importer = get_path_importer(path_importer_cache, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1176 path_hooks, path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1177 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1178 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1179 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1180 return importer; |
|
43895
4cec0c6392c1
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
Nick Coghlan <ncoghlan@gmail.com>
parents:
43792
diff
changeset
|
1181 } |
|
4cec0c6392c1
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
Nick Coghlan <ncoghlan@gmail.com>
parents:
43792
diff
changeset
|
1182 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1183 /* Search the path (default sys.path) for a module. Return the |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1184 corresponding filedescr struct, and (via return arguments) the |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1185 pathname and an open file. Return NULL if the module is not found. */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1186 |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1187 #ifdef MS_COREDLL |
|
13663
29da35543833
ANSIfy as many declarations as possible.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
1188 extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1189 char *, Py_ssize_t); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1190 #endif |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1191 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
1192 static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *); |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
1193 static int find_init_module(char *); /* Forward */ |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1194 static struct filedescr importhookdescr = {"", "", IMP_HOOK}; |
|
6542
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1195 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1196 static struct filedescr * |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1197 find_module(char *fullname, char *subname, PyObject *path, char *buf, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1198 size_t buflen, FILE **p_fp, PyObject **p_loader) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1199 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1200 Py_ssize_t i, npath; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1201 size_t len, namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1202 struct filedescr *fdp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1203 char *filemode; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1204 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1205 PyObject *path_hooks, *path_importer_cache; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1206 #ifndef RISCOS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1207 struct stat statbuf; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1208 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1209 static struct filedescr fd_frozen = {"", "", PY_FROZEN}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1210 static struct filedescr fd_builtin = {"", "", C_BUILTIN}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1211 static struct filedescr fd_package = {"", "", PKG_DIRECTORY}; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1212 char name[MAXPATHLEN+1]; |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1213 #if defined(PYOS_OS2) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1214 size_t saved_len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1215 size_t saved_namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1216 char *saved_buf = NULL; |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1217 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1218 if (p_loader != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1219 *p_loader = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1220 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1221 if (strlen(subname) > MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1222 PyErr_SetString(PyExc_OverflowError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1223 "module name is too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1224 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1225 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1226 strcpy(name, subname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1227 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1228 /* sys.meta_path import hook */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1229 if (p_loader != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1230 PyObject *meta_path; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1231 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1232 meta_path = PySys_GetObject("meta_path"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1233 if (meta_path == NULL || !PyList_Check(meta_path)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1234 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1235 "sys.meta_path must be a list of " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1236 "import hooks"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1237 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1238 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1239 Py_INCREF(meta_path); /* zap guard */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1240 npath = PyList_Size(meta_path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1241 for (i = 0; i < npath; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1242 PyObject *loader; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1243 PyObject *hook = PyList_GetItem(meta_path, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1244 loader = PyObject_CallMethod(hook, "find_module", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1245 "sO", fullname, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1246 path != NULL ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1247 path : Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1248 if (loader == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1249 Py_DECREF(meta_path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1250 return NULL; /* true error */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1251 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1252 if (loader != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1253 /* a loader was found */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1254 *p_loader = loader; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1255 Py_DECREF(meta_path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1256 return &importhookdescr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1257 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1258 Py_DECREF(loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1259 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1260 Py_DECREF(meta_path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1261 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1262 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1263 if (path != NULL && PyString_Check(path)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1264 /* The only type of submodule allowed inside a "frozen" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1265 package are other frozen modules or packages. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1266 if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1267 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1268 "full frozen module name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1269 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1270 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1271 strcpy(buf, PyString_AsString(path)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1272 strcat(buf, "."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1273 strcat(buf, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1274 strcpy(name, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1275 if (find_frozen(name) != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1276 strcpy(buf, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1277 return &fd_frozen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1278 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1279 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1280 "No frozen submodule named %.200s", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1281 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1282 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1283 if (path == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1284 if (is_builtin(name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1285 strcpy(buf, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1286 return &fd_builtin; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1287 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1288 if ((find_frozen(name)) != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1289 strcpy(buf, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1290 return &fd_frozen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1291 } |
|
1410
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1362
diff
changeset
|
1292 |
|
4111
90216e907345
PYTHONWIN -> MS_COREDLL
Guido van Rossum <guido@python.org>
parents:
3964
diff
changeset
|
1293 #ifdef MS_COREDLL |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1294 fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1295 if (fp != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1296 *p_fp = fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1297 return fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1298 } |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1299 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1300 path = PySys_GetObject("path"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1301 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1302 if (path == NULL || !PyList_Check(path)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1303 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1304 "sys.path must be a list of directory names"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1305 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1306 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1307 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1308 path_hooks = PySys_GetObject("path_hooks"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1309 if (path_hooks == NULL || !PyList_Check(path_hooks)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1310 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1311 "sys.path_hooks must be a list of " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1312 "import hooks"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1313 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1314 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1315 path_importer_cache = PySys_GetObject("path_importer_cache"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1316 if (path_importer_cache == NULL || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1317 !PyDict_Check(path_importer_cache)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1318 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1319 "sys.path_importer_cache must be a dict"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1320 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1321 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1322 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1323 npath = PyList_Size(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1324 namelen = strlen(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1325 for (i = 0; i < npath; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1326 PyObject *copy = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1327 PyObject *v = PyList_GetItem(path, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1328 if (!v) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1329 return NULL; |
|
23879
08475c87d24f
Apply diff2.txt from SF patch http://www.python.org/sf/566999
Walter Dörwald <walter@livinglogic.de>
parents:
23851
diff
changeset
|
1330 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1331 if (PyUnicode_Check(v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1332 copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1333 PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1334 if (copy == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1335 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1336 v = copy; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1337 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1338 else |
|
23879
08475c87d24f
Apply diff2.txt from SF patch http://www.python.org/sf/566999
Walter Dörwald <walter@livinglogic.de>
parents:
23851
diff
changeset
|
1339 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1340 if (!PyString_Check(v)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1341 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1342 len = PyString_GET_SIZE(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1343 if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1344 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1345 continue; /* Too long */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1346 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1347 strcpy(buf, PyString_AS_STRING(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1348 if (strlen(buf) != len) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1349 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1350 continue; /* v contains '\0' */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1351 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1352 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1353 /* sys.path_hooks import hook */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1354 if (p_loader != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1355 PyObject *importer; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1356 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1357 importer = get_path_importer(path_importer_cache, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1358 path_hooks, v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1359 if (importer == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1360 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1361 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1362 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1363 /* Note: importer is a borrowed reference */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1364 if (importer != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1365 PyObject *loader; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1366 loader = PyObject_CallMethod(importer, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1367 "find_module", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1368 "s", fullname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1369 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1370 if (loader == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1371 return NULL; /* error */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1372 if (loader != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1373 /* a loader was found */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1374 *p_loader = loader; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1375 return &importhookdescr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1376 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1377 Py_DECREF(loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1378 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1379 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1380 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1381 /* no hook was found, use builtin import */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1382 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1383 if (len > 0 && buf[len-1] != SEP |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1384 #ifdef ALTSEP |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1385 && buf[len-1] != ALTSEP |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1386 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1387 ) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1388 buf[len++] = SEP; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1389 strcpy(buf+len, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1390 len += namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1391 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1392 /* Check for package import (buf holds a directory name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1393 and there's an __init__ module in that directory */ |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1394 #ifdef HAVE_STAT |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1395 if (stat(buf, &statbuf) == 0 && /* it exists */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1396 S_ISDIR(statbuf.st_mode) && /* it's a directory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1397 case_ok(buf, len, namelen, name)) { /* case matches */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1398 if (find_init_module(buf)) { /* and has __init__.py */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1399 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1400 return &fd_package; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1401 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1402 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1403 char warnstr[MAXPATHLEN+80]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1404 sprintf(warnstr, "Not importing directory " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1405 "'%.*s': missing __init__.py", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1406 MAXPATHLEN, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1407 if (PyErr_Warn(PyExc_ImportWarning, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1408 warnstr)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1409 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1410 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1411 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1412 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1413 } |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1414 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1415 /* XXX How are you going to test for directories? */ |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1416 #ifdef RISCOS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1417 if (isdir(buf) && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1418 case_ok(buf, len, namelen, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1419 if (find_init_module(buf)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1420 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1421 return &fd_package; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1422 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1423 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1424 char warnstr[MAXPATHLEN+80]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1425 sprintf(warnstr, "Not importing directory " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1426 "'%.*s': missing __init__.py", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1427 MAXPATHLEN, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1428 if (PyErr_Warn(PyExc_ImportWarning, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1429 warnstr)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1430 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1431 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1432 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1433 } |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1434 #endif |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1435 #endif |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1436 #if defined(PYOS_OS2) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1437 /* take a snapshot of the module spec for restoration |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1438 * after the 8 character DLL hackery |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1439 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1440 saved_buf = strdup(buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1441 saved_len = len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1442 saved_namelen = namelen; |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1443 #endif /* PYOS_OS2 */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1444 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { |
|
42734
9087337f3a3f
Second half of #1752175: #ifdef out references to PyImport_DynLoadFiletab if HAVE_DYNAMIC_LOADING is not defined.
Georg Brandl <georg@python.org>
parents:
42688
diff
changeset
|
1445 #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1446 /* OS/2 limits DLLs to 8 character names (w/o |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1447 extension) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1448 * so if the name is longer than that and its a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1449 * dynamically loaded module we're going to try, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1450 * truncate the name before trying |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1451 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1452 if (strlen(subname) > 8) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1453 /* is this an attempt to load a C extension? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1454 const struct filedescr *scan; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1455 scan = _PyImport_DynLoadFiletab; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1456 while (scan->suffix != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1457 if (!strcmp(scan->suffix, fdp->suffix)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1458 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1459 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1460 scan++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1461 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1462 if (scan->suffix != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1463 /* yes, so truncate the name */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1464 namelen = 8; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1465 len -= strlen(subname) - namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1466 buf[len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1467 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1468 } |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1469 #endif /* PYOS_OS2 */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1470 strcpy(buf+len, fdp->suffix); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1471 if (Py_VerboseFlag > 1) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1472 PySys_WriteStderr("# trying %s\n", buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1473 filemode = fdp->mode; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1474 if (filemode[0] == 'U') |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1475 filemode = "r" PY_STDIOTEXTMODE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1476 fp = fopen(buf, filemode); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1477 if (fp != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1478 if (case_ok(buf, len, namelen, name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1479 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1480 else { /* continue search */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1481 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1482 fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1483 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1484 } |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1485 #if defined(PYOS_OS2) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1486 /* restore the saved snapshot */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1487 strcpy(buf, saved_buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1488 len = saved_len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1489 namelen = saved_namelen; |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1490 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1491 } |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1492 #if defined(PYOS_OS2) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1493 /* don't need/want the module name snapshot anymore */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1494 if (saved_buf) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1495 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1496 free(saved_buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1497 saved_buf = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1498 } |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1499 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1500 Py_XDECREF(copy); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1501 if (fp != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1502 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1503 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1504 if (fp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1505 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1506 "No module named %.200s", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1507 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1508 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1509 *p_fp = fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1510 return fdp; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1511 } |
|
1410
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1362
diff
changeset
|
1512 |
|
33680
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1513 /* Helpers for main.c |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1514 * Find the source file corresponding to a named module |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1515 */ |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1516 struct filedescr * |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1517 _PyImport_FindModule(const char *name, PyObject *path, char *buf, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1518 size_t buflen, FILE **p_fp, PyObject **p_loader) |
|
33680
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1519 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1520 return find_module((char *) name, (char *) name, path, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1521 buf, buflen, p_fp, p_loader); |
|
33680
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1522 } |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1523 |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1524 PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr * fd) |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1525 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1526 return fd->type == PY_SOURCE || fd->type == PY_COMPILED; |
|
33680
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1527 } |
|
bcafb68ad985
SF patch #1035498: -m option to run a module as a script
Raymond Hettinger <python@rcn.com>
parents:
33542
diff
changeset
|
1528 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
1529 /* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name) |
|
16902
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1530 * The arguments here are tricky, best shown by example: |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1531 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1532 * ^ ^ ^ ^ |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1533 * |--------------------- buf ---------------------| |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1534 * |------------------- len ------------------| |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1535 * |------ name -------| |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1536 * |----- namelen -----| |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1537 * buf is the full path, but len only counts up to (& exclusive of) the |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1538 * extension. name is the module name, also exclusive of extension. |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1539 * |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1540 * We've already done a successful stat() or fopen() on buf, so know that |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1541 * there's some match, possibly case-insensitive. |
|
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1542 * |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1543 * case_ok() is to return 1 if there's a case-sensitive match for |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1544 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1545 * exists. |
|
16902
f55f35dc5320
More MacOSX fiddling. As noted in a comment, I believe all variations
Tim Peters <tim.peters@gmail.com>
parents:
16896
diff
changeset
|
1546 * |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1547 * case_ok() is used to implement case-sensitive import semantics even |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1548 * on platforms with case-insensitive filesystems. It's trivial to implement |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1549 * for case-sensitive filesystems. It's pretty much a cross-platform |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1550 * nightmare for systems with case-insensitive filesystems. |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1551 */ |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1552 |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1553 /* First we may need a pile of platform-specific header files; the sequence |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1554 * of #if's here should match the sequence in the body of case_ok(). |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1555 */ |
|
34961
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1556 #if defined(MS_WINDOWS) |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1557 #include <windows.h> |
|
15802
eb1767b068fe
SF Patch #103154 by jlt63: Cygwin Check Import Case Patch.
Guido van Rossum <guido@python.org>
parents:
15401
diff
changeset
|
1558 |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1559 #elif defined(DJGPP) |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1560 #include <dir.h> |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1561 |
|
34961
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1562 #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) |
|
16880
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1563 #include <sys/types.h> |
|
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1564 #include <dirent.h> |
|
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1565 |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1566 #elif defined(PYOS_OS2) |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1567 #define INCL_DOS |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1568 #define INCL_DOSERRORS |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1569 #define INCL_NOPMAPI |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1570 #include <os2.h> |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1571 |
|
20654
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20527
diff
changeset
|
1572 #elif defined(RISCOS) |
|
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20527
diff
changeset
|
1573 #include "oslib/osfscontrol.h" |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1574 #endif |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1575 |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1576 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
1577 case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name) |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1578 { |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1579 /* Pick a platform-specific implementation; the sequence of #if's here should |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1580 * match the sequence just above. |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1581 */ |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1582 |
|
34961
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1583 /* MS_WINDOWS */ |
|
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1584 #if defined(MS_WINDOWS) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1585 WIN32_FIND_DATA data; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1586 HANDLE h; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1587 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1588 if (Py_GETENV("PYTHONCASEOK") != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1589 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1590 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1591 h = FindFirstFile(buf, &data); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1592 if (h == INVALID_HANDLE_VALUE) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1593 PyErr_Format(PyExc_NameError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1594 "Can't find file for module %.100s\n(filename %.300s)", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1595 name, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1596 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1597 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1598 FindClose(h); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1599 return strncmp(data.cFileName, name, namelen) == 0; |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1600 |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1601 /* DJGPP */ |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1602 #elif defined(DJGPP) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1603 struct ffblk ffblk; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1604 int done; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1605 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1606 if (Py_GETENV("PYTHONCASEOK") != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1607 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1608 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1609 done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1610 if (done) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1611 PyErr_Format(PyExc_NameError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1612 "Can't find file for module %.100s\n(filename %.300s)", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1613 name, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1614 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1615 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1616 return strncmp(ffblk.ff_name, name, namelen) == 0; |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1617 |
|
34961
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1618 /* new-fangled macintosh (macosx) or Cygwin */ |
|
4a33c58c319c
Patch #1197318: Cygwin case-sensitive import patch
Jason Tishler <jason@tishler.net>
parents:
33680
diff
changeset
|
1619 #elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1620 DIR *dirp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1621 struct dirent *dp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1622 char dirname[MAXPATHLEN + 1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1623 const int dirlen = len - namelen - 1; /* don't want trailing SEP */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1624 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1625 if (Py_GETENV("PYTHONCASEOK") != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1626 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1627 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1628 /* Copy the dir component into dirname; substitute "." if empty */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1629 if (dirlen <= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1630 dirname[0] = '.'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1631 dirname[1] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1632 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1633 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1634 assert(dirlen <= MAXPATHLEN); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1635 memcpy(dirname, buf, dirlen); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1636 dirname[dirlen] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1637 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1638 /* Open the directory and search the entries for an exact match. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1639 dirp = opendir(dirname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1640 if (dirp) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1641 char *nameWithExt = buf + len - namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1642 while ((dp = readdir(dirp)) != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1643 const int thislen = |
|
16880
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1644 #ifdef _DIRENT_HAVE_D_NAMELEN |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1645 dp->d_namlen; |
|
16880
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1646 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1647 strlen(dp->d_name); |
|
16880
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1648 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1649 if (thislen >= namelen && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1650 strcmp(dp->d_name, nameWithExt) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1651 (void)closedir(dirp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1652 return 1; /* Found */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1653 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1654 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1655 (void)closedir(dirp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1656 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1657 return 0 ; /* Not found */ |
|
16880
bdcd79873924
In Steven's apparent absence, check in *something* with a non-zero chance
Tim Peters <tim.peters@gmail.com>
parents:
16830
diff
changeset
|
1658 |
|
20654
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20527
diff
changeset
|
1659 /* RISC OS */ |
|
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20527
diff
changeset
|
1660 #elif defined(RISCOS) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1661 char canon[MAXPATHLEN+1]; /* buffer for the canonical form of the path */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1662 char buf2[MAXPATHLEN+2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1663 char *nameWithExt = buf+len-namelen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1664 int canonlen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1665 os_error *e; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1666 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1667 if (Py_GETENV("PYTHONCASEOK") != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1668 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1669 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1670 /* workaround: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1671 append wildcard, otherwise case of filename wouldn't be touched */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1672 strcpy(buf2, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1673 strcat(buf2, "*"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1674 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1675 e = xosfscontrol_canonicalise_path(buf2,canon,0,0,MAXPATHLEN+1,&canonlen); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1676 canonlen = MAXPATHLEN+1-canonlen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1677 if (e || canonlen<=0 || canonlen>(MAXPATHLEN+1) ) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1678 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1679 if (strcmp(nameWithExt, canon+canonlen-strlen(nameWithExt))==0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1680 return 1; /* match */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1681 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1682 return 0; |
|
20654
edd9d0b3c47e
SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents:
20527
diff
changeset
|
1683 |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1684 /* OS/2 */ |
|
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1685 #elif defined(PYOS_OS2) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1686 HDIR hdir = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1687 ULONG srchcnt = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1688 FILEFINDBUF3 ffbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1689 APIRET rc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1690 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1691 if (Py_GETENV("PYTHONCASEOK") != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1692 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1693 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1694 rc = DosFindFirst(buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1695 &hdir, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1696 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1697 &ffbuf, sizeof(ffbuf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1698 &srchcnt, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1699 FIL_STANDARD); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1700 if (rc != NO_ERROR) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1701 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1702 return strncmp(ffbuf.achName, name, namelen) == 0; |
|
22054
5cbcfde3ad55
OS/2 EMX port changes (Python part of patch #450267):
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents:
21886
diff
changeset
|
1703 |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1704 /* assuming it's a case-sensitive filesystem, so there's nothing to do! */ |
|
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1705 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1706 return 1; |
|
7305
067e4813c6d6
Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents:
7290
diff
changeset
|
1707 |
|
16828
3b05212c1616
Implement PEP 235: Import on Case-Insensitive Platforms.
Tim Peters <tim.peters@gmail.com>
parents:
16712
diff
changeset
|
1708 #endif |
|
7305
067e4813c6d6
Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents:
7290
diff
changeset
|
1709 } |
|
067e4813c6d6
Added DJGPP version of check_case(), by Pit Scrorpion (Hans Nowak).
Guido van Rossum <guido@python.org>
parents:
7290
diff
changeset
|
1710 |
|
7290
72d531d54572
Add case checking feature on import.
Guido van Rossum <guido@python.org>
parents:
7232
diff
changeset
|
1711 |
|
6542
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1712 #ifdef HAVE_STAT |
|
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1713 /* Helper to look for __init__.py or __init__.py[co] in potential package */ |
|
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1714 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1715 find_init_module(char *buf) |
|
6542
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1716 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1717 const size_t save_len = strlen(buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1718 size_t i = save_len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1719 char *pname; /* pointer to start of __init__ */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1720 struct stat statbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1721 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1722 /* For calling case_ok(buf, len, namelen, name): |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1723 * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1724 * ^ ^ ^ ^ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1725 * |--------------------- buf ---------------------| |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1726 * |------------------- len ------------------| |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1727 * |------ name -------| |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1728 * |----- namelen -----| |
|
18388
06332b3c4335
SF bug #438295: [Windows] __init__.py cause strange behavior
Tim Peters <tim.peters@gmail.com>
parents:
17642
diff
changeset
|
1729 */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1730 if (save_len + 13 >= MAXPATHLEN) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1731 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1732 buf[i++] = SEP; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1733 pname = buf + i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1734 strcpy(pname, "__init__.py"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1735 if (stat(buf, &statbuf) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1736 if (case_ok(buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1737 save_len + 9, /* len("/__init__") */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1738 8, /* len("__init__") */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1739 pname)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1740 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1741 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1742 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1743 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1744 i += strlen(pname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1745 strcpy(buf+i, Py_OptimizeFlag ? "o" : "c"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1746 if (stat(buf, &statbuf) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1747 if (case_ok(buf, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1748 save_len + 9, /* len("/__init__") */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1749 8, /* len("__init__") */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1750 pname)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1751 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1752 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1753 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1754 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1755 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1756 return 0; |
|
6542
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1757 } |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1758 |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1759 #else |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1760 |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1761 #ifdef RISCOS |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1762 static int |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1763 find_init_module(buf) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1764 char *buf; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1765 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1766 int save_len = strlen(buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1767 int i = save_len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1768 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1769 if (save_len + 13 >= MAXPATHLEN) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1770 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1771 buf[i++] = SEP; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1772 strcpy(buf+i, "__init__/py"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1773 if (isfile(buf)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1774 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1775 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1776 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1777 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1778 if (Py_OptimizeFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1779 strcpy(buf+i, "o"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1780 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1781 strcpy(buf+i, "c"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1782 if (isfile(buf)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1783 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1784 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1785 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1786 buf[save_len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1787 return 0; |
|
16947
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1788 } |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1789 #endif /*RISCOS*/ |
|
b25131bc6ec7
RISCOS changes by dschwertberger.
Guido van Rossum <guido@python.org>
parents:
16932
diff
changeset
|
1790 |
|
6542
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1791 #endif /* HAVE_STAT */ |
|
62bdb1cbe0f5
New policy for package imports: only a directory containing
Guido van Rossum <guido@python.org>
parents:
6541
diff
changeset
|
1792 |
|
1410
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1362
diff
changeset
|
1793 |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
1794 static int init_builtin(char *); /* Forward */ |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1795 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1796 /* Load an external module using the default search path and return |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
1797 its module object WITH INCREMENTED REFERENCE COUNT */ |
| 86 | 1798 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1799 static PyObject * |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
1800 load_module(char *name, FILE *fp, char *buf, int type, PyObject *loader) |
| 86 | 1801 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1802 PyObject *modules; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1803 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1804 int err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1805 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1806 /* First check that there's an open file (if we need one) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1807 switch (type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1808 case PY_SOURCE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1809 case PY_COMPILED: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1810 if (fp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1811 PyErr_Format(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1812 "file object required for import (type code %d)", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1813 type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1814 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1815 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1816 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1817 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1818 switch (type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1819 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1820 case PY_SOURCE: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1821 m = load_source_module(name, buf, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1822 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1823 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1824 case PY_COMPILED: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1825 m = load_compiled_module(name, buf, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1826 break; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1827 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1828 #ifdef HAVE_DYNAMIC_LOADING |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1829 case C_EXTENSION: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1830 m = _PyImport_LoadDynamicModule(name, buf, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1831 break; |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1832 #endif |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1833 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1834 case PKG_DIRECTORY: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1835 m = load_package(name, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1836 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1837 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1838 case C_BUILTIN: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1839 case PY_FROZEN: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1840 if (buf != NULL && buf[0] != '\0') |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1841 name = buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1842 if (type == C_BUILTIN) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1843 err = init_builtin(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1844 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1845 err = PyImport_ImportFrozenModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1846 if (err < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1847 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1848 if (err == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1849 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1850 "Purported %s module %.200s not found", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1851 type == C_BUILTIN ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1852 "builtin" : "frozen", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1853 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1854 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1855 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1856 modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1857 m = PyDict_GetItemString(modules, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1858 if (m == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1859 PyErr_Format( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1860 PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1861 "%s module %.200s not properly initialized", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1862 type == C_BUILTIN ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1863 "builtin" : "frozen", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1864 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1865 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1866 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1867 Py_INCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1868 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1869 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1870 case IMP_HOOK: { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1871 if (loader == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1872 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1873 "import hook without loader"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1874 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1875 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1876 m = PyObject_CallMethod(loader, "load_module", "s", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1877 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1878 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1879 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1880 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1881 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1882 "Don't know how to import %.200s (type code %d)", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1883 name, type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1884 m = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1885 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1886 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1887 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1888 return m; |
| 6 | 1889 } |
|
40
f28ac7f621c7
Added reload() functionality.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
1890 |
| 86 | 1891 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1892 /* Initialize a built-in module. |
|
39978
47ab0c27dd1f
Fix minor typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents:
39901
diff
changeset
|
1893 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
|
1894 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
|
1895 |
|
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1896 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1897 init_builtin(char *name) |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1898 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1899 struct _inittab *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1900 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1901 if (_PyImport_FindExtension(name, name) != NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1902 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1903 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1904 for (p = PyImport_Inittab; p->name != NULL; p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1905 if (strcmp(name, p->name) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1906 if (p->initfunc == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1907 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1908 "Cannot re-init internal module %.200s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1909 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1910 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1911 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1912 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1913 PySys_WriteStderr("import %s # builtin\n", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1914 (*p->initfunc)(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1915 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1916 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1917 if (_PyImport_FixupExtension(name, name) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1918 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1919 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1920 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1921 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1922 return 0; |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1923 } |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1924 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1925 |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1926 /* 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
|
1927 |
|
3683
ec39264311ff
struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents:
3590
diff
changeset
|
1928 static struct _frozen * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1929 find_frozen(char *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1930 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1931 struct _frozen *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1932 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1933 for (p = PyImport_FrozenModules; ; p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1934 if (p->name == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1935 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1936 if (strcmp(p->name, name) == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1937 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1938 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1939 return p; |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1940 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1941 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1942 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1943 get_frozen_object(char *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1944 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1945 struct _frozen *p = find_frozen(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1946 int size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1947 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1948 if (p == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1949 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1950 "No such frozen object named %.200s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1951 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1952 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1953 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1954 if (p->code == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1955 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1956 "Excluded frozen object named %.200s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1957 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1958 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1959 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1960 size = p->size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1961 if (size < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1962 size = -size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1963 return PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1964 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1965 |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1966 /* Initialize a frozen module. |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1967 Return 1 for succes, 0 if the module is not found, and -1 with |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1968 an exception set if the initialization failed. |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1969 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
|
1970 |
|
6263e2fd9398
init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents:
2270
diff
changeset
|
1971 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1972 PyImport_ImportFrozenModule(char *name) |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1973 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1974 struct _frozen *p = find_frozen(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1975 PyObject *co; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1976 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1977 int ispackage; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1978 int size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1979 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1980 if (p == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1981 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1982 if (p->code == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1983 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1984 "Excluded frozen object named %.200s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1985 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1986 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1987 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1988 size = p->size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1989 ispackage = (size < 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1990 if (ispackage) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1991 size = -size; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1992 if (Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1993 PySys_WriteStderr("import %s # frozen%s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1994 name, ispackage ? " package" : ""); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1995 co = PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1996 if (co == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1997 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1998 if (!PyCode_Check(co)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
1999 PyErr_Format(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2000 "frozen object %.200s is not a code object", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2001 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2002 goto err_return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2003 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2004 if (ispackage) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2005 /* Set __path__ to the package name */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2006 PyObject *d, *s; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2007 int err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2008 m = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2009 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2010 goto err_return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2011 d = PyModule_GetDict(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2012 s = PyString_InternFromString(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2013 if (s == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2014 goto err_return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2015 err = PyDict_SetItemString(d, "__path__", s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2016 Py_DECREF(s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2017 if (err != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2018 goto err_return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2019 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2020 m = PyImport_ExecCodeModuleEx(name, co, "<frozen>"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2021 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2022 goto err_return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2023 Py_DECREF(co); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2024 Py_DECREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2025 return 1; |
|
39099
775f85b98e65
Fix memory leak under some conditions.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39070
diff
changeset
|
2026 err_return: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2027 Py_DECREF(co); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2028 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
|
2029 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2030 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2031 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2032 /* 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
|
2033 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
|
2034 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2035 PyObject * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35757
diff
changeset
|
2036 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
|
2037 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2038 PyObject *pname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2039 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2040 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2041 pname = PyString_FromString(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2042 if (pname == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2043 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2044 result = PyImport_Import(pname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2045 Py_DECREF(pname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2046 return result; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2047 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2048 |
|
44439
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2049 /* Import a module without blocking |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2050 * |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2051 * At first it tries to fetch the module from sys.modules. If the module was |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2052 * never loaded before it loads it with PyImport_ImportModule() unless another |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2053 * thread holds the import lock. In the latter case the function raises an |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2054 * ImportError instead of blocking. |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2055 * |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2056 * Returns the module object with incremented ref count. |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2057 */ |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2058 PyObject * |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2059 PyImport_ImportModuleNoBlock(const char *name) |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2060 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2061 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2062 PyObject *modules; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2063 long me; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2064 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2065 /* Try to get the module from sys.modules[name] */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2066 modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2067 if (modules == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2068 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2069 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2070 result = PyDict_GetItemString(modules, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2071 if (result != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2072 Py_INCREF(result); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2073 return result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2074 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2075 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2076 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2077 } |
|
48920
176c409fd747
Fix compilation when --without-threads is given #3683
Benjamin Peterson <benjamin@python.org>
parents:
48189
diff
changeset
|
2078 #ifdef WITH_THREAD |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2079 /* check the import lock |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2080 * me might be -1 but I ignore the error here, the lock function |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2081 * takes care of the problem */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2082 me = PyThread_get_thread_ident(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2083 if (import_lock_thread == -1 || import_lock_thread == me) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2084 /* no thread or me is holding the lock */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2085 return PyImport_ImportModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2086 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2087 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2088 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2089 "Failed to import %.200s because the import lock" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2090 "is held by another thread.", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2091 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2092 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2093 } |
|
48920
176c409fd747
Fix compilation when --without-threads is given #3683
Benjamin Peterson <benjamin@python.org>
parents:
48189
diff
changeset
|
2094 #else |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2095 return PyImport_ImportModule(name); |
|
48920
176c409fd747
Fix compilation when --without-threads is given #3683
Benjamin Peterson <benjamin@python.org>
parents:
48189
diff
changeset
|
2096 #endif |
|
44439
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2097 } |
|
0cbe94bea2c7
Modified PyImport_Import and PyImport_ImportModule to always use absolute imports by calling __import__ with an explicit level of 0
Christian Heimes <christian@cheimes.de>
parents:
44334
diff
changeset
|
2098 |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2099 /* Forward declarations for helper routines */ |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2100 static PyObject *get_parent(PyObject *globals, char *buf, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2101 Py_ssize_t *p_buflen, int level); |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
2102 static PyObject *load_next(PyObject *mod, PyObject *altmod, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2103 char **p_name, char *buf, Py_ssize_t *p_buflen); |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
2104 static int mark_miss(char *name); |
|
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
2105 static int ensure_fromlist(PyObject *mod, PyObject *fromlist, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2106 char *buf, Py_ssize_t buflen, int recursive); |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13266
diff
changeset
|
2107 static PyObject * import_submodule(PyObject *mod, char *name, char *fullname); |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2108 |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2109 /* The Magnum Opus of dotted-name import :-) */ |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2110 |
|
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
|
2111 static PyObject * |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2112 import_module_level(char *name, PyObject *globals, PyObject *locals, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2113 PyObject *fromlist, int level) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2114 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2115 char buf[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2116 Py_ssize_t buflen = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2117 PyObject *parent, *head, *next, *tail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2118 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2119 if (strchr(name, '/') != NULL |
|
44614
dc9d95b717c5
Fixed #1776. __import__() no longer imports modules by file name
Christian Heimes <christian@cheimes.de>
parents:
44569
diff
changeset
|
2120 #ifdef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2121 || strchr(name, '\\') != NULL |
|
44614
dc9d95b717c5
Fixed #1776. __import__() no longer imports modules by file name
Christian Heimes <christian@cheimes.de>
parents:
44569
diff
changeset
|
2122 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2123 ) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2124 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2125 "Import by filename is not supported."); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2126 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2127 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2128 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2129 parent = get_parent(globals, buf, &buflen, level); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2130 if (parent == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2131 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2132 |
|
61774
55e2368f72f2
Merged revisions 81380 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents:
61465
diff
changeset
|
2133 head = load_next(parent, level < 0 ? Py_None : parent, &name, buf, |
|
55e2368f72f2
Merged revisions 81380 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents:
61465
diff
changeset
|
2134 &buflen); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2135 if (head == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2136 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2137 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2138 tail = head; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2139 Py_INCREF(tail); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2140 while (name) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2141 next = load_next(tail, tail, &name, buf, &buflen); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2142 Py_DECREF(tail); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2143 if (next == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2144 Py_DECREF(head); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2145 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2146 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2147 tail = next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2148 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2149 if (tail == Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2150 /* If tail is Py_None, both get_parent and load_next found |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2151 an empty module name: someone called __import__("") or |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2152 doctored faulty bytecode */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2153 Py_DECREF(tail); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2154 Py_DECREF(head); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2155 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2156 "Empty module name"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2157 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2158 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2159 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2160 if (fromlist != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2161 if (fromlist == Py_None || !PyObject_IsTrue(fromlist)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2162 fromlist = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2163 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2164 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2165 if (fromlist == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2166 Py_DECREF(tail); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2167 return head; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2168 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2169 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2170 Py_DECREF(head); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2171 if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2172 Py_DECREF(tail); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2173 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2174 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2175 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2176 return tail; |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2177 } |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2178 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2179 PyObject * |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2180 PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2181 PyObject *fromlist, int level) |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2182 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2183 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2184 _PyImport_AcquireLock(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2185 result = import_module_level(name, globals, locals, fromlist, level); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2186 if (_PyImport_ReleaseLock() < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2187 Py_XDECREF(result); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2188 PyErr_SetString(PyExc_RuntimeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2189 "not holding the import lock"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2190 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2191 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2192 return result; |
|
7533
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
2193 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
2194 |
|
32156
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2195 /* Return the package that an import is being performed in. If globals comes |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2196 from the module foo.bar.bat (not itself a package), this returns the |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2197 sys.modules entry for foo.bar. If globals is from a package's __init__.py, |
|
38471
9268c30782c0
Correct None refcount issue in Mac modules. (Are they
Georg Brandl <georg@python.org>
parents:
38465
diff
changeset
|
2198 the package's entry in sys.modules is returned, as a borrowed reference. |
|
32156
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2199 |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2200 The *name* of the returned package is returned in buf, with the length of |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2201 the name in *p_buflen. |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2202 |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2203 If globals doesn't come from a package or a module in a package, or a |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2204 corresponding entry is not found in sys.modules, Py_None is returned. |
|
56a4ec066621
starting to add comments to explain what's here
Fred Drake <fdrake@acm.org>
parents:
31851
diff
changeset
|
2205 */ |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2206 static PyObject * |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2207 get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level) |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2208 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2209 static PyObject *namestr = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2210 static PyObject *pathstr = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2211 static PyObject *pkgstr = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2212 PyObject *pkgname, *modname, *modpath, *modules, *parent; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2213 int orig_level = level; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2214 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2215 if (globals == NULL || !PyDict_Check(globals) || !level) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2216 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2217 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2218 if (namestr == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2219 namestr = PyString_InternFromString("__name__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2220 if (namestr == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2221 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2222 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2223 if (pathstr == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2224 pathstr = PyString_InternFromString("__path__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2225 if (pathstr == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2226 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2227 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2228 if (pkgstr == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2229 pkgstr = PyString_InternFromString("__package__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2230 if (pkgstr == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2231 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2232 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2233 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2234 *buf = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2235 *p_buflen = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2236 pkgname = PyDict_GetItem(globals, pkgstr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2237 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2238 if ((pkgname != NULL) && (pkgname != Py_None)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2239 /* __package__ is set, so use it */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2240 Py_ssize_t len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2241 if (!PyString_Check(pkgname)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2242 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2243 "__package__ set to non-string"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2244 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2245 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2246 len = PyString_GET_SIZE(pkgname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2247 if (len == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2248 if (level > 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2249 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2250 "Attempted relative import in non-package"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2251 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2252 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2253 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2254 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2255 if (len > MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2256 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2257 "Package name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2258 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2259 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2260 strcpy(buf, PyString_AS_STRING(pkgname)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2261 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2262 /* __package__ not set, so figure it out and set it */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2263 modname = PyDict_GetItem(globals, namestr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2264 if (modname == NULL || !PyString_Check(modname)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2265 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2266 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2267 modpath = PyDict_GetItem(globals, pathstr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2268 if (modpath != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2269 /* __path__ is set, so modname is already the package name */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2270 Py_ssize_t len = PyString_GET_SIZE(modname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2271 int error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2272 if (len > MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2273 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2274 "Module name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2275 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2276 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2277 strcpy(buf, PyString_AS_STRING(modname)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2278 error = PyDict_SetItem(globals, pkgstr, modname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2279 if (error) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2280 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2281 "Could not set __package__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2282 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2283 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2284 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2285 /* Normal module, so work out the package name if any */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2286 char *start = PyString_AS_STRING(modname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2287 char *lastdot = strrchr(start, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2288 size_t len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2289 int error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2290 if (lastdot == NULL && level > 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2291 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2292 "Attempted relative import in non-package"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2293 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2294 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2295 if (lastdot == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2296 error = PyDict_SetItem(globals, pkgstr, Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2297 if (error) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2298 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2299 "Could not set __package__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2300 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2301 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2302 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2303 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2304 len = lastdot - start; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2305 if (len >= MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2306 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2307 "Module name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2308 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2309 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2310 strncpy(buf, start, len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2311 buf[len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2312 pkgname = PyString_FromString(buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2313 if (pkgname == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2314 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2315 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2316 error = PyDict_SetItem(globals, pkgstr, pkgname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2317 Py_DECREF(pkgname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2318 if (error) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2319 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2320 "Could not set __package__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2321 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2322 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2323 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2324 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2325 while (--level > 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2326 char *dot = strrchr(buf, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2327 if (dot == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2328 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2329 "Attempted relative import beyond " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2330 "toplevel package"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2331 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2332 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2333 *dot = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2334 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2335 *p_buflen = strlen(buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2336 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2337 modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2338 parent = PyDict_GetItemString(modules, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2339 if (parent == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2340 if (orig_level < 1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2341 PyObject *err_msg = PyString_FromFormat( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2342 "Parent module '%.200s' not found " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2343 "while handling absolute import", buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2344 if (err_msg == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2345 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2346 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2347 if (!PyErr_WarnEx(PyExc_RuntimeWarning, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2348 PyString_AsString(err_msg), 1)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2349 *buf = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2350 *p_buflen = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2351 parent = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2352 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2353 Py_DECREF(err_msg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2354 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2355 PyErr_Format(PyExc_SystemError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2356 "Parent module '%.200s' not loaded, " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2357 "cannot perform relative import", buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2358 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2359 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2360 return parent; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2361 /* We expect, but can't guarantee, if parent != None, that: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2362 - parent.__name__ == buf |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2363 - parent.__dict__ is globals |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2364 If this is violated... Who cares? */ |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2365 } |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2366 |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2367 /* altmod is either None or same as mod */ |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2368 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2369 load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2370 Py_ssize_t *p_buflen) |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2371 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2372 char *name = *p_name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2373 char *dot = strchr(name, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2374 size_t len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2375 char *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2376 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2377 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2378 if (strlen(name) == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2379 /* completely empty module name should only happen in |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2380 'from . import' (or '__import__("")')*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2381 Py_INCREF(mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2382 *p_name = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2383 return mod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2384 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2385 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2386 if (dot == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2387 *p_name = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2388 len = strlen(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2389 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2390 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2391 *p_name = dot+1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2392 len = dot-name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2393 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2394 if (len == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2395 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2396 "Empty module name"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2397 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2398 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2399 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2400 p = buf + *p_buflen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2401 if (p != buf) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2402 *p++ = '.'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2403 if (p+len-buf >= MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2404 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2405 "Module name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2406 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2407 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2408 strncpy(p, name, len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2409 p[len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2410 *p_buflen = p+len-buf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2411 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2412 result = import_submodule(mod, p, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2413 if (result == Py_None && altmod != mod) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2414 Py_DECREF(result); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2415 /* Here, altmod must be None and mod must not be None */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2416 result = import_submodule(altmod, p, p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2417 if (result != NULL && result != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2418 if (mark_miss(buf) != 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2419 Py_DECREF(result); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2420 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2421 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2422 strncpy(buf, name, len); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2423 buf[len] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2424 *p_buflen = len; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2425 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2426 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2427 if (result == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2428 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2429 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2430 if (result == Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2431 Py_DECREF(result); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2432 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2433 "No module named %.200s", name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2434 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2435 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2436 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2437 return result; |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2438 } |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2439 |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2440 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2441 mark_miss(char *name) |
|
6252
6429db5d0af7
Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents:
6250
diff
changeset
|
2442 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2443 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2444 return PyDict_SetItemString(modules, name, Py_None); |
|
6252
6429db5d0af7
Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents:
6250
diff
changeset
|
2445 } |
|
6429db5d0af7
Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents:
6250
diff
changeset
|
2446 |
|
6429db5d0af7
Significant speedup -- when a submodule imports a global module, add a
Guido van Rossum <guido@python.org>
parents:
6250
diff
changeset
|
2447 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
2448 ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2449 int recursive) |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2450 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2451 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2452 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2453 if (!PyObject_HasAttrString(mod, "__path__")) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2454 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2455 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2456 for (i = 0; ; i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2457 PyObject *item = PySequence_GetItem(fromlist, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2458 int hasit; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2459 if (item == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2460 if (PyErr_ExceptionMatches(PyExc_IndexError)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2461 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2462 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2463 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2464 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2465 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2466 if (!PyString_Check(item)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2467 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2468 "Item in ``from list'' not a string"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2469 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2470 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2471 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2472 if (PyString_AS_STRING(item)[0] == '*') { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2473 PyObject *all; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2474 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2475 /* See if the package defines __all__ */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2476 if (recursive) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2477 continue; /* Avoid endless recursion */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2478 all = PyObject_GetAttrString(mod, "__all__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2479 if (all == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2480 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2481 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2482 int ret = ensure_fromlist(mod, all, buf, buflen, 1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2483 Py_DECREF(all); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2484 if (!ret) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2485 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2486 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2487 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2488 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2489 hasit = PyObject_HasAttr(mod, item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2490 if (!hasit) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2491 char *subname = PyString_AS_STRING(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2492 PyObject *submod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2493 char *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2494 if (buflen + strlen(subname) >= MAXPATHLEN) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2495 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2496 "Module name too long"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2497 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2498 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2499 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2500 p = buf + buflen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2501 *p++ = '.'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2502 strcpy(p, subname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2503 submod = import_submodule(mod, subname, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2504 Py_XDECREF(submod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2505 if (submod == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2506 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2507 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2508 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2509 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2510 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2511 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2512 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2513 /* NOTREACHED */ |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2514 } |
|
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2515 |
|
29501
6c6b321d1d10
Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
28392
diff
changeset
|
2516 static int |
|
6c6b321d1d10
Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
28392
diff
changeset
|
2517 add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2518 PyObject *modules) |
|
29501
6c6b321d1d10
Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
28392
diff
changeset
|
2519 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2520 if (mod == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2521 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2522 /* Irrespective of the success of this load, make a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2523 reference to it in the parent package module. A copy gets |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2524 saved in the modules dictionary under the full name, so get a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2525 reference from there, if need be. (The exception is when the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2526 load failed with a SyntaxError -- then there's no trace in |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2527 sys.modules. In that case, of course, do nothing extra.) */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2528 if (submod == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2529 submod = PyDict_GetItemString(modules, fullname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2530 if (submod == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2531 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2532 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2533 if (PyModule_Check(mod)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2534 /* We can't use setattr here since it can give a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2535 * spurious warning if the submodule name shadows a |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2536 * builtin name */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2537 PyObject *dict = PyModule_GetDict(mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2538 if (!dict) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2539 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2540 if (PyDict_SetItemString(dict, subname, submod) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2541 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2542 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2543 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2544 if (PyObject_SetAttrString(mod, subname, submod) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2545 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2546 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2547 return 1; |
|
29501
6c6b321d1d10
Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
28392
diff
changeset
|
2548 } |
|
6c6b321d1d10
Don't use the module object setattr when importing submodules. Instead,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
28392
diff
changeset
|
2549 |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2550 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2551 import_submodule(PyObject *mod, char *subname, char *fullname) |
|
6249
f10aad73e029
Phase two of package import. "import a.b.c" and all variants now do the
Guido van Rossum <guido@python.org>
parents:
6243
diff
changeset
|
2552 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2553 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2554 PyObject *m = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2555 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2556 /* Require: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2557 if mod == None: subname == fullname |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2558 else: mod.__name__ + "." + subname == fullname |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2559 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2560 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2561 if ((m = PyDict_GetItemString(modules, fullname)) != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2562 Py_INCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2563 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2564 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2565 PyObject *path, *loader = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2566 char buf[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2567 struct filedescr *fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2568 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2569 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2570 if (mod == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2571 path = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2572 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2573 path = PyObject_GetAttrString(mod, "__path__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2574 if (path == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2575 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2576 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2577 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2578 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2579 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2580 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2581 buf[0] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2582 fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2583 &fp, &loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2584 Py_XDECREF(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2585 if (fdp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2586 if (!PyErr_ExceptionMatches(PyExc_ImportError)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2587 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2588 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2589 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2590 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2591 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2592 m = load_module(fullname, fp, buf, fdp->type, loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2593 Py_XDECREF(loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2594 if (fp) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2595 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2596 if (!add_submodule(mod, m, fullname, subname, modules)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2597 Py_XDECREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2598 m = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2599 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2600 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2601 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2602 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
|
2603 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2604 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2605 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2606 /* 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
|
2607 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
|
2608 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2609 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2610 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
|
2611 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2612 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2613 PyObject *modules_reloading = interp->modules_reloading; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2614 PyObject *modules = PyImport_GetModuleDict(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2615 PyObject *path = NULL, *loader = NULL, *existing_m = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2616 char *name, *subname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2617 char buf[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2618 struct filedescr *fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2619 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2620 PyObject *newm; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2621 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2622 if (modules_reloading == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2623 Py_FatalError("PyImport_ReloadModule: " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2624 "no modules_reloading dictionary!"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2625 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2626 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2627 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2628 if (m == NULL || !PyModule_Check(m)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2629 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2630 "reload() argument must be module"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2631 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2632 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2633 name = PyModule_GetName(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2634 if (name == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2635 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2636 if (m != PyDict_GetItemString(modules, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2637 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2638 "reload(): module %.200s not in sys.modules", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2639 name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2640 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2641 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2642 existing_m = PyDict_GetItemString(modules_reloading, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2643 if (existing_m != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2644 /* Due to a recursive reload, this module is already |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2645 being reloaded. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2646 Py_INCREF(existing_m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2647 return existing_m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2648 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2649 if (PyDict_SetItemString(modules_reloading, name, m) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2650 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2651 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2652 subname = strrchr(name, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2653 if (subname == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2654 subname = name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2655 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2656 PyObject *parentname, *parent; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2657 parentname = PyString_FromStringAndSize(name, (subname-name)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2658 if (parentname == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2659 imp_modules_reloading_clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2660 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2661 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2662 parent = PyDict_GetItem(modules, parentname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2663 if (parent == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2664 PyErr_Format(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2665 "reload(): parent %.200s not in sys.modules", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2666 PyString_AS_STRING(parentname)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2667 Py_DECREF(parentname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2668 imp_modules_reloading_clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2669 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2670 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2671 Py_DECREF(parentname); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2672 subname++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2673 path = PyObject_GetAttrString(parent, "__path__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2674 if (path == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2675 PyErr_Clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2676 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2677 buf[0] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2678 fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2679 Py_XDECREF(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2680 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2681 if (fdp == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2682 Py_XDECREF(loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2683 imp_modules_reloading_clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2684 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2685 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2686 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2687 newm = load_module(name, fp, buf, fdp->type, loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2688 Py_XDECREF(loader); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2689 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2690 if (fp) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2691 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2692 if (newm == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2693 /* load_module probably removed name from modules because of |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2694 * the error. Put back the original module object. We're |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2695 * going to return NULL in this case regardless of whether |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2696 * replacing name succeeds, so the return value is ignored. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2697 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2698 PyDict_SetItemString(modules, name, m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2699 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2700 imp_modules_reloading_clear(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2701 return newm; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
2702 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2703 |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2704 |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2705 /* 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
|
2706 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
|
2707 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
|
2708 done using whatever import hooks are installed in the current |
|
9680
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2709 environment, e.g. by "rexec". |
|
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
2710 A dummy list ["__doc__"] is passed as the 4th argument so that |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
2711 e.g. PyImport_Import(PyString_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
|
2712 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
|
2713 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2714 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2715 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
|
2716 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2717 static PyObject *silly_list = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2718 static PyObject *builtins_str = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2719 static PyObject *import_str = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2720 PyObject *globals = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2721 PyObject *import = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2722 PyObject *builtins = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2723 PyObject *r = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2724 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2725 /* Initialize constant string objects */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2726 if (silly_list == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2727 import_str = PyString_InternFromString("__import__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2728 if (import_str == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2729 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2730 builtins_str = PyString_InternFromString("__builtins__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2731 if (builtins_str == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2732 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2733 silly_list = Py_BuildValue("[s]", "__doc__"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2734 if (silly_list == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2735 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2736 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2737 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2738 /* Get the builtins from current globals */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2739 globals = PyEval_GetGlobals(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2740 if (globals != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2741 Py_INCREF(globals); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2742 builtins = PyObject_GetItem(globals, builtins_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2743 if (builtins == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2744 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2745 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2746 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2747 /* No globals -- use standard builtins, and fake globals */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2748 builtins = PyImport_ImportModuleLevel("__builtin__", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2749 NULL, NULL, NULL, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2750 if (builtins == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2751 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2752 globals = Py_BuildValue("{OO}", builtins_str, builtins); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2753 if (globals == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2754 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2755 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2756 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2757 /* Get the __import__ function from the builtins */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2758 if (PyDict_Check(builtins)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2759 import = PyObject_GetItem(builtins, import_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2760 if (import == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2761 PyErr_SetObject(PyExc_KeyError, import_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2762 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2763 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2764 import = PyObject_GetAttr(builtins, import_str); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2765 if (import == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2766 goto err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2767 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2768 /* Call the __import__ function with the proper argument list |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2769 * Always use absolute import here. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2770 r = PyObject_CallFunction(import, "OOOOi", module_name, globals, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2771 globals, silly_list, 0, NULL); |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2772 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2773 err: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2774 Py_XDECREF(globals); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2775 Py_XDECREF(builtins); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2776 Py_XDECREF(import); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2777 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2778 return r; |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2779 } |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2780 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
2781 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2782 /* 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
|
2783 importing modules. |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2784 */ |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2785 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2786 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
2787 imp_get_magic(PyObject *self, PyObject *noargs) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2788 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2789 char buf[4]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2790 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2791 buf[0] = (char) ((pyc_magic >> 0) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2792 buf[1] = (char) ((pyc_magic >> 8) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2793 buf[2] = (char) ((pyc_magic >> 16) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2794 buf[3] = (char) ((pyc_magic >> 24) & 0xff); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2795 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2796 return PyString_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
|
2797 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2798 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2799 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
2800 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
|
2801 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2802 PyObject *list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2803 struct filedescr *fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2804 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2805 list = PyList_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2806 if (list == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2807 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2808 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2809 PyObject *item = Py_BuildValue("ssi", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2810 fdp->suffix, fdp->mode, fdp->type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2811 if (item == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2812 Py_DECREF(list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2813 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2814 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2815 if (PyList_Append(list, item) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2816 Py_DECREF(list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2817 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2818 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2819 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2820 Py_DECREF(item); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2821 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2822 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
|
2823 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2824 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2825 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2826 call_find_module(char *name, PyObject *path) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2827 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2828 extern int fclose(FILE *); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2829 PyObject *fob, *ret; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2830 struct filedescr *fdp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2831 char pathname[MAXPATHLEN+1]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2832 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2833 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2834 pathname[0] = '\0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2835 if (path == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2836 path = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2837 fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2838 if (fdp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2839 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2840 if (fp != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2841 fob = PyFile_FromFile(fp, pathname, fdp->mode, fclose); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2842 if (fob == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2843 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2844 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2845 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2846 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2847 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2848 fob = Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2849 Py_INCREF(fob); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2850 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2851 ret = Py_BuildValue("Os(ssi)", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2852 fob, pathname, fdp->suffix, fdp->mode, fdp->type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2853 Py_DECREF(fob); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2854 return ret; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2855 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2856 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
2857 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2858 imp_find_module(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2859 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2860 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2861 PyObject *path = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2862 if (!PyArg_ParseTuple(args, "s|O:find_module", &name, &path)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2863 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2864 return call_find_module(name, path); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2865 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2866 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2867 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2868 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
|
2869 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2870 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2871 int ret; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2872 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2873 if (!PyArg_ParseTuple(args, "s:init_builtin", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2874 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2875 ret = init_builtin(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2876 if (ret < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2877 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2878 if (ret == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2879 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2880 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2881 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2882 m = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2883 Py_XINCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2884 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
|
2885 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2886 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2887 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2888 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
|
2889 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2890 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2891 int ret; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2892 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2893 if (!PyArg_ParseTuple(args, "s:init_frozen", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2894 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2895 ret = PyImport_ImportFrozenModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2896 if (ret < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2897 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2898 if (ret == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2899 Py_INCREF(Py_None); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2900 return Py_None; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2901 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2902 m = PyImport_AddModule(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2903 Py_XINCREF(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2904 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
|
2905 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2906 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2907 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2908 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
|
2909 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2910 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2911 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2912 if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2913 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2914 return get_frozen_object(name); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
2915 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
2916 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2917 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2918 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
|
2919 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2920 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2921 if (!PyArg_ParseTuple(args, "s:is_builtin", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2922 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2923 return PyInt_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
|
2924 } |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
2925 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2926 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2927 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
|
2928 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2929 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2930 struct _frozen *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2931 if (!PyArg_ParseTuple(args, "s:is_frozen", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2932 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2933 p = find_frozen(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2934 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
|
2935 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2936 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2937 static FILE * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2938 get_file(char *pathname, PyObject *fob, char *mode) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2939 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2940 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2941 if (fob == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2942 if (mode[0] == 'U') |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2943 mode = "r" PY_STDIOTEXTMODE; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2944 fp = fopen(pathname, mode); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2945 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2946 PyErr_SetFromErrno(PyExc_IOError); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2947 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2948 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2949 fp = PyFile_AsFile(fob); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2950 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2951 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2952 "bad/closed file object"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2953 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2954 return fp; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2955 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2956 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2957 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2958 imp_load_compiled(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2959 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2960 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2961 char *pathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2962 PyObject *fob = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2963 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2964 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2965 if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2966 &PyFile_Type, &fob)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2967 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2968 fp = get_file(pathname, fob, "rb"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2969 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2970 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2971 m = load_compiled_module(name, pathname, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2972 if (fob == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2973 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2974 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
|
2975 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2976 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2977 #ifdef HAVE_DYNAMIC_LOADING |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2978 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
2979 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
2980 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
|
2981 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2982 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2983 char *pathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2984 PyObject *fob = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2985 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2986 FILE *fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2987 if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2988 &PyFile_Type, &fob)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2989 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2990 if (fob) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2991 fp = get_file(pathname, fob, "r"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2992 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2993 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2994 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2995 m = _PyImport_LoadDynamicModule(name, pathname, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
2996 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
|
2997 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
2998 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
2999 #endif /* HAVE_DYNAMIC_LOADING */ |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
3000 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
3001 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3002 imp_load_source(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3003 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3004 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3005 char *pathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3006 PyObject *fob = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3007 PyObject *m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3008 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3009 if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3010 &PyFile_Type, &fob)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3011 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3012 fp = get_file(pathname, fob, "r"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3013 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3014 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3015 m = load_source_module(name, pathname, fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3016 if (fob == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3017 fclose(fp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3018 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
|
3019 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3020 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
3021 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3022 imp_load_module(PyObject *self, PyObject *args) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3023 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3024 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3025 PyObject *fob; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3026 char *pathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3027 char *suffix; /* Unused */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3028 char *mode; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3029 int type; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3030 FILE *fp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3031 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3032 if (!PyArg_ParseTuple(args, "sOs(ssi):load_module", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3033 &name, &fob, &pathname, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3034 &suffix, &mode, &type)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3035 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3036 if (*mode) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3037 /* Mode must start with 'r' or 'U' and must not contain '+'. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3038 Implicit in this test is the assumption that the mode |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3039 may contain other modifiers like 'b' or 't'. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3040 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3041 if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3042 PyErr_Format(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3043 "invalid file open mode %.200s", mode); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3044 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3045 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3046 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3047 if (fob == Py_None) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3048 fp = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3049 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3050 if (!PyFile_Check(fob)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3051 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3052 "load_module arg#2 should be a file or None"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3053 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3054 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3055 fp = get_file(pathname, fob, mode); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3056 if (fp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3057 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3058 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3059 return load_module(name, fp, pathname, type, NULL); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3060 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3061 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3062 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3063 imp_load_package(PyObject *self, PyObject *args) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3064 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3065 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3066 char *pathname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3067 if (!PyArg_ParseTuple(args, "ss:load_package", &name, &pathname)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3068 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3069 return load_package(name, pathname); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3070 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3071 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3072 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3073 imp_new_module(PyObject *self, PyObject *args) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3074 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3075 char *name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3076 if (!PyArg_ParseTuple(args, "s:new_module", &name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3077 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3078 return PyModule_New(name); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3079 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3080 |
|
48189
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3081 static PyObject * |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3082 imp_reload(PyObject *self, PyObject *v) |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3083 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3084 return PyImport_ReloadModule(v); |
|
48189
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3085 } |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3086 |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3087 |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3088 /* Doc strings */ |
|
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3089 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3090 PyDoc_STRVAR(doc_imp, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3091 "This module provides the components needed to build your own\n\ |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3092 __import__ function. Undocumented functions are obsolete."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3093 |
|
48189
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3094 PyDoc_STRVAR(doc_reload, |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3095 "reload(module) -> module\n\ |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3096 \n\ |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3097 Reload the module. The module must have been successfully imported before."); |
|
53ade9e68b56
Add imp.reload(). This to help with transitioning to 3.0 the reload() built-in
Brett Cannon <bcannon@gmail.com>
parents:
47944
diff
changeset
|
3098 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3099 PyDoc_STRVAR(doc_find_module, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3100 "find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\ |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3101 Search for a module. If path is omitted or None, search for a\n\ |
|
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3102 built-in, frozen or special module and continue search in sys.path.\n\ |
|
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3103 The module name cannot contain '.'; to search for a submodule of a\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3104 package, pass the submodule name and the package's __path__."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3105 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3106 PyDoc_STRVAR(doc_load_module, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3107 "load_module(name, file, filename, (suffix, mode, type)) -> module\n\ |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3108 Load a module, given information returned by find_module().\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3109 The module name must include the full package name, if any."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3110 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3111 PyDoc_STRVAR(doc_get_magic, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3112 "get_magic() -> string\n\ |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3113 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
|
3114 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3115 PyDoc_STRVAR(doc_get_suffixes, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3116 "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
|
3117 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
|
3118 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
|
3119 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3120 PyDoc_STRVAR(doc_new_module, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3121 "new_module(name) -> module\n\ |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3122 Create a new module. Do not enter it in sys.modules.\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3123 The module name must include the full package name, if any."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
3124 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
3125 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
|
3126 "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
|
3127 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
|
3128 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
|
3129 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
3130 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
|
3131 "acquire_lock() -> None\n\ |
|
27853
5620b0786271
Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents:
27852
diff
changeset
|
3132 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
|
3133 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
|
3134 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
|
3135 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
|
3136 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
3137 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
|
3138 "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
|
3139 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
|
3140 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
|
3141 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
3142 static PyMethodDef imp_methods[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3143 {"reload", imp_reload, METH_O, doc_reload}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3144 {"find_module", imp_find_module, METH_VARARGS, doc_find_module}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3145 {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3146 {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3147 {"load_module", imp_load_module, METH_VARARGS, doc_load_module}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3148 {"new_module", imp_new_module, METH_VARARGS, doc_new_module}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3149 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3150 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3151 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3152 /* The rest are obsolete */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3153 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3154 {"init_builtin", imp_init_builtin, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3155 {"init_frozen", imp_init_frozen, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3156 {"is_builtin", imp_is_builtin, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3157 {"is_frozen", imp_is_frozen, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3158 {"load_compiled", imp_load_compiled, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
3159 #ifdef HAVE_DYNAMIC_LOADING |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3160 {"load_dynamic", imp_load_dynamic, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
3161 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3162 {"load_package", imp_load_package, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3163 {"load_source", imp_load_source, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3164 {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
|
3165 }; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3166 |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8613
diff
changeset
|
3167 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3168 setint(PyObject *d, char *name, int value) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3169 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3170 PyObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3171 int err; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3172 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3173 v = PyInt_FromLong((long)value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3174 err = PyDict_SetItemString(d, name, v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3175 Py_XDECREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3176 return err; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3177 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3178 |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3179 typedef struct { |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3180 PyObject_HEAD |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3181 } NullImporter; |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3182 |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3183 static int |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3184 NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds) |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3185 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3186 char *path; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3187 Py_ssize_t pathlen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3188 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3189 if (!_PyArg_NoKeywords("NullImporter()", kwds)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3190 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3191 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3192 if (!PyArg_ParseTuple(args, "s:NullImporter", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3193 &path)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3194 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3195 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3196 pathlen = strlen(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3197 if (pathlen == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3198 PyErr_SetString(PyExc_ImportError, "empty pathname"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3199 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3200 } else { |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3201 #ifndef RISCOS |
|
50786
2d453b221bec
Merged revisions 68292,68344,68361,68378,68424,68426,68429-68430,68450,68457,68480-68481,68493,68495,68499,68501,68512,68514-68515 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50618
diff
changeset
|
3202 #ifndef MS_WINDOWS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3203 struct stat statbuf; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3204 int rv; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3205 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3206 rv = stat(path, &statbuf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3207 if (rv == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3208 /* it exists */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3209 if (S_ISDIR(statbuf.st_mode)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3210 /* it's a directory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3211 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3212 "existing directory"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3213 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3214 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3215 } |
|
50786
2d453b221bec
Merged revisions 68292,68344,68361,68378,68424,68426,68429-68430,68450,68457,68480-68481,68493,68495,68499,68501,68512,68514-68515 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50618
diff
changeset
|
3216 #else /* MS_WINDOWS */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3217 DWORD rv; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3218 /* see issue1293 and issue3677: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3219 * stat() on Windows doesn't recognise paths like |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3220 * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3221 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3222 rv = GetFileAttributesA(path); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3223 if (rv != INVALID_FILE_ATTRIBUTES) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3224 /* it exists */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3225 if (rv & FILE_ATTRIBUTE_DIRECTORY) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3226 /* it's a directory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3227 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3228 "existing directory"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3229 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3230 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3231 } |
|
50786
2d453b221bec
Merged revisions 68292,68344,68361,68378,68424,68426,68429-68430,68450,68457,68480-68481,68493,68495,68499,68501,68512,68514-68515 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50618
diff
changeset
|
3232 #endif |
|
2d453b221bec
Merged revisions 68292,68344,68361,68378,68424,68426,68429-68430,68450,68457,68480-68481,68493,68495,68499,68501,68512,68514-68515 via svnmerge from
Georg Brandl <georg@python.org>
parents:
50618
diff
changeset
|
3233 #else /* RISCOS */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3234 if (object_exists(path)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3235 /* it exists */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3236 if (isdir(path)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3237 /* it's a directory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3238 PyErr_SetString(PyExc_ImportError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3239 "existing directory"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3240 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3241 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3242 } |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3243 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3244 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3245 return 0; |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3246 } |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3247 |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3248 static PyObject * |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3249 NullImporter_find_module(NullImporter *self, PyObject *args) |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3250 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3251 Py_RETURN_NONE; |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3252 } |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3253 |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3254 static PyMethodDef NullImporter_methods[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3255 {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3256 "Always return None" |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3257 }, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3258 {NULL} /* Sentinel */ |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3259 }; |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3260 |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3261 |
|
43895
4cec0c6392c1
Patch #1739468: Directories and zipfiles containing __main__.py are now executable
Nick Coghlan <ncoghlan@gmail.com>
parents:
43792
diff
changeset
|
3262 PyTypeObject PyNullImporter_Type = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3263 PyVarObject_HEAD_INIT(NULL, 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3264 "imp.NullImporter", /*tp_name*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3265 sizeof(NullImporter), /*tp_basicsize*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3266 0, /*tp_itemsize*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3267 0, /*tp_dealloc*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3268 0, /*tp_print*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3269 0, /*tp_getattr*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3270 0, /*tp_setattr*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3271 0, /*tp_compare*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3272 0, /*tp_repr*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3273 0, /*tp_as_number*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3274 0, /*tp_as_sequence*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3275 0, /*tp_as_mapping*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3276 0, /*tp_hash */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3277 0, /*tp_call*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3278 0, /*tp_str*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3279 0, /*tp_getattro*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3280 0, /*tp_setattro*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3281 0, /*tp_as_buffer*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3282 Py_TPFLAGS_DEFAULT, /*tp_flags*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3283 "Null importer object", /* tp_doc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3284 0, /* tp_traverse */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3285 0, /* tp_clear */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3286 0, /* tp_richcompare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3287 0, /* tp_weaklistoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3288 0, /* tp_iter */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3289 0, /* tp_iternext */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3290 NullImporter_methods, /* tp_methods */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3291 0, /* tp_members */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3292 0, /* tp_getset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3293 0, /* tp_base */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3294 0, /* tp_dict */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3295 0, /* tp_descr_get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3296 0, /* tp_descr_set */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3297 0, /* tp_dictoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3298 (initproc)NullImporter_init, /* tp_init */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3299 0, /* tp_alloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3300 PyType_GenericNew /* tp_new */ |
|
39253
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3301 }; |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3302 |
|
3f4485b20e79
Bug #1529871: The speed enhancement patch #921466 broke Python's compliance
Phillip J. Eby <pje@telecommunity.com>
parents:
39130
diff
changeset
|
3303 |
|
30311
f003e48f562d
Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents:
29812
diff
changeset
|
3304 PyMODINIT_FUNC |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3305 initimp(void) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3306 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3307 PyObject *m, *d; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3308 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3309 if (PyType_Ready(&PyNullImporter_Type) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3310 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3311 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3312 m = Py_InitModule4("imp", imp_methods, doc_imp, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3313 NULL, PYTHON_API_VERSION); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3314 if (m == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3315 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3316 d = PyModule_GetDict(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3317 if (d == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3318 goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3319 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3320 if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3321 if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3322 if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3323 if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3324 if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3325 if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3326 if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3327 if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3328 if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3329 if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3330 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3331 Py_INCREF(&PyNullImporter_Type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3332 PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
3333 failure: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3334 ; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
3335 } |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3336 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3337 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
3338 /* 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
|
3339 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
|
3340 *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
|
3341 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
|
3342 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3343 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
|
3344 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3345 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3346 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
|
3347 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3348 static struct _inittab *our_copy = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3349 struct _inittab *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3350 int i, n; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3351 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3352 /* Count the number of entries in both tables */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3353 for (n = 0; newtab[n].name != NULL; n++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3354 ; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3355 if (n == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3356 return 0; /* Nothing to do */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3357 for (i = 0; PyImport_Inittab[i].name != NULL; i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3358 ; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3359 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3360 /* Allocate new memory for the combined table */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3361 p = our_copy; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3362 PyMem_RESIZE(p, struct _inittab, i+n+1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3363 if (p == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3364 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3365 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3366 /* Copy the tables into the new memory */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3367 if (our_copy != PyImport_Inittab) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3368 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3369 PyImport_Inittab = our_copy = p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3370 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3371 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3372 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
|
3373 } |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3374 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3375 /* 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
|
3376 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
3377 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
3378 PyImport_AppendInittab(char *name, void (*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
|
3379 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3380 struct _inittab newtab[2]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3381 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3382 memset(newtab, '\0', sizeof newtab); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3383 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3384 newtab[0].name = name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3385 newtab[0].initfunc = initfunc; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3386 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59822
diff
changeset
|
3387 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
|
3388 } |
|
37655
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
3389 |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
3390 #ifdef __cplusplus |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
3391 } |
|
2f3f2e32dfd9
spread the extern "C" { } magic pixie dust around. Python itself builds now
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37488
diff
changeset
|
3392 #endif |
