Mercurial > cpython-lru_cache-weakref
annotate Python/import.c @ 84172:e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
UnicodeDecodeError as ImportError. That was over-reaching the point of
raising ImportError in get_source() (which is to signal the source
code was not found when it should have). Conflating the two exceptions
with ImportError could lead to masking errors with the source which
should be known outside of whether there was an error simply getting
the source to begin with.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Sun, 16 Jun 2013 18:05:54 -0400 |
| parents | 3a50025f1900 |
| children | a39d2223be23 |
| rev | line source |
|---|---|
|
145
853b736a6a9e
Added copyright notice.
Guido van Rossum <guido@python.org>
parents:
141
diff
changeset
|
1 |
| 6 | 2 /* Module definition and import implementation */ |
| 3 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
4 #include "Python.h" |
| 6 | 5 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
6 #include "Python-ast.h" |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41253
diff
changeset
|
7 #undef Yield /* undefine macro conflicting with winbase.h */ |
| 6 | 8 #include "errcode.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
9 #include "marshal.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35678
diff
changeset
|
10 #include "code.h" |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
11 #include "frameobject.h" |
|
675
5aff9f8fd299
Move SEP to osdefs.h. Use MAXPATHLEN from osdefs.h.
Guido van Rossum <guido@python.org>
parents:
630
diff
changeset
|
12 #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
|
13 #include "importdl.h" |
|
263
28f0ffd9facf
Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents:
228
diff
changeset
|
14 |
|
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
|
15 #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
|
16 #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
|
17 #endif |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
18 #ifdef __cplusplus |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
19 extern "C" { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
20 #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
|
21 |
|
45495
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
22 #ifdef MS_WINDOWS |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
23 /* for stat.st_mode */ |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
24 typedef unsigned short mode_t; |
|
64594
84217b2d8c0c
Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
64439
diff
changeset
|
25 /* for _mkdir */ |
|
84217b2d8c0c
Fix Issue #9752: MSVC compiler warning due to undefined function
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
64439
diff
changeset
|
26 #include <direct.h> |
|
45495
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
27 #endif |
|
48488fa50729
Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45471
diff
changeset
|
28 |
|
1351
e149c77d173c
Makefile, import.c: Lance's alternative module search (allow .pyc file
Guido van Rossum <guido@python.org>
parents:
1293
diff
changeset
|
29 |
| 60648 | 30 #define CACHEDIR "__pycache__" |
| 31 | |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
32 /* See _PyImport_FixupExtensionObject() below */ |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
33 static PyObject *extensions = NULL; |
|
54889
3aaf2e065db0
Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52721
diff
changeset
|
34 |
|
69148
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68887
diff
changeset
|
35 /* Function from Parser/tokenizer.c */ |
|
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68887
diff
changeset
|
36 extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
37 |
|
6541
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
38 /* 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
|
39 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
|
40 |
|
b2dfff06789c
Instead of using _PyImport_Inittab[] directly, use the new "official"
Guido van Rossum <guido@python.org>
parents:
6454
diff
changeset
|
41 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
|
42 |
|
68732
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
43 static PyObject *initstr = NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
44 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
45 /* Initialize things */ |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
46 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
47 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
48 _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
|
49 { |
|
68732
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
50 initstr = PyUnicode_InternFromString("__init__"); |
|
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
51 if (initstr == NULL) |
|
c4ccf02456d6
Issue #3080: Refactor find_module_path(), use return instead of break
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68731
diff
changeset
|
52 Py_FatalError("Can't initialize import variables"); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
53 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
54 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
55 void |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
56 _PyImportHooks_Init(void) |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
57 { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
58 PyObject *v, *path_hooks = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
59 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
60 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
61 /* adding sys.path_hooks and sys.path_importer_cache */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
62 v = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
63 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
64 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
65 err = PySys_SetObject("meta_path", v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
66 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
67 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
68 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
69 v = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
70 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
71 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
72 err = PySys_SetObject("path_importer_cache", v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
73 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
74 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
75 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
76 path_hooks = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
77 if (path_hooks == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
78 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
79 err = PySys_SetObject("path_hooks", path_hooks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
80 if (err) { |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
81 error: |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
82 PyErr_Print(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
83 Py_FatalError("initializing sys.meta_path, sys.path_hooks, " |
|
76768
babe4dd3fe0d
Fix typo in changeset eb5c5c23ca9b.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
76764
diff
changeset
|
84 "or path_importer_cache failed"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
85 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
86 Py_DECREF(path_hooks); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
87 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
88 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
89 void |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
90 _PyImportZip_Init(void) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
91 { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
92 PyObject *path_hooks, *zimpimport; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
93 int err = 0; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
94 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
95 path_hooks = PySys_GetObject("path_hooks"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
96 if (path_hooks == NULL) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
97 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
98 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
99 if (Py_VerboseFlag) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
100 PySys_WriteStderr("# installing zipimport hook\n"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
101 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
102 zimpimport = PyImport_ImportModule("zipimport"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
103 if (zimpimport == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
104 PyErr_Clear(); /* No zip import module -- okay */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
105 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
106 PySys_WriteStderr("# can't import zipimport\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
107 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
108 else { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72866
diff
changeset
|
109 _Py_IDENTIFIER(zipimporter); |
|
72848
81380082d216
Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
110 PyObject *zipimporter = _PyObject_GetAttrId(zimpimport, |
|
81380082d216
Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
111 &PyId_zipimporter); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
112 Py_DECREF(zimpimport); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
113 if (zipimporter == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
114 PyErr_Clear(); /* No zipimporter object -- okay */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
115 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
116 PySys_WriteStderr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
117 "# can't import zipimport.zipimporter\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
118 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
119 else { |
|
76562
8dab93ec19de
Issue #14605: Insert to the front of sys.path_hooks instead of appending.
Brett Cannon <brett@python.org>
parents:
76455
diff
changeset
|
120 /* sys.path_hooks.insert(0, zipimporter) */ |
|
8dab93ec19de
Issue #14605: Insert to the front of sys.path_hooks instead of appending.
Brett Cannon <brett@python.org>
parents:
76455
diff
changeset
|
121 err = PyList_Insert(path_hooks, 0, zipimporter); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
122 Py_DECREF(zipimporter); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
123 if (err < 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
124 goto error; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
125 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
126 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
127 PySys_WriteStderr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
128 "# installed zipimport hook\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
129 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
130 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
131 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
132 return; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
133 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
134 error: |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
135 PyErr_Print(); |
|
76633
eb5c5c23ca9b
Issue #13959: Re-implement imp.NullImporter in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
136 Py_FatalError("initializing zipimport failed"); |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
137 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
138 |
|
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
|
139 /* 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
|
140 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
|
141 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
|
142 |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
143 #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
|
144 |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
9187
diff
changeset
|
145 #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
|
146 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9431
diff
changeset
|
147 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
|
148 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
|
149 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
|
150 |
|
56382
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
151 void |
|
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
152 _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
|
153 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
154 long me = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
155 if (me == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
156 return; /* Too bad */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
157 if (import_lock == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
158 import_lock = PyThread_allocate_lock(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
159 if (import_lock == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
160 return; /* Nothing much we can do. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
161 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
162 if (import_lock_thread == me) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
163 import_lock_level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
164 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
165 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
166 if (import_lock_thread != -1 || !PyThread_acquire_lock(import_lock, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
167 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
168 PyThreadState *tstate = PyEval_SaveThread(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
169 PyThread_acquire_lock(import_lock, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
170 PyEval_RestoreThread(tstate); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
171 } |
|
80935
1ee9cf5a5351
Add sanity assertions in some import lock code (issue #15599).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79846
diff
changeset
|
172 assert(import_lock_level == 0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
173 import_lock_thread = me; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
174 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
|
175 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
176 |
|
56382
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
177 int |
|
2e4d7a40c2dd
Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
55584
diff
changeset
|
178 _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
|
179 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
180 long me = PyThread_get_thread_ident(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
181 if (me == -1 || import_lock == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
182 return 0; /* Too bad */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
183 if (import_lock_thread != me) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
184 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
185 import_lock_level--; |
|
80935
1ee9cf5a5351
Add sanity assertions in some import lock code (issue #15599).
Antoine Pitrou <solipsis@pitrou.net>
parents:
79846
diff
changeset
|
186 assert(import_lock_level >= 0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
187 if (import_lock_level == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
188 import_lock_thread = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
189 PyThread_release_lock(import_lock); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
190 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
191 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
|
192 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
193 |
|
59235
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
194 /* This function is called from PyOS_AfterFork to ensure that newly |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
195 created child processes do not share locks with the parent. |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
196 We now acquire the import lock around fork() calls but on some platforms |
|
58c35495a934
Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents:
59213
diff
changeset
|
197 (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
|
198 |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
199 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
|
200 _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
|
201 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
202 if (import_lock != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
203 import_lock = PyThread_allocate_lock(); |
|
66599
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
204 if (import_lock_level > 1) { |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
205 /* Forked as a side effect of import */ |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
206 long me = PyThread_get_thread_ident(); |
|
80451
bd853311ffe0
Issue #15894: Document why we don't worry about re-acquiring the
Brett Cannon <brett@python.org>
parents:
79846
diff
changeset
|
207 /* The following could fail if the lock is already held, but forking as |
|
bd853311ffe0
Issue #15894: Document why we don't worry about re-acquiring the
Brett Cannon <brett@python.org>
parents:
79846
diff
changeset
|
208 a side-effect of an import is a) rare, b) nuts, and c) difficult to |
|
bd853311ffe0
Issue #15894: Document why we don't worry about re-acquiring the
Brett Cannon <brett@python.org>
parents:
79846
diff
changeset
|
209 do thanks to the lock only being held when doing individual module |
|
bd853311ffe0
Issue #15894: Document why we don't worry about re-acquiring the
Brett Cannon <brett@python.org>
parents:
79846
diff
changeset
|
210 locks per import. */ |
|
bd853311ffe0
Issue #15894: Document why we don't worry about re-acquiring the
Brett Cannon <brett@python.org>
parents:
79846
diff
changeset
|
211 PyThread_acquire_lock(import_lock, NOWAIT_LOCK); |
|
66599
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
212 import_lock_thread = me; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
213 import_lock_level--; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
214 } else { |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
215 import_lock_thread = -1; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
216 import_lock_level = 0; |
|
09ed411a1090
Issue #9573: os.fork now works when triggered as a side effect of import (the wisdom of actually relying on this remains questionable!)
Nick Coghlan <ncoghlan@gmail.com>
parents:
66556
diff
changeset
|
217 } |
|
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
|
218 } |
|
724bbd489ad4
- Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents:
35542
diff
changeset
|
219 |
|
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
|
220 #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
|
221 |
|
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
|
222 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
223 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
|
224 { |
|
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
|
225 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
226 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
|
227 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
228 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
|
229 #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
|
230 } |
|
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
|
231 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
232 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
233 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
|
234 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
235 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
236 _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
|
237 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
238 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
239 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
|
240 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
241 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
242 static PyObject * |
|
27917
c346d095791d
Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents:
27853
diff
changeset
|
243 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
|
244 { |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
245 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
246 if (_PyImport_ReleaseLock() < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
247 PyErr_SetString(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
248 "not holding the import lock"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
249 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
250 } |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
251 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
252 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
253 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
|
254 } |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
255 |
|
73205
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
256 void |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
257 _PyImport_Fini(void) |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
258 { |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
259 Py_XDECREF(extensions); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
260 extensions = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
261 #ifdef WITH_THREAD |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
262 if (import_lock != NULL) { |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
263 PyThread_free_lock(import_lock); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
264 import_lock = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
265 } |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
266 #endif |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
267 } |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
72453
diff
changeset
|
268 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
269 /* Helper for sys */ |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
270 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
271 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
272 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
|
273 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
274 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
275 if (interp->modules == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
276 Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
277 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
|
278 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
279 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
280 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
281 /* 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
|
282 static char* sys_deletes[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
283 "path", "argv", "ps1", "ps2", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
284 "last_type", "last_value", "last_traceback", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
285 "path_hooks", "path_importer_cache", "meta_path", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
286 /* misc stuff */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
287 "flags", "float_info", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
288 NULL |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
289 }; |
|
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
290 |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
291 static char* sys_files[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
292 "stdin", "__stdin__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
293 "stdout", "__stdout__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
294 "stderr", "__stderr__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
295 NULL |
|
7403
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
296 }; |
|
185c1d47ce7a
Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents:
7367
diff
changeset
|
297 |
|
83687
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
298 static int |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
299 is_essential_module(PyObject *name) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
300 { |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
301 Py_ssize_t name_len; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
302 char *name_str = PyUnicode_AsUTF8AndSize(name, &name_len); |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
303 |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
304 if (name_str == NULL) { |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
305 PyErr_Clear(); |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
306 return 0; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
307 } |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
308 if (strcmp(name_str, "builtins") == 0) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
309 return 1; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
310 if (strcmp(name_str, "sys") == 0) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
311 return 1; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
312 /* These are all needed for stderr to still function */ |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
313 if (strcmp(name_str, "codecs") == 0) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
314 return 1; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
315 if (strcmp(name_str, "_codecs") == 0) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
316 return 1; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
317 if (strncmp(name_str, "encodings.", 10) == 0) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
318 return 1; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
319 return 0; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
320 } |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
321 |
|
7202
fed3d200fb56
Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents:
7111
diff
changeset
|
322 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
323 /* Un-initialize things, as good as we can */ |
| 86 | 324 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
325 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
326 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
|
327 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
328 Py_ssize_t pos, ndone; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
329 PyObject *key, *value, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
330 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
331 PyObject *modules = interp->modules; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
332 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
333 if (modules == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
334 return; /* Already done */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
335 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
336 /* Delete some special variables first. These are common |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
337 places where user values hide and people complain when their |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
338 destructors fail. Since the modules containing them are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
339 deleted *last* of all, they would come too late in the normal |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
340 destruction order. Sigh. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
341 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
342 value = PyDict_GetItemString(modules, "builtins"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
343 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
344 dict = PyModule_GetDict(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
345 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
346 PySys_WriteStderr("# clear builtins._\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
347 PyDict_SetItemString(dict, "_", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
348 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
349 value = PyDict_GetItemString(modules, "sys"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
350 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
351 char **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
352 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
353 dict = PyModule_GetDict(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
354 for (p = sys_deletes; *p != NULL; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
355 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
356 PySys_WriteStderr("# clear sys.%s\n", *p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
357 PyDict_SetItemString(dict, *p, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
358 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
359 for (p = sys_files; *p != NULL; p+=2) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
360 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
361 PySys_WriteStderr("# restore sys.%s\n", *p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
362 v = PyDict_GetItemString(dict, *(p+1)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
363 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
364 v = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
365 PyDict_SetItemString(dict, *p, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
366 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
367 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
368 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
369 /* First, delete __main__ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
370 value = PyDict_GetItemString(modules, "__main__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
371 if (value != NULL && PyModule_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
372 if (Py_VerboseFlag) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
373 PySys_WriteStderr("# cleanup __main__\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
374 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
375 PyDict_SetItemString(modules, "__main__", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
376 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
377 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
378 /* The special treatment of "builtins" here is because even |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
379 when it's not referenced as a module, its dictionary is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
380 referenced by almost every module's __builtins__. Since |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
381 deleting a module clears its dictionary (even if there are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
382 references left to it), we need to delete the "builtins" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
383 module last. Likewise, we don't delete sys until the very |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
384 end because it is implicitly referenced (e.g. by print). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
385 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
386 Also note that we 'delete' modules by replacing their entry |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
387 in the modules dict with None, rather than really deleting |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
388 them; this avoids a rehash of the modules dictionary and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
389 also marks them as "non existent" so they won't be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
390 re-imported. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
391 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
392 /* Next, repeatedly delete modules with a reference count of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
393 one (skipping builtins and sys) and delete them */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
394 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
395 ndone = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
396 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
397 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
398 if (value->ob_refcnt != 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
399 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
400 if (PyUnicode_Check(key) && PyModule_Check(value)) { |
|
83687
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
401 if (is_essential_module(key)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
402 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
403 if (Py_VerboseFlag) |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
404 PySys_FormatStderr( |
|
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
405 "# cleanup[1] %U\n", key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
406 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
407 PyDict_SetItem(modules, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
408 ndone++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
409 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
410 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
411 } while (ndone > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
412 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
413 /* Next, delete all modules (still skipping builtins and sys) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
414 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
415 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
416 if (PyUnicode_Check(key) && PyModule_Check(value)) { |
|
83687
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
417 if (is_essential_module(key)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
418 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
419 if (Py_VerboseFlag) |
|
68710
b50a0d44545a
Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68708
diff
changeset
|
420 PySys_FormatStderr("# cleanup[2] %U\n", key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
421 _PyModule_Clear(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
422 PyDict_SetItem(modules, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
423 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
424 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
425 |
|
83650
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
426 /* Collect garbage remaining after deleting the modules. Mostly |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
427 reference cycles created by classes. */ |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
428 PyGC_Collect(); |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
429 |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
430 /* Dump GC stats before it's too late, since it uses the warnings |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
431 machinery. */ |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
432 _PyGC_DumpShutdownStats(); |
|
f0833e6ff2d2
Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83590
diff
changeset
|
433 |
|
83687
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
434 /* Next, delete all remaining modules */ |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
435 pos = 0; |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
436 while (PyDict_Next(modules, &pos, &key, &value)) { |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
437 if (PyUnicode_Check(key) && PyModule_Check(value)) { |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
438 if (Py_VerboseFlag) |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
439 PySys_FormatStderr("# cleanup[3] %U\n", key); |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
440 _PyModule_Clear(value); |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
441 PyDict_SetItem(modules, key, Py_None); |
|
8a5bebea9fec
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83650
diff
changeset
|
442 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
443 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
444 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
445 /* Finally, clear and delete the modules directory */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
446 PyDict_Clear(modules); |
|
83835
5abe85aefe29
Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83687
diff
changeset
|
447 _PyGC_CollectNoFail(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
448 interp->modules = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
449 Py_DECREF(modules); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
450 } |
|
166
28923e44254c
Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
451 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
452 |
| 60648 | 453 /* Helper for pythonrun.c -- return magic number and tag. */ |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
454 |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
455 long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
456 PyImport_GetMagicNumber(void) |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
457 { |
|
78052
2ecdda96f970
Fix compilation under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents:
78048
diff
changeset
|
458 long res; |
|
78042
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78029
diff
changeset
|
459 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78029
diff
changeset
|
460 PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib, |
|
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78029
diff
changeset
|
461 "_RAW_MAGIC_NUMBER"); |
|
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78029
diff
changeset
|
462 if (pyc_magic == NULL) |
|
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78029
diff
changeset
|
463 return -1; |
|
78052
2ecdda96f970
Fix compilation under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents:
78048
diff
changeset
|
464 res = PyLong_AsLong(pyc_magic); |
| 78048 | 465 Py_DECREF(pyc_magic); |
| 466 return res; | |
|
1886
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
467 } |
|
ac6a9f90f6fd
* Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents:
1877
diff
changeset
|
468 |
| 6 | 469 |
|
78029
ee01fd98b5b0
Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents:
77996
diff
changeset
|
470 extern const char * _PySys_ImplCacheTag; |
|
ee01fd98b5b0
Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents:
77996
diff
changeset
|
471 |
| 60648 | 472 const char * |
| 473 PyImport_GetMagicTag(void) | |
| 474 { | |
|
78029
ee01fd98b5b0
Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents:
77996
diff
changeset
|
475 return _PySys_ImplCacheTag; |
| 60648 | 476 } |
| 477 | |
|
77917
b36bed82c9d0
Issue #15166: Re-implement imp.get_tag() using sys.implementation.
Brett Cannon <brett@python.org>
parents:
77464
diff
changeset
|
478 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
479 /* 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
|
480 loaded). To prevent initializing an extension module more than |
|
80842
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
481 once, we keep a static dictionary 'extensions' keyed by the tuple |
|
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
482 (module name, module name) (for built-in modules) or by |
|
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
483 (filename, module name) (for dynamically loaded modules), containing these |
|
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
484 modules. A copy of the module's dictionary is stored by calling |
|
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
485 _PyImport_FixupExtensionObject() immediately after the module initialization |
|
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
486 function succeeds. A copy can be retrieved from there by calling |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
487 _PyImport_FindExtensionObject(). |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
488 |
| 62385 | 489 Modules which do support multiple initialization set their m_size |
| 490 field to a non-negative number (indicating the size of the | |
| 491 module-specific state). They are still recorded in the extensions | |
| 492 dictionary, to avoid loading shared libraries twice. | |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
493 */ |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
494 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
495 int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
496 _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
497 PyObject *filename) |
| 6 | 498 { |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
499 PyObject *modules, *dict, *key; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
500 struct PyModuleDef *def; |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
501 int res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
502 if (extensions == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
503 extensions = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
504 if (extensions == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
505 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
506 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
507 if (mod == NULL || !PyModule_Check(mod)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
508 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
509 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
510 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
511 def = PyModule_GetDef(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
512 if (!def) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
513 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
514 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
515 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
516 modules = PyImport_GetModuleDict(); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
517 if (PyDict_SetItem(modules, name, mod) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
518 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
519 if (_PyState_AddModule(mod, def) < 0) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
520 PyDict_DelItem(modules, name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
521 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
522 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
523 if (def->m_size == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
524 if (def->m_base.m_copy) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
525 /* Somebody already imported the module, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
526 likely under a different name. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
527 XXX this should really not happen. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
528 Py_DECREF(def->m_base.m_copy); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
529 def->m_base.m_copy = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
530 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
531 dict = PyModule_GetDict(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
532 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
533 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
534 def->m_base.m_copy = PyDict_Copy(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
535 if (def->m_base.m_copy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
536 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
537 } |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
538 key = PyTuple_Pack(2, filename, name); |
|
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
539 if (key == NULL) |
|
80842
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
540 return -1; |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
541 res = PyDict_SetItem(extensions, key, (PyObject *)def); |
|
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
542 Py_DECREF(key); |
|
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
543 if (res < 0) |
|
80842
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
544 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
545 return 0; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
546 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
547 |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
548 int |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
549 _PyImport_FixupBuiltin(PyObject *mod, char *name) |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
550 { |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
551 int res; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
552 PyObject *nameobj; |
|
68713
ced52fcd95f6
Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68712
diff
changeset
|
553 nameobj = PyUnicode_InternFromString(name); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
554 if (nameobj == NULL) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
555 return -1; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
556 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
557 Py_DECREF(nameobj); |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
558 return res; |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
559 } |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
560 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
561 PyObject * |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
562 _PyImport_FindExtensionObject(PyObject *name, PyObject *filename) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5894
diff
changeset
|
563 { |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
564 PyObject *mod, *mdict, *key; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
565 PyModuleDef* def; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
566 if (extensions == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
567 return NULL; |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
568 key = PyTuple_Pack(2, filename, name); |
|
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
569 if (key == NULL) |
|
80842
6eefe4d537b3
Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80451
diff
changeset
|
570 return NULL; |
|
80854
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
571 def = (PyModuleDef *)PyDict_GetItem(extensions, key); |
|
4c8d756196a4
cleanup and fix refleaks
Benjamin Peterson <benjamin@python.org>
parents:
80842
diff
changeset
|
572 Py_DECREF(key); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
573 if (def == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
574 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
575 if (def->m_size == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
576 /* Module does not support repeated initialization */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
577 if (def->m_base.m_copy == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
578 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
579 mod = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
580 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
581 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
582 mdict = PyModule_GetDict(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
583 if (mdict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
584 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
585 if (PyDict_Update(mdict, def->m_base.m_copy)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
586 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
587 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
588 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
589 if (def->m_base.m_init == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
590 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
591 mod = def->m_base.m_init(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
592 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
593 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
594 PyDict_SetItem(PyImport_GetModuleDict(), name, mod); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
595 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
596 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
597 if (_PyState_AddModule(mod, def) < 0) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
598 PyDict_DelItem(PyImport_GetModuleDict(), name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
599 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
600 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
601 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
602 if (Py_VerboseFlag) |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
603 PySys_FormatStderr("import %U # previously loaded (%R)\n", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
604 name, filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
605 return mod; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
606 |
| 6 | 607 } |
| 608 | |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
609 PyObject * |
|
68110
44cc9ef43127
Issue #3080: Mark _PyImport_FindBuiltin() argument as constant
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68107
diff
changeset
|
610 _PyImport_FindBuiltin(const char *name) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
611 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
612 PyObject *res, *nameobj; |
|
68713
ced52fcd95f6
Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68712
diff
changeset
|
613 nameobj = PyUnicode_InternFromString(name); |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
614 if (nameobj == NULL) |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
615 return NULL; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
616 res = _PyImport_FindExtensionObject(nameobj, nameobj); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
617 Py_DECREF(nameobj); |
|
65418
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
618 return res; |
|
fd5135cbd928
_PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65391
diff
changeset
|
619 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
620 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
621 /* 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
|
622 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
|
623 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
|
624 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
|
625 '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
|
626 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
627 PyObject * |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
628 PyImport_AddModuleObject(PyObject *name) |
|
40
f28ac7f621c7
Added reload() functionality.
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
629 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
630 PyObject *modules = PyImport_GetModuleDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
631 PyObject *m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
632 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
633 if ((m = PyDict_GetItem(modules, name)) != NULL && |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
634 PyModule_Check(m)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
635 return m; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
636 m = PyModule_NewObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
637 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
638 return NULL; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
639 if (PyDict_SetItem(modules, name, m) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
640 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
641 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
642 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
643 Py_DECREF(m); /* Yes, it still exists, in modules! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
644 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
645 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
|
646 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
647 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
648 PyObject * |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
649 PyImport_AddModule(const char *name) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
650 { |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
651 PyObject *nameobj, *module; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
652 nameobj = PyUnicode_FromString(name); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
653 if (nameobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
654 return NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
655 module = PyImport_AddModuleObject(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
656 Py_DECREF(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
657 return module; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
658 } |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
659 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
660 |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
661 /* 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
|
662 static void |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
663 remove_module(PyObject *name) |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
664 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
665 PyObject *modules = PyImport_GetModuleDict(); |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
666 if (PyDict_GetItem(modules, name) == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
667 return; |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
668 if (PyDict_DelItem(modules, name) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
669 Py_FatalError("import: deleting existing key in" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
670 "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
|
671 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
672 |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
673 |
|
2198
27557e70a8f0
fix import related leaks
Guido van Rossum <guido@python.org>
parents:
2128
diff
changeset
|
674 /* 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
|
675 * 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
|
676 * 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
|
677 * 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
|
678 * 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
|
679 * example. |
| 60648 | 680 * |
| 681 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer | |
| 682 * interface. The other two exist primarily for backward compatibility. | |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
683 */ |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
684 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
685 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
|
686 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
687 return PyImport_ExecCodeModuleWithPathnames( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
688 name, co, (char *)NULL, (char *)NULL); |
|
7232
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
689 } |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
690 |
|
74c57288a02b
Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents:
7202
diff
changeset
|
691 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
692 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
|
693 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
694 return PyImport_ExecCodeModuleWithPathnames( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
695 name, co, pathname, (char *)NULL); |
| 60648 | 696 } |
| 697 | |
| 698 PyObject * | |
| 699 PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname, | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
700 char *cpathname) |
| 60648 | 701 { |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
702 PyObject *m = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
703 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
704 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
705 nameobj = PyUnicode_FromString(name); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
706 if (nameobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
707 return NULL; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
708 |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
709 if (cpathname != NULL) { |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
710 cpathobj = PyUnicode_DecodeFSDefault(cpathname); |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
711 if (cpathobj == NULL) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
712 goto error; |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
713 } |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
714 else |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
715 cpathobj = NULL; |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
716 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
717 if (pathname != NULL) { |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
718 pathobj = PyUnicode_DecodeFSDefault(pathname); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
719 if (pathobj == NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
720 goto error; |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
721 } |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
722 else if (cpathobj != NULL) { |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
723 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
724 _Py_IDENTIFIER(_get_sourcefile); |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
725 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
726 if (interp == NULL) { |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
727 Py_FatalError("PyImport_ExecCodeModuleWithPathnames: " |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
728 "no interpreter!"); |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
729 } |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
730 |
|
83590
8a364deb0225
Closes #17892: Fix the name of _PyObject_CallMethodObjIdArgs
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
83550
diff
changeset
|
731 pathobj = _PyObject_CallMethodIdObjArgs(interp->importlib, |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
732 &PyId__get_sourcefile, cpathobj, |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
733 NULL); |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
734 if (pathobj == NULL) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
735 PyErr_Clear(); |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
736 } |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
737 else |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
738 pathobj = NULL; |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
739 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
740 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
741 error: |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
742 Py_DECREF(nameobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
743 Py_XDECREF(pathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
744 Py_XDECREF(cpathobj); |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
745 return m; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
746 } |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
747 |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
748 PyObject* |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
749 PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
750 PyObject *cpathname) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
751 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
752 PyObject *modules = PyImport_GetModuleDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
753 PyObject *m, *d, *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
754 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
755 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
756 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
757 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
758 /* If the module is being reloaded, we get the old module back |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
759 and re-use its dict to exec the new code. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
760 d = PyModule_GetDict(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
761 if (PyDict_GetItemString(d, "__builtins__") == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
762 if (PyDict_SetItemString(d, "__builtins__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
763 PyEval_GetBuiltins()) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
764 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
765 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
766 if (pathname != NULL) { |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
767 v = pathname; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
768 } |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
769 else { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
770 v = ((PyCodeObject *)co)->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
771 } |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78052
diff
changeset
|
772 Py_INCREF(v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
773 if (PyDict_SetItemString(d, "__file__", v) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
774 PyErr_Clear(); /* Not important enough to report */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
775 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
776 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
777 /* Remember the pyc path name as the __cached__ attribute. */ |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
778 if (cpathname != NULL) |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
779 v = cpathname; |
|
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
780 else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
781 v = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
782 if (PyDict_SetItemString(d, "__cached__", v) != 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
783 PyErr_Clear(); /* Not important enough to report */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
784 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66650
diff
changeset
|
785 v = PyEval_EvalCode(co, d, d); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
786 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
787 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
788 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
789 |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
790 if ((m = PyDict_GetItem(modules, name)) == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
791 PyErr_Format(PyExc_ImportError, |
|
68229
0e7180e4c3cd
Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68110
diff
changeset
|
792 "Loaded module %R not found in sys.modules", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
793 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
794 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
795 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
796 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
797 Py_INCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
798 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
799 return m; |
|
32882
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
800 |
|
331e60d8ce6d
PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents:
32879
diff
changeset
|
801 error: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
802 remove_module(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
803 return NULL; |
| 6 | 804 } |
| 805 | |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
806 |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
807 static void |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
808 update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname) |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
809 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
810 PyObject *constants, *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
811 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
812 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
813 if (PyUnicode_Compare(co->co_filename, oldname)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
814 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
815 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
816 tmp = co->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
817 co->co_filename = newname; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
818 Py_INCREF(co->co_filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
819 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
820 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
821 constants = co->co_consts; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
822 n = PyTuple_GET_SIZE(constants); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
823 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
824 tmp = PyTuple_GET_ITEM(constants, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
825 if (PyCode_Check(tmp)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
826 update_code_filenames((PyCodeObject *)tmp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
827 oldname, newname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
828 } |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
829 } |
|
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
830 |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
831 static void |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
832 update_compiled_module(PyCodeObject *co, PyObject *newname) |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
833 { |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
834 PyObject *oldname; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
835 |
|
68722
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
836 if (PyUnicode_Compare(co->co_filename, newname) == 0) |
|
d24decc8c97e
Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68721
diff
changeset
|
837 return; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
838 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
839 oldname = co->co_filename; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
840 Py_INCREF(oldname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
841 update_code_filenames(co, oldname, newname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
842 Py_DECREF(oldname); |
|
50619
2ff9910f1526
Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50492
diff
changeset
|
843 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
844 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
845 static PyObject * |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
846 imp_fix_co_filename(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
|
847 { |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
848 PyObject *co; |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
849 PyObject *file_path; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
850 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
851 if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
852 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
853 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
854 if (!PyCode_Check(co)) { |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
855 PyErr_SetString(PyExc_TypeError, |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
856 "first argument must be a code object"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
857 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
858 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
859 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
860 if (!PyUnicode_Check(file_path)) { |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
861 PyErr_SetString(PyExc_TypeError, |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
862 "second argument must be a string"); |
|
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
863 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
864 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
865 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
866 update_compiled_module((PyCodeObject*)co, file_path); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60648
diff
changeset
|
867 |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
868 Py_RETURN_NONE; |
|
44583
73e1bf179a01
Another patch for #1762972: __file__ points to the py file instead pyo/pyc file
Christian Heimes <christian@cheimes.de>
parents:
44567
diff
changeset
|
869 } |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
870 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
871 |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
872 /* Forward */ |
| 82746 | 873 static const struct _frozen * find_frozen(PyObject *); |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
874 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
875 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
876 /* Helper to test for built-in module */ |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
877 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
878 static int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
879 is_builtin(PyObject *name) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
880 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
881 int i, cmp; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
882 for (i = 0; PyImport_Inittab[i].name != NULL; i++) { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
883 cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name); |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
884 if (cmp == 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
885 if (PyImport_Inittab[i].initfunc == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
886 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
887 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
888 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
889 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
890 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
891 return 0; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
892 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
893 |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
894 |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
895 /* 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
|
896 possibly by fetching it from the path_importer_cache dict. If it |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
897 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
|
898 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
|
899 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
|
900 import mechanism. Cache the result in path_importer_cache. |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
901 Returns a borrowed reference. */ |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
902 |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
903 static PyObject * |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
904 get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
905 PyObject *p) |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
906 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
907 PyObject *importer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
908 Py_ssize_t j, nhooks; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
909 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
910 /* These conditions are the caller's responsibility: */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
911 assert(PyList_Check(path_hooks)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
912 assert(PyDict_Check(path_importer_cache)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
913 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
914 nhooks = PyList_Size(path_hooks); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
915 if (nhooks < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
916 return NULL; /* Shouldn't happen */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
917 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
918 importer = PyDict_GetItem(path_importer_cache, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
919 if (importer != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
920 return importer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
921 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
922 /* set path_importer_cache[p] to None to avoid recursion */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
923 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
924 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
925 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
926 for (j = 0; j < nhooks; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
927 PyObject *hook = PyList_GetItem(path_hooks, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
928 if (hook == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
929 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
930 importer = PyObject_CallFunctionObjArgs(hook, p, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
931 if (importer != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
932 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
933 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
934 if (!PyErr_ExceptionMatches(PyExc_ImportError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
935 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
936 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
937 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
938 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
939 if (importer == NULL) { |
|
76582
7025ee00dbf6
Issue #14605: Use None in sys.path_importer_cache to represent no
Brett Cannon <brett@python.org>
parents:
76573
diff
changeset
|
940 return Py_None; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
941 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
942 if (importer != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
943 int err = PyDict_SetItem(path_importer_cache, p, importer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
944 Py_DECREF(importer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
945 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
946 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
947 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
948 return importer; |
|
26885
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
949 } |
|
54aacb87beda
PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents:
26796
diff
changeset
|
950 |
|
43897
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
951 PyAPI_FUNC(PyObject *) |
|
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
952 PyImport_GetImporter(PyObject *path) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
953 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
954 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
955 if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
956 if ((path_hooks = PySys_GetObject("path_hooks"))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
957 importer = get_path_importer(path_importer_cache, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
958 path_hooks, path); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
959 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
960 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
961 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
962 return importer; |
|
43897
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
963 } |
|
41f7c13ef161
Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43790
diff
changeset
|
964 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
965 |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
966 static int init_builtin(PyObject *); /* Forward */ |
| 86 | 967 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
968 /* Initialize a built-in module. |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
969 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
|
970 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
|
971 |
|
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
972 static int |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
973 init_builtin(PyObject *name) |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
974 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
975 struct _inittab *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
976 |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
977 if (_PyImport_FindExtensionObject(name, name) != NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
978 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
979 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
980 for (p = PyImport_Inittab; p->name != NULL; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
981 PyObject *mod; |
|
74504
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
982 PyModuleDef *def; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
983 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
984 if (p->initfunc == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
985 PyErr_Format(PyExc_ImportError, |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
986 "Cannot re-init internal module %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
987 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
988 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
989 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
990 mod = (*p->initfunc)(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
991 if (mod == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
992 return -1; |
|
74504
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
993 /* Remember pointer to module init function. */ |
|
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
994 def = PyModule_GetDef(mod); |
|
f0cbceef47c3
Fix the builtin module initialization code to store the init function for future reinitialization.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73321
diff
changeset
|
995 def->m_base.m_init = p->initfunc; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
996 if (_PyImport_FixupExtensionObject(mod, name, name) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
997 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
998 /* FixupExtension has put the module into sys.modules, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
999 so we can release our own reference. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1000 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1001 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1002 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1003 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1004 return 0; |
|
141
bf5a8539d8ba
Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents:
86
diff
changeset
|
1005 } |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1006 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1007 |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1008 /* 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
|
1009 |
| 82746 | 1010 static const struct _frozen * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1011 find_frozen(PyObject *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1012 { |
| 82746 | 1013 const struct _frozen *p; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1014 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1015 if (name == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1016 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1017 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1018 for (p = PyImport_FrozenModules; ; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1019 if (p->name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1020 return NULL; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1021 if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1022 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1023 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1024 return p; |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1025 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1026 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1027 static PyObject * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1028 get_frozen_object(PyObject *name) |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1029 { |
| 82746 | 1030 const struct _frozen *p = find_frozen(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1031 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1032 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1033 if (p == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1034 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1035 "No such frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1036 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1037 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1038 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1039 if (p->code == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1040 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1041 "Excluded frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1042 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1043 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1044 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1045 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1046 if (size < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1047 size = -size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1048 return PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1049 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1050 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1051 static PyObject * |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1052 is_frozen_package(PyObject *name) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1053 { |
| 82746 | 1054 const struct _frozen *p = find_frozen(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1055 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1056 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1057 if (p == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1058 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1059 "No such frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1060 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1061 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1062 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1063 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1064 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1065 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1066 if (size < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1067 Py_RETURN_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1068 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1069 Py_RETURN_FALSE; |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1070 } |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1071 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1072 |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1073 /* Initialize a frozen module. |
|
52073
56983cfdf5d4
Fix a typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents:
51996
diff
changeset
|
1074 Return 1 for success, 0 if the module is not found, and -1 with |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1075 an exception set if the initialization failed. |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1076 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
|
1077 |
|
6263e2fd9398
init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents:
2270
diff
changeset
|
1078 int |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1079 PyImport_ImportFrozenModuleObject(PyObject *name) |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1080 { |
| 82746 | 1081 const struct _frozen *p; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1082 PyObject *co, *m, *path; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1083 int ispackage; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1084 int size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1085 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1086 p = find_frozen(name); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1087 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1088 if (p == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1089 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1090 if (p->code == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1091 PyErr_Format(PyExc_ImportError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1092 "Excluded frozen object named %R", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1093 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1094 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1095 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1096 size = p->size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1097 ispackage = (size < 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1098 if (ispackage) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1099 size = -size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1100 co = PyMarshal_ReadObjectFromString((char *)p->code, size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1101 if (co == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1102 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1103 if (!PyCode_Check(co)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1104 PyErr_Format(PyExc_TypeError, |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1105 "frozen object %R is not a code object", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1106 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1107 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1108 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1109 if (ispackage) { |
|
84003
82db02a2e023
Issue #18065: For frozen packages set __path__ to [].
Brett Cannon <brett@python.org>
parents:
83835
diff
changeset
|
1110 /* Set __path__ to the empty list */ |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1111 PyObject *d, *l; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1112 int err; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1113 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1114 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1115 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1116 d = PyModule_GetDict(m); |
|
84003
82db02a2e023
Issue #18065: For frozen packages set __path__ to [].
Brett Cannon <brett@python.org>
parents:
83835
diff
changeset
|
1117 l = PyList_New(0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1118 if (l == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1119 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1120 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1121 err = PyDict_SetItemString(d, "__path__", l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1122 Py_DECREF(l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1123 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1124 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1125 } |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1126 path = PyUnicode_FromString("<frozen>"); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1127 if (path == NULL) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1128 goto err_return; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1129 m = PyImport_ExecCodeModuleObject(name, co, path, NULL); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1130 Py_DECREF(path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1131 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1132 goto err_return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1133 Py_DECREF(co); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1134 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1135 return 1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
1136 err_return: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1137 Py_DECREF(co); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1138 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
|
1139 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1140 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1141 int |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1142 PyImport_ImportFrozenModule(char *name) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1143 { |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1144 PyObject *nameobj; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1145 int ret; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1146 nameobj = PyUnicode_InternFromString(name); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1147 if (nameobj == NULL) |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1148 return -1; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1149 ret = PyImport_ImportFrozenModuleObject(nameobj); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1150 Py_DECREF(nameobj); |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1151 return ret; |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1152 } |
|
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1153 |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1154 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1155 /* 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
|
1156 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
|
1157 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1158 PyObject * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35757
diff
changeset
|
1159 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
|
1160 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1161 PyObject *pname; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1162 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1163 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1164 pname = PyUnicode_FromString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1165 if (pname == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1166 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1167 result = PyImport_Import(pname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1168 Py_DECREF(pname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1169 return result; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1170 } |
|
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1171 |
|
44441
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1172 /* Import a module without blocking |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1173 * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1174 * At first it tries to fetch the module from sys.modules. If the module was |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1175 * never loaded before it loads it with PyImport_ImportModule() unless another |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1176 * thread holds the import lock. In the latter case the function raises an |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1177 * ImportError instead of blocking. |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1178 * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1179 * Returns the module object with incremented ref count. |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1180 */ |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1181 PyObject * |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1182 PyImport_ImportModuleNoBlock(const char *name) |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1183 { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1184 return PyImport_ImportModule(name); |
|
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
|
1185 } |
|
ea8184bff12d
Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents:
7403
diff
changeset
|
1186 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1187 |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1188 /* Remove importlib frames from the traceback, |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1189 * except in Verbose mode. */ |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1190 static void |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1191 remove_importlib_frames(void) |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1192 { |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1193 const char *importlib_filename = "<frozen importlib._bootstrap>"; |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1194 const char *remove_frames = "_call_with_frames_removed"; |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1195 int always_trim = 0; |
|
78044
7ed3b4f830c0
initialize variable for compiler happiness
Benjamin Peterson <benjamin@python.org>
parents:
78042
diff
changeset
|
1196 int in_importlib = 0; |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1197 PyObject *exception, *value, *base_tb, *tb; |
|
78044
7ed3b4f830c0
initialize variable for compiler happiness
Benjamin Peterson <benjamin@python.org>
parents:
78042
diff
changeset
|
1198 PyObject **prev_link, **outer_link = NULL; |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1199 |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1200 /* Synopsis: if it's an ImportError, we trim all importlib chunks |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1201 from the traceback. We always trim chunks |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1202 which end with a call to "_call_with_frames_removed". */ |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1203 |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1204 PyErr_Fetch(&exception, &value, &base_tb); |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1205 if (!exception || Py_VerboseFlag) |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1206 goto done; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1207 if (PyType_IsSubtype((PyTypeObject *) exception, |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1208 (PyTypeObject *) PyExc_ImportError)) |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1209 always_trim = 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1210 |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1211 prev_link = &base_tb; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1212 tb = base_tb; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1213 while (tb != NULL) { |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1214 PyTracebackObject *traceback = (PyTracebackObject *)tb; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1215 PyObject *next = (PyObject *) traceback->tb_next; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1216 PyFrameObject *frame = traceback->tb_frame; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1217 PyCodeObject *code = frame->f_code; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1218 int now_in_importlib; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1219 |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1220 assert(PyTraceBack_Check(tb)); |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1221 now_in_importlib = (PyUnicode_CompareWithASCIIString( |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1222 code->co_filename, |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1223 importlib_filename) == 0); |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1224 if (now_in_importlib && !in_importlib) { |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1225 /* This is the link to this chunk of importlib tracebacks */ |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1226 outer_link = prev_link; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1227 } |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1228 in_importlib = now_in_importlib; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1229 |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1230 if (in_importlib && |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1231 (always_trim || |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1232 PyUnicode_CompareWithASCIIString(code->co_name, |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1233 remove_frames) == 0)) { |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1234 PyObject *tmp = *outer_link; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1235 *outer_link = next; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1236 Py_XINCREF(next); |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1237 Py_DECREF(tmp); |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1238 prev_link = outer_link; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1239 } |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1240 else { |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1241 prev_link = (PyObject **) &traceback->tb_next; |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1242 } |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1243 tb = next; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1244 } |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1245 done: |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1246 PyErr_Restore(exception, value, base_tb); |
|
44441
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1247 } |
|
b91ca87e6f32
Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
1248 |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1249 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1250 PyObject * |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1251 PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1252 PyObject *locals, PyObject *given_fromlist, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1253 int level) |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1254 { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1255 _Py_IDENTIFIER(__import__); |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1256 _Py_IDENTIFIER(__initializing__); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1257 _Py_IDENTIFIER(__package__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1258 _Py_IDENTIFIER(__path__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1259 _Py_IDENTIFIER(__name__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1260 _Py_IDENTIFIER(_find_and_load); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1261 _Py_IDENTIFIER(_handle_fromlist); |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1262 _Py_IDENTIFIER(_lock_unlock_module); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1263 _Py_static_string(single_dot, "."); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1264 PyObject *abs_name = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1265 PyObject *builtins_import = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1266 PyObject *final_mod = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1267 PyObject *mod = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1268 PyObject *package = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1269 PyObject *globals = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1270 PyObject *fromlist = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1271 PyInterpreterState *interp = PyThreadState_GET()->interp; |
|
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
|
1272 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1273 /* Make sure to use default values so as to not have |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1274 PyObject_CallMethodObjArgs() truncate the parameter list because of a |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1275 NULL argument. */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1276 if (given_globals == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1277 globals = PyDict_New(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1278 if (globals == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1279 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1280 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1281 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1282 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1283 /* Only have to care what given_globals is if it will be used |
|
78448
9066dca1a9b3
Fix a spelling mistake in a comment.
Brett Cannon <brett@python.org>
parents:
78419
diff
changeset
|
1284 for something. */ |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1285 if (level > 0 && !PyDict_Check(given_globals)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1286 PyErr_SetString(PyExc_TypeError, "globals must be a dict"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1287 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1288 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1289 globals = given_globals; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1290 Py_INCREF(globals); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1291 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1292 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1293 if (given_fromlist == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1294 fromlist = PyList_New(0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1295 if (fromlist == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1296 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1297 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1298 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1299 else { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1300 fromlist = given_fromlist; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1301 Py_INCREF(fromlist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1302 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1303 if (name == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1304 PyErr_SetString(PyExc_ValueError, "Empty module name"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1305 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1306 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1307 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1308 /* The below code is importlib.__import__() & _gcd_import(), ported to C |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1309 for added performance. */ |
|
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
|
1310 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1311 if (!PyUnicode_Check(name)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1312 PyErr_SetString(PyExc_TypeError, "module name must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1313 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1314 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1315 else if (PyUnicode_READY(name) < 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1316 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1317 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1318 if (level < 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1319 PyErr_SetString(PyExc_ValueError, "level must be >= 0"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1320 goto error; |
|
75824
daed636a3536
Fixes Issue #14331: Use significantly less stack space when importing modules by
Gregory P. Smith <greg@krypto.org>
parents:
75176
diff
changeset
|
1321 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1322 else if (level > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1323 package = _PyDict_GetItemId(globals, &PyId___package__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1324 if (package != NULL && package != Py_None) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1325 Py_INCREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1326 if (!PyUnicode_Check(package)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1327 PyErr_SetString(PyExc_TypeError, "package must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1328 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1329 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1330 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1331 else { |
|
76380
68f9ad6a3b13
Issue #14592: A relative import will raise a KeyError if __package__
Brett Cannon <brett@python.org>
parents:
76379
diff
changeset
|
1332 package = _PyDict_GetItemId(globals, &PyId___name__); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1333 if (package == NULL) { |
|
76380
68f9ad6a3b13
Issue #14592: A relative import will raise a KeyError if __package__
Brett Cannon <brett@python.org>
parents:
76379
diff
changeset
|
1334 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1335 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1336 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1337 else if (!PyUnicode_Check(package)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1338 PyErr_SetString(PyExc_TypeError, "__name__ must be a string"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1339 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1340 Py_INCREF(package); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1341 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1342 if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) { |
| 76304 | 1343 PyObject *partition = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1344 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1345 if (borrowed_dot == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1346 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1347 } |
| 76304 | 1348 partition = PyUnicode_RPartition(package, borrowed_dot); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1349 Py_DECREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1350 if (partition == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1351 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1352 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1353 package = PyTuple_GET_ITEM(partition, 0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1354 Py_INCREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1355 Py_DECREF(partition); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1356 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1357 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1358 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1359 if (PyDict_GetItem(interp->modules, package) == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1360 PyErr_Format(PyExc_SystemError, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1361 "Parent module %R not loaded, cannot perform relative " |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1362 "import", package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1363 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1364 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1365 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1366 else { /* level == 0 */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1367 if (PyUnicode_GET_LENGTH(name) == 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1368 PyErr_SetString(PyExc_ValueError, "Empty module name"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1369 goto error; |
|
75824
daed636a3536
Fixes Issue #14331: Use significantly less stack space when importing modules by
Gregory P. Smith <greg@krypto.org>
parents:
75176
diff
changeset
|
1370 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1371 package = Py_None; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1372 Py_INCREF(package); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1373 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1374 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1375 if (level > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1376 Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1377 PyObject *base = NULL; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1378 int level_up = 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1379 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1380 for (level_up = 1; level_up < level; level_up += 1) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1381 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1382 if (last_dot == -2) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1383 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1384 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1385 else if (last_dot == -1) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1386 PyErr_SetString(PyExc_ValueError, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1387 "attempted relative import beyond top-level " |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1388 "package"); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1389 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1390 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1391 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1392 base = PyUnicode_Substring(package, 0, last_dot); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1393 if (PyUnicode_GET_LENGTH(name) > 0) { |
| 76361 | 1394 PyObject *borrowed_dot, *seq = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1395 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1396 borrowed_dot = _PyUnicode_FromId(&single_dot); |
| 76361 | 1397 seq = PyTuple_Pack(2, base, name); |
| 1398 Py_DECREF(base); | |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1399 if (borrowed_dot == NULL || seq == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1400 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1401 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1402 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1403 abs_name = PyUnicode_Join(borrowed_dot, seq); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1404 Py_DECREF(seq); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1405 if (abs_name == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1406 goto error; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1407 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1408 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1409 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1410 abs_name = base; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1411 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1412 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1413 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1414 abs_name = name; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1415 Py_INCREF(abs_name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1416 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1417 |
| 76307 | 1418 #ifdef WITH_THREAD |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1419 _PyImport_AcquireLock(); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1420 #endif |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1421 /* From this point forward, goto error_with_unlock! */ |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1422 if (PyDict_Check(globals)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1423 builtins_import = _PyDict_GetItemId(globals, &PyId___import__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1424 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1425 if (builtins_import == NULL) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1426 builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1427 if (builtins_import == NULL) { |
|
83549
08ce30768003
raise an ImportError (rather than fatal) when __import__ is not found in __builtins__ (closes #17867)
Benjamin Peterson <benjamin@python.org>
parents:
80935
diff
changeset
|
1428 PyErr_SetString(PyExc_ImportError, "__import__ not found"); |
|
08ce30768003
raise an ImportError (rather than fatal) when __import__ is not found in __builtins__ (closes #17867)
Benjamin Peterson <benjamin@python.org>
parents:
80935
diff
changeset
|
1429 goto error_with_unlock; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1430 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1431 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1432 Py_INCREF(builtins_import); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1433 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1434 mod = PyDict_GetItem(interp->modules, abs_name); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1435 if (mod == Py_None) { |
|
76328
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1436 PyObject *msg = PyUnicode_FromFormat("import of %R halted; " |
|
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1437 "None in sys.modules", abs_name); |
|
c9fb9f5e16e7
Set ImportError.name when raising the exception in the case of None
Brett Cannon <brett@python.org>
parents:
76312
diff
changeset
|
1438 if (msg != NULL) { |
|
84109
3a50025f1900
Issue #15767: Touch up ModuleNotFoundError usage by import.
Brett Cannon <brett@python.org>
parents:
84003
diff
changeset
|
1439 PyErr_SetImportErrorSubclass(PyExc_ModuleNotFoundError, msg, |
|
3a50025f1900
Issue #15767: Touch up ModuleNotFoundError usage by import.
Brett Cannon <brett@python.org>
parents:
84003
diff
changeset
|
1440 abs_name, NULL); |
|
76379
7a32b9380ffd
Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents:
76371
diff
changeset
|
1441 Py_DECREF(msg); |
|
78604
56dc7b09f390
Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76847
diff
changeset
|
1442 } |
|
76358
feeb1ca9e93c
Fix reference loss on Py_None when None is encountered in sys.modules.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76342
diff
changeset
|
1443 mod = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1444 goto error_with_unlock; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1445 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1446 else if (mod != NULL) { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1447 PyObject *value; |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1448 int initializing = 0; |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1449 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1450 Py_INCREF(mod); |
|
78779
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78605
diff
changeset
|
1451 /* Optimization: only call _bootstrap._lock_unlock_module() if |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78605
diff
changeset
|
1452 __initializing__ is true. |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78605
diff
changeset
|
1453 NOTE: because of this, __initializing__ must be set *before* |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78605
diff
changeset
|
1454 stuffing the new module in sys.modules. |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78605
diff
changeset
|
1455 */ |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1456 value = _PyObject_GetAttrId(mod, &PyId___initializing__); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1457 if (value == NULL) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1458 PyErr_Clear(); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1459 else { |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1460 initializing = PyObject_IsTrue(value); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1461 Py_DECREF(value); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1462 if (initializing == -1) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1463 PyErr_Clear(); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1464 } |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1465 if (initializing > 0) { |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1466 /* _bootstrap._lock_unlock_module() releases the import lock */ |
|
83590
8a364deb0225
Closes #17892: Fix the name of _PyObject_CallMethodObjIdArgs
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
83550
diff
changeset
|
1467 value = _PyObject_CallMethodIdObjArgs(interp->importlib, |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1468 &PyId__lock_unlock_module, abs_name, |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1469 NULL); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1470 if (value == NULL) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1471 goto error; |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1472 Py_DECREF(value); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1473 } |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1474 else { |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1475 #ifdef WITH_THREAD |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1476 if (_PyImport_ReleaseLock() < 0) { |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1477 PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1478 goto error; |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1479 } |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1480 #endif |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1481 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1482 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1483 else { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1484 /* _bootstrap._find_and_load() releases the import lock */ |
|
83590
8a364deb0225
Closes #17892: Fix the name of _PyObject_CallMethodObjIdArgs
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
83550
diff
changeset
|
1485 mod = _PyObject_CallMethodIdObjArgs(interp->importlib, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1486 &PyId__find_and_load, abs_name, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1487 builtins_import, NULL); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1488 if (mod == NULL) { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1489 goto error; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1490 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1491 } |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1492 /* From now on we don't hold the import lock anymore. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1493 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1494 if (PyObject_Not(fromlist)) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1495 if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1496 PyObject *front = NULL; |
| 76307 | 1497 PyObject *partition = NULL; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1498 PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1499 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1500 if (borrowed_dot == NULL) { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1501 goto error; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1502 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1503 |
| 76307 | 1504 partition = PyUnicode_Partition(name, borrowed_dot); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1505 if (partition == NULL) { |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1506 goto error; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1507 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1508 |
|
76826
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1509 if (PyUnicode_GET_LENGTH(PyTuple_GET_ITEM(partition, 1)) == 0) { |
|
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1510 /* No dot in module name, simple exit */ |
|
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1511 Py_DECREF(partition); |
|
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1512 final_mod = mod; |
|
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1513 Py_INCREF(mod); |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1514 goto error; |
|
76826
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1515 } |
|
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1516 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1517 front = PyTuple_GET_ITEM(partition, 0); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1518 Py_INCREF(front); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1519 Py_DECREF(partition); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1520 |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1521 if (level == 0) { |
|
76826
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76799
diff
changeset
|
1522 final_mod = PyObject_CallFunctionObjArgs(builtins_import, front, NULL); |
|
76799
49306ceaf91f
Fix too early decrefs.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76768
diff
changeset
|
1523 Py_DECREF(front); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1524 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1525 else { |
| 76362 | 1526 Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) - |
| 1527 PyUnicode_GET_LENGTH(front); | |
| 1528 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name); | |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1529 PyObject *to_return = PyUnicode_Substring(abs_name, 0, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1530 abs_name_len - cut_off); |
| 76362 | 1531 Py_DECREF(front); |
| 1532 if (to_return == NULL) { | |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1533 goto error; |
| 76362 | 1534 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1535 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1536 final_mod = PyDict_GetItem(interp->modules, to_return); |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1537 if (final_mod == NULL) { |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1538 PyErr_Format(PyExc_KeyError, |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1539 "%R not in sys.modules as expected", |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1540 to_return); |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1541 } |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1542 else { |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1543 Py_INCREF(final_mod); |
|
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76307
diff
changeset
|
1544 } |
|
76799
49306ceaf91f
Fix too early decrefs.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76768
diff
changeset
|
1545 Py_DECREF(to_return); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1546 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1547 } |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1548 else { |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1549 final_mod = mod; |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1550 Py_INCREF(mod); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1551 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1552 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1553 else { |
|
83590
8a364deb0225
Closes #17892: Fix the name of _PyObject_CallMethodObjIdArgs
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
83550
diff
changeset
|
1554 final_mod = _PyObject_CallMethodIdObjArgs(interp->importlib, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1555 &PyId__handle_fromlist, mod, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1556 fromlist, builtins_import, |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1557 NULL); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1558 } |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76848
diff
changeset
|
1559 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1560 |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1561 error_with_unlock: |
| 76307 | 1562 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1563 if (_PyImport_ReleaseLock() < 0) { |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1564 PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1565 } |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1566 #endif |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1567 error: |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1568 Py_XDECREF(abs_name); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1569 Py_XDECREF(builtins_import); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1570 Py_XDECREF(mod); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1571 Py_XDECREF(package); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1572 Py_XDECREF(globals); |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1573 Py_XDECREF(fromlist); |
|
77996
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1574 if (final_mod == NULL) |
|
8c877ad00bc4
Issue #15110: Fix the tracebacks generated by "import xxx" to not show the importlib stack frames.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77917
diff
changeset
|
1575 remove_importlib_frames(); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
75826
diff
changeset
|
1576 return final_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
|
1577 } |
|
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
|
1578 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
1579 PyObject * |
|
70374
a9126e8770e5
make PyImport_ImportModuleLevel's first arg const like similiar functions (closes #12173)
Benjamin Peterson <benjamin@python.org>
parents:
69463
diff
changeset
|
1580 PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, |
|
68739
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1581 PyObject *fromlist, 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
|
1582 { |
|
68739
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1583 PyObject *nameobj, *mod; |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1584 nameobj = PyUnicode_FromString(name); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1585 if (nameobj == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1586 return NULL; |
|
68739
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1587 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals, |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1588 fromlist, level); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1589 Py_DECREF(nameobj); |
|
80f4bd647695
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68738
diff
changeset
|
1590 return mod; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1591 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1592 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1593 |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1594 /* 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
|
1595 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
|
1596 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1597 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1598 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
|
1599 { |
|
76640
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1600 _Py_IDENTIFIER(reload); |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1601 PyObject *reloaded_module = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1602 PyObject *modules = PyImport_GetModuleDict(); |
|
76640
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1603 PyObject *imp = PyDict_GetItemString(modules, "imp"); |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1604 if (imp == NULL) { |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1605 imp = PyImport_ImportModule("imp"); |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1606 if (imp == NULL) { |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1607 return NULL; |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1608 } |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1609 } |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1610 else { |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1611 Py_INCREF(imp); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1612 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1613 |
|
76640
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1614 reloaded_module = _PyObject_CallMethodId(imp, &PyId_reload, "O", m); |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1615 Py_DECREF(imp); |
|
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76633
diff
changeset
|
1616 return reloaded_module; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1262
diff
changeset
|
1617 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1618 |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1619 |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1620 /* 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
|
1621 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
|
1622 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
|
1623 done using whatever import hooks are installed in the current |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1624 environment. |
|
9680
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
1625 A dummy list ["__doc__"] is passed as the 4th argument so that |
|
42862
ed1594a16bdb
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42859
diff
changeset
|
1626 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache")) |
|
9680
8b61e1273b4b
Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
1627 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
|
1628 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1629 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1630 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
|
1631 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1632 static PyObject *silly_list = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1633 static PyObject *builtins_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1634 static PyObject *import_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1635 PyObject *globals = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1636 PyObject *import = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1637 PyObject *builtins = NULL; |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1638 PyObject *modules = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1639 PyObject *r = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1640 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1641 /* Initialize constant string objects */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1642 if (silly_list == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1643 import_str = PyUnicode_InternFromString("__import__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1644 if (import_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1645 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1646 builtins_str = PyUnicode_InternFromString("__builtins__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1647 if (builtins_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1648 return NULL; |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1649 silly_list = PyList_New(0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1650 if (silly_list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1651 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1652 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1653 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1654 /* Get the builtins from current globals */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1655 globals = PyEval_GetGlobals(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1656 if (globals != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1657 Py_INCREF(globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1658 builtins = PyObject_GetItem(globals, builtins_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1659 if (builtins == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1660 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1661 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1662 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1663 /* No globals -- use standard builtins, and fake globals */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1664 builtins = PyImport_ImportModuleLevel("builtins", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1665 NULL, NULL, NULL, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1666 if (builtins == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1667 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1668 globals = Py_BuildValue("{OO}", builtins_str, builtins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1669 if (globals == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1670 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1671 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1672 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1673 /* Get the __import__ function from the builtins */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1674 if (PyDict_Check(builtins)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1675 import = PyObject_GetItem(builtins, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1676 if (import == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1677 PyErr_SetObject(PyExc_KeyError, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1678 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1679 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1680 import = PyObject_GetAttr(builtins, import_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1681 if (import == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1682 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1683 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1684 /* Call the __import__ function with the proper argument list |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1685 Always use absolute import here. |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1686 Calling for side-effect of import. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1687 r = PyObject_CallFunction(import, "OOOOi", module_name, globals, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1688 globals, silly_list, 0, NULL); |
|
64838
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1689 if (r == NULL) |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1690 goto err; |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1691 Py_DECREF(r); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1692 |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1693 modules = PyImport_GetModuleDict(); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1694 r = PyDict_GetItem(modules, module_name); |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1695 if (r != NULL) |
|
dd3080b80dda
PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents:
64638
diff
changeset
|
1696 Py_INCREF(r); |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1697 |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1698 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1699 Py_XDECREF(globals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1700 Py_XDECREF(builtins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1701 Py_XDECREF(import); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1702 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1703 return r; |
|
6028
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1704 } |
|
292193170da1
Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents:
5980
diff
changeset
|
1705 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1706 static PyObject * |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1707 imp_extension_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
|
1708 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1709 PyObject *list; |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1710 const char *suffix; |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1711 unsigned int index = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1712 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1713 list = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1714 if (list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1715 return NULL; |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1716 #ifdef HAVE_DYNAMIC_LOADING |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1717 while ((suffix = _PyImport_DynLoadFiletab[index])) { |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1718 PyObject *item = PyUnicode_FromString(suffix); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1719 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1720 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1721 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1722 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1723 if (PyList_Append(list, item) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1724 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1725 Py_DECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1726 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1727 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1728 Py_DECREF(item); |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1729 index += 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1730 } |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1731 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1732 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
|
1733 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1734 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1735 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1736 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
|
1737 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1738 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1739 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1740 PyObject *m; |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1741 if (!PyArg_ParseTuple(args, "U:init_builtin", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1742 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1743 ret = init_builtin(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1744 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1745 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1746 if (ret == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1747 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1748 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1749 } |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1750 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1751 Py_XINCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1752 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
|
1753 } |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1754 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1755 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1756 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
|
1757 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1758 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1759 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1760 PyObject *m; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1761 if (!PyArg_ParseTuple(args, "U:init_frozen", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1762 return NULL; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1763 ret = PyImport_ImportFrozenModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1764 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1765 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1766 if (ret == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1767 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1768 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1769 } |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1770 m = PyImport_AddModuleObject(name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1771 Py_XINCREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1772 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
|
1773 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1774 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1775 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1776 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
|
1777 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1778 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1779 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1780 if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1781 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1782 return get_frozen_object(name); |
|
2891
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1783 } |
|
964d76f49a5e
add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents:
2868
diff
changeset
|
1784 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1785 static PyObject * |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1786 imp_is_frozen_package(PyObject *self, PyObject *args) |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1787 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1788 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1789 |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1790 if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1791 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1792 return is_frozen_package(name); |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1793 } |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1794 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52073
diff
changeset
|
1795 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1796 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
|
1797 { |
|
68712
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1798 PyObject *name; |
|
2425717c6430
Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68711
diff
changeset
|
1799 if (!PyArg_ParseTuple(args, "U:is_builtin", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1800 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1801 return PyLong_FromLong(is_builtin(name)); |
|
1844
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1802 } |
|
d1e6c9a64a56
* Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
1803 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1804 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1805 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
|
1806 { |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1807 PyObject *name; |
| 82746 | 1808 const struct _frozen *p; |
|
68711
e7c1019b27b9
Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68710
diff
changeset
|
1809 if (!PyArg_ParseTuple(args, "U:is_frozen", &name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1810 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1811 p = find_frozen(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1812 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
|
1813 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1814 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1815 #ifdef HAVE_DYNAMIC_LOADING |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1816 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1817 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1818 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
|
1819 { |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1820 PyObject *name, *pathname, *fob = NULL, *mod; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1821 FILE *fp; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1822 |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1823 if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic", |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1824 &name, PyUnicode_FSDecoder, &pathname, &fob)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1825 return NULL; |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1826 if (fob != NULL) { |
|
76764
cd519a923d41
Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents:
76760
diff
changeset
|
1827 fp = _Py_fopen(pathname, "r"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1828 if (fp == NULL) { |
|
68826
3114f26d5d54
Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68823
diff
changeset
|
1829 Py_DECREF(pathname); |
|
76764
cd519a923d41
Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents:
76760
diff
changeset
|
1830 if (!PyErr_Occurred()) |
|
cd519a923d41
Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents:
76760
diff
changeset
|
1831 PyErr_SetFromErrno(PyExc_IOError); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1832 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1833 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1834 } |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1835 else |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1836 fp = NULL; |
|
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1837 mod = _PyImport_LoadDynamicModule(name, pathname, fp); |
|
68826
3114f26d5d54
Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68823
diff
changeset
|
1838 Py_DECREF(pathname); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1839 if (fp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1840 fclose(fp); |
|
68716
ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68715
diff
changeset
|
1841 return mod; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1842 } |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1843 |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1844 #endif /* HAVE_DYNAMIC_LOADING */ |
|
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1845 |
| 60648 | 1846 |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
1847 /* Doc strings */ |
|
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
1848 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
1849 PyDoc_STRVAR(doc_imp, |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76329
diff
changeset
|
1850 "(Extremely) low-level import machinery bits as used by importlib and imp."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
1851 |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1852 PyDoc_STRVAR(doc_extension_suffixes, |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1853 "extension_suffixes() -> list of strings\n\ |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1854 Returns the list of file suffixes used to identify extension modules."); |
|
6305
6e1fa76e7940
Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents:
6304
diff
changeset
|
1855 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23586
diff
changeset
|
1856 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
|
1857 "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
|
1858 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
|
1859 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
|
1860 |
|
27852
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
1861 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
|
1862 "acquire_lock() -> None\n\ |
|
27853
5620b0786271
Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents:
27852
diff
changeset
|
1863 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
|
1864 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
|
1865 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
|
1866 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
|
1867 |
|
4b75a0b76857
Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents:
27357
diff
changeset
|
1868 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
|
1869 "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
|
1870 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
|
1871 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
|
1872 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5317
diff
changeset
|
1873 static PyMethodDef imp_methods[] = { |
|
76754
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1874 {"extension_suffixes", imp_extension_suffixes, METH_NOARGS, |
|
257cbd2fac38
Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76640
diff
changeset
|
1875 doc_extension_suffixes}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1876 {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1877 {"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1878 {"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1879 {"get_frozen_object", imp_get_frozen_object, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1880 {"is_frozen_package", imp_is_frozen_package, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1881 {"init_builtin", imp_init_builtin, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1882 {"init_frozen", imp_init_frozen, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1883 {"is_builtin", imp_is_builtin, METH_VARARGS}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1884 {"is_frozen", imp_is_frozen, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1885 #ifdef HAVE_DYNAMIC_LOADING |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1886 {"load_dynamic", imp_load_dynamic, METH_VARARGS}, |
|
11618
528559a0b2f2
Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents:
11602
diff
changeset
|
1887 #endif |
|
68887
5deb2094f033
Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents:
68826
diff
changeset
|
1888 {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1889 {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
|
1890 }; |
|
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1891 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
1892 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1893 static struct PyModuleDef impmodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1894 PyModuleDef_HEAD_INIT, |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76329
diff
changeset
|
1895 "_imp", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1896 doc_imp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1897 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1898 imp_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1899 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1900 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1901 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1902 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1903 }; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38669
diff
changeset
|
1904 |
|
30311
f003e48f562d
Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents:
29812
diff
changeset
|
1905 PyMODINIT_FUNC |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
1906 PyInit_imp(void) |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1907 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1908 PyObject *m, *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1909 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1910 m = PyModule_Create(&impmodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1911 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1912 goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1913 d = PyModule_GetDict(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1914 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1915 goto failure; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1916 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1917 return m; |
|
6243
4279f4eb210a
First part of package support.
Guido van Rossum <guido@python.org>
parents:
6055
diff
changeset
|
1918 failure: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1919 Py_XDECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1920 return NULL; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2040
diff
changeset
|
1921 } |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1922 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1923 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12543
diff
changeset
|
1924 /* 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
|
1925 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
|
1926 *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
|
1927 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
|
1928 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1929 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
|
1930 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1931 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13552
diff
changeset
|
1932 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
|
1933 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1934 static struct _inittab *our_copy = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1935 struct _inittab *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1936 int i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1937 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1938 /* Count the number of entries in both tables */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1939 for (n = 0; newtab[n].name != NULL; n++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1940 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1941 if (n == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1942 return 0; /* Nothing to do */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1943 for (i = 0; PyImport_Inittab[i].name != NULL; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1944 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1945 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1946 /* Allocate new memory for the combined table */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1947 p = our_copy; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1948 PyMem_RESIZE(p, struct _inittab, i+n+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1949 if (p == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1950 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1951 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1952 /* Copy the tables into the new memory */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1953 if (our_copy != PyImport_Inittab) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1954 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1955 PyImport_Inittab = our_copy = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1956 memcpy(p+i, newtab, (n+1) * sizeof(struct _inittab)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1957 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1958 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
|
1959 } |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1960 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1961 /* 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
|
1962 |
|
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1963 int |
|
52721
54e093bd887e
Merged revisions 71031 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents:
52547
diff
changeset
|
1964 PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void)) |
|
8330
7a1e7da922f8
New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents:
8012
diff
changeset
|
1965 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1966 struct _inittab newtab[2]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1967 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1968 memset(newtab, '\0', sizeof newtab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1969 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1970 newtab[0].name = (char *)name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1971 newtab[0].initfunc = initfunc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1972 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59865
diff
changeset
|
1973 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
|
1974 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1975 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1976 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1977 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1978 #endif |
