blob: cbd0fa86fb58f4223262e520c47aca2c1ba9098f [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 Stinner61691d82019-10-02 23:51:20 +02007#include "pycore_initconfig.h"
Victor Stinner0a28f8d2019-06-19 02:54:39 +02008#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01009#include "pycore_pyhash.h"
10#include "pycore_pylifecycle.h"
11#include "pycore_pymem.h"
12#include "pycore_pystate.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000014#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000015#include "code.h"
Antoine Pitroubc07a5c2012-07-08 12:01:27 +020016#include "frameobject.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000017#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000018#include "importdl.h"
Christian Heimes3d2b4072017-09-30 00:53:19 +020019#include "pydtrace.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000020
Guido van Rossum55a83382000-09-20 20:31:38 +000021#ifdef HAVE_FCNTL_H
22#include <fcntl.h>
23#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000025extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000026#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000027
Barry Warsaw28a691b2010-04-17 00:19:56 +000028#define CACHEDIR "__pycache__"
Guido van Rossum96774c12000-05-01 20:19:08 +000029
Victor Stinner0a28f8d2019-06-19 02:54:39 +020030/* Forward references */
31static PyObject *import_add_module(PyThreadState *tstate, PyObject *name);
32
Victor Stinner95872862011-03-07 18:20:56 +010033/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +000034static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
Guido van Rossum771c6c81997-10-31 18:37:24 +000036/* This table is defined in config.c: */
37extern struct _inittab _PyImport_Inittab[];
38
39struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Victor Stinner92a3c6f2017-12-06 18:12:59 +010040static struct _inittab *inittab_copy = NULL;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000041
Brett Cannon4caa61d2014-01-09 19:03:32 -050042/*[clinic input]
43module _imp
44[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030045/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
Brett Cannonfd4d0502014-05-30 11:21:14 -040046
47#include "clinic/import.c.h"
Brett Cannon4caa61d2014-01-09 19:03:32 -050048
Guido van Rossum1ae940a1995-01-02 19:04:15 +000049/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050
Victor Stinner331a6a52019-05-27 16:39:22 +020051PyStatus
Victor Stinnerb45d2592019-06-20 00:05:23 +020052_PyImport_Init(PyThreadState *tstate)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053{
Victor Stinnerb45d2592019-06-20 00:05:23 +020054 PyInterpreterState *interp = tstate->interp;
Serhiy Storchaka013bb912014-02-10 18:21:34 +020055 interp->builtins_copy = PyDict_Copy(interp->builtins);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080056 if (interp->builtins_copy == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020057 return _PyStatus_ERR("Can't backup builtins dict");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080058 }
Victor Stinner331a6a52019-05-27 16:39:22 +020059 return _PyStatus_OK();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060}
61
Victor Stinner331a6a52019-05-27 16:39:22 +020062PyStatus
Victor Stinnerb45d2592019-06-20 00:05:23 +020063_PyImportHooks_Init(PyThreadState *tstate)
Just van Rossum52e14d62002-12-30 22:08:05 +000064{
Brett Cannonfd074152012-04-14 14:10:13 -040065 PyObject *v, *path_hooks = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +000067
Brett Cannonfd074152012-04-14 14:10:13 -040068 /* adding sys.path_hooks and sys.path_importer_cache */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 v = PyList_New(0);
70 if (v == NULL)
71 goto error;
72 err = PySys_SetObject("meta_path", v);
73 Py_DECREF(v);
74 if (err)
75 goto error;
76 v = PyDict_New();
77 if (v == NULL)
78 goto error;
79 err = PySys_SetObject("path_importer_cache", v);
80 Py_DECREF(v);
81 if (err)
82 goto error;
83 path_hooks = PyList_New(0);
84 if (path_hooks == NULL)
85 goto error;
86 err = PySys_SetObject("path_hooks", path_hooks);
87 if (err) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -080088 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 }
Brett Cannonfd074152012-04-14 14:10:13 -040090 Py_DECREF(path_hooks);
Victor Stinner331a6a52019-05-27 16:39:22 +020091 return _PyStatus_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080092
93 error:
Victor Stinnerb45d2592019-06-20 00:05:23 +020094 _PyErr_Print(tstate);
Victor Stinner331a6a52019-05-27 16:39:22 +020095 return _PyStatus_ERR("initializing sys.meta_path, sys.path_hooks, "
Victor Stinnerf7e5b562017-11-15 15:48:08 -080096 "or path_importer_cache failed");
Brett Cannonfd074152012-04-14 14:10:13 -040097}
98
Victor Stinner331a6a52019-05-27 16:39:22 +020099PyStatus
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200100_PyImportZip_Init(PyThreadState *tstate)
Brett Cannonfd074152012-04-14 14:10:13 -0400101{
ukwksk5e6312c2018-05-15 04:10:52 +0900102 PyObject *path_hooks, *zipimport;
Brett Cannonfd074152012-04-14 14:10:13 -0400103 int err = 0;
104
105 path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200106 if (path_hooks == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200107 _PyErr_SetString(tstate, PyExc_RuntimeError,
108 "unable to get sys.path_hooks");
Brett Cannonfd074152012-04-14 14:10:13 -0400109 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200110 }
Brett Cannonfd074152012-04-14 14:10:13 -0400111
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200112 int verbose = tstate->interp->config.verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +0200113 if (verbose) {
Brett Cannonfd074152012-04-14 14:10:13 -0400114 PySys_WriteStderr("# installing zipimport hook\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200115 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000116
ukwksk5e6312c2018-05-15 04:10:52 +0900117 zipimport = PyImport_ImportModule("zipimport");
118 if (zipimport == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200119 _PyErr_Clear(tstate); /* No zip import module -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +0200120 if (verbose) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 PySys_WriteStderr("# can't import zipimport\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200122 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 }
124 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200125 _Py_IDENTIFIER(zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900126 PyObject *zipimporter = _PyObject_GetAttrId(zipimport,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200127 &PyId_zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900128 Py_DECREF(zipimport);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 if (zipimporter == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200130 _PyErr_Clear(tstate); /* No zipimporter object -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +0200131 if (verbose) {
132 PySys_WriteStderr("# can't import zipimport.zipimporter\n");
133 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 }
135 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -0400136 /* sys.path_hooks.insert(0, zipimporter) */
137 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -0400139 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -0400141 }
Victor Stinner410b85a2019-05-13 17:12:45 +0200142 if (verbose) {
143 PySys_WriteStderr("# installed zipimport hook\n");
144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 }
146 }
Brett Cannonfd074152012-04-14 14:10:13 -0400147
Victor Stinner331a6a52019-05-27 16:39:22 +0200148 return _PyStatus_OK();
Brett Cannonfd074152012-04-14 14:10:13 -0400149
150 error:
151 PyErr_Print();
Victor Stinner331a6a52019-05-27 16:39:22 +0200152 return _PyStatus_ERR("initializing zipimport failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000153}
154
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000155/* Locking primitives to prevent parallel imports of the same module
156 in different threads to return with a partially loaded module.
157 These calls are serialized by the global interpreter lock. */
158
Guido van Rossum49b56061998-10-01 20:42:43 +0000159#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000160
Guido van Rossum65d5b571998-12-21 19:32:43 +0000161static PyThread_type_lock import_lock = 0;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200162static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000163static int import_lock_level = 0;
164
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000165void
166_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000167{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200168 unsigned long me = PyThread_get_thread_ident();
169 if (me == PYTHREAD_INVALID_THREAD_ID)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 return; /* Too bad */
171 if (import_lock == NULL) {
172 import_lock = PyThread_allocate_lock();
173 if (import_lock == NULL)
174 return; /* Nothing much we can do. */
175 }
176 if (import_lock_thread == me) {
177 import_lock_level++;
178 return;
179 }
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200180 if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
181 !PyThread_acquire_lock(import_lock, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 {
183 PyThreadState *tstate = PyEval_SaveThread();
184 PyThread_acquire_lock(import_lock, 1);
185 PyEval_RestoreThread(tstate);
186 }
Antoine Pitrou202b6062012-12-18 22:18:17 +0100187 assert(import_lock_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 import_lock_thread = me;
189 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000190}
191
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000192int
193_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000194{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200195 unsigned long me = PyThread_get_thread_ident();
196 if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 return 0; /* Too bad */
198 if (import_lock_thread != me)
199 return -1;
200 import_lock_level--;
Antoine Pitrou202b6062012-12-18 22:18:17 +0100201 assert(import_lock_level >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (import_lock_level == 0) {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200203 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyThread_release_lock(import_lock);
205 }
206 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000207}
208
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200209/* This function is called from PyOS_AfterFork_Child to ensure that newly
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000210 created child processes do not share locks with the parent.
211 We now acquire the import lock around fork() calls but on some platforms
212 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000213
214void
215_PyImport_ReInitLock(void)
216{
Christian Heimes418fd742015-04-19 21:08:42 +0200217 if (import_lock != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 import_lock = PyThread_allocate_lock();
Christian Heimes418fd742015-04-19 21:08:42 +0200219 if (import_lock == NULL) {
220 Py_FatalError("PyImport_ReInitLock failed to create a new lock");
221 }
222 }
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000223 if (import_lock_level > 1) {
224 /* Forked as a side effect of import */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200225 unsigned long me = PyThread_get_thread_ident();
Brett Cannone4710cf2012-11-15 21:39:36 -0500226 /* The following could fail if the lock is already held, but forking as
227 a side-effect of an import is a) rare, b) nuts, and c) difficult to
228 do thanks to the lock only being held when doing individual module
229 locks per import. */
230 PyThread_acquire_lock(import_lock, NOWAIT_LOCK);
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000231 import_lock_thread = me;
232 import_lock_level--;
233 } else {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200234 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000235 import_lock_level = 0;
236 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000237}
238
Brett Cannon4caa61d2014-01-09 19:03:32 -0500239/*[clinic input]
240_imp.lock_held
241
242Return True if the import lock is currently held, else False.
243
244On platforms without threads, return False.
245[clinic start generated code]*/
246
Brett Cannon4caa61d2014-01-09 19:03:32 -0500247static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300248_imp_lock_held_impl(PyObject *module)
249/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
Tim Peters69232342001-08-30 05:16:13 +0000250{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200251 return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
Tim Peters69232342001-08-30 05:16:13 +0000252}
253
Brett Cannon4caa61d2014-01-09 19:03:32 -0500254/*[clinic input]
255_imp.acquire_lock
256
257Acquires the interpreter's import lock for the current thread.
258
259This lock should be used by import hooks to ensure thread-safety when importing
260modules. On platforms without threads, this function does nothing.
261[clinic start generated code]*/
262
Brett Cannon4caa61d2014-01-09 19:03:32 -0500263static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300264_imp_acquire_lock_impl(PyObject *module)
265/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 _PyImport_AcquireLock();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200268 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000269}
270
Brett Cannon4caa61d2014-01-09 19:03:32 -0500271/*[clinic input]
272_imp.release_lock
273
274Release the interpreter's import lock.
275
276On platforms without threads, this function does nothing.
277[clinic start generated code]*/
278
Brett Cannon4caa61d2014-01-09 19:03:32 -0500279static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300280_imp_release_lock_impl(PyObject *module)
281/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 if (_PyImport_ReleaseLock() < 0) {
284 PyErr_SetString(PyExc_RuntimeError,
285 "not holding the import lock");
286 return NULL;
287 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200288 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000289}
290
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100291void
292_PyImport_Fini(void)
293{
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200294 Py_CLEAR(extensions);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100295 if (import_lock != NULL) {
296 PyThread_free_lock(import_lock);
297 import_lock = NULL;
298 }
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100299}
300
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100301void
302_PyImport_Fini2(void)
303{
304 /* Use the same memory allocator than PyImport_ExtendInittab(). */
305 PyMemAllocatorEx old_alloc;
306 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
307
308 /* Free memory allocated by PyImport_ExtendInittab() */
309 PyMem_RawFree(inittab_copy);
310
311 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
312}
313
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314/* Helper for sys */
315
316PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000317PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000318{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200319 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow3f9eee62017-09-15 16:35:20 -0600320 if (interp->modules == NULL) {
Eric Snow93c92f72017-09-13 23:46:04 -0700321 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
Eric Snow3f9eee62017-09-15 16:35:20 -0600322 }
Eric Snow93c92f72017-09-13 23:46:04 -0700323 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000324}
325
Eric Snowd393c1b2017-09-14 12:18:12 -0600326/* In some corner cases it is important to be sure that the import
327 machinery has been initialized (or not cleaned up yet). For
328 example, see issue #4236 and PyModule_Create2(). */
329
330int
331_PyImport_IsInitialized(PyInterpreterState *interp)
332{
333 if (interp->modules == NULL)
334 return 0;
335 return 1;
336}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000337
Eric Snow3f9eee62017-09-15 16:35:20 -0600338PyObject *
339_PyImport_GetModuleId(struct _Py_Identifier *nameid)
340{
341 PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
342 if (name == NULL) {
343 return NULL;
344 }
345 return PyImport_GetModule(name);
346}
347
348int
349_PyImport_SetModule(PyObject *name, PyObject *m)
350{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200351 PyThreadState *tstate = _PyThreadState_GET();
352 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600353 return PyObject_SetItem(modules, name, m);
354}
355
356int
357_PyImport_SetModuleString(const char *name, PyObject *m)
358{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200359 PyThreadState *tstate = _PyThreadState_GET();
360 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600361 return PyMapping_SetItemString(modules, name, m);
362}
363
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200364static PyObject *
365import_get_module(PyThreadState *tstate, PyObject *name)
Eric Snow3f9eee62017-09-15 16:35:20 -0600366{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200367 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600368 if (modules == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200369 _PyErr_SetString(tstate, PyExc_RuntimeError,
370 "unable to get sys.modules");
Eric Snow3f9eee62017-09-15 16:35:20 -0600371 return NULL;
372 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200373
374 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600375 Py_INCREF(modules);
376 if (PyDict_CheckExact(modules)) {
377 m = PyDict_GetItemWithError(modules, name); /* borrowed */
378 Py_XINCREF(m);
379 }
380 else {
381 m = PyObject_GetItem(modules, name);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200382 if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
383 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600384 }
385 }
386 Py_DECREF(modules);
387 return m;
388}
389
390
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100391static int
392import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name)
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200393{
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100394 PyInterpreterState *interp = tstate->interp;
395 PyObject *spec;
396
397 _Py_IDENTIFIER(__spec__);
398 _Py_IDENTIFIER(_lock_unlock_module);
399
400 /* Optimization: only call _bootstrap._lock_unlock_module() if
401 __spec__._initializing is true.
402 NOTE: because of this, initializing must be set *before*
403 stuffing the new module in sys.modules.
404 */
405 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
406 int busy = _PyModuleSpec_IsInitializing(spec);
407 Py_XDECREF(spec);
408 if (busy) {
409 /* Wait until module is done importing. */
410 PyObject *value = _PyObject_CallMethodIdOneArg(
411 interp->importlib, &PyId__lock_unlock_module, name);
412 if (value == NULL) {
413 return -1;
414 }
415 Py_DECREF(value);
416 }
417 return 0;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200418}
419
420
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000421/* List of names to clear in sys */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200422static const char * const sys_deletes[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 "path", "argv", "ps1", "ps2",
424 "last_type", "last_value", "last_traceback",
425 "path_hooks", "path_importer_cache", "meta_path",
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200426 "__interactivehook__",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000428};
429
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200430static const char * const sys_files[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 "stdin", "__stdin__",
432 "stdout", "__stdout__",
433 "stderr", "__stderr__",
434 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000435};
436
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000438
Guido van Rossum3f5da241990-12-20 15:06:42 +0000439void
Victor Stinner987a0dc2019-06-19 10:36:10 +0200440_PyImport_Cleanup(PyThreadState *tstate)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200442 PyInterpreterState *interp = tstate->interp;
443 PyObject *modules = interp->modules;
444 if (modules == NULL) {
445 /* Already done */
446 return;
447 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 /* Delete some special variables first. These are common
450 places where user values hide and people complain when their
451 destructors fail. Since the modules containing them are
452 deleted *last* of all, they would come too late in the normal
453 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000454
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200455 /* XXX Perhaps these precautions are obsolete. Who knows? */
456
Victor Stinner331a6a52019-05-27 16:39:22 +0200457 int verbose = interp->config.verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +0200458 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200459 PySys_WriteStderr("# clear builtins._\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200460 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300461 if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300462 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300463 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200464
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200465 const char * const *p;
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200466 for (p = sys_deletes; *p != NULL; p++) {
Victor Stinner410b85a2019-05-13 17:12:45 +0200467 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200468 PySys_WriteStderr("# clear sys.%s\n", *p);
Victor Stinner410b85a2019-05-13 17:12:45 +0200469 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300470 if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300471 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300472 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200474 for (p = sys_files; *p != NULL; p+=2) {
Victor Stinner410b85a2019-05-13 17:12:45 +0200475 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200476 PySys_WriteStderr("# restore sys.%s\n", *p);
Victor Stinner410b85a2019-05-13 17:12:45 +0200477 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200478 PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict,
479 *(p+1));
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200480 if (value == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200481 if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200482 PyErr_WriteUnraisable(NULL);
483 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200484 value = Py_None;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200485 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300486 if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300487 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000490
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200491 /* We prepare a list which will receive (name, weakref) tuples of
492 modules when they are removed from sys.modules. The name is used
493 for diagnosis messages (in verbose mode), while the weakref helps
494 detect those modules which have been held alive. */
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200495 PyObject *weaklist = PyList_New(0);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300496 if (weaklist == NULL) {
497 PyErr_WriteUnraisable(NULL);
498 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200499
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200500#define STORE_MODULE_WEAKREF(name, mod) \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200501 if (weaklist != NULL) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200502 PyObject *wr = PyWeakref_NewRef(mod, NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300503 if (wr) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200504 PyObject *tup = PyTuple_Pack(2, name, wr); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300505 if (!tup || PyList_Append(weaklist, tup) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300506 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300507 } \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200508 Py_XDECREF(tup); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300509 Py_DECREF(wr); \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200510 } \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300511 else { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300512 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300513 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600515#define CLEAR_MODULE(name, mod) \
516 if (PyModule_Check(mod)) { \
Victor Stinner410b85a2019-05-13 17:12:45 +0200517 if (verbose && PyUnicode_Check(name)) { \
Eric Snow3f9eee62017-09-15 16:35:20 -0600518 PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
Victor Stinner410b85a2019-05-13 17:12:45 +0200519 } \
Eric Snow3f9eee62017-09-15 16:35:20 -0600520 STORE_MODULE_WEAKREF(name, mod); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300521 if (PyObject_SetItem(modules, name, Py_None) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300522 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300523 } \
Eric Snow3f9eee62017-09-15 16:35:20 -0600524 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000525
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200526 /* Remove all modules from sys.modules, hoping that garbage collection
527 can reclaim most of them. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600528 if (PyDict_CheckExact(modules)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200529 Py_ssize_t pos = 0;
530 PyObject *key, *value;
Eric Snow3f9eee62017-09-15 16:35:20 -0600531 while (PyDict_Next(modules, &pos, &key, &value)) {
532 CLEAR_MODULE(key, value);
533 }
534 }
535 else {
536 PyObject *iterator = PyObject_GetIter(modules);
537 if (iterator == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300538 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600539 }
540 else {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200541 PyObject *key;
Eric Snow3f9eee62017-09-15 16:35:20 -0600542 while ((key = PyIter_Next(iterator))) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200543 PyObject *value = PyObject_GetItem(modules, key);
Eric Snow3f9eee62017-09-15 16:35:20 -0600544 if (value == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300545 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600546 continue;
547 }
548 CLEAR_MODULE(key, value);
549 Py_DECREF(value);
550 Py_DECREF(key);
551 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300552 if (PyErr_Occurred()) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300553 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300554 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600555 Py_DECREF(iterator);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 }
557 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000558
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200559 /* Clear the modules dict. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600560 if (PyDict_CheckExact(modules)) {
561 PyDict_Clear(modules);
562 }
563 else {
564 _Py_IDENTIFIER(clear);
Jeroen Demeyer762f93f2019-07-08 10:19:25 +0200565 if (_PyObject_CallMethodIdNoArgs(modules, &PyId_clear) == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300566 PyErr_WriteUnraisable(NULL);
567 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600568 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200569 /* Restore the original builtins dict, to ensure that any
570 user data gets cleared. */
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200571 PyObject *dict = PyDict_Copy(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300572 if (dict == NULL) {
573 PyErr_WriteUnraisable(NULL);
574 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200575 PyDict_Clear(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300576 if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200577 _PyErr_Clear(tstate);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300578 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200579 Py_XDECREF(dict);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200580 /* Clear module dict copies stored in the interpreter state */
Victor Stinnerb45d2592019-06-20 00:05:23 +0200581 _PyInterpreterState_ClearModules(interp);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200582 /* Collect references */
583 _PyGC_CollectNoFail();
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200584 /* Dump GC stats before it's too late, since it uses the warnings
585 machinery. */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200586 _PyGC_DumpShutdownStats(&_PyRuntime);
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200587
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200588 /* Now, if there are any modules left alive, clear their globals to
589 minimize potential leaks. All C extension modules actually end
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200590 up here, since they are kept alive in the interpreter state.
591
592 The special treatment of "builtins" here is because even
593 when it's not referenced as a module, its dictionary is
594 referenced by almost every module's __builtins__. Since
595 deleting a module clears its dictionary (even if there are
596 references left to it), we need to delete the "builtins"
597 module last. Likewise, we don't delete sys until the very
598 end because it is implicitly referenced (e.g. by print). */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200599 if (weaklist != NULL) {
Serhiy Storchakac93c58b2018-10-29 19:30:16 +0200600 Py_ssize_t i;
601 /* Since dict is ordered in CPython 3.6+, modules are saved in
602 importing order. First clear modules imported later. */
603 for (i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200604 PyObject *tup = PyList_GET_ITEM(weaklist, i);
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200605 PyObject *name = PyTuple_GET_ITEM(tup, 0);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200606 PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1));
607 if (mod == Py_None)
608 continue;
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200609 assert(PyModule_Check(mod));
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200610 dict = PyModule_GetDict(mod);
611 if (dict == interp->builtins || dict == interp->sysdict)
612 continue;
613 Py_INCREF(mod);
Victor Stinner410b85a2019-05-13 17:12:45 +0200614 if (verbose && PyUnicode_Check(name)) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200615 PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
Victor Stinner410b85a2019-05-13 17:12:45 +0200616 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200617 _PyModule_Clear(mod);
618 Py_DECREF(mod);
Antoine Pitrou070cb3c2013-05-08 13:23:25 +0200619 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200620 Py_DECREF(weaklist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000622
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200623 /* Next, delete sys and builtins (in that order) */
Victor Stinner410b85a2019-05-13 17:12:45 +0200624 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200625 PySys_FormatStderr("# cleanup[3] wiping sys\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200626 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200627 _PyModule_ClearDict(interp->sysdict);
Victor Stinner410b85a2019-05-13 17:12:45 +0200628 if (verbose) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200629 PySys_FormatStderr("# cleanup[3] wiping builtins\n");
Victor Stinner410b85a2019-05-13 17:12:45 +0200630 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200631 _PyModule_ClearDict(interp->builtins);
632
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200633 /* Clear and delete the modules directory. Actual modules will
634 still be there only if imported during the execution of some
635 destructor. */
Eric Snow93c92f72017-09-13 23:46:04 -0700636 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 Py_DECREF(modules);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200638
639 /* Once more */
640 _PyGC_CollectNoFail();
641
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300642#undef CLEAR_MODULE
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200643#undef STORE_MODULE_WEAKREF
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000644}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000645
646
Barry Warsaw28a691b2010-04-17 00:19:56 +0000647/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648
649long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000651{
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200652 long res;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200653 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow32439d62015-05-02 19:15:18 -0600654 PyObject *external, *pyc_magic;
655
656 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
657 if (external == NULL)
658 return -1;
659 pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
660 Py_DECREF(external);
Brett Cannon77b2abd2012-07-09 16:09:00 -0400661 if (pyc_magic == NULL)
662 return -1;
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200663 res = PyLong_AsLong(pyc_magic);
Benjamin Peterson66f36592012-07-09 22:21:55 -0700664 Py_DECREF(pyc_magic);
665 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666}
667
668
Brett Cannon3adc7b72012-07-09 14:22:12 -0400669extern const char * _PySys_ImplCacheTag;
670
Barry Warsaw28a691b2010-04-17 00:19:56 +0000671const char *
672PyImport_GetMagicTag(void)
673{
Brett Cannon3adc7b72012-07-09 14:22:12 -0400674 return _PySys_ImplCacheTag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000675}
676
Brett Cannon98979b82012-07-02 15:13:11 -0400677
Guido van Rossum25ce5661997-08-02 03:10:38 +0000678/* Magic for extension modules (built-in as well as dynamically
679 loaded). To prevent initializing an extension module more than
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200680 once, we keep a static dictionary 'extensions' keyed by the tuple
681 (module name, module name) (for built-in modules) or by
682 (filename, module name) (for dynamically loaded modules), containing these
683 modules. A copy of the module's dictionary is stored by calling
684 _PyImport_FixupExtensionObject() immediately after the module initialization
685 function succeeds. A copy can be retrieved from there by calling
Victor Stinner95872862011-03-07 18:20:56 +0100686 _PyImport_FindExtensionObject().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000688 Modules which do support multiple initialization set their m_size
689 field to a non-negative number (indicating the size of the
690 module-specific state). They are still recorded in the extensions
691 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000692*/
693
694int
Victor Stinner95872862011-03-07 18:20:56 +0100695_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200696 PyObject *filename, PyObject *modules)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000697{
Eric Snowd393c1b2017-09-14 12:18:12 -0600698 PyObject *dict, *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 struct PyModuleDef *def;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500700 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 if (extensions == NULL) {
702 extensions = PyDict_New();
703 if (extensions == NULL)
704 return -1;
705 }
706 if (mod == NULL || !PyModule_Check(mod)) {
707 PyErr_BadInternalCall();
708 return -1;
709 }
710 def = PyModule_GetDef(mod);
711 if (!def) {
712 PyErr_BadInternalCall();
713 return -1;
714 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600715 if (PyObject_SetItem(modules, name, mod) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return -1;
717 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600718 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 return -1;
720 }
721 if (def->m_size == -1) {
722 if (def->m_base.m_copy) {
723 /* Somebody already imported the module,
724 likely under a different name.
725 XXX this should really not happen. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200726 Py_CLEAR(def->m_base.m_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 }
728 dict = PyModule_GetDict(mod);
729 if (dict == NULL)
730 return -1;
731 def->m_base.m_copy = PyDict_Copy(dict);
732 if (def->m_base.m_copy == NULL)
733 return -1;
734 }
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500735 key = PyTuple_Pack(2, filename, name);
736 if (key == NULL)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200737 return -1;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500738 res = PyDict_SetItem(extensions, key, (PyObject *)def);
739 Py_DECREF(key);
740 if (res < 0)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200741 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000743}
744
Victor Stinner49d3f252010-10-17 01:24:53 +0000745int
Eric Snowd393c1b2017-09-14 12:18:12 -0600746_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000747{
748 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100749 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100750 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100751 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000752 return -1;
Eric Snowd393c1b2017-09-14 12:18:12 -0600753 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100754 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000755 return res;
756}
757
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200758static PyObject *
759import_find_extension(PyThreadState *tstate, PyObject *name,
760 PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000761{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200762 if (extensions == NULL) {
763 return NULL;
764 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600765
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200766 PyObject *key = PyTuple_Pack(2, filename, name);
767 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200769 }
770 PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500771 Py_DECREF(key);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200772 if (def == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200774 }
775
776 PyObject *mod, *mdict;
777 PyObject *modules = tstate->interp->modules;
778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 if (def->m_size == -1) {
780 /* Module does not support repeated initialization */
781 if (def->m_base.m_copy == NULL)
782 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200783 mod = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 if (mod == NULL)
785 return NULL;
786 mdict = PyModule_GetDict(mod);
787 if (mdict == NULL)
788 return NULL;
789 if (PyDict_Update(mdict, def->m_base.m_copy))
790 return NULL;
791 }
792 else {
793 if (def->m_base.m_init == NULL)
794 return NULL;
795 mod = def->m_base.m_init();
796 if (mod == NULL)
797 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600798 if (PyObject_SetItem(modules, name, mod) == -1) {
Christian Heimes09ca7942013-07-20 14:51:53 +0200799 Py_DECREF(mod);
800 return NULL;
801 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 Py_DECREF(mod);
803 }
804 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600805 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 return NULL;
807 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200808
809 int verbose = tstate->interp->config.verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +0200810 if (verbose) {
Victor Stinner95872862011-03-07 18:20:56 +0100811 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Victor Stinner410b85a2019-05-13 17:12:45 +0200812 name, filename);
813 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815}
816
Victor Stinner49d3f252010-10-17 01:24:53 +0000817PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200818_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
819{
820 PyThreadState *tstate = _PyThreadState_GET();
821 return import_find_extension(tstate, name, filename);
822}
823
824
825PyObject *
826_PyImport_FindBuiltin(PyThreadState *tstate, const char *name)
Victor Stinner49d3f252010-10-17 01:24:53 +0000827{
Victor Stinner95872862011-03-07 18:20:56 +0100828 PyObject *res, *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100829 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100830 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000831 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200832 res = import_find_extension(tstate, nameobj, nameobj);
Victor Stinner95872862011-03-07 18:20:56 +0100833 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000834 return res;
835}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836
837/* Get the module object corresponding to a module name.
838 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000839 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000840 Because the former action is most common, THIS DOES NOT RETURN A
841 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200843static PyObject *
844import_add_module(PyThreadState *tstate, PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200846 PyObject *modules = tstate->interp->modules;
847 if (modules == NULL) {
848 _PyErr_SetString(tstate, PyExc_RuntimeError,
849 "no import module dictionary");
850 return NULL;
851 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600852
Eric Snow86b7afd2017-09-04 17:54:09 -0600853 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600854 if (PyDict_CheckExact(modules)) {
855 m = PyDict_GetItemWithError(modules, name);
856 }
857 else {
858 m = PyObject_GetItem(modules, name);
Min ho Kimc4cacc82019-07-31 08:16:13 +1000859 // For backward-compatibility we copy the behavior
Eric Snow3f9eee62017-09-15 16:35:20 -0600860 // of PyDict_GetItemWithError().
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200861 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
862 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600863 }
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200864 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200865 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200866 return NULL;
867 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600868 if (m != NULL && PyModule_Check(m)) {
869 return m;
870 }
Victor Stinner27ee0892011-03-04 12:57:09 +0000871 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 if (m == NULL)
873 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600874 if (PyObject_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(m);
876 return NULL;
877 }
878 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881}
882
Victor Stinner27ee0892011-03-04 12:57:09 +0000883PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200884PyImport_AddModuleObject(PyObject *name)
885{
886 PyThreadState *tstate = _PyThreadState_GET();
887 return import_add_module(tstate, name);
888}
889
890
891PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000892PyImport_AddModule(const char *name)
893{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200894 PyObject *nameobj = PyUnicode_FromString(name);
895 if (nameobj == NULL) {
Victor Stinner27ee0892011-03-04 12:57:09 +0000896 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200897 }
898 PyObject *module = PyImport_AddModuleObject(nameobj);
Victor Stinner27ee0892011-03-04 12:57:09 +0000899 Py_DECREF(nameobj);
900 return module;
901}
902
903
Tim Peters1cd70172004-08-02 03:52:12 +0000904/* Remove name from sys.modules, if it's there. */
905static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200906remove_module(PyThreadState *tstate, PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000907{
Zackery Spytz94a64e92019-05-08 10:31:23 -0600908 PyObject *type, *value, *traceback;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200909 _PyErr_Fetch(tstate, &type, &value, &traceback);
910
911 PyObject *modules = tstate->interp->modules;
Zackery Spytz94a64e92019-05-08 10:31:23 -0600912 if (!PyMapping_HasKey(modules, name)) {
913 goto out;
914 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600915 if (PyMapping_DelItem(modules, name) < 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200916 _PyErr_SetString(tstate, PyExc_RuntimeError,
917 "deleting key in sys.modules failed");
918 _PyErr_ChainExceptions(type, value, traceback);
919 return;
Eric Snow3f9eee62017-09-15 16:35:20 -0600920 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200921
Zackery Spytz94a64e92019-05-08 10:31:23 -0600922out:
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200923 _PyErr_Restore(tstate, type, value, traceback);
Tim Peters1cd70172004-08-02 03:52:12 +0000924}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925
Christian Heimes3b06e532008-01-07 20:12:44 +0000926
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000927/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000928 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
929 * removed from sys.modules, to avoid leaving damaged module objects
930 * in sys.modules. The caller may wish to restore the original
931 * module object (if any) in this case; PyImport_ReloadModule is an
932 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000933 *
934 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
935 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000936 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300938PyImport_ExecCodeModule(const char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 return PyImport_ExecCodeModuleWithPathnames(
941 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000942}
943
944PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300945PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 return PyImport_ExecCodeModuleWithPathnames(
948 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000949}
950
951PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300952PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
953 const char *pathname,
954 const char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000955{
Victor Stinner27ee0892011-03-04 12:57:09 +0000956 PyObject *m = NULL;
Eric Snow32439d62015-05-02 19:15:18 -0600957 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000958
959 nameobj = PyUnicode_FromString(name);
960 if (nameobj == NULL)
961 return NULL;
962
Victor Stinner27ee0892011-03-04 12:57:09 +0000963 if (cpathname != NULL) {
964 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
965 if (cpathobj == NULL)
966 goto error;
Brett Cannona6473f92012-07-13 13:57:03 -0400967 }
968 else
Victor Stinner27ee0892011-03-04 12:57:09 +0000969 cpathobj = NULL;
Brett Cannona6473f92012-07-13 13:57:03 -0400970
971 if (pathname != NULL) {
972 pathobj = PyUnicode_DecodeFSDefault(pathname);
973 if (pathobj == NULL)
974 goto error;
975 }
976 else if (cpathobj != NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200977 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannona6473f92012-07-13 13:57:03 -0400978 _Py_IDENTIFIER(_get_sourcefile);
979
980 if (interp == NULL) {
981 Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
982 "no interpreter!");
983 }
984
Eric Snow32439d62015-05-02 19:15:18 -0600985 external= PyObject_GetAttrString(interp->importlib,
986 "_bootstrap_external");
987 if (external != NULL) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200988 pathobj = _PyObject_CallMethodIdOneArg(
989 external, &PyId__get_sourcefile, cpathobj);
Eric Snow32439d62015-05-02 19:15:18 -0600990 Py_DECREF(external);
991 }
Brett Cannona6473f92012-07-13 13:57:03 -0400992 if (pathobj == NULL)
993 PyErr_Clear();
994 }
995 else
996 pathobj = NULL;
997
Victor Stinner27ee0892011-03-04 12:57:09 +0000998 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
999error:
1000 Py_DECREF(nameobj);
1001 Py_XDECREF(pathobj);
1002 Py_XDECREF(cpathobj);
1003 return m;
1004}
1005
Brett Cannon18fc4e72014-04-04 10:01:46 -04001006static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001007module_dict_for_exec(PyThreadState *tstate, PyObject *name)
Victor Stinner27ee0892011-03-04 12:57:09 +00001008{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001009 _Py_IDENTIFIER(__builtins__);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001010 PyObject *m, *d = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001012 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 if (m == NULL)
1014 return NULL;
1015 /* If the module is being reloaded, we get the old module back
1016 and re-use its dict to exec the new code. */
1017 d = PyModule_GetDict(m);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001018 if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001019 if (_PyErr_Occurred(tstate) ||
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001020 _PyDict_SetItemId(d, &PyId___builtins__,
1021 PyEval_GetBuiltins()) != 0)
1022 {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001023 remove_module(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001024 return NULL;
1025 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 }
Brett Cannon18fc4e72014-04-04 10:01:46 -04001027
Eric Snow08197a42014-05-12 17:54:55 -06001028 return d; /* Return a borrowed reference. */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001029}
1030
1031static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001032exec_code_in_module(PyThreadState *tstate, PyObject *name,
1033 PyObject *module_dict, PyObject *code_object)
Brett Cannon18fc4e72014-04-04 10:01:46 -04001034{
Brett Cannon18fc4e72014-04-04 10:01:46 -04001035 PyObject *v, *m;
1036
1037 v = PyEval_EvalCode(code_object, module_dict, module_dict);
1038 if (v == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001039 remove_module(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001040 return NULL;
1041 }
1042 Py_DECREF(v);
1043
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001044 m = import_get_module(tstate, name);
1045 if (m == NULL && !_PyErr_Occurred(tstate)) {
1046 _PyErr_Format(tstate, PyExc_ImportError,
1047 "Loaded module %R not found in sys.modules",
1048 name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001049 }
1050
Brett Cannon18fc4e72014-04-04 10:01:46 -04001051 return m;
1052}
1053
1054PyObject*
1055PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
1056 PyObject *cpathname)
1057{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001058 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow32439d62015-05-02 19:15:18 -06001059 PyObject *d, *external, *res;
Eric Snow08197a42014-05-12 17:54:55 -06001060 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001061
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001062 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001063 if (d == NULL) {
1064 return NULL;
1065 }
1066
Eric Snow08197a42014-05-12 17:54:55 -06001067 if (pathname == NULL) {
1068 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001070 external = PyObject_GetAttrString(tstate->interp->importlib,
1071 "_bootstrap_external");
Eric Snow32439d62015-05-02 19:15:18 -06001072 if (external == NULL)
1073 return NULL;
1074 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -06001075 &PyId__fix_up_module,
1076 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -06001077 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -06001078 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -06001079 Py_DECREF(res);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001080 res = exec_code_in_module(tstate, name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 }
Eric Snow08197a42014-05-12 17:54:55 -06001082 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001083}
1084
1085
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001086static void
1087update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 PyObject *constants, *tmp;
1090 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 if (PyUnicode_Compare(co->co_filename, oldname))
1093 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001094
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001095 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001096 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 constants = co->co_consts;
1099 n = PyTuple_GET_SIZE(constants);
1100 for (i = 0; i < n; i++) {
1101 tmp = PyTuple_GET_ITEM(constants, i);
1102 if (PyCode_Check(tmp))
1103 update_code_filenames((PyCodeObject *)tmp,
1104 oldname, newname);
1105 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001106}
1107
Victor Stinner2f42ae52011-03-20 00:41:24 +01001108static void
1109update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001110{
Victor Stinner2f42ae52011-03-20 00:41:24 +01001111 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001112
Victor Stinner2f42ae52011-03-20 00:41:24 +01001113 if (PyUnicode_Compare(co->co_filename, newname) == 0)
1114 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 oldname = co->co_filename;
1117 Py_INCREF(oldname);
1118 update_code_filenames(co, oldname, newname);
1119 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001120}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001121
Brett Cannon4caa61d2014-01-09 19:03:32 -05001122/*[clinic input]
1123_imp._fix_co_filename
1124
1125 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
1126 Code object to change.
1127
1128 path: unicode
1129 File path to use.
1130 /
1131
1132Changes code.co_filename to specify the passed-in file path.
1133[clinic start generated code]*/
1134
Brett Cannon4caa61d2014-01-09 19:03:32 -05001135static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001136_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -04001137 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001138/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -07001139
Brett Cannon4caa61d2014-01-09 19:03:32 -05001140{
Brett Cannona6dec2e2014-01-10 07:43:55 -05001141 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -07001142
1143 Py_RETURN_NONE;
1144}
1145
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001146
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001147/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001148static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001149
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001150
1151/* Helper to test for built-in module */
1152
1153static int
Victor Stinner95872862011-03-07 18:20:56 +01001154is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001155{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001156 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001158 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 if (PyImport_Inittab[i].initfunc == NULL)
1160 return -1;
1161 else
1162 return 1;
1163 }
1164 }
1165 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001166}
1167
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001168
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001169/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +00001170 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001171 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001172 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001173 this tells our caller that the path based finder could not find
1174 a finder for this path item. Cache the result in
1175 path_importer_cache.
Just van Rossum52e14d62002-12-30 22:08:05 +00001176 Returns a borrowed reference. */
1177
1178static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001179get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
1180 PyObject *path_hooks, PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyObject *importer;
1183 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 /* These conditions are the caller's responsibility: */
1186 assert(PyList_Check(path_hooks));
1187 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 nhooks = PyList_Size(path_hooks);
1190 if (nhooks < 0)
1191 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001192
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001193 importer = PyDict_GetItemWithError(path_importer_cache, p);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001194 if (importer != NULL || _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 /* set path_importer_cache[p] to None to avoid recursion */
1198 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1199 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 for (j = 0; j < nhooks; j++) {
1202 PyObject *hook = PyList_GetItem(path_hooks, j);
1203 if (hook == NULL)
1204 return NULL;
Jeroen Demeyer196a5302019-07-04 12:31:34 +02001205 importer = _PyObject_CallOneArg(hook, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 if (importer != NULL)
1207 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001208
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001209 if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 return NULL;
1211 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001212 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 }
1214 if (importer == NULL) {
Brett Cannonaa936422012-04-27 15:30:58 -04001215 return Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 }
1217 if (importer != NULL) {
1218 int err = PyDict_SetItem(path_importer_cache, p, importer);
1219 Py_DECREF(importer);
1220 if (err != 0)
1221 return NULL;
1222 }
1223 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001224}
1225
Benjamin Petersone5024512018-09-12 12:06:42 -07001226PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001227PyImport_GetImporter(PyObject *path)
1228{
1229 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001231
Victor Stinner1e53bba2013-07-16 22:26:05 +02001232 path_importer_cache = PySys_GetObject("path_importer_cache");
1233 path_hooks = PySys_GetObject("path_hooks");
1234 if (path_importer_cache != NULL && path_hooks != NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001235 importer = get_path_importer(tstate, path_importer_cache,
Victor Stinner1e53bba2013-07-16 22:26:05 +02001236 path_hooks, path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 }
1238 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1239 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001240}
1241
Nick Coghland5cacbb2015-05-23 22:24:10 +10001242/*[clinic input]
1243_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001244
Nick Coghland5cacbb2015-05-23 22:24:10 +10001245 spec: object
1246 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001247
Nick Coghland5cacbb2015-05-23 22:24:10 +10001248Create an extension module.
1249[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001250
Nick Coghland5cacbb2015-05-23 22:24:10 +10001251static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001252_imp_create_builtin(PyObject *module, PyObject *spec)
1253/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001254{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001255 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 struct _inittab *p;
Nick Coghland5cacbb2015-05-23 22:24:10 +10001257 PyObject *name;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001258 const char *namestr;
Victor Stinner5eb4f592013-11-14 22:38:52 +01001259 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001260
Nick Coghland5cacbb2015-05-23 22:24:10 +10001261 name = PyObject_GetAttrString(spec, "name");
1262 if (name == NULL) {
1263 return NULL;
1264 }
1265
Victor Stinner5eb4f592013-11-14 22:38:52 +01001266 mod = _PyImport_FindExtensionObject(name, name);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001267 if (mod || _PyErr_Occurred(tstate)) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001268 Py_DECREF(name);
Raymond Hettingerf0afe772016-08-31 08:44:11 -07001269 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001270 return mod;
1271 }
1272
1273 namestr = PyUnicode_AsUTF8(name);
1274 if (namestr == NULL) {
1275 Py_DECREF(name);
1276 return NULL;
1277 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001278
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001279 PyObject *modules = tstate->interp->modules;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 for (p = PyImport_Inittab; p->name != NULL; p++) {
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001281 PyModuleDef *def;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001282 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 if (p->initfunc == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001284 /* Cannot re-init internal module ("sys" or "builtins") */
1285 mod = PyImport_AddModule(namestr);
1286 Py_DECREF(name);
1287 return mod;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 mod = (*p->initfunc)();
Nick Coghland5cacbb2015-05-23 22:24:10 +10001290 if (mod == NULL) {
1291 Py_DECREF(name);
1292 return NULL;
1293 }
1294 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1295 Py_DECREF(name);
1296 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1297 } else {
1298 /* Remember pointer to module init function. */
1299 def = PyModule_GetDef(mod);
Christian Heimesa78b6272016-09-09 00:25:03 +02001300 if (def == NULL) {
1301 Py_DECREF(name);
1302 return NULL;
1303 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001304 def->m_base.m_init = p->initfunc;
Eric Snowd393c1b2017-09-14 12:18:12 -06001305 if (_PyImport_FixupExtensionObject(mod, name, name,
1306 modules) < 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001307 Py_DECREF(name);
1308 return NULL;
1309 }
1310 Py_DECREF(name);
1311 return mod;
1312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 }
1314 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001315 Py_DECREF(name);
1316 Py_RETURN_NONE;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001317}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001318
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001320/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001322static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001323find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001324{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001325 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001326
Victor Stinner53dc7352011-03-20 01:50:21 +01001327 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 for (p = PyImport_FrozenModules; ; p++) {
1331 if (p->name == NULL)
1332 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001333 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 break;
1335 }
1336 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001337}
1338
Guido van Rossum79f25d91997-04-29 20:08:16 +00001339static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001340get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001341{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001342 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 if (p == NULL) {
1346 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001347 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 name);
1349 return NULL;
1350 }
1351 if (p->code == NULL) {
1352 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001353 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 name);
1355 return NULL;
1356 }
1357 size = p->size;
1358 if (size < 0)
1359 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001360 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001361}
1362
Brett Cannon8d110132009-03-15 02:20:16 +00001363static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001364is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001365{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001366 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 if (p == NULL) {
1370 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001371 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 name);
1373 return NULL;
1374 }
Brett Cannon8d110132009-03-15 02:20:16 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 if (size < 0)
1379 Py_RETURN_TRUE;
1380 else
1381 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001382}
1383
1384
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001385/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001386 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001387 an exception set if the initialization failed.
1388 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001389
1390int
Victor Stinner53dc7352011-03-20 01:50:21 +01001391PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001392{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001393 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001394 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001395 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 int ispackage;
1397 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001398
Victor Stinner53dc7352011-03-20 01:50:21 +01001399 p = find_frozen(name);
1400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 if (p == NULL)
1402 return 0;
1403 if (p->code == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001404 _PyErr_Format(tstate, PyExc_ImportError,
1405 "Excluded frozen object named %R",
1406 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 return -1;
1408 }
1409 size = p->size;
1410 ispackage = (size < 0);
1411 if (ispackage)
1412 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001413 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (co == NULL)
1415 return -1;
1416 if (!PyCode_Check(co)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001417 _PyErr_Format(tstate, PyExc_TypeError,
1418 "frozen object %R is not a code object",
1419 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 goto err_return;
1421 }
1422 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001423 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001424 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 int err;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001426 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 if (m == NULL)
1428 goto err_return;
1429 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001430 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 goto err_return;
1433 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 err = PyDict_SetItemString(d, "__path__", l);
1435 Py_DECREF(l);
1436 if (err != 0)
1437 goto err_return;
1438 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001439 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001440 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001441 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001442 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001443 m = exec_code_in_module(tstate, name, d, co);
1444 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 goto err_return;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001446 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 Py_DECREF(co);
1448 Py_DECREF(m);
1449 return 1;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001450
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001451err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 Py_DECREF(co);
1453 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001454}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001455
Victor Stinner53dc7352011-03-20 01:50:21 +01001456int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001457PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001458{
1459 PyObject *nameobj;
1460 int ret;
1461 nameobj = PyUnicode_InternFromString(name);
1462 if (nameobj == NULL)
1463 return -1;
1464 ret = PyImport_ImportFrozenModuleObject(nameobj);
1465 Py_DECREF(nameobj);
1466 return ret;
1467}
1468
Guido van Rossum74e6a111994-08-29 12:54:38 +00001469
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001470/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001471 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001474PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 PyObject *pname;
1477 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 pname = PyUnicode_FromString(name);
1480 if (pname == NULL)
1481 return NULL;
1482 result = PyImport_Import(pname);
1483 Py_DECREF(pname);
1484 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001485}
1486
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001487
Christian Heimes072c0f12008-01-03 23:01:04 +00001488/* Import a module without blocking
1489 *
1490 * At first it tries to fetch the module from sys.modules. If the module was
1491 * never loaded before it loads it with PyImport_ImportModule() unless another
1492 * thread holds the import lock. In the latter case the function raises an
1493 * ImportError instead of blocking.
1494 *
1495 * Returns the module object with incremented ref count.
1496 */
1497PyObject *
1498PyImport_ImportModuleNoBlock(const char *name)
1499{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001500 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001501}
1502
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001503
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001504/* Remove importlib frames from the traceback,
1505 * except in Verbose mode. */
1506static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001507remove_importlib_frames(PyThreadState *tstate)
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001508{
1509 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001510 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001511 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001512 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001513 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001514 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001515 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001516
1517 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001518 from the traceback. We always trim chunks
1519 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001520
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001521 _PyErr_Fetch(tstate, &exception, &value, &base_tb);
1522 if (!exception || tstate->interp->config.verbose) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001523 goto done;
Victor Stinner410b85a2019-05-13 17:12:45 +02001524 }
1525
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001526 if (PyType_IsSubtype((PyTypeObject *) exception,
1527 (PyTypeObject *) PyExc_ImportError))
1528 always_trim = 1;
1529
1530 prev_link = &base_tb;
1531 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001532 while (tb != NULL) {
1533 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1534 PyObject *next = (PyObject *) traceback->tb_next;
1535 PyFrameObject *frame = traceback->tb_frame;
1536 PyCodeObject *code = frame->f_code;
1537 int now_in_importlib;
1538
1539 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001540 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1541 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001542 if (now_in_importlib && !in_importlib) {
1543 /* This is the link to this chunk of importlib tracebacks */
1544 outer_link = prev_link;
1545 }
1546 in_importlib = now_in_importlib;
1547
1548 if (in_importlib &&
1549 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001550 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001551 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001552 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001553 prev_link = outer_link;
1554 }
1555 else {
1556 prev_link = (PyObject **) &traceback->tb_next;
1557 }
1558 tb = next;
1559 }
1560done:
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001561 _PyErr_Restore(tstate, exception, value, base_tb);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001562}
1563
1564
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001565static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001566resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001567{
Eric Snowb523f842013-11-22 09:05:39 -07001568 _Py_IDENTIFIER(__spec__);
Brett Cannonfd074152012-04-14 14:10:13 -04001569 _Py_IDENTIFIER(__package__);
1570 _Py_IDENTIFIER(__path__);
1571 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001572 _Py_IDENTIFIER(parent);
1573 PyObject *abs_name;
1574 PyObject *package = NULL;
1575 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001576 Py_ssize_t last_dot;
1577 PyObject *base;
1578 int level_up;
1579
1580 if (globals == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001581 _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001582 goto error;
1583 }
1584 if (!PyDict_Check(globals)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001585 _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001586 goto error;
1587 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001588 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001589 if (package == Py_None) {
1590 package = NULL;
1591 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001592 else if (package == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001593 goto error;
1594 }
1595 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001596 if (spec == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001597 goto error;
1598 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001599
1600 if (package != NULL) {
1601 Py_INCREF(package);
1602 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001603 _PyErr_SetString(tstate, PyExc_TypeError,
1604 "package must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001605 goto error;
1606 }
1607 else if (spec != NULL && spec != Py_None) {
1608 int equal;
1609 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1610 if (parent == NULL) {
1611 goto error;
1612 }
1613
1614 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1615 Py_DECREF(parent);
1616 if (equal < 0) {
1617 goto error;
1618 }
1619 else if (equal == 0) {
1620 if (PyErr_WarnEx(PyExc_ImportWarning,
1621 "__package__ != __spec__.parent", 1) < 0) {
1622 goto error;
1623 }
1624 }
1625 }
1626 }
1627 else if (spec != NULL && spec != Py_None) {
1628 package = _PyObject_GetAttrId(spec, &PyId_parent);
1629 if (package == NULL) {
1630 goto error;
1631 }
1632 else if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001633 _PyErr_SetString(tstate, PyExc_TypeError,
1634 "__spec__.parent must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001635 goto error;
1636 }
1637 }
1638 else {
1639 if (PyErr_WarnEx(PyExc_ImportWarning,
1640 "can't resolve package from __spec__ or __package__, "
1641 "falling back on __name__ and __path__", 1) < 0) {
1642 goto error;
1643 }
1644
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001645 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001646 if (package == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001647 if (!_PyErr_Occurred(tstate)) {
1648 _PyErr_SetString(tstate, PyExc_KeyError,
1649 "'__name__' not in globals");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001650 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001651 goto error;
1652 }
1653
1654 Py_INCREF(package);
1655 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001656 _PyErr_SetString(tstate, PyExc_TypeError,
1657 "__name__ must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001658 goto error;
1659 }
1660
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001661 if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001662 Py_ssize_t dot;
1663
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001664 if (_PyErr_Occurred(tstate) || PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001665 goto error;
1666 }
1667
1668 dot = PyUnicode_FindChar(package, '.',
1669 0, PyUnicode_GET_LENGTH(package), -1);
1670 if (dot == -2) {
1671 goto error;
1672 }
Ben Lewis92420b32019-09-11 20:09:47 +10001673 else if (dot == -1) {
1674 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001675 }
Ben Lewis92420b32019-09-11 20:09:47 +10001676 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1677 if (substr == NULL) {
1678 goto error;
1679 }
1680 Py_SETREF(package, substr);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001681 }
1682 }
1683
1684 last_dot = PyUnicode_GET_LENGTH(package);
1685 if (last_dot == 0) {
Ben Lewis92420b32019-09-11 20:09:47 +10001686 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001687 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001688
1689 for (level_up = 1; level_up < level; level_up += 1) {
1690 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1691 if (last_dot == -2) {
1692 goto error;
1693 }
1694 else if (last_dot == -1) {
Ngalim Siregarc5fa4492019-08-03 12:46:02 +07001695 _PyErr_SetString(tstate, PyExc_ImportError,
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001696 "attempted relative import beyond top-level "
1697 "package");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001698 goto error;
1699 }
1700 }
1701
1702 base = PyUnicode_Substring(package, 0, last_dot);
1703 Py_DECREF(package);
1704 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1705 return base;
1706 }
1707
1708 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1709 Py_DECREF(base);
1710 return abs_name;
1711
Ben Lewis92420b32019-09-11 20:09:47 +10001712 no_parent_error:
1713 _PyErr_SetString(tstate, PyExc_ImportError,
1714 "attempted relative import "
1715 "with no known parent package");
1716
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001717 error:
1718 Py_XDECREF(package);
1719 return NULL;
1720}
1721
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001722static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001723import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001724{
1725 _Py_IDENTIFIER(_find_and_load);
1726 PyObject *mod = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001727 PyInterpreterState *interp = tstate->interp;
Victor Stinner331a6a52019-05-27 16:39:22 +02001728 int import_time = interp->config.import_time;
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001729 static int import_level;
1730 static _PyTime_t accumulated;
1731
1732 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1733
Steve Dowerb82e17e2019-05-23 08:45:22 -07001734 PyObject *sys_path = PySys_GetObject("path");
1735 PyObject *sys_meta_path = PySys_GetObject("meta_path");
1736 PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
1737 if (PySys_Audit("import", "OOOOO",
1738 abs_name, Py_None, sys_path ? sys_path : Py_None,
1739 sys_meta_path ? sys_meta_path : Py_None,
1740 sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
1741 return NULL;
1742 }
1743
1744
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001745 /* XOptions is initialized after first some imports.
1746 * So we can't have negative cache before completed initialization.
1747 * Anyway, importlib._find_and_load is much slower than
1748 * _PyDict_GetItemIdWithError().
1749 */
1750 if (import_time) {
1751 static int header = 1;
1752 if (header) {
1753 fputs("import time: self [us] | cumulative | imported package\n",
1754 stderr);
1755 header = 0;
1756 }
1757
1758 import_level++;
1759 t1 = _PyTime_GetPerfCounter();
1760 accumulated = 0;
1761 }
1762
1763 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1764 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1765
1766 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1767 &PyId__find_and_load, abs_name,
1768 interp->import_func, NULL);
1769
1770 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1771 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1772 mod != NULL);
1773
1774 if (import_time) {
1775 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1776
1777 import_level--;
1778 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1779 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1780 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1781 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1782
1783 accumulated = accumulated_copy + cum;
1784 }
1785
1786 return mod;
1787}
1788
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001789PyObject *
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001790PyImport_GetModule(PyObject *name)
1791{
1792 PyThreadState *tstate = _PyThreadState_GET();
1793 PyObject *mod;
1794
1795 mod = import_get_module(tstate, name);
1796 if (mod != NULL && mod != Py_None) {
1797 if (import_ensure_initialized(tstate, mod, name) < 0) {
1798 Py_DECREF(mod);
1799 remove_importlib_frames(tstate);
1800 return NULL;
1801 }
1802 }
1803 return mod;
1804}
1805
1806PyObject *
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001807PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1808 PyObject *locals, PyObject *fromlist,
1809 int level)
1810{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001811 PyThreadState *tstate = _PyThreadState_GET();
Brett Cannonfd074152012-04-14 14:10:13 -04001812 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001813 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001814 PyObject *final_mod = NULL;
1815 PyObject *mod = NULL;
1816 PyObject *package = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001817 PyInterpreterState *interp = tstate->interp;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001818 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001819
Brett Cannonfd074152012-04-14 14:10:13 -04001820 if (name == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001821 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001822 goto error;
1823 }
1824
1825 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1826 for added performance. */
1827
1828 if (!PyUnicode_Check(name)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001829 _PyErr_SetString(tstate, PyExc_TypeError,
1830 "module name must be a string");
Brett Cannonfd074152012-04-14 14:10:13 -04001831 goto error;
1832 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001833 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001834 goto error;
1835 }
1836 if (level < 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001837 _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0");
Brett Cannonfd074152012-04-14 14:10:13 -04001838 goto error;
1839 }
Brett Cannon849113a2016-01-22 15:25:50 -08001840
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001841 if (level > 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001842 abs_name = resolve_name(tstate, name, globals, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001843 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001844 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001845 }
1846 else { /* level == 0 */
1847 if (PyUnicode_GET_LENGTH(name) == 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001848 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001849 goto error;
1850 }
Brett Cannonfd074152012-04-14 14:10:13 -04001851 abs_name = name;
1852 Py_INCREF(abs_name);
1853 }
1854
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001855 mod = import_get_module(tstate, abs_name);
1856 if (mod == NULL && _PyErr_Occurred(tstate)) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001857 goto error;
1858 }
1859
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001860 if (mod != NULL && mod != Py_None) {
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001861 if (import_ensure_initialized(tstate, mod, name) < 0) {
1862 goto error;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001863 }
Brett Cannonfd074152012-04-14 14:10:13 -04001864 }
1865 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001866 Py_XDECREF(mod);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001867 mod = import_find_and_load(tstate, abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001868 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001869 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001870 }
1871 }
1872
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001873 has_from = 0;
1874 if (fromlist != NULL && fromlist != Py_None) {
1875 has_from = PyObject_IsTrue(fromlist);
1876 if (has_from < 0)
1877 goto error;
1878 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001879 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001880 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1881 if (level == 0 || len > 0) {
1882 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001883
Victor Stinner744c34e2016-05-20 11:36:13 +02001884 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1885 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001886 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001887 }
1888
Victor Stinner744c34e2016-05-20 11:36:13 +02001889 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001890 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001891 final_mod = mod;
1892 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001893 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001894 }
1895
Brett Cannonfd074152012-04-14 14:10:13 -04001896 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001897 PyObject *front = PyUnicode_Substring(name, 0, dot);
1898 if (front == NULL) {
1899 goto error;
1900 }
1901
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001902 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001903 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001904 }
1905 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001906 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001907 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001908 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001909 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001910 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001911 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001912 }
Brett Cannonfd074152012-04-14 14:10:13 -04001913
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001914 final_mod = import_get_module(tstate, to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001915 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001916 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001917 if (!_PyErr_Occurred(tstate)) {
1918 _PyErr_Format(tstate, PyExc_KeyError,
1919 "%R not in sys.modules as expected",
1920 to_return);
Stefan Krah027b09c2019-03-25 21:50:58 +01001921 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001922 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001923 }
Brett Cannonfd074152012-04-14 14:10:13 -04001924 }
1925 }
1926 else {
1927 final_mod = mod;
1928 Py_INCREF(mod);
1929 }
1930 }
1931 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001932 _Py_IDENTIFIER(__path__);
1933 PyObject *path;
1934 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1935 goto error;
1936 }
1937 if (path) {
1938 Py_DECREF(path);
1939 final_mod = _PyObject_CallMethodIdObjArgs(
1940 interp->importlib, &PyId__handle_fromlist,
1941 mod, fromlist, interp->import_func, NULL);
1942 }
1943 else {
1944 final_mod = mod;
1945 Py_INCREF(mod);
1946 }
Brett Cannonfd074152012-04-14 14:10:13 -04001947 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001948
Brett Cannonfd074152012-04-14 14:10:13 -04001949 error:
1950 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001951 Py_XDECREF(mod);
1952 Py_XDECREF(package);
Victor Stinner410b85a2019-05-13 17:12:45 +02001953 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001954 remove_importlib_frames(tstate);
Victor Stinner410b85a2019-05-13 17:12:45 +02001955 }
Brett Cannonfd074152012-04-14 14:10:13 -04001956 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001957}
1958
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001959PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001960PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001961 PyObject *fromlist, int level)
1962{
1963 PyObject *nameobj, *mod;
1964 nameobj = PyUnicode_FromString(name);
1965 if (nameobj == NULL)
1966 return NULL;
1967 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1968 fromlist, level);
1969 Py_DECREF(nameobj);
1970 return mod;
1971}
1972
1973
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974/* Re-import a module of any kind and return its module object, WITH
1975 INCREMENTED REFERENCE COUNT */
1976
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001978PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001979{
Eric Snow3f9eee62017-09-15 16:35:20 -06001980 _Py_IDENTIFIER(imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001981 _Py_IDENTIFIER(reload);
1982 PyObject *reloaded_module = NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001983 PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001984 if (imp == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001985 if (PyErr_Occurred()) {
1986 return NULL;
1987 }
1988
Brett Cannon62228db2012-04-29 14:38:11 -04001989 imp = PyImport_ImportModule("imp");
1990 if (imp == NULL) {
1991 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001994
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02001995 reloaded_module = _PyObject_CallMethodIdOneArg(imp, &PyId_reload, m);
Brett Cannon62228db2012-04-29 14:38:11 -04001996 Py_DECREF(imp);
1997 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001998}
1999
2000
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002001/* Higher-level import emulator which emulates the "import" statement
2002 more accurately -- it invokes the __import__() function from the
2003 builtins of the current globals. This means that the import is
2004 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00002005 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00002006 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00002007 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00002008 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002009
2010PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002012{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02002013 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 static PyObject *silly_list = NULL;
2015 static PyObject *builtins_str = NULL;
2016 static PyObject *import_str = NULL;
2017 PyObject *globals = NULL;
2018 PyObject *import = NULL;
2019 PyObject *builtins = NULL;
2020 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 /* Initialize constant string objects */
2023 if (silly_list == NULL) {
2024 import_str = PyUnicode_InternFromString("__import__");
2025 if (import_str == NULL)
2026 return NULL;
2027 builtins_str = PyUnicode_InternFromString("__builtins__");
2028 if (builtins_str == NULL)
2029 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00002030 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 if (silly_list == NULL)
2032 return NULL;
2033 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 /* Get the builtins from current globals */
2036 globals = PyEval_GetGlobals();
2037 if (globals != NULL) {
2038 Py_INCREF(globals);
2039 builtins = PyObject_GetItem(globals, builtins_str);
2040 if (builtins == NULL)
2041 goto err;
2042 }
2043 else {
2044 /* No globals -- use standard builtins, and fake globals */
2045 builtins = PyImport_ImportModuleLevel("builtins",
2046 NULL, NULL, NULL, 0);
2047 if (builtins == NULL)
2048 return NULL;
2049 globals = Py_BuildValue("{OO}", builtins_str, builtins);
2050 if (globals == NULL)
2051 goto err;
2052 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 /* Get the __import__ function from the builtins */
2055 if (PyDict_Check(builtins)) {
2056 import = PyObject_GetItem(builtins, import_str);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02002057 if (import == NULL) {
2058 _PyErr_SetObject(tstate, PyExc_KeyError, import_str);
2059 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 }
2061 else
2062 import = PyObject_GetAttr(builtins, import_str);
2063 if (import == NULL)
2064 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00002067 Always use absolute import here.
2068 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2070 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00002071 if (r == NULL)
2072 goto err;
2073 Py_DECREF(r);
2074
Victor Stinner0a28f8d2019-06-19 02:54:39 +02002075 r = import_get_module(tstate, module_name);
2076 if (r == NULL && !_PyErr_Occurred(tstate)) {
2077 _PyErr_SetObject(tstate, PyExc_KeyError, module_name);
Serhiy Storchaka145541c2017-06-15 20:54:38 +03002078 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002079
2080 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 Py_XDECREF(globals);
2082 Py_XDECREF(builtins);
2083 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00002086}
2087
Brett Cannon4caa61d2014-01-09 19:03:32 -05002088/*[clinic input]
2089_imp.extension_suffixes
2090
2091Returns the list of file suffixes used to identify extension modules.
2092[clinic start generated code]*/
2093
Brett Cannon4caa61d2014-01-09 19:03:32 -05002094static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002095_imp_extension_suffixes_impl(PyObject *module)
2096/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 list = PyList_New(0);
2101 if (list == NULL)
2102 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04002103#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01002104 const char *suffix;
2105 unsigned int index = 0;
2106
Brett Cannon2657df42012-05-04 15:20:40 -04002107 while ((suffix = _PyImport_DynLoadFiletab[index])) {
2108 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 if (item == NULL) {
2110 Py_DECREF(list);
2111 return NULL;
2112 }
2113 if (PyList_Append(list, item) < 0) {
2114 Py_DECREF(list);
2115 Py_DECREF(item);
2116 return NULL;
2117 }
2118 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04002119 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 }
Brett Cannon2657df42012-05-04 15:20:40 -04002121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123}
2124
Brett Cannon4caa61d2014-01-09 19:03:32 -05002125/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05002126_imp.init_frozen
2127
2128 name: unicode
2129 /
2130
2131Initializes a frozen module.
2132[clinic start generated code]*/
2133
Brett Cannon4caa61d2014-01-09 19:03:32 -05002134static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002135_imp_init_frozen_impl(PyObject *module, PyObject *name)
2136/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002137{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02002138 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 int ret;
2140 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002141
Victor Stinner53dc7352011-03-20 01:50:21 +01002142 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 if (ret < 0)
2144 return NULL;
2145 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002146 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02002148 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 Py_XINCREF(m);
2150 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151}
2152
Brett Cannon4caa61d2014-01-09 19:03:32 -05002153/*[clinic input]
2154_imp.get_frozen_object
2155
2156 name: unicode
2157 /
2158
2159Create a code object for a frozen module.
2160[clinic start generated code]*/
2161
Brett Cannon4caa61d2014-01-09 19:03:32 -05002162static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002163_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
2164/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002167}
2168
Brett Cannon4caa61d2014-01-09 19:03:32 -05002169/*[clinic input]
2170_imp.is_frozen_package
2171
2172 name: unicode
2173 /
2174
2175Returns True if the module name is of a frozen package.
2176[clinic start generated code]*/
2177
Brett Cannon4caa61d2014-01-09 19:03:32 -05002178static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002179_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2180/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002183}
2184
Brett Cannon4caa61d2014-01-09 19:03:32 -05002185/*[clinic input]
2186_imp.is_builtin
2187
2188 name: unicode
2189 /
2190
2191Returns True if the module name corresponds to a built-in module.
2192[clinic start generated code]*/
2193
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002195_imp_is_builtin_impl(PyObject *module, PyObject *name)
2196/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002197{
Brett Cannon4caa61d2014-01-09 19:03:32 -05002198 return PyLong_FromLong(is_builtin(name));
2199}
2200
2201/*[clinic input]
2202_imp.is_frozen
2203
2204 name: unicode
2205 /
2206
2207Returns True if the module name corresponds to a frozen module.
2208[clinic start generated code]*/
2209
Brett Cannon4caa61d2014-01-09 19:03:32 -05002210static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002211_imp_is_frozen_impl(PyObject *module, PyObject *name)
2212/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002213{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07002214 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 p = find_frozen(name);
2217 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002218}
2219
Larry Hastings1df0b352015-08-24 19:53:56 -07002220/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2221static int
2222exec_builtin_or_dynamic(PyObject *mod) {
2223 PyModuleDef *def;
2224 void *state;
2225
2226 if (!PyModule_Check(mod)) {
2227 return 0;
2228 }
2229
2230 def = PyModule_GetDef(mod);
2231 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07002232 return 0;
2233 }
Brett Cannon52794db2016-09-07 17:00:43 -07002234
Larry Hastings1df0b352015-08-24 19:53:56 -07002235 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07002236 if (state) {
2237 /* Already initialized; skip reload */
2238 return 0;
2239 }
Brett Cannon52794db2016-09-07 17:00:43 -07002240
Larry Hastings1df0b352015-08-24 19:53:56 -07002241 return PyModule_ExecDef(mod, def);
2242}
2243
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002244#ifdef HAVE_DYNAMIC_LOADING
2245
Brett Cannon4caa61d2014-01-09 19:03:32 -05002246/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002247_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002248
Nick Coghland5cacbb2015-05-23 22:24:10 +10002249 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002250 file: object = NULL
2251 /
2252
Nick Coghland5cacbb2015-05-23 22:24:10 +10002253Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002254[clinic start generated code]*/
2255
Brett Cannon4caa61d2014-01-09 19:03:32 -05002256static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002257_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2258/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002259{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002260 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002261 FILE *fp;
2262
Nick Coghland5cacbb2015-05-23 22:24:10 +10002263 name = PyObject_GetAttrString(spec, "name");
2264 if (name == NULL) {
2265 return NULL;
2266 }
2267
2268 path = PyObject_GetAttrString(spec, "origin");
2269 if (path == NULL) {
2270 Py_DECREF(name);
2271 return NULL;
2272 }
2273
2274 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002275 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002276 Py_DECREF(name);
2277 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002278 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002279 return mod;
2280 }
2281
Brett Cannon4caa61d2014-01-09 19:03:32 -05002282 if (file != NULL) {
2283 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002284 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002285 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002286 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002288 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002290 else
2291 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002292
2293 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2294
2295 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002296 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (fp)
2298 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002299 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002300}
2301
Nick Coghland5cacbb2015-05-23 22:24:10 +10002302/*[clinic input]
2303_imp.exec_dynamic -> int
2304
2305 mod: object
2306 /
2307
2308Initialize an extension module.
2309[clinic start generated code]*/
2310
2311static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002312_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2313/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002314{
Larry Hastings1df0b352015-08-24 19:53:56 -07002315 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002316}
2317
2318
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002319#endif /* HAVE_DYNAMIC_LOADING */
2320
Larry Hastings7726ac92014-01-31 22:03:12 -08002321/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002322_imp.exec_builtin -> int
2323
2324 mod: object
2325 /
2326
2327Initialize a built-in module.
2328[clinic start generated code]*/
2329
2330static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002331_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2332/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002333{
2334 return exec_builtin_or_dynamic(mod);
2335}
2336
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002337/*[clinic input]
2338_imp.source_hash
2339
2340 key: long
2341 source: Py_buffer
2342[clinic start generated code]*/
2343
2344static PyObject *
2345_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2346/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2347{
Benjamin Peterson83620772017-12-09 12:18:56 -08002348 union {
2349 uint64_t x;
2350 char data[sizeof(uint64_t)];
2351 } hash;
2352 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002353#if !PY_LITTLE_ENDIAN
2354 // Force to little-endian. There really ought to be a succinct standard way
2355 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002356 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2357 char tmp = hash.data[i];
2358 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2359 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002360 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002361#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002362 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002363}
2364
Barry Warsaw28a691b2010-04-17 00:19:56 +00002365
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002366PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002367"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002368
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002370 _IMP_EXTENSION_SUFFIXES_METHODDEF
2371 _IMP_LOCK_HELD_METHODDEF
2372 _IMP_ACQUIRE_LOCK_METHODDEF
2373 _IMP_RELEASE_LOCK_METHODDEF
2374 _IMP_GET_FROZEN_OBJECT_METHODDEF
2375 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002376 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002377 _IMP_INIT_FROZEN_METHODDEF
2378 _IMP_IS_BUILTIN_METHODDEF
2379 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002380 _IMP_CREATE_DYNAMIC_METHODDEF
2381 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002382 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002383 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002384 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002385 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002386};
2387
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002388
Martin v. Löwis1a214512008-06-11 05:26:20 +00002389static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002391 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 doc_imp,
2393 0,
2394 imp_methods,
2395 NULL,
2396 NULL,
2397 NULL,
2398 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002399};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002400
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002401PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002402PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 m = PyModule_Create(&impmodule);
Victor Stinner410b85a2019-05-13 17:12:45 +02002407 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002409 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 d = PyModule_GetDict(m);
Victor Stinner410b85a2019-05-13 17:12:45 +02002411 if (d == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 goto failure;
Victor Stinner410b85a2019-05-13 17:12:45 +02002413 }
2414
Victor Stinner331a6a52019-05-27 16:39:22 +02002415 const wchar_t *mode = _PyInterpreterState_Get()->config.check_hash_pycs_mode;
Victor Stinner410b85a2019-05-13 17:12:45 +02002416 PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002417 if (pyc_mode == NULL) {
2418 goto failure;
2419 }
2420 if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) {
2421 Py_DECREF(pyc_mode);
2422 goto failure;
2423 }
2424 Py_DECREF(pyc_mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002427 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 Py_XDECREF(m);
2429 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002430}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002431
2432
Guido van Rossumb18618d2000-05-03 23:44:39 +00002433/* API for embedding applications that want to add their own entries
2434 to the table of built-in modules. This should normally be called
2435 *before* Py_Initialize(). When the table resize fails, -1 is
2436 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002437
2438 After a similar function by Just van Rossum. */
2439
2440int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002444 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002445 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 /* Count the number of entries in both tables */
2448 for (n = 0; newtab[n].name != NULL; n++)
2449 ;
2450 if (n == 0)
2451 return 0; /* Nothing to do */
2452 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2453 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002454
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002455 /* Force default raw memory allocator to get a known allocator to be able
2456 to release the memory in _PyImport_Fini2() */
2457 PyMemAllocatorEx old_alloc;
2458 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002461 p = NULL;
2462 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002463 size_t size = sizeof(struct _inittab) * (i + n + 1);
2464 p = PyMem_RawRealloc(inittab_copy, size);
2465 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002466 if (p == NULL) {
2467 res = -1;
2468 goto done;
2469 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002470
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002471 /* Copy the tables into the new memory at the first call
2472 to PyImport_ExtendInittab(). */
2473 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002475 }
2476 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2477 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002478
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002479done:
2480 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2481 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002482}
2483
2484/* Shorthand to add a single entry given a name and a function */
2485
2486int
Brett Cannona826f322009-04-02 03:41:46 +00002487PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002492
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002493 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002497}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002498
2499#ifdef __cplusplus
2500}
2501#endif