blob: ec172b29f739fc8c0f24d93448c1708542dc454e [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
Steve Dowerb82e17e2019-05-23 08:45:22 -07001664 PyObject *sys_path = PySys_GetObject("path");
1665 PyObject *sys_meta_path = PySys_GetObject("meta_path");
1666 PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
1667 if (PySys_Audit("import", "OOOOO",
1668 abs_name, Py_None, sys_path ? sys_path : Py_None,
1669 sys_meta_path ? sys_meta_path : Py_None,
1670 sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
1671 return NULL;
1672 }
1673
1674
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001675 /* XOptions is initialized after first some imports.
1676 * So we can't have negative cache before completed initialization.
1677 * Anyway, importlib._find_and_load is much slower than
1678 * _PyDict_GetItemIdWithError().
1679 */
1680 if (import_time) {
1681 static int header = 1;
1682 if (header) {
1683 fputs("import time: self [us] | cumulative | imported package\n",
1684 stderr);
1685 header = 0;
1686 }
1687
1688 import_level++;
1689 t1 = _PyTime_GetPerfCounter();
1690 accumulated = 0;
1691 }
1692
1693 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1694 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1695
1696 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1697 &PyId__find_and_load, abs_name,
1698 interp->import_func, NULL);
1699
1700 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1701 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1702 mod != NULL);
1703
1704 if (import_time) {
1705 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1706
1707 import_level--;
1708 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1709 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1710 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1711 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1712
1713 accumulated = accumulated_copy + cum;
1714 }
1715
1716 return mod;
1717}
1718
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001719PyObject *
1720PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1721 PyObject *locals, PyObject *fromlist,
1722 int level)
1723{
Brett Cannonfd074152012-04-14 14:10:13 -04001724 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001725 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001726 PyObject *final_mod = NULL;
1727 PyObject *mod = NULL;
1728 PyObject *package = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001729 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001730 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001731
Brett Cannonfd074152012-04-14 14:10:13 -04001732 if (name == NULL) {
1733 PyErr_SetString(PyExc_ValueError, "Empty module name");
1734 goto error;
1735 }
1736
1737 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1738 for added performance. */
1739
1740 if (!PyUnicode_Check(name)) {
1741 PyErr_SetString(PyExc_TypeError, "module name must be a string");
1742 goto error;
1743 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001744 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001745 goto error;
1746 }
1747 if (level < 0) {
1748 PyErr_SetString(PyExc_ValueError, "level must be >= 0");
1749 goto error;
1750 }
Brett Cannon849113a2016-01-22 15:25:50 -08001751
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001752 if (level > 0) {
1753 abs_name = resolve_name(name, globals, level);
1754 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001755 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001756 }
1757 else { /* level == 0 */
1758 if (PyUnicode_GET_LENGTH(name) == 0) {
1759 PyErr_SetString(PyExc_ValueError, "Empty module name");
1760 goto error;
1761 }
Brett Cannonfd074152012-04-14 14:10:13 -04001762 abs_name = name;
1763 Py_INCREF(abs_name);
1764 }
1765
Eric Snow3f9eee62017-09-15 16:35:20 -06001766 mod = PyImport_GetModule(abs_name);
Stefan Krah027b09c2019-03-25 21:50:58 +01001767 if (mod == NULL && PyErr_Occurred()) {
1768 goto error;
1769 }
1770
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001771 if (mod != NULL && mod != Py_None) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001772 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001773 _Py_IDENTIFIER(_lock_unlock_module);
Eric Snowb523f842013-11-22 09:05:39 -07001774 PyObject *spec;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001775
Antoine Pitrou03989852012-08-28 00:24:52 +02001776 /* Optimization: only call _bootstrap._lock_unlock_module() if
Eric Snowb523f842013-11-22 09:05:39 -07001777 __spec__._initializing is true.
1778 NOTE: because of this, initializing must be set *before*
Antoine Pitrou03989852012-08-28 00:24:52 +02001779 stuffing the new module in sys.modules.
1780 */
Eric Snowb523f842013-11-22 09:05:39 -07001781 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001782 if (_PyModuleSpec_IsInitializing(spec)) {
1783 PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib,
1784 &PyId__lock_unlock_module, abs_name,
1785 NULL);
1786 if (value == NULL) {
1787 Py_DECREF(spec);
1788 goto error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001789 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001790 Py_DECREF(value);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001791 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001792 Py_XDECREF(spec);
Brett Cannonfd074152012-04-14 14:10:13 -04001793 }
1794 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001795 Py_XDECREF(mod);
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001796 mod = import_find_and_load(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001797 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001798 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001799 }
1800 }
1801
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001802 has_from = 0;
1803 if (fromlist != NULL && fromlist != Py_None) {
1804 has_from = PyObject_IsTrue(fromlist);
1805 if (has_from < 0)
1806 goto error;
1807 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001808 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001809 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1810 if (level == 0 || len > 0) {
1811 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001812
Victor Stinner744c34e2016-05-20 11:36:13 +02001813 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1814 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001815 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001816 }
1817
Victor Stinner744c34e2016-05-20 11:36:13 +02001818 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001819 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001820 final_mod = mod;
1821 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001822 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001823 }
1824
Brett Cannonfd074152012-04-14 14:10:13 -04001825 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001826 PyObject *front = PyUnicode_Substring(name, 0, dot);
1827 if (front == NULL) {
1828 goto error;
1829 }
1830
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001831 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001832 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001833 }
1834 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001835 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001836 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001837 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001838 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001839 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001840 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001841 }
Brett Cannonfd074152012-04-14 14:10:13 -04001842
Eric Snow3f9eee62017-09-15 16:35:20 -06001843 final_mod = PyImport_GetModule(to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001844 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001845 if (final_mod == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001846 if (!PyErr_Occurred()) {
1847 PyErr_Format(PyExc_KeyError,
1848 "%R not in sys.modules as expected",
1849 to_return);
1850 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001851 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001852 }
Brett Cannonfd074152012-04-14 14:10:13 -04001853 }
1854 }
1855 else {
1856 final_mod = mod;
1857 Py_INCREF(mod);
1858 }
1859 }
1860 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001861 _Py_IDENTIFIER(__path__);
1862 PyObject *path;
1863 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1864 goto error;
1865 }
1866 if (path) {
1867 Py_DECREF(path);
1868 final_mod = _PyObject_CallMethodIdObjArgs(
1869 interp->importlib, &PyId__handle_fromlist,
1870 mod, fromlist, interp->import_func, NULL);
1871 }
1872 else {
1873 final_mod = mod;
1874 Py_INCREF(mod);
1875 }
Brett Cannonfd074152012-04-14 14:10:13 -04001876 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001877
Brett Cannonfd074152012-04-14 14:10:13 -04001878 error:
1879 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001880 Py_XDECREF(mod);
1881 Py_XDECREF(package);
Victor Stinner410b85a2019-05-13 17:12:45 +02001882 if (final_mod == NULL) {
1883 remove_importlib_frames(interp);
1884 }
Brett Cannonfd074152012-04-14 14:10:13 -04001885 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001886}
1887
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001888PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001889PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001890 PyObject *fromlist, int level)
1891{
1892 PyObject *nameobj, *mod;
1893 nameobj = PyUnicode_FromString(name);
1894 if (nameobj == NULL)
1895 return NULL;
1896 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1897 fromlist, level);
1898 Py_DECREF(nameobj);
1899 return mod;
1900}
1901
1902
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001903/* Re-import a module of any kind and return its module object, WITH
1904 INCREMENTED REFERENCE COUNT */
1905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001907PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001908{
Eric Snow3f9eee62017-09-15 16:35:20 -06001909 _Py_IDENTIFIER(imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001910 _Py_IDENTIFIER(reload);
1911 PyObject *reloaded_module = NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001912 PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001913 if (imp == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001914 if (PyErr_Occurred()) {
1915 return NULL;
1916 }
1917
Brett Cannon62228db2012-04-29 14:38:11 -04001918 imp = PyImport_ImportModule("imp");
1919 if (imp == NULL) {
1920 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001923
Victor Stinner55ba38a2016-12-09 16:09:30 +01001924 reloaded_module = _PyObject_CallMethodIdObjArgs(imp, &PyId_reload, m, NULL);
Brett Cannon62228db2012-04-29 14:38:11 -04001925 Py_DECREF(imp);
1926 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001927}
1928
1929
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001930/* Higher-level import emulator which emulates the "import" statement
1931 more accurately -- it invokes the __import__() function from the
1932 builtins of the current globals. This means that the import is
1933 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001934 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001935 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001936 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001937 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001938
1939PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001940PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 static PyObject *silly_list = NULL;
1943 static PyObject *builtins_str = NULL;
1944 static PyObject *import_str = NULL;
1945 PyObject *globals = NULL;
1946 PyObject *import = NULL;
1947 PyObject *builtins = NULL;
1948 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 /* Initialize constant string objects */
1951 if (silly_list == NULL) {
1952 import_str = PyUnicode_InternFromString("__import__");
1953 if (import_str == NULL)
1954 return NULL;
1955 builtins_str = PyUnicode_InternFromString("__builtins__");
1956 if (builtins_str == NULL)
1957 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001958 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 if (silly_list == NULL)
1960 return NULL;
1961 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 /* Get the builtins from current globals */
1964 globals = PyEval_GetGlobals();
1965 if (globals != NULL) {
1966 Py_INCREF(globals);
1967 builtins = PyObject_GetItem(globals, builtins_str);
1968 if (builtins == NULL)
1969 goto err;
1970 }
1971 else {
1972 /* No globals -- use standard builtins, and fake globals */
1973 builtins = PyImport_ImportModuleLevel("builtins",
1974 NULL, NULL, NULL, 0);
1975 if (builtins == NULL)
1976 return NULL;
1977 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1978 if (globals == NULL)
1979 goto err;
1980 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 /* Get the __import__ function from the builtins */
1983 if (PyDict_Check(builtins)) {
1984 import = PyObject_GetItem(builtins, import_str);
1985 if (import == NULL)
1986 PyErr_SetObject(PyExc_KeyError, import_str);
1987 }
1988 else
1989 import = PyObject_GetAttr(builtins, import_str);
1990 if (import == NULL)
1991 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001994 Always use absolute import here.
1995 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1997 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001998 if (r == NULL)
1999 goto err;
2000 Py_DECREF(r);
2001
Eric Snow3f9eee62017-09-15 16:35:20 -06002002 r = PyImport_GetModule(module_name);
2003 if (r == NULL && !PyErr_Occurred()) {
Serhiy Storchaka145541c2017-06-15 20:54:38 +03002004 PyErr_SetObject(PyExc_KeyError, module_name);
2005 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002006
2007 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 Py_XDECREF(globals);
2009 Py_XDECREF(builtins);
2010 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002013}
2014
Brett Cannon4caa61d2014-01-09 19:03:32 -05002015/*[clinic input]
2016_imp.extension_suffixes
2017
2018Returns the list of file suffixes used to identify extension modules.
2019[clinic start generated code]*/
2020
Brett Cannon4caa61d2014-01-09 19:03:32 -05002021static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002022_imp_extension_suffixes_impl(PyObject *module)
2023/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 list = PyList_New(0);
2028 if (list == NULL)
2029 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04002030#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01002031 const char *suffix;
2032 unsigned int index = 0;
2033
Brett Cannon2657df42012-05-04 15:20:40 -04002034 while ((suffix = _PyImport_DynLoadFiletab[index])) {
2035 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 if (item == NULL) {
2037 Py_DECREF(list);
2038 return NULL;
2039 }
2040 if (PyList_Append(list, item) < 0) {
2041 Py_DECREF(list);
2042 Py_DECREF(item);
2043 return NULL;
2044 }
2045 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04002046 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 }
Brett Cannon2657df42012-05-04 15:20:40 -04002048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002050}
2051
Brett Cannon4caa61d2014-01-09 19:03:32 -05002052/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05002053_imp.init_frozen
2054
2055 name: unicode
2056 /
2057
2058Initializes a frozen module.
2059[clinic start generated code]*/
2060
Brett Cannon4caa61d2014-01-09 19:03:32 -05002061static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002062_imp_init_frozen_impl(PyObject *module, PyObject *name)
2063/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 int ret;
2066 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002067
Victor Stinner53dc7352011-03-20 01:50:21 +01002068 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 if (ret < 0)
2070 return NULL;
2071 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002072 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 }
Victor Stinner53dc7352011-03-20 01:50:21 +01002074 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 Py_XINCREF(m);
2076 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077}
2078
Brett Cannon4caa61d2014-01-09 19:03:32 -05002079/*[clinic input]
2080_imp.get_frozen_object
2081
2082 name: unicode
2083 /
2084
2085Create a code object for a frozen module.
2086[clinic start generated code]*/
2087
Brett Cannon4caa61d2014-01-09 19:03:32 -05002088static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002089_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
2090/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002093}
2094
Brett Cannon4caa61d2014-01-09 19:03:32 -05002095/*[clinic input]
2096_imp.is_frozen_package
2097
2098 name: unicode
2099 /
2100
2101Returns True if the module name is of a frozen package.
2102[clinic start generated code]*/
2103
Brett Cannon4caa61d2014-01-09 19:03:32 -05002104static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002105_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2106/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002109}
2110
Brett Cannon4caa61d2014-01-09 19:03:32 -05002111/*[clinic input]
2112_imp.is_builtin
2113
2114 name: unicode
2115 /
2116
2117Returns True if the module name corresponds to a built-in module.
2118[clinic start generated code]*/
2119
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002121_imp_is_builtin_impl(PyObject *module, PyObject *name)
2122/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123{
Brett Cannon4caa61d2014-01-09 19:03:32 -05002124 return PyLong_FromLong(is_builtin(name));
2125}
2126
2127/*[clinic input]
2128_imp.is_frozen
2129
2130 name: unicode
2131 /
2132
2133Returns True if the module name corresponds to a frozen module.
2134[clinic start generated code]*/
2135
Brett Cannon4caa61d2014-01-09 19:03:32 -05002136static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002137_imp_is_frozen_impl(PyObject *module, PyObject *name)
2138/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002139{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07002140 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 p = find_frozen(name);
2143 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144}
2145
Larry Hastings1df0b352015-08-24 19:53:56 -07002146/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2147static int
2148exec_builtin_or_dynamic(PyObject *mod) {
2149 PyModuleDef *def;
2150 void *state;
2151
2152 if (!PyModule_Check(mod)) {
2153 return 0;
2154 }
2155
2156 def = PyModule_GetDef(mod);
2157 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07002158 return 0;
2159 }
Brett Cannon52794db2016-09-07 17:00:43 -07002160
Larry Hastings1df0b352015-08-24 19:53:56 -07002161 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07002162 if (state) {
2163 /* Already initialized; skip reload */
2164 return 0;
2165 }
Brett Cannon52794db2016-09-07 17:00:43 -07002166
Larry Hastings1df0b352015-08-24 19:53:56 -07002167 return PyModule_ExecDef(mod, def);
2168}
2169
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002170#ifdef HAVE_DYNAMIC_LOADING
2171
Brett Cannon4caa61d2014-01-09 19:03:32 -05002172/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002173_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002174
Nick Coghland5cacbb2015-05-23 22:24:10 +10002175 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002176 file: object = NULL
2177 /
2178
Nick Coghland5cacbb2015-05-23 22:24:10 +10002179Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002180[clinic start generated code]*/
2181
Brett Cannon4caa61d2014-01-09 19:03:32 -05002182static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002183_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2184/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002185{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002186 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002187 FILE *fp;
2188
Nick Coghland5cacbb2015-05-23 22:24:10 +10002189 name = PyObject_GetAttrString(spec, "name");
2190 if (name == NULL) {
2191 return NULL;
2192 }
2193
2194 path = PyObject_GetAttrString(spec, "origin");
2195 if (path == NULL) {
2196 Py_DECREF(name);
2197 return NULL;
2198 }
2199
2200 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002201 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002202 Py_DECREF(name);
2203 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002204 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002205 return mod;
2206 }
2207
Brett Cannon4caa61d2014-01-09 19:03:32 -05002208 if (file != NULL) {
2209 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002210 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002211 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002212 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002214 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002216 else
2217 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002218
2219 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2220
2221 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002222 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (fp)
2224 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002225 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002226}
2227
Nick Coghland5cacbb2015-05-23 22:24:10 +10002228/*[clinic input]
2229_imp.exec_dynamic -> int
2230
2231 mod: object
2232 /
2233
2234Initialize an extension module.
2235[clinic start generated code]*/
2236
2237static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002238_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2239/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002240{
Larry Hastings1df0b352015-08-24 19:53:56 -07002241 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002242}
2243
2244
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002245#endif /* HAVE_DYNAMIC_LOADING */
2246
Larry Hastings7726ac92014-01-31 22:03:12 -08002247/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002248_imp.exec_builtin -> int
2249
2250 mod: object
2251 /
2252
2253Initialize a built-in module.
2254[clinic start generated code]*/
2255
2256static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002257_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2258/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002259{
2260 return exec_builtin_or_dynamic(mod);
2261}
2262
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002263/*[clinic input]
2264_imp.source_hash
2265
2266 key: long
2267 source: Py_buffer
2268[clinic start generated code]*/
2269
2270static PyObject *
2271_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2272/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2273{
Benjamin Peterson83620772017-12-09 12:18:56 -08002274 union {
2275 uint64_t x;
2276 char data[sizeof(uint64_t)];
2277 } hash;
2278 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002279#if !PY_LITTLE_ENDIAN
2280 // Force to little-endian. There really ought to be a succinct standard way
2281 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002282 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2283 char tmp = hash.data[i];
2284 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2285 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002286 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002287#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002288 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002289}
2290
Barry Warsaw28a691b2010-04-17 00:19:56 +00002291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002292PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002293"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002294
Guido van Rossum79f25d91997-04-29 20:08:16 +00002295static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002296 _IMP_EXTENSION_SUFFIXES_METHODDEF
2297 _IMP_LOCK_HELD_METHODDEF
2298 _IMP_ACQUIRE_LOCK_METHODDEF
2299 _IMP_RELEASE_LOCK_METHODDEF
2300 _IMP_GET_FROZEN_OBJECT_METHODDEF
2301 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002302 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002303 _IMP_INIT_FROZEN_METHODDEF
2304 _IMP_IS_BUILTIN_METHODDEF
2305 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002306 _IMP_CREATE_DYNAMIC_METHODDEF
2307 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002308 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002309 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002310 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002311 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312};
2313
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002314
Martin v. Löwis1a214512008-06-11 05:26:20 +00002315static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002317 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 doc_imp,
2319 0,
2320 imp_methods,
2321 NULL,
2322 NULL,
2323 NULL,
2324 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002325};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002326
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002327PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002328PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 m = PyModule_Create(&impmodule);
Victor Stinner410b85a2019-05-13 17:12:45 +02002333 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 d = PyModule_GetDict(m);
Victor Stinner410b85a2019-05-13 17:12:45 +02002337 if (d == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002339 }
2340
2341 const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode;
2342 PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002343 if (pyc_mode == NULL) {
2344 goto failure;
2345 }
2346 if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) {
2347 Py_DECREF(pyc_mode);
2348 goto failure;
2349 }
2350 Py_DECREF(pyc_mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002353 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 Py_XDECREF(m);
2355 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002356}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002357
2358
Guido van Rossumb18618d2000-05-03 23:44:39 +00002359/* API for embedding applications that want to add their own entries
2360 to the table of built-in modules. This should normally be called
2361 *before* Py_Initialize(). When the table resize fails, -1 is
2362 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002363
2364 After a similar function by Just van Rossum. */
2365
2366int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002370 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002371 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 /* Count the number of entries in both tables */
2374 for (n = 0; newtab[n].name != NULL; n++)
2375 ;
2376 if (n == 0)
2377 return 0; /* Nothing to do */
2378 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2379 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002380
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002381 /* Force default raw memory allocator to get a known allocator to be able
2382 to release the memory in _PyImport_Fini2() */
2383 PyMemAllocatorEx old_alloc;
2384 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002387 p = NULL;
2388 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002389 size_t size = sizeof(struct _inittab) * (i + n + 1);
2390 p = PyMem_RawRealloc(inittab_copy, size);
2391 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002392 if (p == NULL) {
2393 res = -1;
2394 goto done;
2395 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002396
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002397 /* Copy the tables into the new memory at the first call
2398 to PyImport_ExtendInittab(). */
2399 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002401 }
2402 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2403 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002404
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002405done:
2406 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2407 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002408}
2409
2410/* Shorthand to add a single entry given a name and a function */
2411
2412int
Brett Cannona826f322009-04-02 03:41:46 +00002413PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002418
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002419 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002423}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002424
2425#ifdef __cplusplus
2426}
2427#endif