blob: acfe96963ca34e0f97a3497cdec1b4b51c70ac1c [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
Victor Stinner62230712020-11-18 23:18:29 +01005#include "pycore_import.h" // _PyImport_BootstrapImp()
Victor Stinner61691d82019-10-02 23:51:20 +02006#include "pycore_initconfig.h"
Victor Stinner0a28f8d2019-06-19 02:54:39 +02007#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01008#include "pycore_pyhash.h"
9#include "pycore_pylifecycle.h"
Victor Stinnerd9ea5ca2020-04-15 02:57:50 +020010#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
Victor Stinnere5014be2020-04-14 17:52:15 +020011#include "pycore_interp.h" // _PyInterpreterState_ClearModules()
12#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +010013#include "pycore_sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000015#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000016#include "code.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000017#include "importdl.h"
Christian Heimes3d2b4072017-09-30 00:53:19 +020018#include "pydtrace.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000019
Guido van Rossum55a83382000-09-20 20:31:38 +000020#ifdef HAVE_FCNTL_H
21#include <fcntl.h>
22#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000023#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000024extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000025#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000026
Barry Warsaw28a691b2010-04-17 00:19:56 +000027#define CACHEDIR "__pycache__"
Guido van Rossum96774c12000-05-01 20:19:08 +000028
Victor Stinner0a28f8d2019-06-19 02:54:39 +020029/* Forward references */
30static PyObject *import_add_module(PyThreadState *tstate, PyObject *name);
31
Victor Stinner95872862011-03-07 18:20:56 +010032/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +000033static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000034
Guido van Rossum771c6c81997-10-31 18:37:24 +000035/* This table is defined in config.c: */
36extern struct _inittab _PyImport_Inittab[];
37
38struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Victor Stinner92a3c6f2017-12-06 18:12:59 +010039static struct _inittab *inittab_copy = NULL;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000040
Hai Shi46874c22020-01-30 17:20:25 -060041_Py_IDENTIFIER(__path__);
42_Py_IDENTIFIER(__spec__);
43
Brett Cannon4caa61d2014-01-09 19:03:32 -050044/*[clinic input]
45module _imp
46[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030047/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
Brett Cannonfd4d0502014-05-30 11:21:14 -040048
49#include "clinic/import.c.h"
Brett Cannon4caa61d2014-01-09 19:03:32 -050050
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052
Victor Stinner331a6a52019-05-27 16:39:22 +020053PyStatus
Victor Stinner0a28f8d2019-06-19 02:54:39 +020054_PyImportZip_Init(PyThreadState *tstate)
Brett Cannonfd074152012-04-14 14:10:13 -040055{
ukwksk5e6312c2018-05-15 04:10:52 +090056 PyObject *path_hooks, *zipimport;
Brett Cannonfd074152012-04-14 14:10:13 -040057 int err = 0;
58
59 path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1e53bba2013-07-16 22:26:05 +020060 if (path_hooks == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020061 _PyErr_SetString(tstate, PyExc_RuntimeError,
62 "unable to get sys.path_hooks");
Brett Cannonfd074152012-04-14 14:10:13 -040063 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +020064 }
Brett Cannonfd074152012-04-14 14:10:13 -040065
Victor Stinnerda7933e2020-04-13 03:04:28 +020066 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +020067 if (verbose) {
Brett Cannonfd074152012-04-14 14:10:13 -040068 PySys_WriteStderr("# installing zipimport hook\n");
Victor Stinner410b85a2019-05-13 17:12:45 +020069 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +000070
ukwksk5e6312c2018-05-15 04:10:52 +090071 zipimport = PyImport_ImportModule("zipimport");
72 if (zipimport == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020073 _PyErr_Clear(tstate); /* No zip import module -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +020074 if (verbose) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 PySys_WriteStderr("# can't import zipimport\n");
Victor Stinner410b85a2019-05-13 17:12:45 +020076 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 }
78 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020079 _Py_IDENTIFIER(zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +090080 PyObject *zipimporter = _PyObject_GetAttrId(zipimport,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +020081 &PyId_zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +090082 Py_DECREF(zipimport);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 if (zipimporter == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020084 _PyErr_Clear(tstate); /* No zipimporter object -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +020085 if (verbose) {
86 PySys_WriteStderr("# can't import zipimport.zipimporter\n");
87 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 }
89 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -040090 /* sys.path_hooks.insert(0, zipimporter) */
91 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -040093 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -040095 }
Victor Stinner410b85a2019-05-13 17:12:45 +020096 if (verbose) {
97 PySys_WriteStderr("# installed zipimport hook\n");
98 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 }
100 }
Brett Cannonfd074152012-04-14 14:10:13 -0400101
Victor Stinner331a6a52019-05-27 16:39:22 +0200102 return _PyStatus_OK();
Brett Cannonfd074152012-04-14 14:10:13 -0400103
104 error:
105 PyErr_Print();
Victor Stinner331a6a52019-05-27 16:39:22 +0200106 return _PyStatus_ERR("initializing zipimport failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000107}
108
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000109/* Locking primitives to prevent parallel imports of the same module
110 in different threads to return with a partially loaded module.
111 These calls are serialized by the global interpreter lock. */
112
Victor Stinner26881c82020-06-02 15:51:37 +0200113static PyThread_type_lock import_lock = NULL;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200114static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000115static int import_lock_level = 0;
116
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000117void
118_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000119{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200120 unsigned long me = PyThread_get_thread_ident();
121 if (me == PYTHREAD_INVALID_THREAD_ID)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 return; /* Too bad */
123 if (import_lock == NULL) {
124 import_lock = PyThread_allocate_lock();
125 if (import_lock == NULL)
126 return; /* Nothing much we can do. */
127 }
128 if (import_lock_thread == me) {
129 import_lock_level++;
130 return;
131 }
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200132 if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
133 !PyThread_acquire_lock(import_lock, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 {
135 PyThreadState *tstate = PyEval_SaveThread();
Victor Stinner26881c82020-06-02 15:51:37 +0200136 PyThread_acquire_lock(import_lock, WAIT_LOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 PyEval_RestoreThread(tstate);
138 }
Antoine Pitrou202b6062012-12-18 22:18:17 +0100139 assert(import_lock_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 import_lock_thread = me;
141 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000142}
143
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000144int
145_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000146{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200147 unsigned long me = PyThread_get_thread_ident();
148 if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 return 0; /* Too bad */
150 if (import_lock_thread != me)
151 return -1;
152 import_lock_level--;
Antoine Pitrou202b6062012-12-18 22:18:17 +0100153 assert(import_lock_level >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 if (import_lock_level == 0) {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200155 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 PyThread_release_lock(import_lock);
157 }
158 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000159}
160
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900161#ifdef HAVE_FORK
Victor Stinner26881c82020-06-02 15:51:37 +0200162/* This function is called from PyOS_AfterFork_Child() to ensure that newly
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000163 created child processes do not share locks with the parent.
164 We now acquire the import lock around fork() calls but on some platforms
165 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Victor Stinner26881c82020-06-02 15:51:37 +0200166PyStatus
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000167_PyImport_ReInitLock(void)
168{
Christian Heimes418fd742015-04-19 21:08:42 +0200169 if (import_lock != NULL) {
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900170 if (_PyThread_at_fork_reinit(&import_lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200171 return _PyStatus_ERR("failed to create a new lock");
Christian Heimes418fd742015-04-19 21:08:42 +0200172 }
173 }
Victor Stinner26881c82020-06-02 15:51:37 +0200174
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000175 if (import_lock_level > 1) {
176 /* Forked as a side effect of import */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200177 unsigned long me = PyThread_get_thread_ident();
Victor Stinner45b34a02020-06-02 17:13:49 +0200178 PyThread_acquire_lock(import_lock, WAIT_LOCK);
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000179 import_lock_thread = me;
180 import_lock_level--;
181 } else {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200182 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000183 import_lock_level = 0;
184 }
Victor Stinner26881c82020-06-02 15:51:37 +0200185 return _PyStatus_OK();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000186}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900187#endif
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000188
Brett Cannon4caa61d2014-01-09 19:03:32 -0500189/*[clinic input]
190_imp.lock_held
191
192Return True if the import lock is currently held, else False.
193
194On platforms without threads, return False.
195[clinic start generated code]*/
196
Brett Cannon4caa61d2014-01-09 19:03:32 -0500197static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300198_imp_lock_held_impl(PyObject *module)
199/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
Tim Peters69232342001-08-30 05:16:13 +0000200{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200201 return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
Tim Peters69232342001-08-30 05:16:13 +0000202}
203
Brett Cannon4caa61d2014-01-09 19:03:32 -0500204/*[clinic input]
205_imp.acquire_lock
206
207Acquires the interpreter's import lock for the current thread.
208
209This lock should be used by import hooks to ensure thread-safety when importing
210modules. On platforms without threads, this function does nothing.
211[clinic start generated code]*/
212
Brett Cannon4caa61d2014-01-09 19:03:32 -0500213static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300214_imp_acquire_lock_impl(PyObject *module)
215/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 _PyImport_AcquireLock();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200218 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000219}
220
Brett Cannon4caa61d2014-01-09 19:03:32 -0500221/*[clinic input]
222_imp.release_lock
223
224Release the interpreter's import lock.
225
226On platforms without threads, this function does nothing.
227[clinic start generated code]*/
228
Brett Cannon4caa61d2014-01-09 19:03:32 -0500229static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300230_imp_release_lock_impl(PyObject *module)
231/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 if (_PyImport_ReleaseLock() < 0) {
234 PyErr_SetString(PyExc_RuntimeError,
235 "not holding the import lock");
236 return NULL;
237 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200238 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000239}
240
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100241void
242_PyImport_Fini(void)
243{
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200244 Py_CLEAR(extensions);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100245 if (import_lock != NULL) {
246 PyThread_free_lock(import_lock);
247 import_lock = NULL;
248 }
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100249}
250
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100251void
252_PyImport_Fini2(void)
253{
254 /* Use the same memory allocator than PyImport_ExtendInittab(). */
255 PyMemAllocatorEx old_alloc;
256 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
257
Victor Stinnerece38412021-06-23 17:47:38 +0200258 // Reset PyImport_Inittab
259 PyImport_Inittab = _PyImport_Inittab;
260
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100261 /* Free memory allocated by PyImport_ExtendInittab() */
262 PyMem_RawFree(inittab_copy);
Gregory Szorc64224a42020-05-01 11:07:54 -0700263 inittab_copy = NULL;
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100264
265 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
266}
267
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268/* Helper for sys */
269
270PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000271PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Victor Stinner81a7be32020-04-14 15:14:01 +0200273 PyInterpreterState *interp = _PyInterpreterState_GET();
Eric Snow3f9eee62017-09-15 16:35:20 -0600274 if (interp->modules == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100275 Py_FatalError("interpreter has no modules dictionary");
Eric Snow3f9eee62017-09-15 16:35:20 -0600276 }
Eric Snow93c92f72017-09-13 23:46:04 -0700277 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278}
279
Eric Snowd393c1b2017-09-14 12:18:12 -0600280/* In some corner cases it is important to be sure that the import
281 machinery has been initialized (or not cleaned up yet). For
282 example, see issue #4236 and PyModule_Create2(). */
283
284int
285_PyImport_IsInitialized(PyInterpreterState *interp)
286{
287 if (interp->modules == NULL)
288 return 0;
289 return 1;
290}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291
Eric Snow3f9eee62017-09-15 16:35:20 -0600292PyObject *
293_PyImport_GetModuleId(struct _Py_Identifier *nameid)
294{
295 PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
296 if (name == NULL) {
297 return NULL;
298 }
299 return PyImport_GetModule(name);
300}
301
302int
303_PyImport_SetModule(PyObject *name, PyObject *m)
304{
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100305 PyInterpreterState *interp = _PyInterpreterState_GET();
306 PyObject *modules = interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600307 return PyObject_SetItem(modules, name, m);
308}
309
310int
311_PyImport_SetModuleString(const char *name, PyObject *m)
312{
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100313 PyInterpreterState *interp = _PyInterpreterState_GET();
314 PyObject *modules = interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600315 return PyMapping_SetItemString(modules, name, m);
316}
317
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200318static PyObject *
319import_get_module(PyThreadState *tstate, PyObject *name)
Eric Snow3f9eee62017-09-15 16:35:20 -0600320{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200321 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600322 if (modules == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200323 _PyErr_SetString(tstate, PyExc_RuntimeError,
324 "unable to get sys.modules");
Eric Snow3f9eee62017-09-15 16:35:20 -0600325 return NULL;
326 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200327
328 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600329 Py_INCREF(modules);
330 if (PyDict_CheckExact(modules)) {
331 m = PyDict_GetItemWithError(modules, name); /* borrowed */
332 Py_XINCREF(m);
333 }
334 else {
335 m = PyObject_GetItem(modules, name);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200336 if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
337 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600338 }
339 }
340 Py_DECREF(modules);
341 return m;
342}
343
344
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100345static int
Victor Stinnerbcb094b2021-02-19 15:10:45 +0100346import_ensure_initialized(PyInterpreterState *interp, PyObject *mod, PyObject *name)
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200347{
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100348 PyObject *spec;
349
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100350 _Py_IDENTIFIER(_lock_unlock_module);
351
352 /* Optimization: only call _bootstrap._lock_unlock_module() if
353 __spec__._initializing is true.
354 NOTE: because of this, initializing must be set *before*
355 stuffing the new module in sys.modules.
356 */
357 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
358 int busy = _PyModuleSpec_IsInitializing(spec);
359 Py_XDECREF(spec);
360 if (busy) {
361 /* Wait until module is done importing. */
362 PyObject *value = _PyObject_CallMethodIdOneArg(
363 interp->importlib, &PyId__lock_unlock_module, name);
364 if (value == NULL) {
365 return -1;
366 }
367 Py_DECREF(value);
368 }
369 return 0;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200370}
371
372
Barry Warsaw28a691b2010-04-17 00:19:56 +0000373/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374
375long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000376PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377{
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200378 long res;
Victor Stinner81a7be32020-04-14 15:14:01 +0200379 PyInterpreterState *interp = _PyInterpreterState_GET();
Eric Snow32439d62015-05-02 19:15:18 -0600380 PyObject *external, *pyc_magic;
381
382 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
383 if (external == NULL)
384 return -1;
385 pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
386 Py_DECREF(external);
Brett Cannon77b2abd2012-07-09 16:09:00 -0400387 if (pyc_magic == NULL)
388 return -1;
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200389 res = PyLong_AsLong(pyc_magic);
Benjamin Peterson66f36592012-07-09 22:21:55 -0700390 Py_DECREF(pyc_magic);
391 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392}
393
394
Brett Cannon3adc7b72012-07-09 14:22:12 -0400395extern const char * _PySys_ImplCacheTag;
396
Barry Warsaw28a691b2010-04-17 00:19:56 +0000397const char *
398PyImport_GetMagicTag(void)
399{
Brett Cannon3adc7b72012-07-09 14:22:12 -0400400 return _PySys_ImplCacheTag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000401}
402
Brett Cannon98979b82012-07-02 15:13:11 -0400403
Guido van Rossum25ce5661997-08-02 03:10:38 +0000404/* Magic for extension modules (built-in as well as dynamically
405 loaded). To prevent initializing an extension module more than
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200406 once, we keep a static dictionary 'extensions' keyed by the tuple
407 (module name, module name) (for built-in modules) or by
408 (filename, module name) (for dynamically loaded modules), containing these
409 modules. A copy of the module's dictionary is stored by calling
410 _PyImport_FixupExtensionObject() immediately after the module initialization
411 function succeeds. A copy can be retrieved from there by calling
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200412 import_find_extension().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000414 Modules which do support multiple initialization set their m_size
415 field to a non-negative number (indicating the size of the
416 module-specific state). They are still recorded in the extensions
417 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000418*/
419
420int
Victor Stinner95872862011-03-07 18:20:56 +0100421_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200422 PyObject *filename, PyObject *modules)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 if (mod == NULL || !PyModule_Check(mod)) {
425 PyErr_BadInternalCall();
426 return -1;
427 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100428
429 struct PyModuleDef *def = PyModule_GetDef(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 if (!def) {
431 PyErr_BadInternalCall();
432 return -1;
433 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100434
435 PyThreadState *tstate = _PyThreadState_GET();
436 if (PyObject_SetItem(modules, name, mod) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100438 }
439 if (_PyState_AddModule(tstate, mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600440 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 return -1;
442 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100443
Miss Islington (bot)d0d29652021-10-05 09:34:59 -0700444 // bpo-44050: Extensions and def->m_base.m_copy can be updated
445 // when the extension module doesn't support sub-interpreters.
446 if (_Py_IsMainInterpreter(tstate->interp) || def->m_size == -1) {
Victor Stinner82c83bd2019-11-22 18:52:27 +0100447 if (def->m_size == -1) {
448 if (def->m_base.m_copy) {
449 /* Somebody already imported the module,
450 likely under a different name.
451 XXX this should really not happen. */
452 Py_CLEAR(def->m_base.m_copy);
453 }
454 PyObject *dict = PyModule_GetDict(mod);
455 if (dict == NULL) {
456 return -1;
457 }
458 def->m_base.m_copy = PyDict_Copy(dict);
459 if (def->m_base.m_copy == NULL) {
460 return -1;
461 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100463
464 if (extensions == NULL) {
465 extensions = PyDict_New();
466 if (extensions == NULL) {
467 return -1;
468 }
469 }
470
471 PyObject *key = PyTuple_Pack(2, filename, name);
472 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100474 }
475 int res = PyDict_SetItem(extensions, key, (PyObject *)def);
476 Py_DECREF(key);
477 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100479 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000483}
484
Victor Stinner49d3f252010-10-17 01:24:53 +0000485int
Eric Snowd393c1b2017-09-14 12:18:12 -0600486_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000487{
488 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100489 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100490 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100491 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000492 return -1;
Eric Snowd393c1b2017-09-14 12:18:12 -0600493 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100494 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000495 return res;
496}
497
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200498static PyObject *
499import_find_extension(PyThreadState *tstate, PyObject *name,
500 PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000501{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200502 if (extensions == NULL) {
503 return NULL;
504 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600505
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200506 PyObject *key = PyTuple_Pack(2, filename, name);
507 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200509 }
510 PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500511 Py_DECREF(key);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200512 if (def == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200514 }
515
516 PyObject *mod, *mdict;
517 PyObject *modules = tstate->interp->modules;
518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 if (def->m_size == -1) {
520 /* Module does not support repeated initialization */
521 if (def->m_base.m_copy == NULL)
522 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200523 mod = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 if (mod == NULL)
525 return NULL;
526 mdict = PyModule_GetDict(mod);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200527 if (mdict == NULL) {
528 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 return NULL;
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200530 }
531 if (PyDict_Update(mdict, def->m_base.m_copy)) {
532 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 return NULL;
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200534 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 }
536 else {
537 if (def->m_base.m_init == NULL)
538 return NULL;
539 mod = def->m_base.m_init();
540 if (mod == NULL)
541 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600542 if (PyObject_SetItem(modules, name, mod) == -1) {
Christian Heimes09ca7942013-07-20 14:51:53 +0200543 Py_DECREF(mod);
544 return NULL;
545 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100547 if (_PyState_AddModule(tstate, mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600548 PyMapping_DelItem(modules, name);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200549 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 return NULL;
551 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200552
Victor Stinnerda7933e2020-04-13 03:04:28 +0200553 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +0200554 if (verbose) {
Victor Stinner95872862011-03-07 18:20:56 +0100555 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Victor Stinner410b85a2019-05-13 17:12:45 +0200556 name, filename);
557 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000559}
560
Serhiy Storchakaec4e2ec2021-09-29 00:12:50 +0300561PyObject *
562_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
563{
564 PyThreadState *tstate = _PyThreadState_GET();
565 PyObject *mod = import_find_extension(tstate, name, filename);
566 if (mod) {
567 PyObject *ref = PyWeakref_NewRef(mod, NULL);
568 Py_DECREF(mod);
569 if (ref == NULL) {
570 return NULL;
571 }
572 mod = PyWeakref_GetObject(ref);
573 Py_DECREF(ref);
574 }
575 return mod; /* borrowed reference */
576}
577
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578
579/* Get the module object corresponding to a module name.
580 First check the modules dictionary if there's one there,
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200581 if not, create a new one and insert it in the modules dictionary. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200583static PyObject *
584import_add_module(PyThreadState *tstate, PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200586 PyObject *modules = tstate->interp->modules;
587 if (modules == NULL) {
588 _PyErr_SetString(tstate, PyExc_RuntimeError,
589 "no import module dictionary");
590 return NULL;
591 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600592
Eric Snow86b7afd2017-09-04 17:54:09 -0600593 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600594 if (PyDict_CheckExact(modules)) {
595 m = PyDict_GetItemWithError(modules, name);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200596 Py_XINCREF(m);
Eric Snow3f9eee62017-09-15 16:35:20 -0600597 }
598 else {
599 m = PyObject_GetItem(modules, name);
Min ho Kimc4cacc82019-07-31 08:16:13 +1000600 // For backward-compatibility we copy the behavior
Eric Snow3f9eee62017-09-15 16:35:20 -0600601 // of PyDict_GetItemWithError().
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200602 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
603 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600604 }
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200605 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200606 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200607 return NULL;
608 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600609 if (m != NULL && PyModule_Check(m)) {
610 return m;
611 }
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200612 Py_XDECREF(m);
Victor Stinner27ee0892011-03-04 12:57:09 +0000613 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 if (m == NULL)
615 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600616 if (PyObject_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 Py_DECREF(m);
618 return NULL;
619 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622}
623
Victor Stinner27ee0892011-03-04 12:57:09 +0000624PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200625PyImport_AddModuleObject(PyObject *name)
626{
627 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200628 PyObject *mod = import_add_module(tstate, name);
629 if (mod) {
630 PyObject *ref = PyWeakref_NewRef(mod, NULL);
631 Py_DECREF(mod);
632 if (ref == NULL) {
633 return NULL;
634 }
635 mod = PyWeakref_GetObject(ref);
636 Py_DECREF(ref);
637 }
638 return mod; /* borrowed reference */
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200639}
640
641
642PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000643PyImport_AddModule(const char *name)
644{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200645 PyObject *nameobj = PyUnicode_FromString(name);
646 if (nameobj == NULL) {
Victor Stinner27ee0892011-03-04 12:57:09 +0000647 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200648 }
649 PyObject *module = PyImport_AddModuleObject(nameobj);
Victor Stinner27ee0892011-03-04 12:57:09 +0000650 Py_DECREF(nameobj);
651 return module;
652}
653
654
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300655/* Remove name from sys.modules, if it's there.
656 * Can be called with an exception raised.
657 * If fail to remove name a new exception will be chained with the old
658 * exception, otherwise the old exception is preserved.
659 */
Tim Peters1cd70172004-08-02 03:52:12 +0000660static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200661remove_module(PyThreadState *tstate, PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000662{
Zackery Spytz94a64e92019-05-08 10:31:23 -0600663 PyObject *type, *value, *traceback;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200664 _PyErr_Fetch(tstate, &type, &value, &traceback);
665
666 PyObject *modules = tstate->interp->modules;
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300667 if (PyDict_CheckExact(modules)) {
668 PyObject *mod = _PyDict_Pop(modules, name, Py_None);
669 Py_XDECREF(mod);
Zackery Spytz94a64e92019-05-08 10:31:23 -0600670 }
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300671 else if (PyMapping_DelItem(modules, name) < 0) {
672 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
673 _PyErr_Clear(tstate);
674 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600675 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200676
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300677 _PyErr_ChainExceptions(type, value, traceback);
Tim Peters1cd70172004-08-02 03:52:12 +0000678}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679
Christian Heimes3b06e532008-01-07 20:12:44 +0000680
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000681/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000682 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
683 * removed from sys.modules, to avoid leaving damaged module objects
684 * in sys.modules. The caller may wish to restore the original
685 * module object (if any) in this case; PyImport_ReloadModule is an
686 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000687 *
688 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
689 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000690 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300692PyImport_ExecCodeModule(const char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 return PyImport_ExecCodeModuleWithPathnames(
695 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000696}
697
698PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300699PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 return PyImport_ExecCodeModuleWithPathnames(
702 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000703}
704
705PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300706PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
707 const char *pathname,
708 const char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000709{
Victor Stinner27ee0892011-03-04 12:57:09 +0000710 PyObject *m = NULL;
Eric Snow32439d62015-05-02 19:15:18 -0600711 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000712
713 nameobj = PyUnicode_FromString(name);
714 if (nameobj == NULL)
715 return NULL;
716
Victor Stinner27ee0892011-03-04 12:57:09 +0000717 if (cpathname != NULL) {
718 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
719 if (cpathobj == NULL)
720 goto error;
Brett Cannona6473f92012-07-13 13:57:03 -0400721 }
722 else
Victor Stinner27ee0892011-03-04 12:57:09 +0000723 cpathobj = NULL;
Brett Cannona6473f92012-07-13 13:57:03 -0400724
725 if (pathname != NULL) {
726 pathobj = PyUnicode_DecodeFSDefault(pathname);
727 if (pathobj == NULL)
728 goto error;
729 }
730 else if (cpathobj != NULL) {
Victor Stinner81a7be32020-04-14 15:14:01 +0200731 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannona6473f92012-07-13 13:57:03 -0400732 _Py_IDENTIFIER(_get_sourcefile);
733
734 if (interp == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100735 Py_FatalError("no current interpreter");
Brett Cannona6473f92012-07-13 13:57:03 -0400736 }
737
Eric Snow32439d62015-05-02 19:15:18 -0600738 external= PyObject_GetAttrString(interp->importlib,
739 "_bootstrap_external");
740 if (external != NULL) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200741 pathobj = _PyObject_CallMethodIdOneArg(
742 external, &PyId__get_sourcefile, cpathobj);
Eric Snow32439d62015-05-02 19:15:18 -0600743 Py_DECREF(external);
744 }
Brett Cannona6473f92012-07-13 13:57:03 -0400745 if (pathobj == NULL)
746 PyErr_Clear();
747 }
748 else
749 pathobj = NULL;
750
Victor Stinner27ee0892011-03-04 12:57:09 +0000751 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
752error:
753 Py_DECREF(nameobj);
754 Py_XDECREF(pathobj);
755 Py_XDECREF(cpathobj);
756 return m;
757}
758
Brett Cannon18fc4e72014-04-04 10:01:46 -0400759static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200760module_dict_for_exec(PyThreadState *tstate, PyObject *name)
Victor Stinner27ee0892011-03-04 12:57:09 +0000761{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200762 _Py_IDENTIFIER(__builtins__);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200763 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200765 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 if (m == NULL)
767 return NULL;
768 /* If the module is being reloaded, we get the old module back
769 and re-use its dict to exec the new code. */
770 d = PyModule_GetDict(m);
Serhiy Storchakab510e102020-10-26 12:47:57 +0200771 int r = _PyDict_ContainsId(d, &PyId___builtins__);
772 if (r == 0) {
773 r = _PyDict_SetItemId(d, &PyId___builtins__,
774 PyEval_GetBuiltins());
775 }
776 if (r < 0) {
777 remove_module(tstate, name);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200778 Py_DECREF(m);
Serhiy Storchakab510e102020-10-26 12:47:57 +0200779 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 }
Brett Cannon18fc4e72014-04-04 10:01:46 -0400781
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200782 Py_INCREF(d);
783 Py_DECREF(m);
784 return d;
Brett Cannon18fc4e72014-04-04 10:01:46 -0400785}
786
787static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200788exec_code_in_module(PyThreadState *tstate, PyObject *name,
789 PyObject *module_dict, PyObject *code_object)
Brett Cannon18fc4e72014-04-04 10:01:46 -0400790{
Brett Cannon18fc4e72014-04-04 10:01:46 -0400791 PyObject *v, *m;
792
793 v = PyEval_EvalCode(code_object, module_dict, module_dict);
794 if (v == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200795 remove_module(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400796 return NULL;
797 }
798 Py_DECREF(v);
799
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200800 m = import_get_module(tstate, name);
801 if (m == NULL && !_PyErr_Occurred(tstate)) {
802 _PyErr_Format(tstate, PyExc_ImportError,
803 "Loaded module %R not found in sys.modules",
804 name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400805 }
806
Brett Cannon18fc4e72014-04-04 10:01:46 -0400807 return m;
808}
809
810PyObject*
811PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
812 PyObject *cpathname)
813{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200814 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow32439d62015-05-02 19:15:18 -0600815 PyObject *d, *external, *res;
Eric Snow08197a42014-05-12 17:54:55 -0600816 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400817
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200818 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400819 if (d == NULL) {
820 return NULL;
821 }
822
Eric Snow08197a42014-05-12 17:54:55 -0600823 if (pathname == NULL) {
824 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200826 external = PyObject_GetAttrString(tstate->interp->importlib,
827 "_bootstrap_external");
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200828 if (external == NULL) {
829 Py_DECREF(d);
Eric Snow32439d62015-05-02 19:15:18 -0600830 return NULL;
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200831 }
Eric Snow32439d62015-05-02 19:15:18 -0600832 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -0600833 &PyId__fix_up_module,
834 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -0600835 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -0600836 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -0600837 Py_DECREF(res);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200838 res = exec_code_in_module(tstate, name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 }
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200840 Py_DECREF(d);
Eric Snow08197a42014-05-12 17:54:55 -0600841 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842}
843
844
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000845static void
846update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 PyObject *constants, *tmp;
849 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 if (PyUnicode_Compare(co->co_filename, oldname))
852 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000853
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200854 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300855 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 constants = co->co_consts;
858 n = PyTuple_GET_SIZE(constants);
859 for (i = 0; i < n; i++) {
860 tmp = PyTuple_GET_ITEM(constants, i);
861 if (PyCode_Check(tmp))
862 update_code_filenames((PyCodeObject *)tmp,
863 oldname, newname);
864 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000865}
866
Victor Stinner2f42ae52011-03-20 00:41:24 +0100867static void
868update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000869{
Victor Stinner2f42ae52011-03-20 00:41:24 +0100870 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000871
Victor Stinner2f42ae52011-03-20 00:41:24 +0100872 if (PyUnicode_Compare(co->co_filename, newname) == 0)
873 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 oldname = co->co_filename;
876 Py_INCREF(oldname);
877 update_code_filenames(co, oldname, newname);
878 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000879}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000880
Brett Cannon4caa61d2014-01-09 19:03:32 -0500881/*[clinic input]
882_imp._fix_co_filename
883
884 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
885 Code object to change.
886
887 path: unicode
888 File path to use.
889 /
890
891Changes code.co_filename to specify the passed-in file path.
892[clinic start generated code]*/
893
Brett Cannon4caa61d2014-01-09 19:03:32 -0500894static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300895_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -0400896 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300897/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -0700898
Brett Cannon4caa61d2014-01-09 19:03:32 -0500899{
Brett Cannona6dec2e2014-01-10 07:43:55 -0500900 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -0700901
902 Py_RETURN_NONE;
903}
904
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000905
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000906/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -0700907static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000908
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000909
910/* Helper to test for built-in module */
911
912static int
Victor Stinner95872862011-03-07 18:20:56 +0100913is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000914{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200915 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200917 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 if (PyImport_Inittab[i].initfunc == NULL)
919 return -1;
920 else
921 return 1;
922 }
923 }
924 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000925}
926
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000927
Brett Cannonfdcdd9e2016-07-08 11:00:00 -0700928/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +0000929 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +0000931 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -0700932 this tells our caller that the path based finder could not find
933 a finder for this path item. Cache the result in
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200934 path_importer_cache. */
Just van Rossum52e14d62002-12-30 22:08:05 +0000935
936static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200937get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
938 PyObject *path_hooks, PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 PyObject *importer;
941 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 /* These conditions are the caller's responsibility: */
944 assert(PyList_Check(path_hooks));
945 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 nhooks = PyList_Size(path_hooks);
948 if (nhooks < 0)
949 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +0000950
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200951 importer = PyDict_GetItemWithError(path_importer_cache, p);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200952 if (importer != NULL || _PyErr_Occurred(tstate)) {
953 Py_XINCREF(importer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 return importer;
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200955 }
Just van Rossum52e14d62002-12-30 22:08:05 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* set path_importer_cache[p] to None to avoid recursion */
958 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
959 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 for (j = 0; j < nhooks; j++) {
962 PyObject *hook = PyList_GetItem(path_hooks, j);
963 if (hook == NULL)
964 return NULL;
Petr Viktorinffd97532020-02-11 17:46:57 +0100965 importer = PyObject_CallOneArg(hook, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 if (importer != NULL)
967 break;
Just van Rossum52e14d62002-12-30 22:08:05 +0000968
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200969 if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 return NULL;
971 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200972 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 }
974 if (importer == NULL) {
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200975 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 }
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200977 if (PyDict_SetItem(path_importer_cache, p, importer) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 Py_DECREF(importer);
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200979 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 }
981 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +0000982}
983
Benjamin Petersone5024512018-09-12 12:06:42 -0700984PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200985PyImport_GetImporter(PyObject *path)
986{
987 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200988 PyObject *path_importer_cache = PySys_GetObject("path_importer_cache");
989 PyObject *path_hooks = PySys_GetObject("path_hooks");
990 if (path_importer_cache == NULL || path_hooks == NULL) {
991 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 }
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200993 return get_path_importer(tstate, path_importer_cache, path_hooks, path);
Christian Heimes9cd17752007-11-18 19:35:23 +0000994}
995
Victor Stinner62230712020-11-18 23:18:29 +0100996static PyObject*
997create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
998{
Serhiy Storchaka4db89882021-01-12 16:43:32 +0200999 PyObject *mod = import_find_extension(tstate, name, name);
Victor Stinner62230712020-11-18 23:18:29 +01001000 if (mod || _PyErr_Occurred(tstate)) {
Victor Stinner62230712020-11-18 23:18:29 +01001001 return mod;
1002 }
1003
1004 PyObject *modules = tstate->interp->modules;
1005 for (struct _inittab *p = PyImport_Inittab; p->name != NULL; p++) {
1006 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
1007 if (p->initfunc == NULL) {
1008 /* Cannot re-init internal module ("sys" or "builtins") */
1009 return PyImport_AddModuleObject(name);
1010 }
1011
1012 mod = (*p->initfunc)();
1013 if (mod == NULL) {
1014 return NULL;
1015 }
1016
1017 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1018 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1019 }
1020 else {
1021 /* Remember pointer to module init function. */
1022 PyModuleDef *def = PyModule_GetDef(mod);
1023 if (def == NULL) {
1024 return NULL;
1025 }
1026
1027 def->m_base.m_init = p->initfunc;
1028 if (_PyImport_FixupExtensionObject(mod, name, name,
1029 modules) < 0) {
1030 return NULL;
1031 }
1032 return mod;
1033 }
1034 }
1035 }
1036
1037 // not found
1038 Py_RETURN_NONE;
1039}
1040
1041
1042
Nick Coghland5cacbb2015-05-23 22:24:10 +10001043/*[clinic input]
1044_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001045
Nick Coghland5cacbb2015-05-23 22:24:10 +10001046 spec: object
1047 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001048
Nick Coghland5cacbb2015-05-23 22:24:10 +10001049Create an extension module.
1050[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001051
Nick Coghland5cacbb2015-05-23 22:24:10 +10001052static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001053_imp_create_builtin(PyObject *module, PyObject *spec)
1054/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001055{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001056 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001057
Victor Stinner62230712020-11-18 23:18:29 +01001058 PyObject *name = PyObject_GetAttrString(spec, "name");
Nick Coghland5cacbb2015-05-23 22:24:10 +10001059 if (name == NULL) {
1060 return NULL;
1061 }
1062
Victor Stinner62230712020-11-18 23:18:29 +01001063 PyObject *mod = create_builtin(tstate, name, spec);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001064 Py_DECREF(name);
Victor Stinner62230712020-11-18 23:18:29 +01001065 return mod;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001066}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001067
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001069/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001070
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001071static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001072find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001073{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001074 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001075
Victor Stinner53dc7352011-03-20 01:50:21 +01001076 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 for (p = PyImport_FrozenModules; ; p++) {
1080 if (p->name == NULL)
1081 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001082 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 break;
1084 }
1085 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001086}
1087
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001089get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001090{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001091 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 if (p == NULL) {
1095 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001096 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 name);
1098 return NULL;
1099 }
1100 if (p->code == NULL) {
1101 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001102 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 name);
1104 return NULL;
1105 }
1106 size = p->size;
1107 if (size < 0)
1108 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001109 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001110}
1111
Brett Cannon8d110132009-03-15 02:20:16 +00001112static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001113is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001114{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001115 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 if (p == NULL) {
1119 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001120 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 name);
1122 return NULL;
1123 }
Brett Cannon8d110132009-03-15 02:20:16 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 if (size < 0)
1128 Py_RETURN_TRUE;
1129 else
1130 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001131}
1132
1133
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001134/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001135 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001136 an exception set if the initialization failed.
1137 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001138
1139int
Victor Stinner53dc7352011-03-20 01:50:21 +01001140PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001141{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001142 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001143 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001144 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 int ispackage;
1146 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001147
Victor Stinner53dc7352011-03-20 01:50:21 +01001148 p = find_frozen(name);
1149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 if (p == NULL)
1151 return 0;
1152 if (p->code == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001153 _PyErr_Format(tstate, PyExc_ImportError,
1154 "Excluded frozen object named %R",
1155 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 return -1;
1157 }
1158 size = p->size;
1159 ispackage = (size < 0);
1160 if (ispackage)
1161 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001162 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (co == NULL)
1164 return -1;
1165 if (!PyCode_Check(co)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001166 _PyErr_Format(tstate, PyExc_TypeError,
1167 "frozen object %R is not a code object",
1168 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 goto err_return;
1170 }
1171 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001172 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001173 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 int err;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001175 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 if (m == NULL)
1177 goto err_return;
1178 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001179 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 if (l == NULL) {
Serhiy Storchaka4db89882021-01-12 16:43:32 +02001181 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 goto err_return;
1183 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 err = PyDict_SetItemString(d, "__path__", l);
1185 Py_DECREF(l);
Serhiy Storchaka4db89882021-01-12 16:43:32 +02001186 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 if (err != 0)
1188 goto err_return;
1189 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001190 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001191 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001192 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001193 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001194 m = exec_code_in_module(tstate, name, d, co);
Serhiy Storchaka4db89882021-01-12 16:43:32 +02001195 Py_DECREF(d);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001196 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 goto err_return;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 Py_DECREF(co);
1200 Py_DECREF(m);
1201 return 1;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001202
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001203err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 Py_DECREF(co);
1205 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001206}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001207
Victor Stinner53dc7352011-03-20 01:50:21 +01001208int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001209PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001210{
1211 PyObject *nameobj;
1212 int ret;
1213 nameobj = PyUnicode_InternFromString(name);
1214 if (nameobj == NULL)
1215 return -1;
1216 ret = PyImport_ImportFrozenModuleObject(nameobj);
1217 Py_DECREF(nameobj);
1218 return ret;
1219}
1220
Guido van Rossum74e6a111994-08-29 12:54:38 +00001221
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001223 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001224
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001226PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 PyObject *pname;
1229 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 pname = PyUnicode_FromString(name);
1232 if (pname == NULL)
1233 return NULL;
1234 result = PyImport_Import(pname);
1235 Py_DECREF(pname);
1236 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001237}
1238
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001239
Christian Heimes072c0f12008-01-03 23:01:04 +00001240/* Import a module without blocking
1241 *
1242 * At first it tries to fetch the module from sys.modules. If the module was
1243 * never loaded before it loads it with PyImport_ImportModule() unless another
1244 * thread holds the import lock. In the latter case the function raises an
1245 * ImportError instead of blocking.
1246 *
1247 * Returns the module object with incremented ref count.
1248 */
1249PyObject *
1250PyImport_ImportModuleNoBlock(const char *name)
1251{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001252 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001253}
1254
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001255
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001256/* Remove importlib frames from the traceback,
1257 * except in Verbose mode. */
1258static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001259remove_importlib_frames(PyThreadState *tstate)
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001260{
1261 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001262 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001263 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001264 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001265 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001266 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001267 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001268
1269 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001270 from the traceback. We always trim chunks
1271 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001272
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001273 _PyErr_Fetch(tstate, &exception, &value, &base_tb);
Victor Stinnerda7933e2020-04-13 03:04:28 +02001274 if (!exception || _PyInterpreterState_GetConfig(tstate->interp)->verbose) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001275 goto done;
Victor Stinner410b85a2019-05-13 17:12:45 +02001276 }
1277
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001278 if (PyType_IsSubtype((PyTypeObject *) exception,
1279 (PyTypeObject *) PyExc_ImportError))
1280 always_trim = 1;
1281
1282 prev_link = &base_tb;
1283 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001284 while (tb != NULL) {
1285 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1286 PyObject *next = (PyObject *) traceback->tb_next;
1287 PyFrameObject *frame = traceback->tb_frame;
Victor Stinnera42ca742020-04-28 19:01:31 +02001288 PyCodeObject *code = PyFrame_GetCode(frame);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001289 int now_in_importlib;
1290
1291 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001292 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1293 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001294 if (now_in_importlib && !in_importlib) {
1295 /* This is the link to this chunk of importlib tracebacks */
1296 outer_link = prev_link;
1297 }
1298 in_importlib = now_in_importlib;
1299
1300 if (in_importlib &&
1301 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001302 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001303 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001304 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001305 prev_link = outer_link;
1306 }
1307 else {
1308 prev_link = (PyObject **) &traceback->tb_next;
1309 }
Victor Stinner8852ad42020-04-29 01:28:13 +02001310 Py_DECREF(code);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001311 tb = next;
1312 }
1313done:
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001314 _PyErr_Restore(tstate, exception, value, base_tb);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001315}
1316
1317
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001318static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001319resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001320{
Brett Cannonfd074152012-04-14 14:10:13 -04001321 _Py_IDENTIFIER(__package__);
Brett Cannonfd074152012-04-14 14:10:13 -04001322 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001323 _Py_IDENTIFIER(parent);
1324 PyObject *abs_name;
1325 PyObject *package = NULL;
1326 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001327 Py_ssize_t last_dot;
1328 PyObject *base;
1329 int level_up;
1330
1331 if (globals == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001332 _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001333 goto error;
1334 }
1335 if (!PyDict_Check(globals)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001336 _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001337 goto error;
1338 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001339 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001340 if (package == Py_None) {
1341 package = NULL;
1342 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001343 else if (package == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001344 goto error;
1345 }
1346 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001347 if (spec == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001348 goto error;
1349 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001350
1351 if (package != NULL) {
1352 Py_INCREF(package);
1353 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001354 _PyErr_SetString(tstate, PyExc_TypeError,
1355 "package must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001356 goto error;
1357 }
1358 else if (spec != NULL && spec != Py_None) {
1359 int equal;
1360 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1361 if (parent == NULL) {
1362 goto error;
1363 }
1364
1365 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1366 Py_DECREF(parent);
1367 if (equal < 0) {
1368 goto error;
1369 }
1370 else if (equal == 0) {
1371 if (PyErr_WarnEx(PyExc_ImportWarning,
1372 "__package__ != __spec__.parent", 1) < 0) {
1373 goto error;
1374 }
1375 }
1376 }
1377 }
1378 else if (spec != NULL && spec != Py_None) {
1379 package = _PyObject_GetAttrId(spec, &PyId_parent);
1380 if (package == NULL) {
1381 goto error;
1382 }
1383 else if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001384 _PyErr_SetString(tstate, PyExc_TypeError,
1385 "__spec__.parent must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001386 goto error;
1387 }
1388 }
1389 else {
1390 if (PyErr_WarnEx(PyExc_ImportWarning,
1391 "can't resolve package from __spec__ or __package__, "
1392 "falling back on __name__ and __path__", 1) < 0) {
1393 goto error;
1394 }
1395
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001396 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001397 if (package == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001398 if (!_PyErr_Occurred(tstate)) {
1399 _PyErr_SetString(tstate, PyExc_KeyError,
1400 "'__name__' not in globals");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001401 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001402 goto error;
1403 }
1404
1405 Py_INCREF(package);
1406 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001407 _PyErr_SetString(tstate, PyExc_TypeError,
1408 "__name__ must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001409 goto error;
1410 }
1411
Serhiy Storchakab510e102020-10-26 12:47:57 +02001412 int haspath = _PyDict_ContainsId(globals, &PyId___path__);
1413 if (haspath < 0) {
1414 goto error;
1415 }
1416 if (!haspath) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001417 Py_ssize_t dot;
1418
Serhiy Storchakab510e102020-10-26 12:47:57 +02001419 if (PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001420 goto error;
1421 }
1422
1423 dot = PyUnicode_FindChar(package, '.',
1424 0, PyUnicode_GET_LENGTH(package), -1);
1425 if (dot == -2) {
1426 goto error;
1427 }
Ben Lewis92420b32019-09-11 20:09:47 +10001428 else if (dot == -1) {
1429 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001430 }
Ben Lewis92420b32019-09-11 20:09:47 +10001431 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1432 if (substr == NULL) {
1433 goto error;
1434 }
1435 Py_SETREF(package, substr);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001436 }
1437 }
1438
1439 last_dot = PyUnicode_GET_LENGTH(package);
1440 if (last_dot == 0) {
Ben Lewis92420b32019-09-11 20:09:47 +10001441 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001442 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001443
1444 for (level_up = 1; level_up < level; level_up += 1) {
1445 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1446 if (last_dot == -2) {
1447 goto error;
1448 }
1449 else if (last_dot == -1) {
Ngalim Siregarc5fa4492019-08-03 12:46:02 +07001450 _PyErr_SetString(tstate, PyExc_ImportError,
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001451 "attempted relative import beyond top-level "
1452 "package");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001453 goto error;
1454 }
1455 }
1456
1457 base = PyUnicode_Substring(package, 0, last_dot);
1458 Py_DECREF(package);
1459 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1460 return base;
1461 }
1462
1463 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1464 Py_DECREF(base);
1465 return abs_name;
1466
Ben Lewis92420b32019-09-11 20:09:47 +10001467 no_parent_error:
1468 _PyErr_SetString(tstate, PyExc_ImportError,
1469 "attempted relative import "
1470 "with no known parent package");
1471
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001472 error:
1473 Py_XDECREF(package);
1474 return NULL;
1475}
1476
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001477static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001478import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001479{
1480 _Py_IDENTIFIER(_find_and_load);
1481 PyObject *mod = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001482 PyInterpreterState *interp = tstate->interp;
Victor Stinnerda7933e2020-04-13 03:04:28 +02001483 int import_time = _PyInterpreterState_GetConfig(interp)->import_time;
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001484 static int import_level;
1485 static _PyTime_t accumulated;
1486
1487 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1488
Steve Dowerb82e17e2019-05-23 08:45:22 -07001489 PyObject *sys_path = PySys_GetObject("path");
1490 PyObject *sys_meta_path = PySys_GetObject("meta_path");
1491 PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001492 if (_PySys_Audit(tstate, "import", "OOOOO",
1493 abs_name, Py_None, sys_path ? sys_path : Py_None,
1494 sys_meta_path ? sys_meta_path : Py_None,
1495 sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001496 return NULL;
1497 }
1498
1499
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001500 /* XOptions is initialized after first some imports.
1501 * So we can't have negative cache before completed initialization.
1502 * Anyway, importlib._find_and_load is much slower than
1503 * _PyDict_GetItemIdWithError().
1504 */
1505 if (import_time) {
1506 static int header = 1;
1507 if (header) {
1508 fputs("import time: self [us] | cumulative | imported package\n",
1509 stderr);
1510 header = 0;
1511 }
1512
1513 import_level++;
1514 t1 = _PyTime_GetPerfCounter();
1515 accumulated = 0;
1516 }
1517
1518 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
Andy Lesterfc2d8d62020-03-30 15:19:14 -05001519 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001520
1521 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1522 &PyId__find_and_load, abs_name,
1523 interp->import_func, NULL);
1524
1525 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
Andy Lesterfc2d8d62020-03-30 15:19:14 -05001526 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001527 mod != NULL);
1528
1529 if (import_time) {
1530 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1531
1532 import_level--;
1533 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1534 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1535 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1536 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1537
1538 accumulated = accumulated_copy + cum;
1539 }
1540
1541 return mod;
1542}
1543
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001544PyObject *
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001545PyImport_GetModule(PyObject *name)
1546{
1547 PyThreadState *tstate = _PyThreadState_GET();
1548 PyObject *mod;
1549
1550 mod = import_get_module(tstate, name);
1551 if (mod != NULL && mod != Py_None) {
Victor Stinnerbcb094b2021-02-19 15:10:45 +01001552 if (import_ensure_initialized(tstate->interp, mod, name) < 0) {
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001553 Py_DECREF(mod);
1554 remove_importlib_frames(tstate);
1555 return NULL;
1556 }
1557 }
1558 return mod;
1559}
1560
1561PyObject *
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001562PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1563 PyObject *locals, PyObject *fromlist,
1564 int level)
1565{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001566 PyThreadState *tstate = _PyThreadState_GET();
Brett Cannonfd074152012-04-14 14:10:13 -04001567 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001568 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001569 PyObject *final_mod = NULL;
1570 PyObject *mod = NULL;
1571 PyObject *package = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001572 PyInterpreterState *interp = tstate->interp;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001573 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001574
Brett Cannonfd074152012-04-14 14:10:13 -04001575 if (name == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001576 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001577 goto error;
1578 }
1579
1580 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1581 for added performance. */
1582
1583 if (!PyUnicode_Check(name)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001584 _PyErr_SetString(tstate, PyExc_TypeError,
1585 "module name must be a string");
Brett Cannonfd074152012-04-14 14:10:13 -04001586 goto error;
1587 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001588 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001589 goto error;
1590 }
1591 if (level < 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001592 _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0");
Brett Cannonfd074152012-04-14 14:10:13 -04001593 goto error;
1594 }
Brett Cannon849113a2016-01-22 15:25:50 -08001595
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001596 if (level > 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001597 abs_name = resolve_name(tstate, name, globals, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001598 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001599 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001600 }
1601 else { /* level == 0 */
1602 if (PyUnicode_GET_LENGTH(name) == 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001603 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001604 goto error;
1605 }
Brett Cannonfd074152012-04-14 14:10:13 -04001606 abs_name = name;
1607 Py_INCREF(abs_name);
1608 }
1609
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001610 mod = import_get_module(tstate, abs_name);
1611 if (mod == NULL && _PyErr_Occurred(tstate)) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001612 goto error;
1613 }
1614
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001615 if (mod != NULL && mod != Py_None) {
Antoine Pitrou2fd16ef2021-03-20 20:07:44 +01001616 if (import_ensure_initialized(tstate->interp, mod, abs_name) < 0) {
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001617 goto error;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001618 }
Brett Cannonfd074152012-04-14 14:10:13 -04001619 }
1620 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001621 Py_XDECREF(mod);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001622 mod = import_find_and_load(tstate, abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001623 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001624 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001625 }
1626 }
1627
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001628 has_from = 0;
1629 if (fromlist != NULL && fromlist != Py_None) {
1630 has_from = PyObject_IsTrue(fromlist);
1631 if (has_from < 0)
1632 goto error;
1633 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001634 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001635 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1636 if (level == 0 || len > 0) {
1637 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001638
Victor Stinner744c34e2016-05-20 11:36:13 +02001639 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1640 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001641 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001642 }
1643
Victor Stinner744c34e2016-05-20 11:36:13 +02001644 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001645 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001646 final_mod = mod;
1647 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001648 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001649 }
1650
Brett Cannonfd074152012-04-14 14:10:13 -04001651 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001652 PyObject *front = PyUnicode_Substring(name, 0, dot);
1653 if (front == NULL) {
1654 goto error;
1655 }
1656
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001657 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001658 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001659 }
1660 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001661 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001662 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001663 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001664 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001665 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001666 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001667 }
Brett Cannonfd074152012-04-14 14:10:13 -04001668
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001669 final_mod = import_get_module(tstate, to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001670 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001671 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001672 if (!_PyErr_Occurred(tstate)) {
1673 _PyErr_Format(tstate, PyExc_KeyError,
1674 "%R not in sys.modules as expected",
1675 to_return);
Stefan Krah027b09c2019-03-25 21:50:58 +01001676 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001677 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001678 }
Brett Cannonfd074152012-04-14 14:10:13 -04001679 }
1680 }
1681 else {
1682 final_mod = mod;
1683 Py_INCREF(mod);
1684 }
1685 }
1686 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001687 PyObject *path;
1688 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1689 goto error;
1690 }
1691 if (path) {
1692 Py_DECREF(path);
1693 final_mod = _PyObject_CallMethodIdObjArgs(
1694 interp->importlib, &PyId__handle_fromlist,
1695 mod, fromlist, interp->import_func, NULL);
1696 }
1697 else {
1698 final_mod = mod;
1699 Py_INCREF(mod);
1700 }
Brett Cannonfd074152012-04-14 14:10:13 -04001701 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001702
Brett Cannonfd074152012-04-14 14:10:13 -04001703 error:
1704 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001705 Py_XDECREF(mod);
1706 Py_XDECREF(package);
Victor Stinner410b85a2019-05-13 17:12:45 +02001707 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001708 remove_importlib_frames(tstate);
Victor Stinner410b85a2019-05-13 17:12:45 +02001709 }
Brett Cannonfd074152012-04-14 14:10:13 -04001710 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001711}
1712
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001713PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001714PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001715 PyObject *fromlist, int level)
1716{
1717 PyObject *nameobj, *mod;
1718 nameobj = PyUnicode_FromString(name);
1719 if (nameobj == NULL)
1720 return NULL;
1721 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1722 fromlist, level);
1723 Py_DECREF(nameobj);
1724 return mod;
1725}
1726
1727
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001728/* Re-import a module of any kind and return its module object, WITH
1729 INCREMENTED REFERENCE COUNT */
1730
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001732PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001733{
Robert Rouhanif40bd462020-05-01 16:28:06 -07001734 _Py_IDENTIFIER(importlib);
Brett Cannon62228db2012-04-29 14:38:11 -04001735 _Py_IDENTIFIER(reload);
1736 PyObject *reloaded_module = NULL;
Robert Rouhanif40bd462020-05-01 16:28:06 -07001737 PyObject *importlib = _PyImport_GetModuleId(&PyId_importlib);
1738 if (importlib == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001739 if (PyErr_Occurred()) {
1740 return NULL;
1741 }
1742
Robert Rouhanif40bd462020-05-01 16:28:06 -07001743 importlib = PyImport_ImportModule("importlib");
1744 if (importlib == NULL) {
Brett Cannon62228db2012-04-29 14:38:11 -04001745 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001748
Robert Rouhanif40bd462020-05-01 16:28:06 -07001749 reloaded_module = _PyObject_CallMethodIdOneArg(importlib, &PyId_reload, m);
1750 Py_DECREF(importlib);
Brett Cannon62228db2012-04-29 14:38:11 -04001751 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001752}
1753
1754
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001755/* Higher-level import emulator which emulates the "import" statement
1756 more accurately -- it invokes the __import__() function from the
1757 builtins of the current globals. This means that the import is
1758 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001759 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001760 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001761 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001762 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001763
1764PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001765PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001766{
junyixie88d99832021-03-22 17:47:10 +08001767 _Py_IDENTIFIER(__import__);
1768 _Py_IDENTIFIER(__builtins__);
1769
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001770 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 PyObject *globals = NULL;
1772 PyObject *import = NULL;
1773 PyObject *builtins = NULL;
1774 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 /* Initialize constant string objects */
junyixie88d99832021-03-22 17:47:10 +08001777 PyObject *import_str = _PyUnicode_FromId(&PyId___import__); // borrowed ref
1778 if (import_str == NULL) {
1779 return NULL;
1780 }
1781
1782 PyObject *builtins_str = _PyUnicode_FromId(&PyId___builtins__); // borrowed ref
1783 if (builtins_str == NULL) {
1784 return NULL;
1785 }
1786
1787 PyObject *from_list = PyList_New(0);
1788 if (from_list == NULL) {
1789 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 /* Get the builtins from current globals */
1793 globals = PyEval_GetGlobals();
1794 if (globals != NULL) {
1795 Py_INCREF(globals);
1796 builtins = PyObject_GetItem(globals, builtins_str);
1797 if (builtins == NULL)
1798 goto err;
1799 }
1800 else {
1801 /* No globals -- use standard builtins, and fake globals */
1802 builtins = PyImport_ImportModuleLevel("builtins",
1803 NULL, NULL, NULL, 0);
junyixie88d99832021-03-22 17:47:10 +08001804 if (builtins == NULL) {
1805 goto err;
1806 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1808 if (globals == NULL)
1809 goto err;
1810 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 /* Get the __import__ function from the builtins */
1813 if (PyDict_Check(builtins)) {
1814 import = PyObject_GetItem(builtins, import_str);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001815 if (import == NULL) {
1816 _PyErr_SetObject(tstate, PyExc_KeyError, import_str);
1817 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 }
1819 else
1820 import = PyObject_GetAttr(builtins, import_str);
1821 if (import == NULL)
1822 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001825 Always use absolute import here.
1826 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
junyixie88d99832021-03-22 17:47:10 +08001828 globals, from_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001829 if (r == NULL)
1830 goto err;
1831 Py_DECREF(r);
1832
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001833 r = import_get_module(tstate, module_name);
1834 if (r == NULL && !_PyErr_Occurred(tstate)) {
1835 _PyErr_SetObject(tstate, PyExc_KeyError, module_name);
Serhiy Storchaka145541c2017-06-15 20:54:38 +03001836 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001837
1838 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 Py_XDECREF(globals);
1840 Py_XDECREF(builtins);
1841 Py_XDECREF(import);
junyixie88d99832021-03-22 17:47:10 +08001842 Py_XDECREF(from_list);
Tim Peters50d8d372001-02-28 05:34:27 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001845}
1846
Brett Cannon4caa61d2014-01-09 19:03:32 -05001847/*[clinic input]
1848_imp.extension_suffixes
1849
1850Returns the list of file suffixes used to identify extension modules.
1851[clinic start generated code]*/
1852
Brett Cannon4caa61d2014-01-09 19:03:32 -05001853static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001854_imp_extension_suffixes_impl(PyObject *module)
1855/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 list = PyList_New(0);
1860 if (list == NULL)
1861 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04001862#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01001863 const char *suffix;
1864 unsigned int index = 0;
1865
Brett Cannon2657df42012-05-04 15:20:40 -04001866 while ((suffix = _PyImport_DynLoadFiletab[index])) {
1867 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (item == NULL) {
1869 Py_DECREF(list);
1870 return NULL;
1871 }
1872 if (PyList_Append(list, item) < 0) {
1873 Py_DECREF(list);
1874 Py_DECREF(item);
1875 return NULL;
1876 }
1877 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04001878 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 }
Brett Cannon2657df42012-05-04 15:20:40 -04001880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001882}
1883
Brett Cannon4caa61d2014-01-09 19:03:32 -05001884/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05001885_imp.init_frozen
1886
1887 name: unicode
1888 /
1889
1890Initializes a frozen module.
1891[clinic start generated code]*/
1892
Brett Cannon4caa61d2014-01-09 19:03:32 -05001893static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001894_imp_init_frozen_impl(PyObject *module, PyObject *name)
1895/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001896{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001897 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 int ret;
Brett Cannon4caa61d2014-01-09 19:03:32 -05001899
Victor Stinner53dc7352011-03-20 01:50:21 +01001900 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 if (ret < 0)
1902 return NULL;
1903 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001904 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 }
Serhiy Storchaka4db89882021-01-12 16:43:32 +02001906 return import_add_module(tstate, name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001907}
1908
Brett Cannon4caa61d2014-01-09 19:03:32 -05001909/*[clinic input]
1910_imp.get_frozen_object
1911
1912 name: unicode
1913 /
1914
1915Create a code object for a frozen module.
1916[clinic start generated code]*/
1917
Brett Cannon4caa61d2014-01-09 19:03:32 -05001918static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001919_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
1920/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001923}
1924
Brett Cannon4caa61d2014-01-09 19:03:32 -05001925/*[clinic input]
1926_imp.is_frozen_package
1927
1928 name: unicode
1929 /
1930
1931Returns True if the module name is of a frozen package.
1932[clinic start generated code]*/
1933
Brett Cannon4caa61d2014-01-09 19:03:32 -05001934static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001935_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
1936/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00001939}
1940
Brett Cannon4caa61d2014-01-09 19:03:32 -05001941/*[clinic input]
1942_imp.is_builtin
1943
1944 name: unicode
1945 /
1946
1947Returns True if the module name corresponds to a built-in module.
1948[clinic start generated code]*/
1949
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001951_imp_is_builtin_impl(PyObject *module, PyObject *name)
1952/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001953{
Brett Cannon4caa61d2014-01-09 19:03:32 -05001954 return PyLong_FromLong(is_builtin(name));
1955}
1956
1957/*[clinic input]
1958_imp.is_frozen
1959
1960 name: unicode
1961 /
1962
1963Returns True if the module name corresponds to a frozen module.
1964[clinic start generated code]*/
1965
Brett Cannon4caa61d2014-01-09 19:03:32 -05001966static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001967_imp_is_frozen_impl(PyObject *module, PyObject *name)
1968/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001969{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001970 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05001971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 p = find_frozen(name);
1973 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974}
1975
Larry Hastings1df0b352015-08-24 19:53:56 -07001976/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
1977static int
1978exec_builtin_or_dynamic(PyObject *mod) {
1979 PyModuleDef *def;
1980 void *state;
1981
1982 if (!PyModule_Check(mod)) {
1983 return 0;
1984 }
1985
1986 def = PyModule_GetDef(mod);
1987 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07001988 return 0;
1989 }
Brett Cannon52794db2016-09-07 17:00:43 -07001990
Larry Hastings1df0b352015-08-24 19:53:56 -07001991 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07001992 if (state) {
1993 /* Already initialized; skip reload */
1994 return 0;
1995 }
Brett Cannon52794db2016-09-07 17:00:43 -07001996
Larry Hastings1df0b352015-08-24 19:53:56 -07001997 return PyModule_ExecDef(mod, def);
1998}
1999
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002000#ifdef HAVE_DYNAMIC_LOADING
2001
Brett Cannon4caa61d2014-01-09 19:03:32 -05002002/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002003_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002004
Nick Coghland5cacbb2015-05-23 22:24:10 +10002005 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002006 file: object = NULL
2007 /
2008
Nick Coghland5cacbb2015-05-23 22:24:10 +10002009Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002010[clinic start generated code]*/
2011
Brett Cannon4caa61d2014-01-09 19:03:32 -05002012static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002013_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2014/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002015{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002016 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002017 FILE *fp;
2018
Nick Coghland5cacbb2015-05-23 22:24:10 +10002019 name = PyObject_GetAttrString(spec, "name");
2020 if (name == NULL) {
2021 return NULL;
2022 }
2023
2024 path = PyObject_GetAttrString(spec, "origin");
2025 if (path == NULL) {
2026 Py_DECREF(name);
2027 return NULL;
2028 }
2029
Serhiy Storchaka4db89882021-01-12 16:43:32 +02002030 PyThreadState *tstate = _PyThreadState_GET();
2031 mod = import_find_extension(tstate, name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002032 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002033 Py_DECREF(name);
2034 Py_DECREF(path);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002035 return mod;
2036 }
2037
Brett Cannon4caa61d2014-01-09 19:03:32 -05002038 if (file != NULL) {
2039 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002040 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002041 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002042 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002046 else
2047 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002048
2049 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2050
2051 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002052 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 if (fp)
2054 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002055 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002056}
2057
Nick Coghland5cacbb2015-05-23 22:24:10 +10002058/*[clinic input]
2059_imp.exec_dynamic -> int
2060
2061 mod: object
2062 /
2063
2064Initialize an extension module.
2065[clinic start generated code]*/
2066
2067static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002068_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2069/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002070{
Larry Hastings1df0b352015-08-24 19:53:56 -07002071 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002072}
2073
2074
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002075#endif /* HAVE_DYNAMIC_LOADING */
2076
Larry Hastings7726ac92014-01-31 22:03:12 -08002077/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002078_imp.exec_builtin -> int
2079
2080 mod: object
2081 /
2082
2083Initialize a built-in module.
2084[clinic start generated code]*/
2085
2086static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002087_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2088/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002089{
2090 return exec_builtin_or_dynamic(mod);
2091}
2092
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002093/*[clinic input]
2094_imp.source_hash
2095
2096 key: long
2097 source: Py_buffer
2098[clinic start generated code]*/
2099
2100static PyObject *
2101_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2102/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2103{
Benjamin Peterson83620772017-12-09 12:18:56 -08002104 union {
2105 uint64_t x;
2106 char data[sizeof(uint64_t)];
2107 } hash;
2108 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002109#if !PY_LITTLE_ENDIAN
2110 // Force to little-endian. There really ought to be a succinct standard way
2111 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002112 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2113 char tmp = hash.data[i];
2114 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2115 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002116 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002117#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002118 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002119}
2120
Barry Warsaw28a691b2010-04-17 00:19:56 +00002121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002123"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002124
Guido van Rossum79f25d91997-04-29 20:08:16 +00002125static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002126 _IMP_EXTENSION_SUFFIXES_METHODDEF
2127 _IMP_LOCK_HELD_METHODDEF
2128 _IMP_ACQUIRE_LOCK_METHODDEF
2129 _IMP_RELEASE_LOCK_METHODDEF
2130 _IMP_GET_FROZEN_OBJECT_METHODDEF
2131 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002132 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002133 _IMP_INIT_FROZEN_METHODDEF
2134 _IMP_IS_BUILTIN_METHODDEF
2135 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002136 _IMP_CREATE_DYNAMIC_METHODDEF
2137 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002138 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002139 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002140 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002141 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142};
2143
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002144
Victor Stinner62230712020-11-18 23:18:29 +01002145static int
2146imp_module_exec(PyObject *module)
2147{
2148 const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode;
2149 PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
2150 if (pyc_mode == NULL) {
2151 return -1;
2152 }
2153 if (PyModule_AddObjectRef(module, "check_hash_based_pycs", pyc_mode) < 0) {
2154 Py_DECREF(pyc_mode);
2155 return -1;
2156 }
2157 Py_DECREF(pyc_mode);
2158
2159 return 0;
2160}
2161
2162
2163static PyModuleDef_Slot imp_slots[] = {
2164 {Py_mod_exec, imp_module_exec},
2165 {0, NULL}
2166};
2167
2168static struct PyModuleDef imp_module = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 PyModuleDef_HEAD_INIT,
Victor Stinner62230712020-11-18 23:18:29 +01002170 .m_name = "_imp",
2171 .m_doc = doc_imp,
2172 .m_size = 0,
2173 .m_methods = imp_methods,
2174 .m_slots = imp_slots,
Martin v. Löwis1a214512008-06-11 05:26:20 +00002175};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002177PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002178PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179{
Victor Stinner62230712020-11-18 23:18:29 +01002180 return PyModuleDef_Init(&imp_module);
2181}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182
Victor Stinner62230712020-11-18 23:18:29 +01002183
2184// Import the _imp extension by calling manually _imp.create_builtin() and
2185// _imp.exec_builtin() since importlib is not initialized yet. Initializing
2186// importlib requires the _imp module: this function fix the bootstrap issue.
2187PyObject*
2188_PyImport_BootstrapImp(PyThreadState *tstate)
2189{
2190 PyObject *name = PyUnicode_FromString("_imp");
2191 if (name == NULL) {
2192 return NULL;
Victor Stinner410b85a2019-05-13 17:12:45 +02002193 }
2194
Victor Stinner62230712020-11-18 23:18:29 +01002195 // Mock a ModuleSpec object just good enough for PyModule_FromDefAndSpec():
2196 // an object with just a name attribute.
2197 //
Christian Claussccd82a02021-10-07 17:30:08 +02002198 // _imp.__spec__ is overridden by importlib._bootstrap._instal() anyway.
Victor Stinner62230712020-11-18 23:18:29 +01002199 PyObject *attrs = Py_BuildValue("{sO}", "name", name);
2200 if (attrs == NULL) {
2201 goto error;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002202 }
Victor Stinner62230712020-11-18 23:18:29 +01002203 PyObject *spec = _PyNamespace_New(attrs);
2204 Py_DECREF(attrs);
2205 if (spec == NULL) {
2206 goto error;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002207 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002208
Victor Stinner62230712020-11-18 23:18:29 +01002209 // Create the _imp module from its definition.
2210 PyObject *mod = create_builtin(tstate, name, spec);
2211 Py_CLEAR(name);
2212 Py_DECREF(spec);
2213 if (mod == NULL) {
2214 goto error;
2215 }
2216 assert(mod != Py_None); // not found
2217
2218 // Execute the _imp module: call imp_module_exec().
2219 if (exec_builtin_or_dynamic(mod) < 0) {
2220 Py_DECREF(mod);
2221 goto error;
2222 }
2223 return mod;
2224
2225error:
2226 Py_XDECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002228}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002229
2230
Guido van Rossumb18618d2000-05-03 23:44:39 +00002231/* API for embedding applications that want to add their own entries
2232 to the table of built-in modules. This should normally be called
2233 *before* Py_Initialize(). When the table resize fails, -1 is
2234 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002235
2236 After a similar function by Just van Rossum. */
2237
2238int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002242 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002243 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 /* Count the number of entries in both tables */
2246 for (n = 0; newtab[n].name != NULL; n++)
2247 ;
2248 if (n == 0)
2249 return 0; /* Nothing to do */
2250 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2251 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002252
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002253 /* Force default raw memory allocator to get a known allocator to be able
2254 to release the memory in _PyImport_Fini2() */
2255 PyMemAllocatorEx old_alloc;
2256 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002259 p = NULL;
2260 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002261 size_t size = sizeof(struct _inittab) * (i + n + 1);
2262 p = PyMem_RawRealloc(inittab_copy, size);
2263 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002264 if (p == NULL) {
2265 res = -1;
2266 goto done;
2267 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002268
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002269 /* Copy the tables into the new memory at the first call
2270 to PyImport_ExtendInittab(). */
2271 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002273 }
2274 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2275 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002276
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002277done:
2278 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2279 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002280}
2281
2282/* Shorthand to add a single entry given a name and a function */
2283
2284int
Brett Cannona826f322009-04-02 03:41:46 +00002285PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002290
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002291 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002295}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002296
2297#ifdef __cplusplus
2298}
2299#endif