annotate Python/import.c @ 80842:6eefe4d537b3

Issue #16421: allow to load multiple modules from the same shared object. Patch by Václav Šmilauer.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Fri, 14 Dec 2012 17:04:59 +0200
parents bd853311ffe0
children 4c8d756196a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 141
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Module definition and import implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
4 #include "Python.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35678
diff changeset
6 #include "Python-ast.h"
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41253
diff changeset
7 #undef Yield /* undefine macro conflicting with winbase.h */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #include "errcode.h"
263
28f0ffd9facf Support ".pyc" files: cached compilation results.
Guido van Rossum <guido@python.org>
parents: 228
diff changeset
9 #include "marshal.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35678
diff changeset
10 #include "code.h"
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
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
30 #define CACHEDIR "__pycache__"
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
172 import_lock_thread = me;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
173 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
174 }
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
56382
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
176 int
2e4d7a40c2dd Merged revisions 75246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 55584
diff changeset
177 _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
178 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
179 long me = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
180 if (me == -1 || import_lock == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
181 return 0; /* Too bad */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
182 if (import_lock_thread != me)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
183 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
184 import_lock_level--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
185 if (import_lock_level == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
186 import_lock_thread = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
187 PyThread_release_lock(import_lock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
188 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
189 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
190 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
191
59235
58c35495a934 Merged revisions 78527,78550 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 59213
diff changeset
192 /* 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
193 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
194 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
195 (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
196
724bbd489ad4 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 35542
diff changeset
197 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
198 _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
199 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
200 if (import_lock != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
201 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
202 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
203 /* 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
204 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
205 /* 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
206 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
207 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
208 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
209 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
210 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
211 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
212 } 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
213 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
214 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
215 }
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
216 }
724bbd489ad4 - Changes donated by Elemental Security to make it work on AIX 5.3
Guido van Rossum <guido@python.org>
parents: 35542
diff changeset
217
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
218 #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
219
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
220 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
221 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
222 {
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
223 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
224 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
225 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
226 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
227 #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
228 }
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
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
230 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
231 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
232 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
233 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
234 _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
235 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
236 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
237 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
238 }
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
239
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
240 static PyObject *
27917
c346d095791d Remove PyArg_ParseTuple() for methods which take no args,
Neal Norwitz <nnorwitz@gmail.com>
parents: 27853
diff changeset
241 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
242 {
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
243 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
244 if (_PyImport_ReleaseLock() < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
245 PyErr_SetString(PyExc_RuntimeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
246 "not holding the import lock");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
247 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
248 }
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
249 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
250 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
251 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
252 }
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
253
73205
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
254 void
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
255 _PyImport_Fini(void)
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
256 {
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
257 Py_XDECREF(extensions);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
258 extensions = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
259 #ifdef WITH_THREAD
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
260 if (import_lock != NULL) {
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
261 PyThread_free_lock(import_lock);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
262 import_lock = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
263 }
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 72453
diff changeset
264 #endif
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
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
267 /* Helper for sys */
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
268
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
269 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
270 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
271 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
272 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
273 if (interp->modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
274 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
275 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
276 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
277
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
278
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
279 /* 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
280 static char* sys_deletes[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
281 "path", "argv", "ps1", "ps2",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
282 "last_type", "last_value", "last_traceback",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
283 "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
284 /* misc stuff */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
285 "flags", "float_info",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
286 NULL
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
287 };
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
288
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
289 static char* sys_files[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
290 "stdin", "__stdin__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
291 "stdout", "__stdout__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
292 "stderr", "__stderr__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
293 NULL
7403
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
294 };
185c1d47ce7a Moved clear_carefully() to _PyModule_Clear() in moduleobject.c
Guido van Rossum <guido@python.org>
parents: 7367
diff changeset
295
7202
fed3d200fb56 Two more refinements of the cleanup process.
Guido van Rossum <guido@python.org>
parents: 7111
diff changeset
296
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
297 /* Un-initialize things, as good as we can */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
298
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
299 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
300 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
301 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
302 Py_ssize_t pos, ndone;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
303 PyObject *key, *value, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
304 PyInterpreterState *interp = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
305 PyObject *modules = interp->modules;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
306
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
307 if (modules == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
308 return; /* Already done */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
309
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
310 /* 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
311 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
312 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
313 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
314 destruction order. Sigh. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
315
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
316 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
317 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
318 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
319 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
320 PySys_WriteStderr("# clear builtins._\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
321 PyDict_SetItemString(dict, "_", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
322 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
323 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
324 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
325 char **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
326 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
327 dict = PyModule_GetDict(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
328 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
329 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
330 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
331 PyDict_SetItemString(dict, *p, Py_None);
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 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
334 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
335 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
336 v = PyDict_GetItemString(dict, *(p+1));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
337 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
338 v = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
339 PyDict_SetItemString(dict, *p, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
340 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
341 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
342
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
343 /* First, delete __main__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
344 value = PyDict_GetItemString(modules, "__main__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
345 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
346 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
347 PySys_WriteStderr("# cleanup __main__\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
348 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
349 PyDict_SetItemString(modules, "__main__", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
350 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
351
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
352 /* 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
353 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
354 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
355 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
356 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
357 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
358 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
359
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
360 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
361 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
362 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
363 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
364 re-imported. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
365
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
366 /* 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
367 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
368 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
369 ndone = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
370 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
371 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
372 if (value->ob_refcnt != 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
373 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
374 if (PyUnicode_Check(key) && PyModule_Check(value)) {
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
375 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
376 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
377 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
378 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
379 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
380 PySys_FormatStderr(
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
381 "# cleanup[1] %U\n", key);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
382 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
383 PyDict_SetItem(modules, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
384 ndone++;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
387 } while (ndone > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
388
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
389 /* 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
390 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
391 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
392 if (PyUnicode_Check(key) && PyModule_Check(value)) {
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
393 if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
394 continue;
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
395 if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
396 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
397 if (Py_VerboseFlag)
68710
b50a0d44545a Issue #3080: PyImport_Cleanup() uses Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68708
diff changeset
398 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
399 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
400 PyDict_SetItem(modules, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
401 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
402 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
403
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
404 /* Next, delete sys and builtins (in that order) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
405 value = PyDict_GetItemString(modules, "sys");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
406 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
407 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
408 PySys_WriteStderr("# cleanup sys\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
409 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
410 PyDict_SetItemString(modules, "sys", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
411 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
412 value = PyDict_GetItemString(modules, "builtins");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
413 if (value != NULL && PyModule_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
414 if (Py_VerboseFlag)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
415 PySys_WriteStderr("# cleanup builtins\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
416 _PyModule_Clear(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
417 PyDict_SetItemString(modules, "builtins", Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
418 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
419
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
420 /* 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
421 PyDict_Clear(modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
422 interp->modules = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
423 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
424 }
166
28923e44254c Added forward declaration (to satisfy Standard C).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
425
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
426
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
427 /* 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
428
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
429 long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
430 PyImport_GetMagicNumber(void)
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
431 {
78052
2ecdda96f970 Fix compilation under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 78048
diff changeset
432 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
433 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
434 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
435 "_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
436 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
437 return -1;
78052
2ecdda96f970 Fix compilation under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 78048
diff changeset
438 res = PyLong_AsLong(pyc_magic);
78048
3fa1414ce505 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 78044
diff changeset
439 Py_DECREF(pyc_magic);
3fa1414ce505 fix refleak
Benjamin Peterson <benjamin@python.org>
parents: 78044
diff changeset
440 return res;
1886
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
441 }
ac6a9f90f6fd * Import/pythonrun.h, Python/{import,pythonrun}.c,
Guido van Rossum <guido@python.org>
parents: 1877
diff changeset
442
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443
78029
ee01fd98b5b0 Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents: 77996
diff changeset
444 extern const char * _PySys_ImplCacheTag;
ee01fd98b5b0 Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents: 77996
diff changeset
445
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
446 const char *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
447 PyImport_GetMagicTag(void)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
448 {
78029
ee01fd98b5b0 Issue #15242: Have PyImport_GetMagicTag() return a const char *
Brett Cannon <brett@python.org>
parents: 77996
diff changeset
449 return _PySys_ImplCacheTag;
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
450 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
451
77917
b36bed82c9d0 Issue #15166: Re-implement imp.get_tag() using sys.implementation.
Brett Cannon <brett@python.org>
parents: 77464
diff changeset
452
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
453 /* 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
454 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
455 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
456 (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
457 (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
458 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
459 _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
460 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
461 _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
462
62385
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
463 Modules which do support multiple initialization set their m_size
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
464 field to a non-negative number (indicating the size of the
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
465 module-specific state). They are still recorded in the extensions
46ab5e4dba6b Typo repair.
Barry Warsaw <barry@python.org>
parents: 61597
diff changeset
466 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
467 */
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
468
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
469 int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
470 _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
471 PyObject *filename)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 {
80842
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
473 PyObject *modules, *dict, *filename_name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
474 struct PyModuleDef *def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
475 if (extensions == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
476 extensions = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
477 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
478 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
479 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
480 if (mod == NULL || !PyModule_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
481 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
482 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
483 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
484 def = PyModule_GetDef(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
485 if (!def) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
486 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
487 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
488 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
489 modules = PyImport_GetModuleDict();
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
490 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
491 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
492 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
493 PyDict_DelItem(modules, name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
494 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
495 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
496 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
497 if (def->m_base.m_copy) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
498 /* Somebody already imported the module,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
499 likely under a different name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
500 XXX this should really not happen. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
501 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
502 def->m_base.m_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
503 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
504 dict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
505 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
506 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
507 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
508 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
509 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
510 }
80842
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
511 filename_name = PyTuple_Pack(2,filename, name);
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
512 if (filename_name == NULL)
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
513 return -1;
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
514 if (PyDict_SetItem(extensions, filename_name, (PyObject*)def) < 0)
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
515 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
516 return 0;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
517 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
518
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
519 int
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
520 _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
521 {
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
522 int res;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
523 PyObject *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
524 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
525 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
526 return -1;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
527 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
528 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
529 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
530 }
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
531
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5894
diff changeset
532 PyObject *
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
533 _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
534 {
80842
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
535 PyObject *mod, *mdict, *filename_name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
536 PyModuleDef* def;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
537 if (extensions == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
538 return 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
539 filename_name = PyTuple_Pack(2,filename, name);
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
540 if (filename_name == NULL)
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
541 return NULL;
6eefe4d537b3 Issue #16421: allow to load multiple modules from the same shared object.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80451
diff changeset
542 def = (PyModuleDef*)PyDict_GetItem(extensions, filename_name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
543 if (def == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
544 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
545 if (def->m_size == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
546 /* Module does not support repeated initialization */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
547 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
548 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
549 mod = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
550 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
551 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
552 mdict = PyModule_GetDict(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
553 if (mdict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
554 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
555 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
556 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
557 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
558 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
559 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
560 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
561 mod = def->m_base.m_init();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
562 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
563 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
564 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
565 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
566 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
567 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
568 PyDict_DelItem(PyImport_GetModuleDict(), name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
569 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
570 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
571 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
572 if (Py_VerboseFlag)
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
573 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
574 name, filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
575 return mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
576
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
578
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
579 PyObject *
68110
44cc9ef43127 Issue #3080: Mark _PyImport_FindBuiltin() argument as constant
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68107
diff changeset
580 _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
581 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
582 PyObject *res, *nameobj;
68713
ced52fcd95f6 Issue #3080: Use PyUnicode_InternFromString() for builtins
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68712
diff changeset
583 nameobj = PyUnicode_InternFromString(name);
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
584 if (nameobj == NULL)
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
585 return NULL;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
586 res = _PyImport_FindExtensionObject(nameobj, nameobj);
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
587 Py_DECREF(nameobj);
65418
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
588 return res;
fd5135cbd928 _PyImport_FixupExtension() and _PyImport_FindExtension() uses FS encoding
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65391
diff changeset
589 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
590
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
591 /* 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
592 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
593 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
594 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
595 '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
596
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
597 PyObject *
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
598 PyImport_AddModuleObject(PyObject *name)
40
f28ac7f621c7 Added reload() functionality.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
599 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
600 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
601 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
602
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
603 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
604 PyModule_Check(m))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
605 return m;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
606 m = PyModule_NewObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
607 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
608 return NULL;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
609 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
610 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
611 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
612 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
613 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
614
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
615 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
616 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
617
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
618 PyObject *
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
619 PyImport_AddModule(const char *name)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
620 {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
621 PyObject *nameobj, *module;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
622 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
623 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
624 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
625 module = PyImport_AddModuleObject(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
626 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
627 return module;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
628 }
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
629
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
630
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
631 /* 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
632 static void
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
633 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
634 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
635 PyObject *modules = PyImport_GetModuleDict();
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
636 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
637 return;
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
638 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
639 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
640 "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
641 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
642
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
643
2198
27557e70a8f0 fix import related leaks
Guido van Rossum <guido@python.org>
parents: 2128
diff changeset
644 /* 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
645 * 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
646 * 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
647 * 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
648 * 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
649 * example.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
650 *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
651 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
652 * 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
653 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
654 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
655 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
656 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
657 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
658 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
659 }
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
660
74c57288a02b Added PyImport_ExecCodeModuleEx(), which adds an extra parameter to
Guido van Rossum <guido@python.org>
parents: 7202
diff changeset
661 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
662 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
663 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
664 return PyImport_ExecCodeModuleWithPathnames(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
665 name, co, pathname, (char *)NULL);
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
666 }
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
667
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
668 PyObject *
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
669 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
670 char *cpathname)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
671 {
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
672 PyObject *m = NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
673 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
674
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
675 nameobj = PyUnicode_FromString(name);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
676 if (nameobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
677 return NULL;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
678
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
679 if (cpathname != NULL) {
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
680 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
681 if (cpathobj == NULL)
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
682 goto error;
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
683 }
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
684 else
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
685 cpathobj = NULL;
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
686
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
687 if (pathname != NULL) {
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
688 pathobj = PyUnicode_DecodeFSDefault(pathname);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
689 if (pathobj == NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
690 goto error;
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
691 }
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
692 else if (cpathobj != NULL) {
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
693 PyInterpreterState *interp = PyThreadState_GET()->interp;
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
694 _Py_IDENTIFIER(_get_sourcefile);
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
695
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
696 if (interp == NULL) {
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
697 Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
698 "no interpreter!");
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
699 }
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
700
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
701 pathobj = _PyObject_CallMethodObjIdArgs(interp->importlib,
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
702 &PyId__get_sourcefile, cpathobj,
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
703 NULL);
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
704 if (pathobj == NULL)
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
705 PyErr_Clear();
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
706 }
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
707 else
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
708 pathobj = NULL;
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
709
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
710 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
711 error:
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
712 Py_DECREF(nameobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
713 Py_XDECREF(pathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
714 Py_XDECREF(cpathobj);
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
715 return m;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
716 }
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
717
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
718 PyObject*
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
719 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
720 PyObject *cpathname)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
721 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
722 PyObject *modules = PyImport_GetModuleDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
723 PyObject *m, *d, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
724
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
725 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
726 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
727 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
728 /* 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
729 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
730 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
731 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
732 if (PyDict_SetItemString(d, "__builtins__",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
733 PyEval_GetBuiltins()) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
734 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
735 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
736 if (pathname != NULL) {
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
737 v = pathname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
738 }
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
739 else {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
740 v = ((PyCodeObject *)co)->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
741 }
78078
9e164b404983 Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents: 78052
diff changeset
742 Py_INCREF(v);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
743 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
744 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
745 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
746
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
747 /* 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
748 if (cpathname != NULL)
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
749 v = cpathname;
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
750 else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
751 v = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
752 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
753 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
754
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66650
diff changeset
755 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
756 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
757 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
758 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
759
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
760 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
761 PyErr_Format(PyExc_ImportError,
68229
0e7180e4c3cd Issue #3080: Add PyImport_AddModuleObject() and PyImport_ExecCodeModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68110
diff changeset
762 "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
763 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
764 return NULL;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
767 Py_INCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
768
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
769 return m;
32882
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
770
331e60d8ce6d PyImport_ExecCodeModuleEx(): remove module from sys.modules in error cases.
Tim Peters <tim.peters@gmail.com>
parents: 32879
diff changeset
771 error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
772 remove_module(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
773 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
776
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
777 static void
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
778 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
779 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
780 PyObject *constants, *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
781 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
782
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
783 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
784 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
785
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
786 tmp = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
787 co->co_filename = newname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
788 Py_INCREF(co->co_filename);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
789 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
790
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
791 constants = co->co_consts;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
792 n = PyTuple_GET_SIZE(constants);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
793 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
794 tmp = PyTuple_GET_ITEM(constants, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
795 if (PyCode_Check(tmp))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
796 update_code_filenames((PyCodeObject *)tmp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
797 oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
798 }
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
799 }
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
800
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
801 static void
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
802 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
803 {
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
804 PyObject *oldname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
805
68722
d24decc8c97e Issue #3080: Use Unicode to import source and compiled modules
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68721
diff changeset
806 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
807 return;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
808
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
809 oldname = co->co_filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
810 Py_INCREF(oldname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
811 update_code_filenames(co, oldname, newname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
812 Py_DECREF(oldname);
50619
2ff9910f1526 Merged revisions 68360-68361 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50492
diff changeset
813 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
814
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
815 static PyObject *
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
816 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
817 {
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
818 PyObject *co;
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
819 PyObject *file_path;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
820
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
821 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
822 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
823
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
824 if (!PyCode_Check(co)) {
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
825 PyErr_SetString(PyExc_TypeError,
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
826 "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
827 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
828 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
829
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
830 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
831 PyErr_SetString(PyExc_TypeError,
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
832 "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
833 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
834 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
835
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
836 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
837
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
838 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
839 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
840
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
841
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
842 /* Forward */
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
843 static struct _frozen * find_frozen(PyObject *);
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
844
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
845
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
846 /* Helper to test for built-in module */
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
847
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
848 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
849 is_builtin(PyObject *name)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
850 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
851 int i, cmp;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
852 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
853 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
854 if (cmp == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
855 if (PyImport_Inittab[i].initfunc == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
856 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
857 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
858 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
859 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
860 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
861 return 0;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
862 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
863
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
864
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
865 /* 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
866 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
867 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
868 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
869 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
870 import mechanism. Cache the result in path_importer_cache.
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
871 Returns a borrowed reference. */
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
872
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
873 static PyObject *
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
874 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
875 PyObject *p)
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
876 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
877 PyObject *importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
878 Py_ssize_t j, nhooks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
879
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
880 /* 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
881 assert(PyList_Check(path_hooks));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
882 assert(PyDict_Check(path_importer_cache));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
883
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
884 nhooks = PyList_Size(path_hooks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
885 if (nhooks < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
886 return NULL; /* Shouldn't happen */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
887
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
888 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
889 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
890 return importer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
891
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
892 /* 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
893 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
894 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
895
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
896 for (j = 0; j < nhooks; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
897 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
898 if (hook == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
899 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
900 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
901 if (importer != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
902 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
903
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
904 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
905 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
906 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
907 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
908 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
909 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
910 return Py_None;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
911 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
912 if (importer != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
913 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
914 Py_DECREF(importer);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
915 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
916 return NULL;
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 return importer;
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
919 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26796
diff changeset
920
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
921 PyAPI_FUNC(PyObject *)
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
922 PyImport_GetImporter(PyObject *path) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
923 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
924
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
925 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
926 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
927 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
928 path_hooks, path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
929 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
930 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
931 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
932 return importer;
43897
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
933 }
41f7c13ef161 Merged revisions 59005-59040 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43790
diff changeset
934
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
935
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
936 static int init_builtin(PyObject *); /* Forward */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 74
diff changeset
937
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
938 /* 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
939 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
940 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
941
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
942 static int
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
943 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
944 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
945 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
946
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
947 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
948 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
949
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
950 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
951 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
952 PyModuleDef *def;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
953 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
954 if (p->initfunc == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
955 PyErr_Format(PyExc_ImportError,
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
956 "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
957 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
958 return -1;
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 mod = (*p->initfunc)();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
961 if (mod == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
962 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
963 /* 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
964 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
965 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
966 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
967 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
968 /* 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
969 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
970 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
971 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
972 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
973 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
974 return 0;
141
bf5a8539d8ba Call the init function of a built-in module here.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
975 }
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
976
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
977
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
978 /* 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
979
3683
ec39264311ff struct frozen is now struct _frozen and comes from import.h.
Guido van Rossum <guido@python.org>
parents: 3590
diff changeset
980 static struct _frozen *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
981 find_frozen(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
982 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
983 struct _frozen *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
984
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
985 if (name == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
986 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
987
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
988 for (p = PyImport_FrozenModules; ; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
989 if (p->name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
990 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
991 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
992 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
993 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
994 return p;
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
995 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
996
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
997 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
998 get_frozen_object(PyObject *name)
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
999 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1000 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1001 int size;
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 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1004 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1005 "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
1006 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1007 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1008 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1009 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1010 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1011 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1012 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1013 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1014 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1015 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1016 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1017 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1018 return PyMarshal_ReadObjectFromString((char *)p->code, size);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1019 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1020
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1021 static PyObject *
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1022 is_frozen_package(PyObject *name)
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1023 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1024 struct _frozen *p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1025 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1026
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1027 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1028 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1029 "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
1030 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1031 return NULL;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1034 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1035
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1036 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1037 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1038 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1039 Py_RETURN_FALSE;
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1040 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1041
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1042
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1043 /* Initialize a frozen module.
52073
56983cfdf5d4 Fix a typo in a comment.
Brett Cannon <bcannon@gmail.com>
parents: 51996
diff changeset
1044 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
1045 an exception set if the initialization failed.
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1046 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
1047
6263e2fd9398 init_frozen non-static, frozenmain.c not in Makefile any more
Guido van Rossum <guido@python.org>
parents: 2270
diff changeset
1048 int
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1049 PyImport_ImportFrozenModuleObject(PyObject *name)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1050 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1051 struct _frozen *p;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1052 PyObject *co, *m, *path;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1053 int ispackage;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1054 int size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1055
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1056 p = find_frozen(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1057
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1058 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1059 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1060 if (p->code == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1061 PyErr_Format(PyExc_ImportError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1062 "Excluded frozen object named %R",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1063 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1064 return -1;
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 size = p->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1067 ispackage = (size < 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1068 if (ispackage)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1069 size = -size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1070 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
1071 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1072 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1073 if (!PyCode_Check(co)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1074 PyErr_Format(PyExc_TypeError,
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1075 "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
1076 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1077 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1078 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1079 if (ispackage) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1080 /* Set __path__ to the package name */
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1081 PyObject *d, *l;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1082 int err;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1083 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1084 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1085 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1086 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1087 l = PyList_New(1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1088 if (l == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1089 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1090 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1091 Py_INCREF(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1092 PyList_SET_ITEM(l, 0, name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1093 err = PyDict_SetItemString(d, "__path__", l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1094 Py_DECREF(l);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1095 if (err != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1096 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1097 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1098 path = PyUnicode_FromString("<frozen>");
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1099 if (path == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1100 goto err_return;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1101 m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1102 Py_DECREF(path);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1103 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1104 goto err_return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1105 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1106 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1107 return 1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1108 err_return:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1109 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1110 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
1111 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1112
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1113 int
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1114 PyImport_ImportFrozenModule(char *name)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1115 {
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1116 PyObject *nameobj;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1117 int ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1118 nameobj = PyUnicode_InternFromString(name);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1119 if (nameobj == NULL)
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1120 return -1;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1121 ret = PyImport_ImportFrozenModuleObject(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1122 Py_DECREF(nameobj);
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1123 return ret;
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1124 }
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1125
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1126
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1127 /* 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
1128 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
1129
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1130 PyObject *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35757
diff changeset
1131 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
1132 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1133 PyObject *pname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1134 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1135
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1136 pname = PyUnicode_FromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1137 if (pname == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1138 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1139 result = PyImport_Import(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1140 Py_DECREF(pname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1141 return result;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1142 }
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1143
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1144 /* Import a module without blocking
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1145 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1146 * 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
1147 * 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
1148 * 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
1149 * ImportError instead of blocking.
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1150 *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1151 * 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
1152 */
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1153 PyObject *
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1154 PyImport_ImportModuleNoBlock(const char *name)
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1155 {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1156 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
1157 }
ea8184bff12d Add a single Python-wide (!) lock on import. Only one thread at a
Guido van Rossum <guido@python.org>
parents: 7403
diff changeset
1158
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1159
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
1160 /* 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
1161 * 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
1162 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
1163 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
1164 {
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
1165 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
1166 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
1167 int always_trim = 0;
78044
7ed3b4f830c0 initialize variable for compiler happiness
Benjamin Peterson <benjamin@python.org>
parents: 78042
diff changeset
1168 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
1169 PyObject *exception, *value, *base_tb, *tb;
78044
7ed3b4f830c0 initialize variable for compiler happiness
Benjamin Peterson <benjamin@python.org>
parents: 78042
diff changeset
1170 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
1171
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
1172 /* 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
1173 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
1174 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
1175
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
1176 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
1177 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
1178 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
1179 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
1180 (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
1181 always_trim = 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1182
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
1183 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
1184 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
1185 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
1186 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
1187 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
1188 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
1189 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
1190 int now_in_importlib;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1191
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
1192 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
1193 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
1194 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
1195 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
1196 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
1197 /* 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
1198 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
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 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
1201
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
1202 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
1203 (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
1204 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
1205 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
1206 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
1207 *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
1208 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
1209 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
1210 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
1211 }
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 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
1213 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
1214 }
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 tb = next;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1216 }
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
1217 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
1218 PyErr_Restore(exception, value, base_tb);
44441
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1219 }
b91ca87e6f32 Merged revisions 59666-59679 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
1220
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
1221
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1222 PyObject *
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1223 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
1224 PyObject *locals, PyObject *given_fromlist,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1225 int level)
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1226 {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1227 _Py_IDENTIFIER(__import__);
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1228 _Py_IDENTIFIER(__initializing__);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1229 _Py_IDENTIFIER(__package__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1230 _Py_IDENTIFIER(__path__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1231 _Py_IDENTIFIER(__name__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1232 _Py_IDENTIFIER(_find_and_load);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1233 _Py_IDENTIFIER(_handle_fromlist);
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1234 _Py_IDENTIFIER(_lock_unlock_module);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1235 _Py_static_string(single_dot, ".");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1236 PyObject *abs_name = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1237 PyObject *builtins_import = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1238 PyObject *final_mod = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1239 PyObject *mod = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1240 PyObject *package = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1241 PyObject *globals = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1242 PyObject *fromlist = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1243 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
1244
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1245 /* 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
1246 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
1247 NULL argument. */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1248 if (given_globals == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1249 globals = PyDict_New();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1250 if (globals == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1251 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1252 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1253 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1254 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1255 /* 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
1256 for something. */
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1257 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
1258 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
1259 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1260 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1261 globals = given_globals;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1262 Py_INCREF(globals);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1263 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1264
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1265 if (given_fromlist == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1266 fromlist = PyList_New(0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1267 if (fromlist == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1268 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1269 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1270 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1271 else {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1272 fromlist = given_fromlist;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1273 Py_INCREF(fromlist);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1274 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1275 if (name == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1276 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
1277 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1278 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1279
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1280 /* 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
1281 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
1282
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1283 if (!PyUnicode_Check(name)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1284 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
1285 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1286 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1287 else if (PyUnicode_READY(name) < 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1288 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1289 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1290 if (level < 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1291 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
1292 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
1293 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1294 else if (level > 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1295 package = _PyDict_GetItemId(globals, &PyId___package__);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1296 if (package != NULL && package != Py_None) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1297 Py_INCREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1298 if (!PyUnicode_Check(package)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1299 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
1300 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1301 }
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 else {
76380
68f9ad6a3b13 Issue #14592: A relative import will raise a KeyError if __package__
Brett Cannon <brett@python.org>
parents: 76379
diff changeset
1304 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
1305 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
1306 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
1307 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1308 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1309 else if (!PyUnicode_Check(package)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1310 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
1311 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1312 Py_INCREF(package);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1313
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1314 if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) {
76304
6cfb6fb18e1f Undo a C99 idiom.
Brett Cannon <brett@python.org>
parents: 76303
diff changeset
1315 PyObject *partition = NULL;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1316 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
1317 if (borrowed_dot == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1318 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1319 }
76304
6cfb6fb18e1f Undo a C99 idiom.
Brett Cannon <brett@python.org>
parents: 76303
diff changeset
1320 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
1321 Py_DECREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1322 if (partition == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1323 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1324 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1325 package = PyTuple_GET_ITEM(partition, 0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1326 Py_INCREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1327 Py_DECREF(partition);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1328 }
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 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
1332 PyErr_Format(PyExc_SystemError,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1333 "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
1334 "import", package);
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 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1337 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1338 else { /* level == 0 */
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1339 if (PyUnicode_GET_LENGTH(name) == 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1340 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
1341 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
1342 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1343 package = Py_None;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1344 Py_INCREF(package);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1345 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1346
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1347 if (level > 0) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1348 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
1349 PyObject *base = NULL;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1350 int level_up = 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1351
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1352 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
1353 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
1354 if (last_dot == -2) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1355 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1356 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1357 else if (last_dot == -1) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1358 PyErr_SetString(PyExc_ValueError,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1359 "attempted relative import beyond top-level "
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1360 "package");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1361 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1362 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1363 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1364 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
1365 if (PyUnicode_GET_LENGTH(name) > 0) {
76361
a3e9d5c239c4 Fix a refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76358
diff changeset
1366 PyObject *borrowed_dot, *seq = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1367
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1368 borrowed_dot = _PyUnicode_FromId(&single_dot);
76361
a3e9d5c239c4 Fix a refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76358
diff changeset
1369 seq = PyTuple_Pack(2, base, name);
a3e9d5c239c4 Fix a refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76358
diff changeset
1370 Py_DECREF(base);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1371 if (borrowed_dot == NULL || seq == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1372 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1373 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1374
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1375 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
1376 Py_DECREF(seq);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1377 if (abs_name == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1378 goto error;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1379 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1380 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1381 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1382 abs_name = base;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1383 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1384 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1385 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1386 abs_name = name;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1387 Py_INCREF(abs_name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1388 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1389
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
1390 #ifdef WITH_THREAD
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1391 _PyImport_AcquireLock();
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1392 #endif
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1393 /* 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
1394 if (PyDict_Check(globals)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1395 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
1396 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1397 if (builtins_import == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1398 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
1399 if (builtins_import == NULL) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1400 Py_FatalError("__import__ missing");
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1401 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1402 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1403 Py_INCREF(builtins_import);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1404
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1405 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
1406 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
1407 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
1408 "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
1409 if (msg != NULL) {
76379
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76371
diff changeset
1410 PyErr_SetImportError(msg, abs_name, NULL);
7a32b9380ffd Fix #14600. Correct reference handling and naming of ImportError convenience function
Brian Curtin <brian@python.org>
parents: 76371
diff changeset
1411 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
1412 }
76358
feeb1ca9e93c Fix reference loss on Py_None when None is encountered in sys.modules.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76342
diff changeset
1413 mod = NULL;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1414 goto error_with_unlock;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1415 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1416 else if (mod != NULL) {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1417 PyObject *value;
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1418 int initializing = 0;
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1419
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1420 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
1421 /* 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
1422 __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
1423 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
1424 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
1425 */
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1426 value = _PyObject_GetAttrId(mod, &PyId___initializing__);
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1427 if (value == NULL)
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1428 PyErr_Clear();
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1429 else {
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1430 initializing = PyObject_IsTrue(value);
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1431 Py_DECREF(value);
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1432 if (initializing == -1)
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1433 PyErr_Clear();
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1434 }
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1435 if (initializing > 0) {
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1436 /* _bootstrap._lock_unlock_module() releases the import lock */
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1437 value = _PyObject_CallMethodObjIdArgs(interp->importlib,
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1438 &PyId__lock_unlock_module, abs_name,
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1439 NULL);
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1440 if (value == NULL)
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1441 goto error;
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1442 Py_DECREF(value);
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1443 }
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1444 else {
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1445 #ifdef WITH_THREAD
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1446 if (_PyImport_ReleaseLock() < 0) {
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1447 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
1448 goto error;
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1449 }
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1450 #endif
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1451 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1452 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1453 else {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1454 /* _bootstrap._find_and_load() releases the import lock */
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1455 mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1456 &PyId__find_and_load, abs_name,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1457 builtins_import, NULL);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1458 if (mod == NULL) {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1459 goto error;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1460 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1461 }
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1462 /* 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
1463
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1464 if (PyObject_Not(fromlist)) {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1465 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
1466 PyObject *front = NULL;
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
1467 PyObject *partition = NULL;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1468 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
1469
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1470 if (borrowed_dot == NULL) {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1471 goto error;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1472 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1473
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
1474 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
1475 if (partition == NULL) {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1476 goto error;
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1477 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1478
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
1479 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
1480 /* 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
1481 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
1482 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
1483 Py_INCREF(mod);
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1484 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
1485 }
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
1486
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1487 front = PyTuple_GET_ITEM(partition, 0);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1488 Py_INCREF(front);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1489 Py_DECREF(partition);
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 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
1492 final_mod = PyObject_CallFunctionObjArgs(builtins_import, front, NULL);
76799
49306ceaf91f Fix too early decrefs.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76768
diff changeset
1493 Py_DECREF(front);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1494 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1495 else {
76362
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1496 Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) -
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1497 PyUnicode_GET_LENGTH(front);
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1498 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
1499 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
1500 abs_name_len - cut_off);
76362
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1501 Py_DECREF(front);
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1502 if (to_return == NULL) {
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1503 goto error;
76362
9d8839289e18 Fix another refleak
Antoine Pitrou <solipsis@pitrou.net>
parents: 76361
diff changeset
1504 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1505
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1506 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
1507 if (final_mod == NULL) {
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1508 PyErr_Format(PyExc_KeyError,
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1509 "%R not in sys.modules as expected",
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1510 to_return);
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1511 }
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1512 else {
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1513 Py_INCREF(final_mod);
9e8cbf07068a Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents: 76307
diff changeset
1514 }
76799
49306ceaf91f Fix too early decrefs.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76768
diff changeset
1515 Py_DECREF(to_return);
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1516 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1517 }
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1518 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1519 final_mod = mod;
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1520 Py_INCREF(mod);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1521 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1522 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1523 else {
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1524 final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1525 &PyId__handle_fromlist, mod,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1526 fromlist, builtins_import,
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1527 NULL);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1528 }
77013
edb9ce3a6c2e Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76848
diff changeset
1529 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1530
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1531 error_with_unlock:
76307
c5da5a2a9262 Fix Windows build
Brian Curtin <brian@python.org>
parents: 76304
diff changeset
1532 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1533 if (_PyImport_ReleaseLock() < 0) {
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1534 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
1535 }
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1536 #endif
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1537 error:
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1538 Py_XDECREF(abs_name);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1539 Py_XDECREF(builtins_import);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1540 Py_XDECREF(mod);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1541 Py_XDECREF(package);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1542 Py_XDECREF(globals);
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1543 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
1544 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
1545 remove_importlib_frames();
76303
2dd046be2c88 Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents: 75826
diff changeset
1546 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
1547 }
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
1548
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
1549 PyObject *
70374
a9126e8770e5 make PyImport_ImportModuleLevel's first arg const like similiar functions (closes #12173)
Benjamin Peterson <benjamin@python.org>
parents: 69463
diff changeset
1550 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
1551 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
1552 {
68739
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1553 PyObject *nameobj, *mod;
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1554 nameobj = PyUnicode_FromString(name);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1555 if (nameobj == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1556 return NULL;
68739
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1557 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1558 fromlist, level);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1559 Py_DECREF(nameobj);
80f4bd647695 Issue #3080: Add PyImport_ImportModuleLevelObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68738
diff changeset
1560 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
1561 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1562
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1563
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1564 /* 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
1565 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
1566
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1567 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1568 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
1569 {
76640
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1570 _Py_IDENTIFIER(reload);
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1571 PyObject *reloaded_module = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1572 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
1573 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
1574 if (imp == NULL) {
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1575 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
1576 if (imp == NULL) {
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1577 return NULL;
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1578 }
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1579 }
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1580 else {
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1581 Py_INCREF(imp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1582 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1583
76640
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1584 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
1585 Py_DECREF(imp);
eb68502731dd Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76633
diff changeset
1586 return reloaded_module;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1262
diff changeset
1587 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1588
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1589
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1590 /* 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
1591 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
1592 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
1593 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
1594 environment.
9680
8b61e1273b4b Improve comment for PyImport_Import() as suggested by Bill Tutt.
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
1595 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
1596 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
1597 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
1598
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1599 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1600 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
1601 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1602 static PyObject *silly_list = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1603 static PyObject *builtins_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1604 static PyObject *import_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1605 PyObject *globals = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1606 PyObject *import = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1607 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
1608 PyObject *modules = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1609 PyObject *r = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1610
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1611 /* Initialize constant string objects */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1612 if (silly_list == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1613 import_str = PyUnicode_InternFromString("__import__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1614 if (import_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1615 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1616 builtins_str = PyUnicode_InternFromString("__builtins__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1617 if (builtins_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1618 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
1619 silly_list = PyList_New(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1620 if (silly_list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1621 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1622 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1623
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1624 /* Get the builtins from current globals */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1625 globals = PyEval_GetGlobals();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1626 if (globals != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1627 Py_INCREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1628 builtins = PyObject_GetItem(globals, builtins_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1629 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1630 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1631 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1632 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1633 /* 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
1634 builtins = PyImport_ImportModuleLevel("builtins",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1635 NULL, NULL, NULL, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1636 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1637 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1638 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
1639 if (globals == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1640 goto err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1641 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1642
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1643 /* 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
1644 if (PyDict_Check(builtins)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1645 import = PyObject_GetItem(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1646 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1647 PyErr_SetObject(PyExc_KeyError, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1648 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1649 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1650 import = PyObject_GetAttr(builtins, import_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1651 if (import == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1652 goto err;
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 /* 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
1655 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
1656 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
1657 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
1658 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
1659 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
1660 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
1661 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
1662
dd3080b80dda PyImport_Import was using the old import hack of sticking a dummy value into
Brett Cannon <bcannon@gmail.com>
parents: 64638
diff changeset
1663 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
1664 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
1665 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
1666 Py_INCREF(r);
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1667
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1668 err:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1669 Py_XDECREF(globals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1670 Py_XDECREF(builtins);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1671 Py_XDECREF(import);
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 return r;
6028
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1674 }
292193170da1 Added Jim Fulton's PyImport_Import(), which calls whatever
Guido van Rossum <guido@python.org>
parents: 5980
diff changeset
1675
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1676 static PyObject *
76754
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1677 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
1678 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1679 PyObject *list;
76754
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1680 const char *suffix;
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1681 unsigned int index = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1682
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1683 list = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1684 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1685 return NULL;
76754
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1686 #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
1687 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
1688 PyObject *item = PyUnicode_FromString(suffix);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1689 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1690 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1691 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1692 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1693 if (PyList_Append(list, item) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1694 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1695 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1696 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1697 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1698 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
1699 index += 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1700 }
76754
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1701 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1702 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
1703 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1704
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1705 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1706 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
1707 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1708 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1709 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1710 PyObject *m;
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1711 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
1712 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1713 ret = init_builtin(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1714 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1715 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1716 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1717 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1718 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1719 }
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1720 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1721 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1722 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
1723 }
1844
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1724
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1725 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1726 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
1727 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1728 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1729 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1730 PyObject *m;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1731 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
1732 return NULL;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1733 ret = PyImport_ImportFrozenModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1734 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1735 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1736 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1737 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1738 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1739 }
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1740 m = PyImport_AddModuleObject(name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1741 Py_XINCREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1742 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
1743 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1744
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1745 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1746 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
1747 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1748 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1749
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1750 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
1751 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1752 return get_frozen_object(name);
2891
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
diff changeset
1753 }
964d76f49a5e add imp.get_frozen_object()
Guido van Rossum <guido@python.org>
parents: 2868
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 *
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1756 imp_is_frozen_package(PyObject *self, PyObject *args)
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
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
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1760 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
1761 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1762 return is_frozen_package(name);
52168
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1763 }
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1764
70f5f9113ae1 Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents: 52073
diff changeset
1765 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1766 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
1767 {
68712
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1768 PyObject *name;
2425717c6430 Issue #3080: Import builtins using Unicode strings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68711
diff changeset
1769 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
1770 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1771 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
1772 }
d1e6c9a64a56 * Python/import.c: support *.o/*.so as alternative for
Guido van Rossum <guido@python.org>
parents: 1415
diff changeset
1773
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1774 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1775 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
1776 {
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1777 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1778 struct _frozen *p;
68711
e7c1019b27b9 Issue #3080: Add PyImport_ImportFrozenModuleObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68710
diff changeset
1779 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
1780 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1781 p = find_frozen(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1782 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
1783 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1784
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1785 #ifdef HAVE_DYNAMIC_LOADING
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1786
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1787 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1788 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
1789 {
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1790 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
1791 FILE *fp;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1792
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1793 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
1794 &name, PyUnicode_FSDecoder, &pathname, &fob))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1795 return NULL;
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1796 if (fob != NULL) {
76764
cd519a923d41 Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents: 76760
diff changeset
1797 fp = _Py_fopen(pathname, "r");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1798 if (fp == NULL) {
68826
3114f26d5d54 Issue #11630, issue #3080: Fix refleak introduced by ef2b6305d395
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68823
diff changeset
1799 Py_DECREF(pathname);
76764
cd519a923d41 Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents: 76760
diff changeset
1800 if (!PyErr_Occurred())
cd519a923d41 Simplify code for load_dynamic()
Antoine Pitrou <solipsis@pitrou.net>
parents: 76760
diff changeset
1801 PyErr_SetFromErrno(PyExc_IOError);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1802 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1803 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1804 }
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1805 else
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1806 fp = NULL;
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1807 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
1808 Py_DECREF(pathname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1809 if (fp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1810 fclose(fp);
68716
ef2b6305d395 Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68715
diff changeset
1811 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
1812 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1813
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1814 #endif /* HAVE_DYNAMIC_LOADING */
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1815
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60022
diff changeset
1816
6305
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
1817 /* Doc strings */
6e1fa76e7940 Added docstrings. Not for the obsolete functions though.
Guido van Rossum <guido@python.org>
parents: 6304
diff changeset
1818
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
1819 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
1820 "(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
1821
76754
257cbd2fac38 Issue #13959: Re-implement imp.get_suffixes() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents: 76640
diff changeset
1822 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
1823 "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
1824 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
1825
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23586
diff changeset
1826 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
1827 "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
1828 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
1829 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
1830
27852
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
1831 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
1832 "acquire_lock() -> None\n\
27853
5620b0786271 Cleanup from patch #683257:
Neal Norwitz <nnorwitz@gmail.com>
parents: 27852
diff changeset
1833 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
1834 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
1835 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
1836 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
1837
4b75a0b76857 Provide access to the import lock, fixing SF bug #580952. This is
Guido van Rossum <guido@python.org>
parents: 27357
diff changeset
1838 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
1839 "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
1840 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
1841 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
1842
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1843 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
1844 {"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
1845 doc_extension_suffixes},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1846 {"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
1847 {"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
1848 {"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
1849 {"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
1850 {"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
1851 {"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
1852 {"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
1853 {"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
1854 {"is_frozen", imp_is_frozen, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1855 #ifdef HAVE_DYNAMIC_LOADING
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1856 {"load_dynamic", imp_load_dynamic, METH_VARARGS},
11618
528559a0b2f2 Cleanup patches from Greg Stein:
Guido van Rossum <guido@python.org>
parents: 11602
diff changeset
1857 #endif
68887
5deb2094f033 Make importlib compatible with __import__ by "fixing" code.co_filename
Brett Cannon <brett@python.org>
parents: 68826
diff changeset
1858 {"_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
1859 {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
1860 };
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2040
diff changeset
1861
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1862
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1863 static struct PyModuleDef impmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1864 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
1865 "_imp",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1866 doc_imp,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1867 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1868 imp_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1869 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1870 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1871 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1872 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1873 };
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1874
30311
f003e48f562d Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents: 29812
diff changeset
1875 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
1876 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
1877 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1878 PyObject *m, *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1879
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1880 m = PyModule_Create(&impmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1881 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1882 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1883 d = PyModule_GetDict(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1884 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1885 goto failure;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1886
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1887 return m;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6055
diff changeset
1888 failure:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1889 Py_XDECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1890 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
1891 }
8330
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
1892
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
1893
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12543
diff changeset
1894 /* 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
1895 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
1896 *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
1897 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
1898
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
1899 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
1900
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
1901 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13552
diff changeset
1902 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
1903 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1904 static struct _inittab *our_copy = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1905 struct _inittab *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1906 int i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1907
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1908 /* 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
1909 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
1910 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1911 if (n == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1912 return 0; /* Nothing to do */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1913 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
1914 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1915
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1916 /* 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
1917 p = our_copy;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1918 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
1919 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1920 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1921
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1922 /* 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
1923 if (our_copy != PyImport_Inittab)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1924 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
1925 PyImport_Inittab = our_copy = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1926 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
1927
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1928 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
1929 }
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 /* 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
1932
7a1e7da922f8 New APIs for embedding applications that want to add their own entries
Guido van Rossum <guido@python.org>
parents: 8012
diff changeset
1933 int
52721
54e093bd887e Merged revisions 71031 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 52547
diff changeset
1934 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
1935 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1936 struct _inittab newtab[2];
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 memset(newtab, '\0', sizeof newtab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1939
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1940 newtab[0].name = (char *)name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1941 newtab[0].initfunc = initfunc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1942
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59865
diff changeset
1943 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
1944 }
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
1945
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
1946 #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
1947 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
1948 #endif