blob: c634edb4c7fcb7ecf0971462c3eda8abef147b14 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module definition and import implementation */
2
Guido van Rossum79f25d91997-04-29 20:08:16 +00003#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "Python-ast.h"
Victor Stinner3bb183d2018-11-22 18:38:38 +01006#undef Yield /* undefine macro conflicting with <winbase.h> */
Victor Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pyhash.h"
8#include "pycore_pylifecycle.h"
9#include "pycore_pymem.h"
10#include "pycore_pystate.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000012#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Antoine Pitroubc07a5c2012-07-08 12:01:27 +020014#include "frameobject.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000015#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016#include "importdl.h"
Christian Heimes3d2b4072017-09-30 00:53:19 +020017#include "pydtrace.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000018
Guido van Rossum55a83382000-09-20 20:31:38 +000019#ifdef HAVE_FCNTL_H
20#include <fcntl.h>
21#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000022#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000023extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000025
Barry Warsaw28a691b2010-04-17 00:19:56 +000026#define CACHEDIR "__pycache__"
Guido van Rossum96774c12000-05-01 20:19:08 +000027
Victor Stinner95872862011-03-07 18:20:56 +010028/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +000029static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000030
Guido van Rossum771c6c81997-10-31 18:37:24 +000031/* This table is defined in config.c: */
32extern struct _inittab _PyImport_Inittab[];
33
34struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Victor Stinner92a3c6f2017-12-06 18:12:59 +010035static struct _inittab *inittab_copy = NULL;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000036
Brett Cannon4caa61d2014-01-09 19:03:32 -050037/*[clinic input]
38module _imp
39[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030040/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
Brett Cannonfd4d0502014-05-30 11:21:14 -040041
42#include "clinic/import.c.h"
Brett Cannon4caa61d2014-01-09 19:03:32 -050043
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Victor Stinnerf7e5b562017-11-15 15:48:08 -080046_PyInitError
Victor Stinner672b6ba2017-12-06 17:25:50 +010047_PyImport_Init(PyInterpreterState *interp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048{
Serhiy Storchaka013bb912014-02-10 18:21:34 +020049 interp->builtins_copy = PyDict_Copy(interp->builtins);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080050 if (interp->builtins_copy == NULL) {
51 return _Py_INIT_ERR("Can't backup builtins dict");
52 }
53 return _Py_INIT_OK();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054}
55
Victor Stinnerf7e5b562017-11-15 15:48:08 -080056_PyInitError
Just van Rossum52e14d62002-12-30 22:08:05 +000057_PyImportHooks_Init(void)
58{
Brett Cannonfd074152012-04-14 14:10:13 -040059 PyObject *v, *path_hooks = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +000061
Brett Cannonfd074152012-04-14 14:10:13 -040062 /* adding sys.path_hooks and sys.path_importer_cache */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 v = PyList_New(0);
64 if (v == NULL)
65 goto error;
66 err = PySys_SetObject("meta_path", v);
67 Py_DECREF(v);
68 if (err)
69 goto error;
70 v = PyDict_New();
71 if (v == NULL)
72 goto error;
73 err = PySys_SetObject("path_importer_cache", v);
74 Py_DECREF(v);
75 if (err)
76 goto error;
77 path_hooks = PyList_New(0);
78 if (path_hooks == NULL)
79 goto error;
80 err = PySys_SetObject("path_hooks", path_hooks);
81 if (err) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -080082 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 }
Brett Cannonfd074152012-04-14 14:10:13 -040084 Py_DECREF(path_hooks);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080085 return _Py_INIT_OK();
86
87 error:
88 PyErr_Print();
89 return _Py_INIT_ERR("initializing sys.meta_path, sys.path_hooks, "
90 "or path_importer_cache failed");
Brett Cannonfd074152012-04-14 14:10:13 -040091}
92
Victor Stinnerf7e5b562017-11-15 15:48:08 -080093_PyInitError
Victor Stinner410b85a2019-05-13 17:12:45 +020094_PyImportZip_Init(PyInterpreterState *interp)
Brett Cannonfd074152012-04-14 14:10:13 -040095{
ukwksk5e6312c2018-05-15 04:10:52 +090096 PyObject *path_hooks, *zipimport;
Brett Cannonfd074152012-04-14 14:10:13 -040097 int err = 0;
98
99 path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200100 if (path_hooks == NULL) {
101 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path_hooks");
Brett Cannonfd074152012-04-14 14:10:13 -0400102 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200103 }
Brett Cannonfd074152012-04-14 14:10:13 -0400104
Victor Stinner410b85a2019-05-13 17:12:45 +0200105 int verbose = interp->core_config.verbose;
106 if (verbose) {
Brett Cannonfd074152012-04-14 14:10:13 -0400107 PySys_WriteStderr("# installing zipimport hook\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200108 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000109
ukwksk5e6312c2018-05-15 04:10:52 +0900110 zipimport = PyImport_ImportModule("zipimport");
111 if (zipimport == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 PyErr_Clear(); /* No zip import module -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +0200113 if (verbose) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 PySys_WriteStderr("# can't import zipimport\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 }
117 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200118 _Py_IDENTIFIER(zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900119 PyObject *zipimporter = _PyObject_GetAttrId(zipimport,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200120 &PyId_zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900121 Py_DECREF(zipimport);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 if (zipimporter == NULL) {
123 PyErr_Clear(); /* No zipimporter object -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +0200124 if (verbose) {
125 PySys_WriteStderr("# can't import zipimport.zipimporter\n");
126 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 }
128 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -0400129 /* sys.path_hooks.insert(0, zipimporter) */
130 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -0400132 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -0400134 }
Victor Stinner410b85a2019-05-13 17:12:45 +0200135 if (verbose) {
136 PySys_WriteStderr("# installed zipimport hook\n");
137 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 }
139 }
Brett Cannonfd074152012-04-14 14:10:13 -0400140
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800141 return _Py_INIT_OK();
Brett Cannonfd074152012-04-14 14:10:13 -0400142
143 error:
144 PyErr_Print();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800145 return _Py_INIT_ERR("initializing zipimport failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000146}
147
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148/* Locking primitives to prevent parallel imports of the same module
149 in different threads to return with a partially loaded module.
150 These calls are serialized by the global interpreter lock. */
151
Guido van Rossum49b56061998-10-01 20:42:43 +0000152#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000153
Guido van Rossum65d5b571998-12-21 19:32:43 +0000154static PyThread_type_lock import_lock = 0;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200155static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000156static int import_lock_level = 0;
157
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000158void
159_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200161 unsigned long me = PyThread_get_thread_ident();
162 if (me == PYTHREAD_INVALID_THREAD_ID)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 return; /* Too bad */
164 if (import_lock == NULL) {
165 import_lock = PyThread_allocate_lock();
166 if (import_lock == NULL)
167 return; /* Nothing much we can do. */
168 }
169 if (import_lock_thread == me) {
170 import_lock_level++;
171 return;
172 }
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200173 if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
174 !PyThread_acquire_lock(import_lock, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 {
176 PyThreadState *tstate = PyEval_SaveThread();
177 PyThread_acquire_lock(import_lock, 1);
178 PyEval_RestoreThread(tstate);
179 }
Antoine Pitrou202b6062012-12-18 22:18:17 +0100180 assert(import_lock_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 import_lock_thread = me;
182 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000183}
184
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000185int
186_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000187{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200188 unsigned long me = PyThread_get_thread_ident();
189 if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 return 0; /* Too bad */
191 if (import_lock_thread != me)
192 return -1;
193 import_lock_level--;
Antoine Pitrou202b6062012-12-18 22:18:17 +0100194 assert(import_lock_level >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 if (import_lock_level == 0) {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200196 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 PyThread_release_lock(import_lock);
198 }
199 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000200}
201
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200202/* This function is called from PyOS_AfterFork_Child to ensure that newly
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000203 created child processes do not share locks with the parent.
204 We now acquire the import lock around fork() calls but on some platforms
205 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000206
207void
208_PyImport_ReInitLock(void)
209{
Christian Heimes418fd742015-04-19 21:08:42 +0200210 if (import_lock != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 import_lock = PyThread_allocate_lock();
Christian Heimes418fd742015-04-19 21:08:42 +0200212 if (import_lock == NULL) {
213 Py_FatalError("PyImport_ReInitLock failed to create a new lock");
214 }
215 }
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000216 if (import_lock_level > 1) {
217 /* Forked as a side effect of import */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200218 unsigned long me = PyThread_get_thread_ident();
Brett Cannone4710cf2012-11-15 21:39:36 -0500219 /* The following could fail if the lock is already held, but forking as
220 a side-effect of an import is a) rare, b) nuts, and c) difficult to
221 do thanks to the lock only being held when doing individual module
222 locks per import. */
223 PyThread_acquire_lock(import_lock, NOWAIT_LOCK);
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000224 import_lock_thread = me;
225 import_lock_level--;
226 } else {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200227 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000228 import_lock_level = 0;
229 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000230}
231
Brett Cannon4caa61d2014-01-09 19:03:32 -0500232/*[clinic input]
233_imp.lock_held
234
235Return True if the import lock is currently held, else False.
236
237On platforms without threads, return False.
238[clinic start generated code]*/
239
Brett Cannon4caa61d2014-01-09 19:03:32 -0500240static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300241_imp_lock_held_impl(PyObject *module)
242/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
Tim Peters69232342001-08-30 05:16:13 +0000243{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200244 return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
Tim Peters69232342001-08-30 05:16:13 +0000245}
246
Brett Cannon4caa61d2014-01-09 19:03:32 -0500247/*[clinic input]
248_imp.acquire_lock
249
250Acquires the interpreter's import lock for the current thread.
251
252This lock should be used by import hooks to ensure thread-safety when importing
253modules. On platforms without threads, this function does nothing.
254[clinic start generated code]*/
255
Brett Cannon4caa61d2014-01-09 19:03:32 -0500256static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300257_imp_acquire_lock_impl(PyObject *module)
258/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 _PyImport_AcquireLock();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200261 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000262}
263
Brett Cannon4caa61d2014-01-09 19:03:32 -0500264/*[clinic input]
265_imp.release_lock
266
267Release the interpreter's import lock.
268
269On platforms without threads, this function does nothing.
270[clinic start generated code]*/
271
Brett Cannon4caa61d2014-01-09 19:03:32 -0500272static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300273_imp_release_lock_impl(PyObject *module)
274/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 if (_PyImport_ReleaseLock() < 0) {
277 PyErr_SetString(PyExc_RuntimeError,
278 "not holding the import lock");
279 return NULL;
280 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200281 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000282}
283
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100284void
285_PyImport_Fini(void)
286{
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200287 Py_CLEAR(extensions);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100288 if (import_lock != NULL) {
289 PyThread_free_lock(import_lock);
290 import_lock = NULL;
291 }
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100292}
293
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100294void
295_PyImport_Fini2(void)
296{
297 /* Use the same memory allocator than PyImport_ExtendInittab(). */
298 PyMemAllocatorEx old_alloc;
299 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
300
301 /* Free memory allocated by PyImport_ExtendInittab() */
302 PyMem_RawFree(inittab_copy);
303
304 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
305}
306
Guido van Rossum25ce5661997-08-02 03:10:38 +0000307/* Helper for sys */
308
309PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000310PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000311{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200312 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow3f9eee62017-09-15 16:35:20 -0600313 if (interp->modules == NULL) {
Eric Snow93c92f72017-09-13 23:46:04 -0700314 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
Eric Snow3f9eee62017-09-15 16:35:20 -0600315 }
Eric Snow93c92f72017-09-13 23:46:04 -0700316 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317}
318
Eric Snowd393c1b2017-09-14 12:18:12 -0600319/* In some corner cases it is important to be sure that the import
320 machinery has been initialized (or not cleaned up yet). For
321 example, see issue #4236 and PyModule_Create2(). */
322
323int
324_PyImport_IsInitialized(PyInterpreterState *interp)
325{
326 if (interp->modules == NULL)
327 return 0;
328 return 1;
329}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330
Eric Snow3f9eee62017-09-15 16:35:20 -0600331PyObject *
332_PyImport_GetModuleId(struct _Py_Identifier *nameid)
333{
334 PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
335 if (name == NULL) {
336 return NULL;
337 }
338 return PyImport_GetModule(name);
339}
340
341int
342_PyImport_SetModule(PyObject *name, PyObject *m)
343{
344 PyObject *modules = PyImport_GetModuleDict();
345 return PyObject_SetItem(modules, name, m);
346}
347
348int
349_PyImport_SetModuleString(const char *name, PyObject *m)
350{
351 PyObject *modules = PyImport_GetModuleDict();
352 return PyMapping_SetItemString(modules, name, m);
353}
354
355PyObject *
356PyImport_GetModule(PyObject *name)
357{
358 PyObject *m;
359 PyObject *modules = PyImport_GetModuleDict();
360 if (modules == NULL) {
361 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
362 return NULL;
363 }
364 Py_INCREF(modules);
365 if (PyDict_CheckExact(modules)) {
366 m = PyDict_GetItemWithError(modules, name); /* borrowed */
367 Py_XINCREF(m);
368 }
369 else {
370 m = PyObject_GetItem(modules, name);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300371 if (m == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600372 PyErr_Clear();
373 }
374 }
375 Py_DECREF(modules);
376 return m;
377}
378
379
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000380/* List of names to clear in sys */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200381static const char * const sys_deletes[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 "path", "argv", "ps1", "ps2",
383 "last_type", "last_value", "last_traceback",
384 "path_hooks", "path_importer_cache", "meta_path",
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200385 "__interactivehook__",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 /* misc stuff */
387 "flags", "float_info",
388 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000389};
390
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200391static const char * const sys_files[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 "stdin", "__stdin__",
393 "stdout", "__stdout__",
394 "stderr", "__stderr__",
395 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000396};
397
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000398/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000401PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402{
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200403 Py_ssize_t pos;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 PyObject *key, *value, *dict;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200405 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snowd393c1b2017-09-14 12:18:12 -0600406 PyObject *modules = PyImport_GetModuleDict();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200407 PyObject *weaklist = NULL;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200408 const char * const *p;
Guido van Rossum758eec01998-01-19 21:58:26 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 if (modules == NULL)
411 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 /* Delete some special variables first. These are common
414 places where user values hide and people complain when their
415 destructors fail. Since the modules containing them are
416 deleted *last* of all, they would come too late in the normal
417 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000418
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200419 /* XXX Perhaps these precautions are obsolete. Who knows? */
420
Victor Stinner410b85a2019-05-13 17:12:45 +0200421 int verbose = interp->core_config.verbose;
422 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200423 PySys_WriteStderr("# clear builtins._\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200424 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300425 if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300426 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300427 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200428
429 for (p = sys_deletes; *p != NULL; p++) {
Victor Stinner410b85a2019-05-13 17:12:45 +0200430 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200431 PySys_WriteStderr("# clear sys.%s\n", *p);
Victor Stinner410b85a2019-05-13 17:12:45 +0200432 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300433 if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300434 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300435 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200437 for (p = sys_files; *p != NULL; p+=2) {
Victor Stinner410b85a2019-05-13 17:12:45 +0200438 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200439 PySys_WriteStderr("# restore sys.%s\n", *p);
Victor Stinner410b85a2019-05-13 17:12:45 +0200440 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200441 value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1));
442 if (value == NULL) {
443 if (PyErr_Occurred()) {
444 PyErr_WriteUnraisable(NULL);
445 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200446 value = Py_None;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200447 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300448 if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300449 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000452
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200453 /* We prepare a list which will receive (name, weakref) tuples of
454 modules when they are removed from sys.modules. The name is used
455 for diagnosis messages (in verbose mode), while the weakref helps
456 detect those modules which have been held alive. */
457 weaklist = PyList_New(0);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300458 if (weaklist == NULL) {
459 PyErr_WriteUnraisable(NULL);
460 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200461
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200462#define STORE_MODULE_WEAKREF(name, mod) \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200463 if (weaklist != NULL) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200464 PyObject *wr = PyWeakref_NewRef(mod, NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300465 if (wr) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200466 PyObject *tup = PyTuple_Pack(2, name, wr); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300467 if (!tup || PyList_Append(weaklist, tup) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300468 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300469 } \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200470 Py_XDECREF(tup); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300471 Py_DECREF(wr); \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200472 } \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300473 else { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300474 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300475 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600477#define CLEAR_MODULE(name, mod) \
478 if (PyModule_Check(mod)) { \
Victor Stinner410b85a2019-05-13 17:12:45 +0200479 if (verbose && PyUnicode_Check(name)) { \
Eric Snow3f9eee62017-09-15 16:35:20 -0600480 PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
Victor Stinner410b85a2019-05-13 17:12:45 +0200481 } \
Eric Snow3f9eee62017-09-15 16:35:20 -0600482 STORE_MODULE_WEAKREF(name, mod); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300483 if (PyObject_SetItem(modules, name, Py_None) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300484 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300485 } \
Eric Snow3f9eee62017-09-15 16:35:20 -0600486 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000487
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200488 /* Remove all modules from sys.modules, hoping that garbage collection
489 can reclaim most of them. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600490 if (PyDict_CheckExact(modules)) {
491 pos = 0;
492 while (PyDict_Next(modules, &pos, &key, &value)) {
493 CLEAR_MODULE(key, value);
494 }
495 }
496 else {
497 PyObject *iterator = PyObject_GetIter(modules);
498 if (iterator == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300499 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600500 }
501 else {
502 while ((key = PyIter_Next(iterator))) {
503 value = PyObject_GetItem(modules, key);
504 if (value == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300505 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600506 continue;
507 }
508 CLEAR_MODULE(key, value);
509 Py_DECREF(value);
510 Py_DECREF(key);
511 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300512 if (PyErr_Occurred()) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300513 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300514 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600515 Py_DECREF(iterator);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 }
517 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000518
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200519 /* Clear the modules dict. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600520 if (PyDict_CheckExact(modules)) {
521 PyDict_Clear(modules);
522 }
523 else {
524 _Py_IDENTIFIER(clear);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300525 if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) {
526 PyErr_WriteUnraisable(NULL);
527 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600528 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200529 /* Restore the original builtins dict, to ensure that any
530 user data gets cleared. */
531 dict = PyDict_Copy(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300532 if (dict == NULL) {
533 PyErr_WriteUnraisable(NULL);
534 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200535 PyDict_Clear(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300536 if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200537 PyErr_Clear();
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300538 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200539 Py_XDECREF(dict);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200540 /* Clear module dict copies stored in the interpreter state */
541 _PyState_ClearModules();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200542 /* Collect references */
543 _PyGC_CollectNoFail();
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200544 /* Dump GC stats before it's too late, since it uses the warnings
545 machinery. */
Victor Stinner9db03242019-04-26 02:32:01 +0200546 _PyGC_DumpShutdownStats(&_PyRuntime);
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200547
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200548 /* Now, if there are any modules left alive, clear their globals to
549 minimize potential leaks. All C extension modules actually end
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200550 up here, since they are kept alive in the interpreter state.
551
552 The special treatment of "builtins" here is because even
553 when it's not referenced as a module, its dictionary is
554 referenced by almost every module's __builtins__. Since
555 deleting a module clears its dictionary (even if there are
556 references left to it), we need to delete the "builtins"
557 module last. Likewise, we don't delete sys until the very
558 end because it is implicitly referenced (e.g. by print). */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200559 if (weaklist != NULL) {
Serhiy Storchakac93c58b2018-10-29 19:30:16 +0200560 Py_ssize_t i;
561 /* Since dict is ordered in CPython 3.6+, modules are saved in
562 importing order. First clear modules imported later. */
563 for (i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200564 PyObject *tup = PyList_GET_ITEM(weaklist, i);
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200565 PyObject *name = PyTuple_GET_ITEM(tup, 0);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200566 PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1));
567 if (mod == Py_None)
568 continue;
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200569 assert(PyModule_Check(mod));
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200570 dict = PyModule_GetDict(mod);
571 if (dict == interp->builtins || dict == interp->sysdict)
572 continue;
573 Py_INCREF(mod);
Victor Stinner410b85a2019-05-13 17:12:45 +0200574 if (verbose && PyUnicode_Check(name)) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200575 PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
Victor Stinner410b85a2019-05-13 17:12:45 +0200576 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200577 _PyModule_Clear(mod);
578 Py_DECREF(mod);
Antoine Pitrou070cb3c2013-05-08 13:23:25 +0200579 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200580 Py_DECREF(weaklist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000582
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200583 /* Next, delete sys and builtins (in that order) */
Victor Stinner410b85a2019-05-13 17:12:45 +0200584 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200585 PySys_FormatStderr("# cleanup[3] wiping sys\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200586 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200587 _PyModule_ClearDict(interp->sysdict);
Victor Stinner410b85a2019-05-13 17:12:45 +0200588 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200589 PySys_FormatStderr("# cleanup[3] wiping builtins\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200590 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200591 _PyModule_ClearDict(interp->builtins);
592
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200593 /* Clear and delete the modules directory. Actual modules will
594 still be there only if imported during the execution of some
595 destructor. */
Eric Snow93c92f72017-09-13 23:46:04 -0700596 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 Py_DECREF(modules);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200598
599 /* Once more */
600 _PyGC_CollectNoFail();
601
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300602#undef CLEAR_MODULE
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200603#undef STORE_MODULE_WEAKREF
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000604}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000605
606
Barry Warsaw28a691b2010-04-17 00:19:56 +0000607/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608
609long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000610PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000611{
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200612 long res;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200613 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow32439d62015-05-02 19:15:18 -0600614 PyObject *external, *pyc_magic;
615
616 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
617 if (external == NULL)
618 return -1;
619 pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
620 Py_DECREF(external);
Brett Cannon77b2abd2012-07-09 16:09:00 -0400621 if (pyc_magic == NULL)
622 return -1;
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200623 res = PyLong_AsLong(pyc_magic);
Benjamin Peterson66f36592012-07-09 22:21:55 -0700624 Py_DECREF(pyc_magic);
625 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626}
627
628
Brett Cannon3adc7b72012-07-09 14:22:12 -0400629extern const char * _PySys_ImplCacheTag;
630
Barry Warsaw28a691b2010-04-17 00:19:56 +0000631const char *
632PyImport_GetMagicTag(void)
633{
Brett Cannon3adc7b72012-07-09 14:22:12 -0400634 return _PySys_ImplCacheTag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000635}
636
Brett Cannon98979b82012-07-02 15:13:11 -0400637
Guido van Rossum25ce5661997-08-02 03:10:38 +0000638/* Magic for extension modules (built-in as well as dynamically
639 loaded). To prevent initializing an extension module more than
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200640 once, we keep a static dictionary 'extensions' keyed by the tuple
641 (module name, module name) (for built-in modules) or by
642 (filename, module name) (for dynamically loaded modules), containing these
643 modules. A copy of the module's dictionary is stored by calling
644 _PyImport_FixupExtensionObject() immediately after the module initialization
645 function succeeds. A copy can be retrieved from there by calling
Victor Stinner95872862011-03-07 18:20:56 +0100646 _PyImport_FindExtensionObject().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000647
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000648 Modules which do support multiple initialization set their m_size
649 field to a non-negative number (indicating the size of the
650 module-specific state). They are still recorded in the extensions
651 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000652*/
653
654int
Victor Stinner95872862011-03-07 18:20:56 +0100655_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
Eric Snowd393c1b2017-09-14 12:18:12 -0600656 PyObject *filename, PyObject *modules)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657{
Eric Snowd393c1b2017-09-14 12:18:12 -0600658 PyObject *dict, *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 struct PyModuleDef *def;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500660 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 if (extensions == NULL) {
662 extensions = PyDict_New();
663 if (extensions == NULL)
664 return -1;
665 }
666 if (mod == NULL || !PyModule_Check(mod)) {
667 PyErr_BadInternalCall();
668 return -1;
669 }
670 def = PyModule_GetDef(mod);
671 if (!def) {
672 PyErr_BadInternalCall();
673 return -1;
674 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600675 if (PyObject_SetItem(modules, name, mod) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return -1;
677 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600678 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 return -1;
680 }
681 if (def->m_size == -1) {
682 if (def->m_base.m_copy) {
683 /* Somebody already imported the module,
684 likely under a different name.
685 XXX this should really not happen. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200686 Py_CLEAR(def->m_base.m_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 }
688 dict = PyModule_GetDict(mod);
689 if (dict == NULL)
690 return -1;
691 def->m_base.m_copy = PyDict_Copy(dict);
692 if (def->m_base.m_copy == NULL)
693 return -1;
694 }
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500695 key = PyTuple_Pack(2, filename, name);
696 if (key == NULL)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200697 return -1;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500698 res = PyDict_SetItem(extensions, key, (PyObject *)def);
699 Py_DECREF(key);
700 if (res < 0)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200701 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000703}
704
Victor Stinner49d3f252010-10-17 01:24:53 +0000705int
Eric Snowd393c1b2017-09-14 12:18:12 -0600706_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000707{
708 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100709 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100710 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100711 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000712 return -1;
Eric Snowd393c1b2017-09-14 12:18:12 -0600713 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100714 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000715 return res;
716}
717
Guido van Rossum25ce5661997-08-02 03:10:38 +0000718PyObject *
Victor Stinner95872862011-03-07 18:20:56 +0100719_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000720{
Eric Snowd393c1b2017-09-14 12:18:12 -0600721 PyObject *modules = PyImport_GetModuleDict();
722 return _PyImport_FindExtensionObjectEx(name, filename, modules);
723}
724
725PyObject *
726_PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename,
727 PyObject *modules)
728{
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500729 PyObject *mod, *mdict, *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 PyModuleDef* def;
731 if (extensions == NULL)
732 return NULL;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500733 key = PyTuple_Pack(2, filename, name);
734 if (key == NULL)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200735 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200736 def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500737 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 if (def == NULL)
739 return NULL;
740 if (def->m_size == -1) {
741 /* Module does not support repeated initialization */
742 if (def->m_base.m_copy == NULL)
743 return NULL;
Eric Snowd393c1b2017-09-14 12:18:12 -0600744 mod = _PyImport_AddModuleObject(name, modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 if (mod == NULL)
746 return NULL;
747 mdict = PyModule_GetDict(mod);
748 if (mdict == NULL)
749 return NULL;
750 if (PyDict_Update(mdict, def->m_base.m_copy))
751 return NULL;
752 }
753 else {
754 if (def->m_base.m_init == NULL)
755 return NULL;
756 mod = def->m_base.m_init();
757 if (mod == NULL)
758 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600759 if (PyObject_SetItem(modules, name, mod) == -1) {
Christian Heimes09ca7942013-07-20 14:51:53 +0200760 Py_DECREF(mod);
761 return NULL;
762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 Py_DECREF(mod);
764 }
765 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600766 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return NULL;
768 }
Victor Stinner410b85a2019-05-13 17:12:45 +0200769 int verbose = _PyInterpreterState_Get()->core_config.verbose;
770 if (verbose) {
Victor Stinner95872862011-03-07 18:20:56 +0100771 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Victor Stinner410b85a2019-05-13 17:12:45 +0200772 name, filename);
773 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 return mod;
Brett Cannon9a5b25a2010-03-01 02:09:17 +0000775
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000776}
777
Victor Stinner49d3f252010-10-17 01:24:53 +0000778PyObject *
Eric Snowd393c1b2017-09-14 12:18:12 -0600779_PyImport_FindBuiltin(const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000780{
Victor Stinner95872862011-03-07 18:20:56 +0100781 PyObject *res, *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100782 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100783 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000784 return NULL;
Eric Snowd393c1b2017-09-14 12:18:12 -0600785 res = _PyImport_FindExtensionObjectEx(nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100786 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000787 return res;
788}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789
790/* Get the module object corresponding to a module name.
791 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000792 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000793 Because the former action is most common, THIS DOES NOT RETURN A
794 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000797PyImport_AddModuleObject(PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 PyObject *modules = PyImport_GetModuleDict();
Eric Snowd393c1b2017-09-14 12:18:12 -0600800 return _PyImport_AddModuleObject(name, modules);
801}
802
803PyObject *
804_PyImport_AddModuleObject(PyObject *name, PyObject *modules)
805{
Eric Snow86b7afd2017-09-04 17:54:09 -0600806 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600807 if (PyDict_CheckExact(modules)) {
808 m = PyDict_GetItemWithError(modules, name);
809 }
810 else {
811 m = PyObject_GetItem(modules, name);
812 // For backward-comaptibility we copy the behavior
813 // of PyDict_GetItemWithError().
814 if (PyErr_ExceptionMatches(PyExc_KeyError)) {
815 PyErr_Clear();
816 }
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200817 }
818 if (PyErr_Occurred()) {
819 return NULL;
820 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600821 if (m != NULL && PyModule_Check(m)) {
822 return m;
823 }
Victor Stinner27ee0892011-03-04 12:57:09 +0000824 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 if (m == NULL)
826 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600827 if (PyObject_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 Py_DECREF(m);
829 return NULL;
830 }
831 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834}
835
Victor Stinner27ee0892011-03-04 12:57:09 +0000836PyObject *
837PyImport_AddModule(const char *name)
838{
839 PyObject *nameobj, *module;
840 nameobj = PyUnicode_FromString(name);
841 if (nameobj == NULL)
842 return NULL;
843 module = PyImport_AddModuleObject(nameobj);
844 Py_DECREF(nameobj);
845 return module;
846}
847
848
Tim Peters1cd70172004-08-02 03:52:12 +0000849/* Remove name from sys.modules, if it's there. */
850static void
Victor Stinner27ee0892011-03-04 12:57:09 +0000851remove_module(PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000852{
Zackery Spytz94a64e92019-05-08 10:31:23 -0600853 PyObject *type, *value, *traceback;
854 PyErr_Fetch(&type, &value, &traceback);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 PyObject *modules = PyImport_GetModuleDict();
Zackery Spytz94a64e92019-05-08 10:31:23 -0600856 if (!PyMapping_HasKey(modules, name)) {
857 goto out;
858 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600859 if (PyMapping_DelItem(modules, name) < 0) {
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +0200860 Py_FatalError("import: deleting existing key in "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 "sys.modules failed");
Eric Snow3f9eee62017-09-15 16:35:20 -0600862 }
Zackery Spytz94a64e92019-05-08 10:31:23 -0600863out:
864 PyErr_Restore(type, value, traceback);
Tim Peters1cd70172004-08-02 03:52:12 +0000865}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
Christian Heimes3b06e532008-01-07 20:12:44 +0000867
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000868/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000869 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
870 * removed from sys.modules, to avoid leaving damaged module objects
871 * in sys.modules. The caller may wish to restore the original
872 * module object (if any) in this case; PyImport_ReloadModule is an
873 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000874 *
875 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
876 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000877 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300879PyImport_ExecCodeModule(const char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 return PyImport_ExecCodeModuleWithPathnames(
882 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000883}
884
885PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300886PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 return PyImport_ExecCodeModuleWithPathnames(
889 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000890}
891
892PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300893PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
894 const char *pathname,
895 const char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000896{
Victor Stinner27ee0892011-03-04 12:57:09 +0000897 PyObject *m = NULL;
Eric Snow32439d62015-05-02 19:15:18 -0600898 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000899
900 nameobj = PyUnicode_FromString(name);
901 if (nameobj == NULL)
902 return NULL;
903
Victor Stinner27ee0892011-03-04 12:57:09 +0000904 if (cpathname != NULL) {
905 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
906 if (cpathobj == NULL)
907 goto error;
Brett Cannona6473f92012-07-13 13:57:03 -0400908 }
909 else
Victor Stinner27ee0892011-03-04 12:57:09 +0000910 cpathobj = NULL;
Brett Cannona6473f92012-07-13 13:57:03 -0400911
912 if (pathname != NULL) {
913 pathobj = PyUnicode_DecodeFSDefault(pathname);
914 if (pathobj == NULL)
915 goto error;
916 }
917 else if (cpathobj != NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200918 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannona6473f92012-07-13 13:57:03 -0400919 _Py_IDENTIFIER(_get_sourcefile);
920
921 if (interp == NULL) {
922 Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
923 "no interpreter!");
924 }
925
Eric Snow32439d62015-05-02 19:15:18 -0600926 external= PyObject_GetAttrString(interp->importlib,
927 "_bootstrap_external");
928 if (external != NULL) {
929 pathobj = _PyObject_CallMethodIdObjArgs(external,
930 &PyId__get_sourcefile, cpathobj,
931 NULL);
932 Py_DECREF(external);
933 }
Brett Cannona6473f92012-07-13 13:57:03 -0400934 if (pathobj == NULL)
935 PyErr_Clear();
936 }
937 else
938 pathobj = NULL;
939
Victor Stinner27ee0892011-03-04 12:57:09 +0000940 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
941error:
942 Py_DECREF(nameobj);
943 Py_XDECREF(pathobj);
944 Py_XDECREF(cpathobj);
945 return m;
946}
947
Brett Cannon18fc4e72014-04-04 10:01:46 -0400948static PyObject *
949module_dict_for_exec(PyObject *name)
Victor Stinner27ee0892011-03-04 12:57:09 +0000950{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200951 _Py_IDENTIFIER(__builtins__);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400952 PyObject *m, *d = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953
Victor Stinner27ee0892011-03-04 12:57:09 +0000954 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 if (m == NULL)
956 return NULL;
957 /* If the module is being reloaded, we get the old module back
958 and re-use its dict to exec the new code. */
959 d = PyModule_GetDict(m);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200960 if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) {
961 if (PyErr_Occurred() ||
962 _PyDict_SetItemId(d, &PyId___builtins__,
963 PyEval_GetBuiltins()) != 0)
964 {
Brett Cannon18fc4e72014-04-04 10:01:46 -0400965 remove_module(name);
966 return NULL;
967 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 }
Brett Cannon18fc4e72014-04-04 10:01:46 -0400969
Eric Snow08197a42014-05-12 17:54:55 -0600970 return d; /* Return a borrowed reference. */
Brett Cannon18fc4e72014-04-04 10:01:46 -0400971}
972
973static PyObject *
974exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object)
975{
Brett Cannon18fc4e72014-04-04 10:01:46 -0400976 PyObject *v, *m;
977
978 v = PyEval_EvalCode(code_object, module_dict, module_dict);
979 if (v == NULL) {
980 remove_module(name);
981 return NULL;
982 }
983 Py_DECREF(v);
984
Eric Snow3f9eee62017-09-15 16:35:20 -0600985 m = PyImport_GetModule(name);
Stefan Krah027b09c2019-03-25 21:50:58 +0100986 if (m == NULL && !PyErr_Occurred()) {
Brett Cannon18fc4e72014-04-04 10:01:46 -0400987 PyErr_Format(PyExc_ImportError,
988 "Loaded module %R not found in sys.modules",
989 name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400990 }
991
Brett Cannon18fc4e72014-04-04 10:01:46 -0400992 return m;
993}
994
995PyObject*
996PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
997 PyObject *cpathname)
998{
Eric Snow32439d62015-05-02 19:15:18 -0600999 PyObject *d, *external, *res;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001000 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow08197a42014-05-12 17:54:55 -06001001 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001002
1003 d = module_dict_for_exec(name);
1004 if (d == NULL) {
1005 return NULL;
1006 }
1007
Eric Snow08197a42014-05-12 17:54:55 -06001008 if (pathname == NULL) {
1009 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 }
Eric Snow32439d62015-05-02 19:15:18 -06001011 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
1012 if (external == NULL)
1013 return NULL;
1014 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -06001015 &PyId__fix_up_module,
1016 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -06001017 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -06001018 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -06001019 Py_DECREF(res);
Eric Snow08197a42014-05-12 17:54:55 -06001020 res = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 }
Eric Snow08197a42014-05-12 17:54:55 -06001022 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001023}
1024
1025
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001026static void
1027update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 PyObject *constants, *tmp;
1030 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 if (PyUnicode_Compare(co->co_filename, oldname))
1033 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001034
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001035 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001036 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 constants = co->co_consts;
1039 n = PyTuple_GET_SIZE(constants);
1040 for (i = 0; i < n; i++) {
1041 tmp = PyTuple_GET_ITEM(constants, i);
1042 if (PyCode_Check(tmp))
1043 update_code_filenames((PyCodeObject *)tmp,
1044 oldname, newname);
1045 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001046}
1047
Victor Stinner2f42ae52011-03-20 00:41:24 +01001048static void
1049update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001050{
Victor Stinner2f42ae52011-03-20 00:41:24 +01001051 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001052
Victor Stinner2f42ae52011-03-20 00:41:24 +01001053 if (PyUnicode_Compare(co->co_filename, newname) == 0)
1054 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 oldname = co->co_filename;
1057 Py_INCREF(oldname);
1058 update_code_filenames(co, oldname, newname);
1059 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001060}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001061
Brett Cannon4caa61d2014-01-09 19:03:32 -05001062/*[clinic input]
1063_imp._fix_co_filename
1064
1065 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
1066 Code object to change.
1067
1068 path: unicode
1069 File path to use.
1070 /
1071
1072Changes code.co_filename to specify the passed-in file path.
1073[clinic start generated code]*/
1074
Brett Cannon4caa61d2014-01-09 19:03:32 -05001075static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001076_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -04001077 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001078/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -07001079
Brett Cannon4caa61d2014-01-09 19:03:32 -05001080{
Brett Cannona6dec2e2014-01-10 07:43:55 -05001081 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -07001082
1083 Py_RETURN_NONE;
1084}
1085
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001086
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001087/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001088static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001089
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001090
1091/* Helper to test for built-in module */
1092
1093static int
Victor Stinner95872862011-03-07 18:20:56 +01001094is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001095{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001096 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001098 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 if (PyImport_Inittab[i].initfunc == NULL)
1100 return -1;
1101 else
1102 return 1;
1103 }
1104 }
1105 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001106}
1107
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001108
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001109/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +00001110 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001111 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001112 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001113 this tells our caller that the path based finder could not find
1114 a finder for this path item. Cache the result in
1115 path_importer_cache.
Just van Rossum52e14d62002-12-30 22:08:05 +00001116 Returns a borrowed reference. */
1117
1118static PyObject *
1119get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 PyObject *importer;
1123 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 /* These conditions are the caller's responsibility: */
1126 assert(PyList_Check(path_hooks));
1127 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 nhooks = PyList_Size(path_hooks);
1130 if (nhooks < 0)
1131 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001132
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001133 importer = PyDict_GetItemWithError(path_importer_cache, p);
1134 if (importer != NULL || PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 /* set path_importer_cache[p] to None to avoid recursion */
1138 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1139 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 for (j = 0; j < nhooks; j++) {
1142 PyObject *hook = PyList_GetItem(path_hooks, j);
1143 if (hook == NULL)
1144 return NULL;
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001145 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (importer != NULL)
1147 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1150 return NULL;
1151 }
1152 PyErr_Clear();
1153 }
1154 if (importer == NULL) {
Brett Cannonaa936422012-04-27 15:30:58 -04001155 return Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
1157 if (importer != NULL) {
1158 int err = PyDict_SetItem(path_importer_cache, p, importer);
1159 Py_DECREF(importer);
1160 if (err != 0)
1161 return NULL;
1162 }
1163 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001164}
1165
Benjamin Petersone5024512018-09-12 12:06:42 -07001166PyObject *
Christian Heimes9cd17752007-11-18 19:35:23 +00001167PyImport_GetImporter(PyObject *path) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001169
Victor Stinner1e53bba2013-07-16 22:26:05 +02001170 path_importer_cache = PySys_GetObject("path_importer_cache");
1171 path_hooks = PySys_GetObject("path_hooks");
1172 if (path_importer_cache != NULL && path_hooks != NULL) {
1173 importer = get_path_importer(path_importer_cache,
1174 path_hooks, path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 }
1176 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1177 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001178}
1179
Nick Coghland5cacbb2015-05-23 22:24:10 +10001180/*[clinic input]
1181_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182
Nick Coghland5cacbb2015-05-23 22:24:10 +10001183 spec: object
1184 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001185
Nick Coghland5cacbb2015-05-23 22:24:10 +10001186Create an extension module.
1187[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001188
Nick Coghland5cacbb2015-05-23 22:24:10 +10001189static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001190_imp_create_builtin(PyObject *module, PyObject *spec)
1191/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 struct _inittab *p;
Nick Coghland5cacbb2015-05-23 22:24:10 +10001194 PyObject *name;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001195 const char *namestr;
Victor Stinner5eb4f592013-11-14 22:38:52 +01001196 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001197
Nick Coghland5cacbb2015-05-23 22:24:10 +10001198 name = PyObject_GetAttrString(spec, "name");
1199 if (name == NULL) {
1200 return NULL;
1201 }
1202
Victor Stinner5eb4f592013-11-14 22:38:52 +01001203 mod = _PyImport_FindExtensionObject(name, name);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001204 if (mod || PyErr_Occurred()) {
1205 Py_DECREF(name);
Raymond Hettingerf0afe772016-08-31 08:44:11 -07001206 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001207 return mod;
1208 }
1209
1210 namestr = PyUnicode_AsUTF8(name);
1211 if (namestr == NULL) {
1212 Py_DECREF(name);
1213 return NULL;
1214 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001215
Eric Snowd393c1b2017-09-14 12:18:12 -06001216 PyObject *modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 for (p = PyImport_Inittab; p->name != NULL; p++) {
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001218 PyModuleDef *def;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001219 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 if (p->initfunc == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001221 /* Cannot re-init internal module ("sys" or "builtins") */
1222 mod = PyImport_AddModule(namestr);
1223 Py_DECREF(name);
1224 return mod;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 mod = (*p->initfunc)();
Nick Coghland5cacbb2015-05-23 22:24:10 +10001227 if (mod == NULL) {
1228 Py_DECREF(name);
1229 return NULL;
1230 }
1231 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1232 Py_DECREF(name);
1233 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1234 } else {
1235 /* Remember pointer to module init function. */
1236 def = PyModule_GetDef(mod);
Christian Heimesa78b6272016-09-09 00:25:03 +02001237 if (def == NULL) {
1238 Py_DECREF(name);
1239 return NULL;
1240 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001241 def->m_base.m_init = p->initfunc;
Eric Snowd393c1b2017-09-14 12:18:12 -06001242 if (modules == NULL) {
1243 modules = PyImport_GetModuleDict();
1244 }
1245 if (_PyImport_FixupExtensionObject(mod, name, name,
1246 modules) < 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001247 Py_DECREF(name);
1248 return NULL;
1249 }
1250 Py_DECREF(name);
1251 return mod;
1252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 }
1254 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001255 Py_DECREF(name);
1256 Py_RETURN_NONE;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001257}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001258
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001260/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001262static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001263find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001264{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001265 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001266
Victor Stinner53dc7352011-03-20 01:50:21 +01001267 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 for (p = PyImport_FrozenModules; ; p++) {
1271 if (p->name == NULL)
1272 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001273 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 break;
1275 }
1276 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001277}
1278
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001280get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001281{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001282 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (p == NULL) {
1286 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001287 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 name);
1289 return NULL;
1290 }
1291 if (p->code == NULL) {
1292 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001293 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 name);
1295 return NULL;
1296 }
1297 size = p->size;
1298 if (size < 0)
1299 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001300 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001301}
1302
Brett Cannon8d110132009-03-15 02:20:16 +00001303static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001304is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001305{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001306 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (p == NULL) {
1310 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001311 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 name);
1313 return NULL;
1314 }
Brett Cannon8d110132009-03-15 02:20:16 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 if (size < 0)
1319 Py_RETURN_TRUE;
1320 else
1321 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001322}
1323
1324
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001325/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001326 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001327 an exception set if the initialization failed.
1328 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001329
1330int
Victor Stinner53dc7352011-03-20 01:50:21 +01001331PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001332{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001333 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001334 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 int ispackage;
1336 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001337
Victor Stinner53dc7352011-03-20 01:50:21 +01001338 p = find_frozen(name);
1339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 if (p == NULL)
1341 return 0;
1342 if (p->code == NULL) {
1343 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001344 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 name);
1346 return -1;
1347 }
1348 size = p->size;
1349 ispackage = (size < 0);
1350 if (ispackage)
1351 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001352 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (co == NULL)
1354 return -1;
1355 if (!PyCode_Check(co)) {
1356 PyErr_Format(PyExc_TypeError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001357 "frozen object %R is not a code object",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 name);
1359 goto err_return;
1360 }
1361 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001362 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001363 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 int err;
Victor Stinner53dc7352011-03-20 01:50:21 +01001365 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 if (m == NULL)
1367 goto err_return;
1368 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001369 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 goto err_return;
1372 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 err = PyDict_SetItemString(d, "__path__", l);
1374 Py_DECREF(l);
1375 if (err != 0)
1376 goto err_return;
1377 }
Brett Cannon18fc4e72014-04-04 10:01:46 -04001378 d = module_dict_for_exec(name);
1379 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001380 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001381 }
1382 m = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 if (m == NULL)
1384 goto err_return;
1385 Py_DECREF(co);
1386 Py_DECREF(m);
1387 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001388err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 Py_DECREF(co);
1390 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001391}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001392
Victor Stinner53dc7352011-03-20 01:50:21 +01001393int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001394PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001395{
1396 PyObject *nameobj;
1397 int ret;
1398 nameobj = PyUnicode_InternFromString(name);
1399 if (nameobj == NULL)
1400 return -1;
1401 ret = PyImport_ImportFrozenModuleObject(nameobj);
1402 Py_DECREF(nameobj);
1403 return ret;
1404}
1405
Guido van Rossum74e6a111994-08-29 12:54:38 +00001406
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001408 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001409
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001411PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 PyObject *pname;
1414 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 pname = PyUnicode_FromString(name);
1417 if (pname == NULL)
1418 return NULL;
1419 result = PyImport_Import(pname);
1420 Py_DECREF(pname);
1421 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001422}
1423
Christian Heimes072c0f12008-01-03 23:01:04 +00001424/* Import a module without blocking
1425 *
1426 * At first it tries to fetch the module from sys.modules. If the module was
1427 * never loaded before it loads it with PyImport_ImportModule() unless another
1428 * thread holds the import lock. In the latter case the function raises an
1429 * ImportError instead of blocking.
1430 *
1431 * Returns the module object with incremented ref count.
1432 */
1433PyObject *
1434PyImport_ImportModuleNoBlock(const char *name)
1435{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001436 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001437}
1438
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001439
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001440/* Remove importlib frames from the traceback,
1441 * except in Verbose mode. */
1442static void
Victor Stinner410b85a2019-05-13 17:12:45 +02001443remove_importlib_frames(PyInterpreterState *interp)
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001444{
1445 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001446 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001447 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001448 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001449 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001450 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001451 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001452
1453 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001454 from the traceback. We always trim chunks
1455 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001456
1457 PyErr_Fetch(&exception, &value, &base_tb);
Victor Stinner410b85a2019-05-13 17:12:45 +02001458 if (!exception || interp->core_config.verbose) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001459 goto done;
Victor Stinner410b85a2019-05-13 17:12:45 +02001460 }
1461
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001462 if (PyType_IsSubtype((PyTypeObject *) exception,
1463 (PyTypeObject *) PyExc_ImportError))
1464 always_trim = 1;
1465
1466 prev_link = &base_tb;
1467 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001468 while (tb != NULL) {
1469 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1470 PyObject *next = (PyObject *) traceback->tb_next;
1471 PyFrameObject *frame = traceback->tb_frame;
1472 PyCodeObject *code = frame->f_code;
1473 int now_in_importlib;
1474
1475 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001476 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1477 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001478 if (now_in_importlib && !in_importlib) {
1479 /* This is the link to this chunk of importlib tracebacks */
1480 outer_link = prev_link;
1481 }
1482 in_importlib = now_in_importlib;
1483
1484 if (in_importlib &&
1485 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001486 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001487 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001488 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001489 prev_link = outer_link;
1490 }
1491 else {
1492 prev_link = (PyObject **) &traceback->tb_next;
1493 }
1494 tb = next;
1495 }
1496done:
1497 PyErr_Restore(exception, value, base_tb);
1498}
1499
1500
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001501static PyObject *
1502resolve_name(PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001503{
Eric Snowb523f842013-11-22 09:05:39 -07001504 _Py_IDENTIFIER(__spec__);
Brett Cannonfd074152012-04-14 14:10:13 -04001505 _Py_IDENTIFIER(__package__);
1506 _Py_IDENTIFIER(__path__);
1507 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001508 _Py_IDENTIFIER(parent);
1509 PyObject *abs_name;
1510 PyObject *package = NULL;
1511 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001512 Py_ssize_t last_dot;
1513 PyObject *base;
1514 int level_up;
1515
1516 if (globals == NULL) {
1517 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1518 goto error;
1519 }
1520 if (!PyDict_Check(globals)) {
1521 PyErr_SetString(PyExc_TypeError, "globals must be a dict");
1522 goto error;
1523 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001524 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001525 if (package == Py_None) {
1526 package = NULL;
1527 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001528 else if (package == NULL && PyErr_Occurred()) {
1529 goto error;
1530 }
1531 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
1532 if (spec == NULL && PyErr_Occurred()) {
1533 goto error;
1534 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001535
1536 if (package != NULL) {
1537 Py_INCREF(package);
1538 if (!PyUnicode_Check(package)) {
1539 PyErr_SetString(PyExc_TypeError, "package must be a string");
1540 goto error;
1541 }
1542 else if (spec != NULL && spec != Py_None) {
1543 int equal;
1544 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1545 if (parent == NULL) {
1546 goto error;
1547 }
1548
1549 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1550 Py_DECREF(parent);
1551 if (equal < 0) {
1552 goto error;
1553 }
1554 else if (equal == 0) {
1555 if (PyErr_WarnEx(PyExc_ImportWarning,
1556 "__package__ != __spec__.parent", 1) < 0) {
1557 goto error;
1558 }
1559 }
1560 }
1561 }
1562 else if (spec != NULL && spec != Py_None) {
1563 package = _PyObject_GetAttrId(spec, &PyId_parent);
1564 if (package == NULL) {
1565 goto error;
1566 }
1567 else if (!PyUnicode_Check(package)) {
1568 PyErr_SetString(PyExc_TypeError,
1569 "__spec__.parent must be a string");
1570 goto error;
1571 }
1572 }
1573 else {
1574 if (PyErr_WarnEx(PyExc_ImportWarning,
1575 "can't resolve package from __spec__ or __package__, "
1576 "falling back on __name__ and __path__", 1) < 0) {
1577 goto error;
1578 }
1579
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001580 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001581 if (package == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001582 if (!PyErr_Occurred()) {
1583 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1584 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001585 goto error;
1586 }
1587
1588 Py_INCREF(package);
1589 if (!PyUnicode_Check(package)) {
1590 PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
1591 goto error;
1592 }
1593
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001594 if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001595 Py_ssize_t dot;
1596
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001597 if (PyErr_Occurred() || PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001598 goto error;
1599 }
1600
1601 dot = PyUnicode_FindChar(package, '.',
1602 0, PyUnicode_GET_LENGTH(package), -1);
1603 if (dot == -2) {
1604 goto error;
1605 }
1606
1607 if (dot >= 0) {
1608 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1609 if (substr == NULL) {
1610 goto error;
1611 }
1612 Py_SETREF(package, substr);
1613 }
1614 }
1615 }
1616
1617 last_dot = PyUnicode_GET_LENGTH(package);
1618 if (last_dot == 0) {
1619 PyErr_SetString(PyExc_ImportError,
1620 "attempted relative import with no known parent package");
1621 goto error;
1622 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001623
1624 for (level_up = 1; level_up < level; level_up += 1) {
1625 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1626 if (last_dot == -2) {
1627 goto error;
1628 }
1629 else if (last_dot == -1) {
1630 PyErr_SetString(PyExc_ValueError,
1631 "attempted relative import beyond top-level "
1632 "package");
1633 goto error;
1634 }
1635 }
1636
1637 base = PyUnicode_Substring(package, 0, last_dot);
1638 Py_DECREF(package);
1639 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1640 return base;
1641 }
1642
1643 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1644 Py_DECREF(base);
1645 return abs_name;
1646
1647 error:
1648 Py_XDECREF(package);
1649 return NULL;
1650}
1651
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001652static PyObject *
1653import_find_and_load(PyObject *abs_name)
1654{
1655 _Py_IDENTIFIER(_find_and_load);
1656 PyObject *mod = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001657 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001658 int import_time = interp->core_config.import_time;
1659 static int import_level;
1660 static _PyTime_t accumulated;
1661
1662 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1663
1664 /* XOptions is initialized after first some imports.
1665 * So we can't have negative cache before completed initialization.
1666 * Anyway, importlib._find_and_load is much slower than
1667 * _PyDict_GetItemIdWithError().
1668 */
1669 if (import_time) {
1670 static int header = 1;
1671 if (header) {
1672 fputs("import time: self [us] | cumulative | imported package\n",
1673 stderr);
1674 header = 0;
1675 }
1676
1677 import_level++;
1678 t1 = _PyTime_GetPerfCounter();
1679 accumulated = 0;
1680 }
1681
1682 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1683 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1684
1685 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1686 &PyId__find_and_load, abs_name,
1687 interp->import_func, NULL);
1688
1689 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1690 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1691 mod != NULL);
1692
1693 if (import_time) {
1694 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1695
1696 import_level--;
1697 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1698 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1699 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1700 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1701
1702 accumulated = accumulated_copy + cum;
1703 }
1704
1705 return mod;
1706}
1707
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001708PyObject *
1709PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1710 PyObject *locals, PyObject *fromlist,
1711 int level)
1712{
Brett Cannonfd074152012-04-14 14:10:13 -04001713 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001714 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001715 PyObject *final_mod = NULL;
1716 PyObject *mod = NULL;
1717 PyObject *package = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001718 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001719 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001720
Brett Cannonfd074152012-04-14 14:10:13 -04001721 if (name == NULL) {
1722 PyErr_SetString(PyExc_ValueError, "Empty module name");
1723 goto error;
1724 }
1725
1726 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1727 for added performance. */
1728
1729 if (!PyUnicode_Check(name)) {
1730 PyErr_SetString(PyExc_TypeError, "module name must be a string");
1731 goto error;
1732 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001733 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001734 goto error;
1735 }
1736 if (level < 0) {
1737 PyErr_SetString(PyExc_ValueError, "level must be >= 0");
1738 goto error;
1739 }
Brett Cannon849113a2016-01-22 15:25:50 -08001740
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001741 if (level > 0) {
1742 abs_name = resolve_name(name, globals, level);
1743 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001744 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001745 }
1746 else { /* level == 0 */
1747 if (PyUnicode_GET_LENGTH(name) == 0) {
1748 PyErr_SetString(PyExc_ValueError, "Empty module name");
1749 goto error;
1750 }
Brett Cannonfd074152012-04-14 14:10:13 -04001751 abs_name = name;
1752 Py_INCREF(abs_name);
1753 }
1754
Eric Snow3f9eee62017-09-15 16:35:20 -06001755 mod = PyImport_GetModule(abs_name);
Stefan Krah027b09c2019-03-25 21:50:58 +01001756 if (mod == NULL && PyErr_Occurred()) {
1757 goto error;
1758 }
1759
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001760 if (mod != NULL && mod != Py_None) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001761 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001762 _Py_IDENTIFIER(_lock_unlock_module);
Eric Snowb523f842013-11-22 09:05:39 -07001763 PyObject *spec;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001764
Antoine Pitrou03989852012-08-28 00:24:52 +02001765 /* Optimization: only call _bootstrap._lock_unlock_module() if
Eric Snowb523f842013-11-22 09:05:39 -07001766 __spec__._initializing is true.
1767 NOTE: because of this, initializing must be set *before*
Antoine Pitrou03989852012-08-28 00:24:52 +02001768 stuffing the new module in sys.modules.
1769 */
Eric Snowb523f842013-11-22 09:05:39 -07001770 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001771 if (_PyModuleSpec_IsInitializing(spec)) {
1772 PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib,
1773 &PyId__lock_unlock_module, abs_name,
1774 NULL);
1775 if (value == NULL) {
1776 Py_DECREF(spec);
1777 goto error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001778 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001779 Py_DECREF(value);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001780 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001781 Py_XDECREF(spec);
Brett Cannonfd074152012-04-14 14:10:13 -04001782 }
1783 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001784 Py_XDECREF(mod);
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001785 mod = import_find_and_load(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001786 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001787 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001788 }
1789 }
1790
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001791 has_from = 0;
1792 if (fromlist != NULL && fromlist != Py_None) {
1793 has_from = PyObject_IsTrue(fromlist);
1794 if (has_from < 0)
1795 goto error;
1796 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001797 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001798 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1799 if (level == 0 || len > 0) {
1800 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001801
Victor Stinner744c34e2016-05-20 11:36:13 +02001802 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1803 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001804 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001805 }
1806
Victor Stinner744c34e2016-05-20 11:36:13 +02001807 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001808 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001809 final_mod = mod;
1810 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001811 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001812 }
1813
Brett Cannonfd074152012-04-14 14:10:13 -04001814 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001815 PyObject *front = PyUnicode_Substring(name, 0, dot);
1816 if (front == NULL) {
1817 goto error;
1818 }
1819
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001820 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001821 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001822 }
1823 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001824 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001825 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001826 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001827 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001828 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001829 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001830 }
Brett Cannonfd074152012-04-14 14:10:13 -04001831
Eric Snow3f9eee62017-09-15 16:35:20 -06001832 final_mod = PyImport_GetModule(to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001833 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001834 if (final_mod == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001835 if (!PyErr_Occurred()) {
1836 PyErr_Format(PyExc_KeyError,
1837 "%R not in sys.modules as expected",
1838 to_return);
1839 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001840 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001841 }
Brett Cannonfd074152012-04-14 14:10:13 -04001842 }
1843 }
1844 else {
1845 final_mod = mod;
1846 Py_INCREF(mod);
1847 }
1848 }
1849 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001850 _Py_IDENTIFIER(__path__);
1851 PyObject *path;
1852 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1853 goto error;
1854 }
1855 if (path) {
1856 Py_DECREF(path);
1857 final_mod = _PyObject_CallMethodIdObjArgs(
1858 interp->importlib, &PyId__handle_fromlist,
1859 mod, fromlist, interp->import_func, NULL);
1860 }
1861 else {
1862 final_mod = mod;
1863 Py_INCREF(mod);
1864 }
Brett Cannonfd074152012-04-14 14:10:13 -04001865 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001866
Brett Cannonfd074152012-04-14 14:10:13 -04001867 error:
1868 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001869 Py_XDECREF(mod);
1870 Py_XDECREF(package);
Victor Stinner410b85a2019-05-13 17:12:45 +02001871 if (final_mod == NULL) {
1872 remove_importlib_frames(interp);
1873 }
Brett Cannonfd074152012-04-14 14:10:13 -04001874 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001875}
1876
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001877PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001878PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001879 PyObject *fromlist, int level)
1880{
1881 PyObject *nameobj, *mod;
1882 nameobj = PyUnicode_FromString(name);
1883 if (nameobj == NULL)
1884 return NULL;
1885 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1886 fromlist, level);
1887 Py_DECREF(nameobj);
1888 return mod;
1889}
1890
1891
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892/* Re-import a module of any kind and return its module object, WITH
1893 INCREMENTED REFERENCE COUNT */
1894
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001896PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001897{
Eric Snow3f9eee62017-09-15 16:35:20 -06001898 _Py_IDENTIFIER(imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001899 _Py_IDENTIFIER(reload);
1900 PyObject *reloaded_module = NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001901 PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001902 if (imp == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001903 if (PyErr_Occurred()) {
1904 return NULL;
1905 }
1906
Brett Cannon62228db2012-04-29 14:38:11 -04001907 imp = PyImport_ImportModule("imp");
1908 if (imp == NULL) {
1909 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001912
Victor Stinner55ba38a2016-12-09 16:09:30 +01001913 reloaded_module = _PyObject_CallMethodIdObjArgs(imp, &PyId_reload, m, NULL);
Brett Cannon62228db2012-04-29 14:38:11 -04001914 Py_DECREF(imp);
1915 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916}
1917
1918
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001919/* Higher-level import emulator which emulates the "import" statement
1920 more accurately -- it invokes the __import__() function from the
1921 builtins of the current globals. This means that the import is
1922 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001923 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001924 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001925 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001926 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001927
1928PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 static PyObject *silly_list = NULL;
1932 static PyObject *builtins_str = NULL;
1933 static PyObject *import_str = NULL;
1934 PyObject *globals = NULL;
1935 PyObject *import = NULL;
1936 PyObject *builtins = NULL;
1937 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 /* Initialize constant string objects */
1940 if (silly_list == NULL) {
1941 import_str = PyUnicode_InternFromString("__import__");
1942 if (import_str == NULL)
1943 return NULL;
1944 builtins_str = PyUnicode_InternFromString("__builtins__");
1945 if (builtins_str == NULL)
1946 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001947 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 if (silly_list == NULL)
1949 return NULL;
1950 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 /* Get the builtins from current globals */
1953 globals = PyEval_GetGlobals();
1954 if (globals != NULL) {
1955 Py_INCREF(globals);
1956 builtins = PyObject_GetItem(globals, builtins_str);
1957 if (builtins == NULL)
1958 goto err;
1959 }
1960 else {
1961 /* No globals -- use standard builtins, and fake globals */
1962 builtins = PyImport_ImportModuleLevel("builtins",
1963 NULL, NULL, NULL, 0);
1964 if (builtins == NULL)
1965 return NULL;
1966 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1967 if (globals == NULL)
1968 goto err;
1969 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 /* Get the __import__ function from the builtins */
1972 if (PyDict_Check(builtins)) {
1973 import = PyObject_GetItem(builtins, import_str);
1974 if (import == NULL)
1975 PyErr_SetObject(PyExc_KeyError, import_str);
1976 }
1977 else
1978 import = PyObject_GetAttr(builtins, import_str);
1979 if (import == NULL)
1980 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001983 Always use absolute import here.
1984 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1986 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001987 if (r == NULL)
1988 goto err;
1989 Py_DECREF(r);
1990
Eric Snow3f9eee62017-09-15 16:35:20 -06001991 r = PyImport_GetModule(module_name);
1992 if (r == NULL && !PyErr_Occurred()) {
Serhiy Storchaka145541c2017-06-15 20:54:38 +03001993 PyErr_SetObject(PyExc_KeyError, module_name);
1994 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001995
1996 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 Py_XDECREF(globals);
1998 Py_XDECREF(builtins);
1999 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002002}
2003
Brett Cannon4caa61d2014-01-09 19:03:32 -05002004/*[clinic input]
2005_imp.extension_suffixes
2006
2007Returns the list of file suffixes used to identify extension modules.
2008[clinic start generated code]*/
2009
Brett Cannon4caa61d2014-01-09 19:03:32 -05002010static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002011_imp_extension_suffixes_impl(PyObject *module)
2012/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 list = PyList_New(0);
2017 if (list == NULL)
2018 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04002019#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01002020 const char *suffix;
2021 unsigned int index = 0;
2022
Brett Cannon2657df42012-05-04 15:20:40 -04002023 while ((suffix = _PyImport_DynLoadFiletab[index])) {
2024 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (item == NULL) {
2026 Py_DECREF(list);
2027 return NULL;
2028 }
2029 if (PyList_Append(list, item) < 0) {
2030 Py_DECREF(list);
2031 Py_DECREF(item);
2032 return NULL;
2033 }
2034 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04002035 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 }
Brett Cannon2657df42012-05-04 15:20:40 -04002037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039}
2040
Brett Cannon4caa61d2014-01-09 19:03:32 -05002041/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05002042_imp.init_frozen
2043
2044 name: unicode
2045 /
2046
2047Initializes a frozen module.
2048[clinic start generated code]*/
2049
Brett Cannon4caa61d2014-01-09 19:03:32 -05002050static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002051_imp_init_frozen_impl(PyObject *module, PyObject *name)
2052/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 int ret;
2055 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002056
Victor Stinner53dc7352011-03-20 01:50:21 +01002057 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (ret < 0)
2059 return NULL;
2060 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002061 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 }
Victor Stinner53dc7352011-03-20 01:50:21 +01002063 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 Py_XINCREF(m);
2065 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066}
2067
Brett Cannon4caa61d2014-01-09 19:03:32 -05002068/*[clinic input]
2069_imp.get_frozen_object
2070
2071 name: unicode
2072 /
2073
2074Create a code object for a frozen module.
2075[clinic start generated code]*/
2076
Brett Cannon4caa61d2014-01-09 19:03:32 -05002077static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002078_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
2079/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002082}
2083
Brett Cannon4caa61d2014-01-09 19:03:32 -05002084/*[clinic input]
2085_imp.is_frozen_package
2086
2087 name: unicode
2088 /
2089
2090Returns True if the module name is of a frozen package.
2091[clinic start generated code]*/
2092
Brett Cannon4caa61d2014-01-09 19:03:32 -05002093static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002094_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2095/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002098}
2099
Brett Cannon4caa61d2014-01-09 19:03:32 -05002100/*[clinic input]
2101_imp.is_builtin
2102
2103 name: unicode
2104 /
2105
2106Returns True if the module name corresponds to a built-in module.
2107[clinic start generated code]*/
2108
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002110_imp_is_builtin_impl(PyObject *module, PyObject *name)
2111/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112{
Brett Cannon4caa61d2014-01-09 19:03:32 -05002113 return PyLong_FromLong(is_builtin(name));
2114}
2115
2116/*[clinic input]
2117_imp.is_frozen
2118
2119 name: unicode
2120 /
2121
2122Returns True if the module name corresponds to a frozen module.
2123[clinic start generated code]*/
2124
Brett Cannon4caa61d2014-01-09 19:03:32 -05002125static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002126_imp_is_frozen_impl(PyObject *module, PyObject *name)
2127/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002128{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07002129 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 p = find_frozen(name);
2132 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002133}
2134
Larry Hastings1df0b352015-08-24 19:53:56 -07002135/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2136static int
2137exec_builtin_or_dynamic(PyObject *mod) {
2138 PyModuleDef *def;
2139 void *state;
2140
2141 if (!PyModule_Check(mod)) {
2142 return 0;
2143 }
2144
2145 def = PyModule_GetDef(mod);
2146 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07002147 return 0;
2148 }
Brett Cannon52794db2016-09-07 17:00:43 -07002149
Larry Hastings1df0b352015-08-24 19:53:56 -07002150 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07002151 if (state) {
2152 /* Already initialized; skip reload */
2153 return 0;
2154 }
Brett Cannon52794db2016-09-07 17:00:43 -07002155
Larry Hastings1df0b352015-08-24 19:53:56 -07002156 return PyModule_ExecDef(mod, def);
2157}
2158
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002159#ifdef HAVE_DYNAMIC_LOADING
2160
Brett Cannon4caa61d2014-01-09 19:03:32 -05002161/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002162_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002163
Nick Coghland5cacbb2015-05-23 22:24:10 +10002164 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002165 file: object = NULL
2166 /
2167
Nick Coghland5cacbb2015-05-23 22:24:10 +10002168Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002169[clinic start generated code]*/
2170
Brett Cannon4caa61d2014-01-09 19:03:32 -05002171static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002172_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2173/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002174{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002175 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002176 FILE *fp;
2177
Nick Coghland5cacbb2015-05-23 22:24:10 +10002178 name = PyObject_GetAttrString(spec, "name");
2179 if (name == NULL) {
2180 return NULL;
2181 }
2182
2183 path = PyObject_GetAttrString(spec, "origin");
2184 if (path == NULL) {
2185 Py_DECREF(name);
2186 return NULL;
2187 }
2188
2189 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002190 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002191 Py_DECREF(name);
2192 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002193 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002194 return mod;
2195 }
2196
Brett Cannon4caa61d2014-01-09 19:03:32 -05002197 if (file != NULL) {
2198 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002199 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002200 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002201 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002203 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002205 else
2206 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002207
2208 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2209
2210 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002211 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 if (fp)
2213 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002214 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215}
2216
Nick Coghland5cacbb2015-05-23 22:24:10 +10002217/*[clinic input]
2218_imp.exec_dynamic -> int
2219
2220 mod: object
2221 /
2222
2223Initialize an extension module.
2224[clinic start generated code]*/
2225
2226static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002227_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2228/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002229{
Larry Hastings1df0b352015-08-24 19:53:56 -07002230 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002231}
2232
2233
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002234#endif /* HAVE_DYNAMIC_LOADING */
2235
Larry Hastings7726ac92014-01-31 22:03:12 -08002236/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002237_imp.exec_builtin -> int
2238
2239 mod: object
2240 /
2241
2242Initialize a built-in module.
2243[clinic start generated code]*/
2244
2245static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002246_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2247/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002248{
2249 return exec_builtin_or_dynamic(mod);
2250}
2251
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002252/*[clinic input]
2253_imp.source_hash
2254
2255 key: long
2256 source: Py_buffer
2257[clinic start generated code]*/
2258
2259static PyObject *
2260_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2261/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2262{
Benjamin Peterson83620772017-12-09 12:18:56 -08002263 union {
2264 uint64_t x;
2265 char data[sizeof(uint64_t)];
2266 } hash;
2267 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002268#if !PY_LITTLE_ENDIAN
2269 // Force to little-endian. There really ought to be a succinct standard way
2270 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002271 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2272 char tmp = hash.data[i];
2273 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2274 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002275 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002276#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002277 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002278}
2279
Barry Warsaw28a691b2010-04-17 00:19:56 +00002280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002281PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002282"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002283
Guido van Rossum79f25d91997-04-29 20:08:16 +00002284static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002285 _IMP_EXTENSION_SUFFIXES_METHODDEF
2286 _IMP_LOCK_HELD_METHODDEF
2287 _IMP_ACQUIRE_LOCK_METHODDEF
2288 _IMP_RELEASE_LOCK_METHODDEF
2289 _IMP_GET_FROZEN_OBJECT_METHODDEF
2290 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002291 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002292 _IMP_INIT_FROZEN_METHODDEF
2293 _IMP_IS_BUILTIN_METHODDEF
2294 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002295 _IMP_CREATE_DYNAMIC_METHODDEF
2296 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002297 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002298 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002299 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002300 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002301};
2302
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002303
Martin v. Löwis1a214512008-06-11 05:26:20 +00002304static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002306 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 doc_imp,
2308 0,
2309 imp_methods,
2310 NULL,
2311 NULL,
2312 NULL,
2313 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002314};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002315
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002316PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002317PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 m = PyModule_Create(&impmodule);
Victor Stinner410b85a2019-05-13 17:12:45 +02002322 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002324 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 d = PyModule_GetDict(m);
Victor Stinner410b85a2019-05-13 17:12:45 +02002326 if (d == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002328 }
2329
2330 const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode;
2331 PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002332 if (pyc_mode == NULL) {
2333 goto failure;
2334 }
2335 if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) {
2336 Py_DECREF(pyc_mode);
2337 goto failure;
2338 }
2339 Py_DECREF(pyc_mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002342 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 Py_XDECREF(m);
2344 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002345}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002346
2347
Guido van Rossumb18618d2000-05-03 23:44:39 +00002348/* API for embedding applications that want to add their own entries
2349 to the table of built-in modules. This should normally be called
2350 *before* Py_Initialize(). When the table resize fails, -1 is
2351 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002352
2353 After a similar function by Just van Rossum. */
2354
2355int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002359 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002360 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 /* Count the number of entries in both tables */
2363 for (n = 0; newtab[n].name != NULL; n++)
2364 ;
2365 if (n == 0)
2366 return 0; /* Nothing to do */
2367 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2368 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002369
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002370 /* Force default raw memory allocator to get a known allocator to be able
2371 to release the memory in _PyImport_Fini2() */
2372 PyMemAllocatorEx old_alloc;
2373 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002376 p = NULL;
2377 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002378 size_t size = sizeof(struct _inittab) * (i + n + 1);
2379 p = PyMem_RawRealloc(inittab_copy, size);
2380 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002381 if (p == NULL) {
2382 res = -1;
2383 goto done;
2384 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002385
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002386 /* Copy the tables into the new memory at the first call
2387 to PyImport_ExtendInittab(). */
2388 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002390 }
2391 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2392 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002393
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002394done:
2395 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2396 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002397}
2398
2399/* Shorthand to add a single entry given a name and a function */
2400
2401int
Brett Cannona826f322009-04-02 03:41:46 +00002402PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002407
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002408 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002412}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002413
2414#ifdef __cplusplus
2415}
2416#endif