blob: 1522abc705ffb29e4da1c3605289f3f58ab3fb8f [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module definition and import implementation */
2
Guido van Rossum79f25d91997-04-29 20:08:16 +00003#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "Python-ast.h"
Victor Stinner3bb183d2018-11-22 18:38:38 +01006#undef Yield /* undefine macro conflicting with <winbase.h> */
Victor Stinner62230712020-11-18 23:18:29 +01007#include "pycore_import.h" // _PyImport_BootstrapImp()
Victor Stinner61691d82019-10-02 23:51:20 +02008#include "pycore_initconfig.h"
Victor Stinner0a28f8d2019-06-19 02:54:39 +02009#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010010#include "pycore_pyhash.h"
11#include "pycore_pylifecycle.h"
Victor Stinnerd9ea5ca2020-04-15 02:57:50 +020012#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
Victor Stinnere5014be2020-04-14 17:52:15 +020013#include "pycore_interp.h" // _PyInterpreterState_ClearModules()
14#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinner1c1e68c2020-03-27 15:11:45 +010015#include "pycore_sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000017#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018#include "code.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000019#include "importdl.h"
Christian Heimes3d2b4072017-09-30 00:53:19 +020020#include "pydtrace.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000021
Guido van Rossum55a83382000-09-20 20:31:38 +000022#ifdef HAVE_FCNTL_H
23#include <fcntl.h>
24#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000025#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000026extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000027#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000028
Barry Warsaw28a691b2010-04-17 00:19:56 +000029#define CACHEDIR "__pycache__"
Guido van Rossum96774c12000-05-01 20:19:08 +000030
Victor Stinner0a28f8d2019-06-19 02:54:39 +020031/* Forward references */
32static PyObject *import_add_module(PyThreadState *tstate, PyObject *name);
33
Victor Stinner95872862011-03-07 18:20:56 +010034/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +000035static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000036
Guido van Rossum771c6c81997-10-31 18:37:24 +000037/* This table is defined in config.c: */
38extern struct _inittab _PyImport_Inittab[];
39
40struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Victor Stinner92a3c6f2017-12-06 18:12:59 +010041static struct _inittab *inittab_copy = NULL;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000042
Hai Shi46874c22020-01-30 17:20:25 -060043_Py_IDENTIFIER(__path__);
44_Py_IDENTIFIER(__spec__);
45
Brett Cannon4caa61d2014-01-09 19:03:32 -050046/*[clinic input]
47module _imp
48[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030049/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
Brett Cannonfd4d0502014-05-30 11:21:14 -040050
51#include "clinic/import.c.h"
Brett Cannon4caa61d2014-01-09 19:03:32 -050052
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054
Victor Stinner331a6a52019-05-27 16:39:22 +020055PyStatus
Victor Stinner0a28f8d2019-06-19 02:54:39 +020056_PyImportZip_Init(PyThreadState *tstate)
Brett Cannonfd074152012-04-14 14:10:13 -040057{
ukwksk5e6312c2018-05-15 04:10:52 +090058 PyObject *path_hooks, *zipimport;
Brett Cannonfd074152012-04-14 14:10:13 -040059 int err = 0;
60
61 path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1e53bba2013-07-16 22:26:05 +020062 if (path_hooks == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020063 _PyErr_SetString(tstate, PyExc_RuntimeError,
64 "unable to get sys.path_hooks");
Brett Cannonfd074152012-04-14 14:10:13 -040065 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +020066 }
Brett Cannonfd074152012-04-14 14:10:13 -040067
Victor Stinnerda7933e2020-04-13 03:04:28 +020068 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +020069 if (verbose) {
Brett Cannonfd074152012-04-14 14:10:13 -040070 PySys_WriteStderr("# installing zipimport hook\n");
Victor Stinner410b85a2019-05-13 17:12:45 +020071 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +000072
ukwksk5e6312c2018-05-15 04:10:52 +090073 zipimport = PyImport_ImportModule("zipimport");
74 if (zipimport == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020075 _PyErr_Clear(tstate); /* No zip import module -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +020076 if (verbose) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 PySys_WriteStderr("# can't import zipimport\n");
Victor Stinner410b85a2019-05-13 17:12:45 +020078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 }
80 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020081 _Py_IDENTIFIER(zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +090082 PyObject *zipimporter = _PyObject_GetAttrId(zipimport,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +020083 &PyId_zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +090084 Py_DECREF(zipimport);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 if (zipimporter == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +020086 _PyErr_Clear(tstate); /* No zipimporter object -- okay */
Victor Stinner410b85a2019-05-13 17:12:45 +020087 if (verbose) {
88 PySys_WriteStderr("# can't import zipimport.zipimporter\n");
89 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 }
91 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -040092 /* sys.path_hooks.insert(0, zipimporter) */
93 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -040095 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -040097 }
Victor Stinner410b85a2019-05-13 17:12:45 +020098 if (verbose) {
99 PySys_WriteStderr("# installed zipimport hook\n");
100 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 }
102 }
Brett Cannonfd074152012-04-14 14:10:13 -0400103
Victor Stinner331a6a52019-05-27 16:39:22 +0200104 return _PyStatus_OK();
Brett Cannonfd074152012-04-14 14:10:13 -0400105
106 error:
107 PyErr_Print();
Victor Stinner331a6a52019-05-27 16:39:22 +0200108 return _PyStatus_ERR("initializing zipimport failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000109}
110
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000111/* Locking primitives to prevent parallel imports of the same module
112 in different threads to return with a partially loaded module.
113 These calls are serialized by the global interpreter lock. */
114
Victor Stinner26881c82020-06-02 15:51:37 +0200115static PyThread_type_lock import_lock = NULL;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200116static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000117static int import_lock_level = 0;
118
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000119void
120_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000121{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200122 unsigned long me = PyThread_get_thread_ident();
123 if (me == PYTHREAD_INVALID_THREAD_ID)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 return; /* Too bad */
125 if (import_lock == NULL) {
126 import_lock = PyThread_allocate_lock();
127 if (import_lock == NULL)
128 return; /* Nothing much we can do. */
129 }
130 if (import_lock_thread == me) {
131 import_lock_level++;
132 return;
133 }
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200134 if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
135 !PyThread_acquire_lock(import_lock, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 {
137 PyThreadState *tstate = PyEval_SaveThread();
Victor Stinner26881c82020-06-02 15:51:37 +0200138 PyThread_acquire_lock(import_lock, WAIT_LOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 PyEval_RestoreThread(tstate);
140 }
Antoine Pitrou202b6062012-12-18 22:18:17 +0100141 assert(import_lock_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 import_lock_thread = me;
143 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000144}
145
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000146int
147_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000148{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200149 unsigned long me = PyThread_get_thread_ident();
150 if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 return 0; /* Too bad */
152 if (import_lock_thread != me)
153 return -1;
154 import_lock_level--;
Antoine Pitrou202b6062012-12-18 22:18:17 +0100155 assert(import_lock_level >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 if (import_lock_level == 0) {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200157 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 PyThread_release_lock(import_lock);
159 }
160 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000161}
162
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900163#ifdef HAVE_FORK
Victor Stinner26881c82020-06-02 15:51:37 +0200164/* This function is called from PyOS_AfterFork_Child() to ensure that newly
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000165 created child processes do not share locks with the parent.
166 We now acquire the import lock around fork() calls but on some platforms
167 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Victor Stinner26881c82020-06-02 15:51:37 +0200168PyStatus
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000169_PyImport_ReInitLock(void)
170{
Christian Heimes418fd742015-04-19 21:08:42 +0200171 if (import_lock != NULL) {
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900172 if (_PyThread_at_fork_reinit(&import_lock) < 0) {
Victor Stinner26881c82020-06-02 15:51:37 +0200173 return _PyStatus_ERR("failed to create a new lock");
Christian Heimes418fd742015-04-19 21:08:42 +0200174 }
175 }
Victor Stinner26881c82020-06-02 15:51:37 +0200176
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000177 if (import_lock_level > 1) {
178 /* Forked as a side effect of import */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200179 unsigned long me = PyThread_get_thread_ident();
Victor Stinner45b34a02020-06-02 17:13:49 +0200180 PyThread_acquire_lock(import_lock, WAIT_LOCK);
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000181 import_lock_thread = me;
182 import_lock_level--;
183 } else {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200184 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000185 import_lock_level = 0;
186 }
Victor Stinner26881c82020-06-02 15:51:37 +0200187 return _PyStatus_OK();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000188}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900189#endif
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000190
Brett Cannon4caa61d2014-01-09 19:03:32 -0500191/*[clinic input]
192_imp.lock_held
193
194Return True if the import lock is currently held, else False.
195
196On platforms without threads, return False.
197[clinic start generated code]*/
198
Brett Cannon4caa61d2014-01-09 19:03:32 -0500199static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300200_imp_lock_held_impl(PyObject *module)
201/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
Tim Peters69232342001-08-30 05:16:13 +0000202{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200203 return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
Tim Peters69232342001-08-30 05:16:13 +0000204}
205
Brett Cannon4caa61d2014-01-09 19:03:32 -0500206/*[clinic input]
207_imp.acquire_lock
208
209Acquires the interpreter's import lock for the current thread.
210
211This lock should be used by import hooks to ensure thread-safety when importing
212modules. On platforms without threads, this function does nothing.
213[clinic start generated code]*/
214
Brett Cannon4caa61d2014-01-09 19:03:32 -0500215static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300216_imp_acquire_lock_impl(PyObject *module)
217/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 _PyImport_AcquireLock();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200220 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000221}
222
Brett Cannon4caa61d2014-01-09 19:03:32 -0500223/*[clinic input]
224_imp.release_lock
225
226Release the interpreter's import lock.
227
228On platforms without threads, this function does nothing.
229[clinic start generated code]*/
230
Brett Cannon4caa61d2014-01-09 19:03:32 -0500231static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300232_imp_release_lock_impl(PyObject *module)
233/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 if (_PyImport_ReleaseLock() < 0) {
236 PyErr_SetString(PyExc_RuntimeError,
237 "not holding the import lock");
238 return NULL;
239 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200240 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000241}
242
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100243void
244_PyImport_Fini(void)
245{
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200246 Py_CLEAR(extensions);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100247 if (import_lock != NULL) {
248 PyThread_free_lock(import_lock);
249 import_lock = NULL;
250 }
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100251}
252
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100253void
254_PyImport_Fini2(void)
255{
256 /* Use the same memory allocator than PyImport_ExtendInittab(). */
257 PyMemAllocatorEx old_alloc;
258 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
259
260 /* Free memory allocated by PyImport_ExtendInittab() */
261 PyMem_RawFree(inittab_copy);
Gregory Szorc64224a42020-05-01 11:07:54 -0700262 inittab_copy = NULL;
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100263
264 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
265}
266
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267/* Helper for sys */
268
269PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271{
Victor Stinner81a7be32020-04-14 15:14:01 +0200272 PyInterpreterState *interp = _PyInterpreterState_GET();
Eric Snow3f9eee62017-09-15 16:35:20 -0600273 if (interp->modules == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100274 Py_FatalError("interpreter has no modules dictionary");
Eric Snow3f9eee62017-09-15 16:35:20 -0600275 }
Eric Snow93c92f72017-09-13 23:46:04 -0700276 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000277}
278
Eric Snowd393c1b2017-09-14 12:18:12 -0600279/* In some corner cases it is important to be sure that the import
280 machinery has been initialized (or not cleaned up yet). For
281 example, see issue #4236 and PyModule_Create2(). */
282
283int
284_PyImport_IsInitialized(PyInterpreterState *interp)
285{
286 if (interp->modules == NULL)
287 return 0;
288 return 1;
289}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290
Eric Snow3f9eee62017-09-15 16:35:20 -0600291PyObject *
292_PyImport_GetModuleId(struct _Py_Identifier *nameid)
293{
294 PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
295 if (name == NULL) {
296 return NULL;
297 }
298 return PyImport_GetModule(name);
299}
300
301int
302_PyImport_SetModule(PyObject *name, PyObject *m)
303{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200304 PyThreadState *tstate = _PyThreadState_GET();
305 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600306 return PyObject_SetItem(modules, name, m);
307}
308
309int
310_PyImport_SetModuleString(const char *name, PyObject *m)
311{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200312 PyThreadState *tstate = _PyThreadState_GET();
313 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600314 return PyMapping_SetItemString(modules, name, m);
315}
316
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200317static PyObject *
318import_get_module(PyThreadState *tstate, PyObject *name)
Eric Snow3f9eee62017-09-15 16:35:20 -0600319{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200320 PyObject *modules = tstate->interp->modules;
Eric Snow3f9eee62017-09-15 16:35:20 -0600321 if (modules == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200322 _PyErr_SetString(tstate, PyExc_RuntimeError,
323 "unable to get sys.modules");
Eric Snow3f9eee62017-09-15 16:35:20 -0600324 return NULL;
325 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200326
327 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600328 Py_INCREF(modules);
329 if (PyDict_CheckExact(modules)) {
330 m = PyDict_GetItemWithError(modules, name); /* borrowed */
331 Py_XINCREF(m);
332 }
333 else {
334 m = PyObject_GetItem(modules, name);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200335 if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
336 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600337 }
338 }
339 Py_DECREF(modules);
340 return m;
341}
342
343
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100344static int
345import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name)
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200346{
Joannah Nanjekye37c22202019-09-11 13:47:39 +0100347 PyInterpreterState *interp = tstate->interp;
348 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
Victor Stinner95872862011-03-07 18:20:56 +0100412 _PyImport_FindExtensionObject().
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
444 if (_Py_IsMainInterpreter(tstate)) {
445 if (def->m_size == -1) {
446 if (def->m_base.m_copy) {
447 /* Somebody already imported the module,
448 likely under a different name.
449 XXX this should really not happen. */
450 Py_CLEAR(def->m_base.m_copy);
451 }
452 PyObject *dict = PyModule_GetDict(mod);
453 if (dict == NULL) {
454 return -1;
455 }
456 def->m_base.m_copy = PyDict_Copy(dict);
457 if (def->m_base.m_copy == NULL) {
458 return -1;
459 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100461
462 if (extensions == NULL) {
463 extensions = PyDict_New();
464 if (extensions == NULL) {
465 return -1;
466 }
467 }
468
469 PyObject *key = PyTuple_Pack(2, filename, name);
470 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100472 }
473 int res = PyDict_SetItem(extensions, key, (PyObject *)def);
474 Py_DECREF(key);
475 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100477 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000481}
482
Victor Stinner49d3f252010-10-17 01:24:53 +0000483int
Eric Snowd393c1b2017-09-14 12:18:12 -0600484_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000485{
486 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100487 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100488 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100489 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000490 return -1;
Eric Snowd393c1b2017-09-14 12:18:12 -0600491 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100492 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000493 return res;
494}
495
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200496static PyObject *
497import_find_extension(PyThreadState *tstate, PyObject *name,
498 PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000499{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200500 if (extensions == NULL) {
501 return NULL;
502 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600503
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200504 PyObject *key = PyTuple_Pack(2, filename, name);
505 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200507 }
508 PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500509 Py_DECREF(key);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200510 if (def == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200512 }
513
514 PyObject *mod, *mdict;
515 PyObject *modules = tstate->interp->modules;
516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (def->m_size == -1) {
518 /* Module does not support repeated initialization */
519 if (def->m_base.m_copy == NULL)
520 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200521 mod = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (mod == NULL)
523 return NULL;
524 mdict = PyModule_GetDict(mod);
525 if (mdict == NULL)
526 return NULL;
527 if (PyDict_Update(mdict, def->m_base.m_copy))
528 return NULL;
529 }
530 else {
531 if (def->m_base.m_init == NULL)
532 return NULL;
533 mod = def->m_base.m_init();
534 if (mod == NULL)
535 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600536 if (PyObject_SetItem(modules, name, mod) == -1) {
Christian Heimes09ca7942013-07-20 14:51:53 +0200537 Py_DECREF(mod);
538 return NULL;
539 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 Py_DECREF(mod);
541 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100542 if (_PyState_AddModule(tstate, mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600543 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return NULL;
545 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200546
Victor Stinnerda7933e2020-04-13 03:04:28 +0200547 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner410b85a2019-05-13 17:12:45 +0200548 if (verbose) {
Victor Stinner95872862011-03-07 18:20:56 +0100549 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Victor Stinner410b85a2019-05-13 17:12:45 +0200550 name, filename);
551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553}
554
Victor Stinner49d3f252010-10-17 01:24:53 +0000555PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200556_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
557{
558 PyThreadState *tstate = _PyThreadState_GET();
559 return import_find_extension(tstate, name, filename);
560}
561
562
563PyObject *
564_PyImport_FindBuiltin(PyThreadState *tstate, const char *name)
Victor Stinner49d3f252010-10-17 01:24:53 +0000565{
Victor Stinner95872862011-03-07 18:20:56 +0100566 PyObject *res, *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100567 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100568 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000569 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200570 res = import_find_extension(tstate, nameobj, nameobj);
Victor Stinner95872862011-03-07 18:20:56 +0100571 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000572 return res;
573}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574
575/* Get the module object corresponding to a module name.
576 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000577 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000578 Because the former action is most common, THIS DOES NOT RETURN A
579 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200581static PyObject *
582import_add_module(PyThreadState *tstate, PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200584 PyObject *modules = tstate->interp->modules;
585 if (modules == NULL) {
586 _PyErr_SetString(tstate, PyExc_RuntimeError,
587 "no import module dictionary");
588 return NULL;
589 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600590
Eric Snow86b7afd2017-09-04 17:54:09 -0600591 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600592 if (PyDict_CheckExact(modules)) {
593 m = PyDict_GetItemWithError(modules, name);
594 }
595 else {
596 m = PyObject_GetItem(modules, name);
Min ho Kimc4cacc82019-07-31 08:16:13 +1000597 // For backward-compatibility we copy the behavior
Eric Snow3f9eee62017-09-15 16:35:20 -0600598 // of PyDict_GetItemWithError().
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200599 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
600 _PyErr_Clear(tstate);
Eric Snow3f9eee62017-09-15 16:35:20 -0600601 }
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200602 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200603 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200604 return NULL;
605 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600606 if (m != NULL && PyModule_Check(m)) {
607 return m;
608 }
Victor Stinner27ee0892011-03-04 12:57:09 +0000609 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 if (m == NULL)
611 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600612 if (PyObject_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 Py_DECREF(m);
614 return NULL;
615 }
616 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000619}
620
Victor Stinner27ee0892011-03-04 12:57:09 +0000621PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200622PyImport_AddModuleObject(PyObject *name)
623{
624 PyThreadState *tstate = _PyThreadState_GET();
625 return import_add_module(tstate, name);
626}
627
628
629PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000630PyImport_AddModule(const char *name)
631{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200632 PyObject *nameobj = PyUnicode_FromString(name);
633 if (nameobj == NULL) {
Victor Stinner27ee0892011-03-04 12:57:09 +0000634 return NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200635 }
636 PyObject *module = PyImport_AddModuleObject(nameobj);
Victor Stinner27ee0892011-03-04 12:57:09 +0000637 Py_DECREF(nameobj);
638 return module;
639}
640
641
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300642/* Remove name from sys.modules, if it's there.
643 * Can be called with an exception raised.
644 * If fail to remove name a new exception will be chained with the old
645 * exception, otherwise the old exception is preserved.
646 */
Tim Peters1cd70172004-08-02 03:52:12 +0000647static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200648remove_module(PyThreadState *tstate, PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000649{
Zackery Spytz94a64e92019-05-08 10:31:23 -0600650 PyObject *type, *value, *traceback;
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200651 _PyErr_Fetch(tstate, &type, &value, &traceback);
652
653 PyObject *modules = tstate->interp->modules;
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300654 if (PyDict_CheckExact(modules)) {
655 PyObject *mod = _PyDict_Pop(modules, name, Py_None);
656 Py_XDECREF(mod);
Zackery Spytz94a64e92019-05-08 10:31:23 -0600657 }
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300658 else if (PyMapping_DelItem(modules, name) < 0) {
659 if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
660 _PyErr_Clear(tstate);
661 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600662 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200663
Serhiy Storchaka8287aad2020-10-11 16:51:07 +0300664 _PyErr_ChainExceptions(type, value, traceback);
Tim Peters1cd70172004-08-02 03:52:12 +0000665}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000666
Christian Heimes3b06e532008-01-07 20:12:44 +0000667
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000668/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000669 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
670 * removed from sys.modules, to avoid leaving damaged module objects
671 * in sys.modules. The caller may wish to restore the original
672 * module object (if any) in this case; PyImport_ReloadModule is an
673 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000674 *
675 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
676 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000677 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300679PyImport_ExecCodeModule(const char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 return PyImport_ExecCodeModuleWithPathnames(
682 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000683}
684
685PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300686PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 return PyImport_ExecCodeModuleWithPathnames(
689 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000690}
691
692PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300693PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
694 const char *pathname,
695 const char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000696{
Victor Stinner27ee0892011-03-04 12:57:09 +0000697 PyObject *m = NULL;
Eric Snow32439d62015-05-02 19:15:18 -0600698 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000699
700 nameobj = PyUnicode_FromString(name);
701 if (nameobj == NULL)
702 return NULL;
703
Victor Stinner27ee0892011-03-04 12:57:09 +0000704 if (cpathname != NULL) {
705 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
706 if (cpathobj == NULL)
707 goto error;
Brett Cannona6473f92012-07-13 13:57:03 -0400708 }
709 else
Victor Stinner27ee0892011-03-04 12:57:09 +0000710 cpathobj = NULL;
Brett Cannona6473f92012-07-13 13:57:03 -0400711
712 if (pathname != NULL) {
713 pathobj = PyUnicode_DecodeFSDefault(pathname);
714 if (pathobj == NULL)
715 goto error;
716 }
717 else if (cpathobj != NULL) {
Victor Stinner81a7be32020-04-14 15:14:01 +0200718 PyInterpreterState *interp = _PyInterpreterState_GET();
Brett Cannona6473f92012-07-13 13:57:03 -0400719 _Py_IDENTIFIER(_get_sourcefile);
720
721 if (interp == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100722 Py_FatalError("no current interpreter");
Brett Cannona6473f92012-07-13 13:57:03 -0400723 }
724
Eric Snow32439d62015-05-02 19:15:18 -0600725 external= PyObject_GetAttrString(interp->importlib,
726 "_bootstrap_external");
727 if (external != NULL) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200728 pathobj = _PyObject_CallMethodIdOneArg(
729 external, &PyId__get_sourcefile, cpathobj);
Eric Snow32439d62015-05-02 19:15:18 -0600730 Py_DECREF(external);
731 }
Brett Cannona6473f92012-07-13 13:57:03 -0400732 if (pathobj == NULL)
733 PyErr_Clear();
734 }
735 else
736 pathobj = NULL;
737
Victor Stinner27ee0892011-03-04 12:57:09 +0000738 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
739error:
740 Py_DECREF(nameobj);
741 Py_XDECREF(pathobj);
742 Py_XDECREF(cpathobj);
743 return m;
744}
745
Brett Cannon18fc4e72014-04-04 10:01:46 -0400746static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200747module_dict_for_exec(PyThreadState *tstate, PyObject *name)
Victor Stinner27ee0892011-03-04 12:57:09 +0000748{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200749 _Py_IDENTIFIER(__builtins__);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400750 PyObject *m, *d = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200752 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 if (m == NULL)
754 return NULL;
755 /* If the module is being reloaded, we get the old module back
756 and re-use its dict to exec the new code. */
757 d = PyModule_GetDict(m);
Serhiy Storchakab510e102020-10-26 12:47:57 +0200758 int r = _PyDict_ContainsId(d, &PyId___builtins__);
759 if (r == 0) {
760 r = _PyDict_SetItemId(d, &PyId___builtins__,
761 PyEval_GetBuiltins());
762 }
763 if (r < 0) {
764 remove_module(tstate, name);
765 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 }
Brett Cannon18fc4e72014-04-04 10:01:46 -0400767
Eric Snow08197a42014-05-12 17:54:55 -0600768 return d; /* Return a borrowed reference. */
Brett Cannon18fc4e72014-04-04 10:01:46 -0400769}
770
771static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200772exec_code_in_module(PyThreadState *tstate, PyObject *name,
773 PyObject *module_dict, PyObject *code_object)
Brett Cannon18fc4e72014-04-04 10:01:46 -0400774{
Brett Cannon18fc4e72014-04-04 10:01:46 -0400775 PyObject *v, *m;
776
777 v = PyEval_EvalCode(code_object, module_dict, module_dict);
778 if (v == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200779 remove_module(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400780 return NULL;
781 }
782 Py_DECREF(v);
783
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200784 m = import_get_module(tstate, name);
785 if (m == NULL && !_PyErr_Occurred(tstate)) {
786 _PyErr_Format(tstate, PyExc_ImportError,
787 "Loaded module %R not found in sys.modules",
788 name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400789 }
790
Brett Cannon18fc4e72014-04-04 10:01:46 -0400791 return m;
792}
793
794PyObject*
795PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
796 PyObject *cpathname)
797{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200798 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow32439d62015-05-02 19:15:18 -0600799 PyObject *d, *external, *res;
Eric Snow08197a42014-05-12 17:54:55 -0600800 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400801
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200802 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400803 if (d == NULL) {
804 return NULL;
805 }
806
Eric Snow08197a42014-05-12 17:54:55 -0600807 if (pathname == NULL) {
808 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200810 external = PyObject_GetAttrString(tstate->interp->importlib,
811 "_bootstrap_external");
Eric Snow32439d62015-05-02 19:15:18 -0600812 if (external == NULL)
813 return NULL;
814 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -0600815 &PyId__fix_up_module,
816 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -0600817 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -0600818 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -0600819 Py_DECREF(res);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200820 res = exec_code_in_module(tstate, name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 }
Eric Snow08197a42014-05-12 17:54:55 -0600822 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823}
824
825
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000826static void
827update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 PyObject *constants, *tmp;
830 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 if (PyUnicode_Compare(co->co_filename, oldname))
833 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000834
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200835 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300836 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 constants = co->co_consts;
839 n = PyTuple_GET_SIZE(constants);
840 for (i = 0; i < n; i++) {
841 tmp = PyTuple_GET_ITEM(constants, i);
842 if (PyCode_Check(tmp))
843 update_code_filenames((PyCodeObject *)tmp,
844 oldname, newname);
845 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000846}
847
Victor Stinner2f42ae52011-03-20 00:41:24 +0100848static void
849update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000850{
Victor Stinner2f42ae52011-03-20 00:41:24 +0100851 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000852
Victor Stinner2f42ae52011-03-20 00:41:24 +0100853 if (PyUnicode_Compare(co->co_filename, newname) == 0)
854 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 oldname = co->co_filename;
857 Py_INCREF(oldname);
858 update_code_filenames(co, oldname, newname);
859 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +0000860}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861
Brett Cannon4caa61d2014-01-09 19:03:32 -0500862/*[clinic input]
863_imp._fix_co_filename
864
865 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
866 Code object to change.
867
868 path: unicode
869 File path to use.
870 /
871
872Changes code.co_filename to specify the passed-in file path.
873[clinic start generated code]*/
874
Brett Cannon4caa61d2014-01-09 19:03:32 -0500875static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300876_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -0400877 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300878/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -0700879
Brett Cannon4caa61d2014-01-09 19:03:32 -0500880{
Brett Cannona6dec2e2014-01-10 07:43:55 -0500881 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -0700882
883 Py_RETURN_NONE;
884}
885
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000887/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -0700888static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000889
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000890
891/* Helper to test for built-in module */
892
893static int
Victor Stinner95872862011-03-07 18:20:56 +0100894is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000895{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200896 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200898 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 if (PyImport_Inittab[i].initfunc == NULL)
900 return -1;
901 else
902 return 1;
903 }
904 }
905 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000906}
907
Guido van Rossumaee0bad1997-09-05 07:33:22 +0000908
Brett Cannonfdcdd9e2016-07-08 11:00:00 -0700909/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +0000910 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +0000911 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +0000912 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -0700913 this tells our caller that the path based finder could not find
914 a finder for this path item. Cache the result in
915 path_importer_cache.
Just van Rossum52e14d62002-12-30 22:08:05 +0000916 Returns a borrowed reference. */
917
918static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200919get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
920 PyObject *path_hooks, PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +0000921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyObject *importer;
923 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 /* These conditions are the caller's responsibility: */
926 assert(PyList_Check(path_hooks));
927 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +0000928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 nhooks = PyList_Size(path_hooks);
930 if (nhooks < 0)
931 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +0000932
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200933 importer = PyDict_GetItemWithError(path_importer_cache, p);
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200934 if (importer != NULL || _PyErr_Occurred(tstate))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 /* set path_importer_cache[p] to None to avoid recursion */
938 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
939 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +0000940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 for (j = 0; j < nhooks; j++) {
942 PyObject *hook = PyList_GetItem(path_hooks, j);
943 if (hook == NULL)
944 return NULL;
Petr Viktorinffd97532020-02-11 17:46:57 +0100945 importer = PyObject_CallOneArg(hook, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 if (importer != NULL)
947 break;
Just van Rossum52e14d62002-12-30 22:08:05 +0000948
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200949 if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 return NULL;
951 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200952 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 }
954 if (importer == NULL) {
Brett Cannonaa936422012-04-27 15:30:58 -0400955 return Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 }
957 if (importer != NULL) {
958 int err = PyDict_SetItem(path_importer_cache, p, importer);
959 Py_DECREF(importer);
960 if (err != 0)
961 return NULL;
962 }
963 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +0000964}
965
Benjamin Petersone5024512018-09-12 12:06:42 -0700966PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200967PyImport_GetImporter(PyObject *path)
968{
969 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +0000971
Victor Stinner1e53bba2013-07-16 22:26:05 +0200972 path_importer_cache = PySys_GetObject("path_importer_cache");
973 path_hooks = PySys_GetObject("path_hooks");
974 if (path_importer_cache != NULL && path_hooks != NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200975 importer = get_path_importer(tstate, path_importer_cache,
Victor Stinner1e53bba2013-07-16 22:26:05 +0200976 path_hooks, path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 }
978 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
979 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000980}
981
Victor Stinner62230712020-11-18 23:18:29 +0100982static PyObject*
983create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
984{
985 PyObject *mod = _PyImport_FindExtensionObject(name, name);
986 if (mod || _PyErr_Occurred(tstate)) {
987 Py_XINCREF(mod);
988 return mod;
989 }
990
991 PyObject *modules = tstate->interp->modules;
992 for (struct _inittab *p = PyImport_Inittab; p->name != NULL; p++) {
993 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
994 if (p->initfunc == NULL) {
995 /* Cannot re-init internal module ("sys" or "builtins") */
996 return PyImport_AddModuleObject(name);
997 }
998
999 mod = (*p->initfunc)();
1000 if (mod == NULL) {
1001 return NULL;
1002 }
1003
1004 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1005 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1006 }
1007 else {
1008 /* Remember pointer to module init function. */
1009 PyModuleDef *def = PyModule_GetDef(mod);
1010 if (def == NULL) {
1011 return NULL;
1012 }
1013
1014 def->m_base.m_init = p->initfunc;
1015 if (_PyImport_FixupExtensionObject(mod, name, name,
1016 modules) < 0) {
1017 return NULL;
1018 }
1019 return mod;
1020 }
1021 }
1022 }
1023
1024 // not found
1025 Py_RETURN_NONE;
1026}
1027
1028
1029
Nick Coghland5cacbb2015-05-23 22:24:10 +10001030/*[clinic input]
1031_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032
Nick Coghland5cacbb2015-05-23 22:24:10 +10001033 spec: object
1034 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001035
Nick Coghland5cacbb2015-05-23 22:24:10 +10001036Create an extension module.
1037[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001038
Nick Coghland5cacbb2015-05-23 22:24:10 +10001039static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001040_imp_create_builtin(PyObject *module, PyObject *spec)
1041/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001042{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001043 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001044
Victor Stinner62230712020-11-18 23:18:29 +01001045 PyObject *name = PyObject_GetAttrString(spec, "name");
Nick Coghland5cacbb2015-05-23 22:24:10 +10001046 if (name == NULL) {
1047 return NULL;
1048 }
1049
Victor Stinner62230712020-11-18 23:18:29 +01001050 PyObject *mod = create_builtin(tstate, name, spec);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001051 Py_DECREF(name);
Victor Stinner62230712020-11-18 23:18:29 +01001052 return mod;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001053}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001054
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001056/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001058static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001059find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001060{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001061 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001062
Victor Stinner53dc7352011-03-20 01:50:21 +01001063 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 for (p = PyImport_FrozenModules; ; p++) {
1067 if (p->name == NULL)
1068 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001069 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 break;
1071 }
1072 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001073}
1074
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001076get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001077{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001078 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 if (p == NULL) {
1082 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001083 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 name);
1085 return NULL;
1086 }
1087 if (p->code == NULL) {
1088 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001089 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 name);
1091 return NULL;
1092 }
1093 size = p->size;
1094 if (size < 0)
1095 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001096 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001097}
1098
Brett Cannon8d110132009-03-15 02:20:16 +00001099static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001100is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001101{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001102 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 if (p == NULL) {
1106 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001107 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 name);
1109 return NULL;
1110 }
Brett Cannon8d110132009-03-15 02:20:16 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (size < 0)
1115 Py_RETURN_TRUE;
1116 else
1117 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001118}
1119
1120
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001121/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001122 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001123 an exception set if the initialization failed.
1124 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001125
1126int
Victor Stinner53dc7352011-03-20 01:50:21 +01001127PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001128{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001129 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001130 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001131 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 int ispackage;
1133 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001134
Victor Stinner53dc7352011-03-20 01:50:21 +01001135 p = find_frozen(name);
1136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 if (p == NULL)
1138 return 0;
1139 if (p->code == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001140 _PyErr_Format(tstate, PyExc_ImportError,
1141 "Excluded frozen object named %R",
1142 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 return -1;
1144 }
1145 size = p->size;
1146 ispackage = (size < 0);
1147 if (ispackage)
1148 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001149 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 if (co == NULL)
1151 return -1;
1152 if (!PyCode_Check(co)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001153 _PyErr_Format(tstate, PyExc_TypeError,
1154 "frozen object %R is not a code object",
1155 name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 goto err_return;
1157 }
1158 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001159 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001160 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 int err;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001162 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (m == NULL)
1164 goto err_return;
1165 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001166 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 goto err_return;
1169 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 err = PyDict_SetItemString(d, "__path__", l);
1171 Py_DECREF(l);
1172 if (err != 0)
1173 goto err_return;
1174 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001175 d = module_dict_for_exec(tstate, name);
Brett Cannon18fc4e72014-04-04 10:01:46 -04001176 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001177 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001178 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001179 m = exec_code_in_module(tstate, name, d, co);
1180 if (m == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 goto err_return;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001182 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 Py_DECREF(co);
1184 Py_DECREF(m);
1185 return 1;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001186
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001187err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 Py_DECREF(co);
1189 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001190}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001191
Victor Stinner53dc7352011-03-20 01:50:21 +01001192int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001193PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001194{
1195 PyObject *nameobj;
1196 int ret;
1197 nameobj = PyUnicode_InternFromString(name);
1198 if (nameobj == NULL)
1199 return -1;
1200 ret = PyImport_ImportFrozenModuleObject(nameobj);
1201 Py_DECREF(nameobj);
1202 return ret;
1203}
1204
Guido van Rossum74e6a111994-08-29 12:54:38 +00001205
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001206/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001207 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001208
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001210PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 PyObject *pname;
1213 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 pname = PyUnicode_FromString(name);
1216 if (pname == NULL)
1217 return NULL;
1218 result = PyImport_Import(pname);
1219 Py_DECREF(pname);
1220 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001221}
1222
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001223
Christian Heimes072c0f12008-01-03 23:01:04 +00001224/* Import a module without blocking
1225 *
1226 * At first it tries to fetch the module from sys.modules. If the module was
1227 * never loaded before it loads it with PyImport_ImportModule() unless another
1228 * thread holds the import lock. In the latter case the function raises an
1229 * ImportError instead of blocking.
1230 *
1231 * Returns the module object with incremented ref count.
1232 */
1233PyObject *
1234PyImport_ImportModuleNoBlock(const char *name)
1235{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001236 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001237}
1238
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001239
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001240/* Remove importlib frames from the traceback,
1241 * except in Verbose mode. */
1242static void
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001243remove_importlib_frames(PyThreadState *tstate)
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001244{
1245 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001246 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001247 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001248 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001249 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001250 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001251 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001252
1253 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001254 from the traceback. We always trim chunks
1255 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001256
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001257 _PyErr_Fetch(tstate, &exception, &value, &base_tb);
Victor Stinnerda7933e2020-04-13 03:04:28 +02001258 if (!exception || _PyInterpreterState_GetConfig(tstate->interp)->verbose) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001259 goto done;
Victor Stinner410b85a2019-05-13 17:12:45 +02001260 }
1261
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001262 if (PyType_IsSubtype((PyTypeObject *) exception,
1263 (PyTypeObject *) PyExc_ImportError))
1264 always_trim = 1;
1265
1266 prev_link = &base_tb;
1267 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001268 while (tb != NULL) {
1269 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1270 PyObject *next = (PyObject *) traceback->tb_next;
1271 PyFrameObject *frame = traceback->tb_frame;
Victor Stinnera42ca742020-04-28 19:01:31 +02001272 PyCodeObject *code = PyFrame_GetCode(frame);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001273 int now_in_importlib;
1274
1275 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001276 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1277 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001278 if (now_in_importlib && !in_importlib) {
1279 /* This is the link to this chunk of importlib tracebacks */
1280 outer_link = prev_link;
1281 }
1282 in_importlib = now_in_importlib;
1283
1284 if (in_importlib &&
1285 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001286 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001287 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001288 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001289 prev_link = outer_link;
1290 }
1291 else {
1292 prev_link = (PyObject **) &traceback->tb_next;
1293 }
Victor Stinner8852ad42020-04-29 01:28:13 +02001294 Py_DECREF(code);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001295 tb = next;
1296 }
1297done:
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001298 _PyErr_Restore(tstate, exception, value, base_tb);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001299}
1300
1301
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001302static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001303resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001304{
Brett Cannonfd074152012-04-14 14:10:13 -04001305 _Py_IDENTIFIER(__package__);
Brett Cannonfd074152012-04-14 14:10:13 -04001306 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001307 _Py_IDENTIFIER(parent);
1308 PyObject *abs_name;
1309 PyObject *package = NULL;
1310 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001311 Py_ssize_t last_dot;
1312 PyObject *base;
1313 int level_up;
1314
1315 if (globals == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001316 _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001317 goto error;
1318 }
1319 if (!PyDict_Check(globals)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001320 _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001321 goto error;
1322 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001323 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001324 if (package == Py_None) {
1325 package = NULL;
1326 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001327 else if (package == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001328 goto error;
1329 }
1330 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001331 if (spec == NULL && _PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001332 goto error;
1333 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001334
1335 if (package != NULL) {
1336 Py_INCREF(package);
1337 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001338 _PyErr_SetString(tstate, PyExc_TypeError,
1339 "package must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001340 goto error;
1341 }
1342 else if (spec != NULL && spec != Py_None) {
1343 int equal;
1344 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1345 if (parent == NULL) {
1346 goto error;
1347 }
1348
1349 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1350 Py_DECREF(parent);
1351 if (equal < 0) {
1352 goto error;
1353 }
1354 else if (equal == 0) {
1355 if (PyErr_WarnEx(PyExc_ImportWarning,
1356 "__package__ != __spec__.parent", 1) < 0) {
1357 goto error;
1358 }
1359 }
1360 }
1361 }
1362 else if (spec != NULL && spec != Py_None) {
1363 package = _PyObject_GetAttrId(spec, &PyId_parent);
1364 if (package == NULL) {
1365 goto error;
1366 }
1367 else if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001368 _PyErr_SetString(tstate, PyExc_TypeError,
1369 "__spec__.parent must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001370 goto error;
1371 }
1372 }
1373 else {
1374 if (PyErr_WarnEx(PyExc_ImportWarning,
1375 "can't resolve package from __spec__ or __package__, "
1376 "falling back on __name__ and __path__", 1) < 0) {
1377 goto error;
1378 }
1379
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001380 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001381 if (package == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001382 if (!_PyErr_Occurred(tstate)) {
1383 _PyErr_SetString(tstate, PyExc_KeyError,
1384 "'__name__' not in globals");
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001385 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001386 goto error;
1387 }
1388
1389 Py_INCREF(package);
1390 if (!PyUnicode_Check(package)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001391 _PyErr_SetString(tstate, PyExc_TypeError,
1392 "__name__ must be a string");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001393 goto error;
1394 }
1395
Serhiy Storchakab510e102020-10-26 12:47:57 +02001396 int haspath = _PyDict_ContainsId(globals, &PyId___path__);
1397 if (haspath < 0) {
1398 goto error;
1399 }
1400 if (!haspath) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001401 Py_ssize_t dot;
1402
Serhiy Storchakab510e102020-10-26 12:47:57 +02001403 if (PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001404 goto error;
1405 }
1406
1407 dot = PyUnicode_FindChar(package, '.',
1408 0, PyUnicode_GET_LENGTH(package), -1);
1409 if (dot == -2) {
1410 goto error;
1411 }
Ben Lewis92420b32019-09-11 20:09:47 +10001412 else if (dot == -1) {
1413 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001414 }
Ben Lewis92420b32019-09-11 20:09:47 +10001415 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1416 if (substr == NULL) {
1417 goto error;
1418 }
1419 Py_SETREF(package, substr);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001420 }
1421 }
1422
1423 last_dot = PyUnicode_GET_LENGTH(package);
1424 if (last_dot == 0) {
Ben Lewis92420b32019-09-11 20:09:47 +10001425 goto no_parent_error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001426 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001427
1428 for (level_up = 1; level_up < level; level_up += 1) {
1429 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1430 if (last_dot == -2) {
1431 goto error;
1432 }
1433 else if (last_dot == -1) {
Ngalim Siregarc5fa4492019-08-03 12:46:02 +07001434 _PyErr_SetString(tstate, PyExc_ImportError,
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001435 "attempted relative import beyond top-level "
1436 "package");
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001437 goto error;
1438 }
1439 }
1440
1441 base = PyUnicode_Substring(package, 0, last_dot);
1442 Py_DECREF(package);
1443 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1444 return base;
1445 }
1446
1447 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1448 Py_DECREF(base);
1449 return abs_name;
1450
Ben Lewis92420b32019-09-11 20:09:47 +10001451 no_parent_error:
1452 _PyErr_SetString(tstate, PyExc_ImportError,
1453 "attempted relative import "
1454 "with no known parent package");
1455
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001456 error:
1457 Py_XDECREF(package);
1458 return NULL;
1459}
1460
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001461static PyObject *
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001462import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001463{
1464 _Py_IDENTIFIER(_find_and_load);
1465 PyObject *mod = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001466 PyInterpreterState *interp = tstate->interp;
Victor Stinnerda7933e2020-04-13 03:04:28 +02001467 int import_time = _PyInterpreterState_GetConfig(interp)->import_time;
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001468 static int import_level;
1469 static _PyTime_t accumulated;
1470
1471 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1472
Steve Dowerb82e17e2019-05-23 08:45:22 -07001473 PyObject *sys_path = PySys_GetObject("path");
1474 PyObject *sys_meta_path = PySys_GetObject("meta_path");
1475 PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1c1e68c2020-03-27 15:11:45 +01001476 if (_PySys_Audit(tstate, "import", "OOOOO",
1477 abs_name, Py_None, sys_path ? sys_path : Py_None,
1478 sys_meta_path ? sys_meta_path : Py_None,
1479 sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001480 return NULL;
1481 }
1482
1483
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001484 /* XOptions is initialized after first some imports.
1485 * So we can't have negative cache before completed initialization.
1486 * Anyway, importlib._find_and_load is much slower than
1487 * _PyDict_GetItemIdWithError().
1488 */
1489 if (import_time) {
1490 static int header = 1;
1491 if (header) {
1492 fputs("import time: self [us] | cumulative | imported package\n",
1493 stderr);
1494 header = 0;
1495 }
1496
1497 import_level++;
1498 t1 = _PyTime_GetPerfCounter();
1499 accumulated = 0;
1500 }
1501
1502 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
Andy Lesterfc2d8d62020-03-30 15:19:14 -05001503 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001504
1505 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1506 &PyId__find_and_load, abs_name,
1507 interp->import_func, NULL);
1508
1509 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
Andy Lesterfc2d8d62020-03-30 15:19:14 -05001510 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001511 mod != NULL);
1512
1513 if (import_time) {
1514 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1515
1516 import_level--;
1517 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1518 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1519 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1520 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1521
1522 accumulated = accumulated_copy + cum;
1523 }
1524
1525 return mod;
1526}
1527
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001528PyObject *
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001529PyImport_GetModule(PyObject *name)
1530{
1531 PyThreadState *tstate = _PyThreadState_GET();
1532 PyObject *mod;
1533
1534 mod = import_get_module(tstate, name);
1535 if (mod != NULL && mod != Py_None) {
1536 if (import_ensure_initialized(tstate, mod, name) < 0) {
1537 Py_DECREF(mod);
1538 remove_importlib_frames(tstate);
1539 return NULL;
1540 }
1541 }
1542 return mod;
1543}
1544
1545PyObject *
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001546PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1547 PyObject *locals, PyObject *fromlist,
1548 int level)
1549{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001550 PyThreadState *tstate = _PyThreadState_GET();
Brett Cannonfd074152012-04-14 14:10:13 -04001551 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001552 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001553 PyObject *final_mod = NULL;
1554 PyObject *mod = NULL;
1555 PyObject *package = NULL;
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001556 PyInterpreterState *interp = tstate->interp;
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001557 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001558
Brett Cannonfd074152012-04-14 14:10:13 -04001559 if (name == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001560 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001561 goto error;
1562 }
1563
1564 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1565 for added performance. */
1566
1567 if (!PyUnicode_Check(name)) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001568 _PyErr_SetString(tstate, PyExc_TypeError,
1569 "module name must be a string");
Brett Cannonfd074152012-04-14 14:10:13 -04001570 goto error;
1571 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001572 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001573 goto error;
1574 }
1575 if (level < 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001576 _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0");
Brett Cannonfd074152012-04-14 14:10:13 -04001577 goto error;
1578 }
Brett Cannon849113a2016-01-22 15:25:50 -08001579
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001580 if (level > 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001581 abs_name = resolve_name(tstate, name, globals, level);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001582 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001583 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001584 }
1585 else { /* level == 0 */
1586 if (PyUnicode_GET_LENGTH(name) == 0) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001587 _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
Brett Cannonfd074152012-04-14 14:10:13 -04001588 goto error;
1589 }
Brett Cannonfd074152012-04-14 14:10:13 -04001590 abs_name = name;
1591 Py_INCREF(abs_name);
1592 }
1593
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001594 mod = import_get_module(tstate, abs_name);
1595 if (mod == NULL && _PyErr_Occurred(tstate)) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001596 goto error;
1597 }
1598
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001599 if (mod != NULL && mod != Py_None) {
Joannah Nanjekye37c22202019-09-11 13:47:39 +01001600 if (import_ensure_initialized(tstate, mod, name) < 0) {
1601 goto error;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001602 }
Brett Cannonfd074152012-04-14 14:10:13 -04001603 }
1604 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001605 Py_XDECREF(mod);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001606 mod = import_find_and_load(tstate, abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001607 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001608 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001609 }
1610 }
1611
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001612 has_from = 0;
1613 if (fromlist != NULL && fromlist != Py_None) {
1614 has_from = PyObject_IsTrue(fromlist);
1615 if (has_from < 0)
1616 goto error;
1617 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001618 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001619 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1620 if (level == 0 || len > 0) {
1621 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001622
Victor Stinner744c34e2016-05-20 11:36:13 +02001623 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1624 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001625 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001626 }
1627
Victor Stinner744c34e2016-05-20 11:36:13 +02001628 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001629 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001630 final_mod = mod;
1631 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001632 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001633 }
1634
Brett Cannonfd074152012-04-14 14:10:13 -04001635 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001636 PyObject *front = PyUnicode_Substring(name, 0, dot);
1637 if (front == NULL) {
1638 goto error;
1639 }
1640
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001641 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001642 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001643 }
1644 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001645 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001646 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001647 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001648 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001649 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001650 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001651 }
Brett Cannonfd074152012-04-14 14:10:13 -04001652
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001653 final_mod = import_get_module(tstate, to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001654 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001655 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001656 if (!_PyErr_Occurred(tstate)) {
1657 _PyErr_Format(tstate, PyExc_KeyError,
1658 "%R not in sys.modules as expected",
1659 to_return);
Stefan Krah027b09c2019-03-25 21:50:58 +01001660 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001661 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001662 }
Brett Cannonfd074152012-04-14 14:10:13 -04001663 }
1664 }
1665 else {
1666 final_mod = mod;
1667 Py_INCREF(mod);
1668 }
1669 }
1670 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001671 PyObject *path;
1672 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1673 goto error;
1674 }
1675 if (path) {
1676 Py_DECREF(path);
1677 final_mod = _PyObject_CallMethodIdObjArgs(
1678 interp->importlib, &PyId__handle_fromlist,
1679 mod, fromlist, interp->import_func, NULL);
1680 }
1681 else {
1682 final_mod = mod;
1683 Py_INCREF(mod);
1684 }
Brett Cannonfd074152012-04-14 14:10:13 -04001685 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001686
Brett Cannonfd074152012-04-14 14:10:13 -04001687 error:
1688 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001689 Py_XDECREF(mod);
1690 Py_XDECREF(package);
Victor Stinner410b85a2019-05-13 17:12:45 +02001691 if (final_mod == NULL) {
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001692 remove_importlib_frames(tstate);
Victor Stinner410b85a2019-05-13 17:12:45 +02001693 }
Brett Cannonfd074152012-04-14 14:10:13 -04001694 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001695}
1696
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001697PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001698PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001699 PyObject *fromlist, int level)
1700{
1701 PyObject *nameobj, *mod;
1702 nameobj = PyUnicode_FromString(name);
1703 if (nameobj == NULL)
1704 return NULL;
1705 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1706 fromlist, level);
1707 Py_DECREF(nameobj);
1708 return mod;
1709}
1710
1711
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001712/* Re-import a module of any kind and return its module object, WITH
1713 INCREMENTED REFERENCE COUNT */
1714
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001716PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717{
Robert Rouhanif40bd462020-05-01 16:28:06 -07001718 _Py_IDENTIFIER(importlib);
Brett Cannon62228db2012-04-29 14:38:11 -04001719 _Py_IDENTIFIER(reload);
1720 PyObject *reloaded_module = NULL;
Robert Rouhanif40bd462020-05-01 16:28:06 -07001721 PyObject *importlib = _PyImport_GetModuleId(&PyId_importlib);
1722 if (importlib == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001723 if (PyErr_Occurred()) {
1724 return NULL;
1725 }
1726
Robert Rouhanif40bd462020-05-01 16:28:06 -07001727 importlib = PyImport_ImportModule("importlib");
1728 if (importlib == NULL) {
Brett Cannon62228db2012-04-29 14:38:11 -04001729 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001732
Robert Rouhanif40bd462020-05-01 16:28:06 -07001733 reloaded_module = _PyObject_CallMethodIdOneArg(importlib, &PyId_reload, m);
1734 Py_DECREF(importlib);
Brett Cannon62228db2012-04-29 14:38:11 -04001735 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001736}
1737
1738
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001739/* Higher-level import emulator which emulates the "import" statement
1740 more accurately -- it invokes the __import__() function from the
1741 builtins of the current globals. This means that the import is
1742 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001743 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001744 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001745 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001746 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001747
1748PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001749PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001750{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001751 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 static PyObject *silly_list = NULL;
1753 static PyObject *builtins_str = NULL;
1754 static PyObject *import_str = NULL;
1755 PyObject *globals = NULL;
1756 PyObject *import = NULL;
1757 PyObject *builtins = NULL;
1758 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 /* Initialize constant string objects */
1761 if (silly_list == NULL) {
1762 import_str = PyUnicode_InternFromString("__import__");
1763 if (import_str == NULL)
1764 return NULL;
1765 builtins_str = PyUnicode_InternFromString("__builtins__");
1766 if (builtins_str == NULL)
1767 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001768 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 if (silly_list == NULL)
1770 return NULL;
1771 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 /* Get the builtins from current globals */
1774 globals = PyEval_GetGlobals();
1775 if (globals != NULL) {
1776 Py_INCREF(globals);
1777 builtins = PyObject_GetItem(globals, builtins_str);
1778 if (builtins == NULL)
1779 goto err;
1780 }
1781 else {
1782 /* No globals -- use standard builtins, and fake globals */
1783 builtins = PyImport_ImportModuleLevel("builtins",
1784 NULL, NULL, NULL, 0);
1785 if (builtins == NULL)
1786 return NULL;
1787 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1788 if (globals == NULL)
1789 goto err;
1790 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 /* Get the __import__ function from the builtins */
1793 if (PyDict_Check(builtins)) {
1794 import = PyObject_GetItem(builtins, import_str);
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001795 if (import == NULL) {
1796 _PyErr_SetObject(tstate, PyExc_KeyError, import_str);
1797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 }
1799 else
1800 import = PyObject_GetAttr(builtins, import_str);
1801 if (import == NULL)
1802 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001805 Always use absolute import here.
1806 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1808 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001809 if (r == NULL)
1810 goto err;
1811 Py_DECREF(r);
1812
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001813 r = import_get_module(tstate, module_name);
1814 if (r == NULL && !_PyErr_Occurred(tstate)) {
1815 _PyErr_SetObject(tstate, PyExc_KeyError, module_name);
Serhiy Storchaka145541c2017-06-15 20:54:38 +03001816 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001817
1818 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 Py_XDECREF(globals);
1820 Py_XDECREF(builtins);
1821 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001824}
1825
Brett Cannon4caa61d2014-01-09 19:03:32 -05001826/*[clinic input]
1827_imp.extension_suffixes
1828
1829Returns the list of file suffixes used to identify extension modules.
1830[clinic start generated code]*/
1831
Brett Cannon4caa61d2014-01-09 19:03:32 -05001832static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001833_imp_extension_suffixes_impl(PyObject *module)
1834/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 list = PyList_New(0);
1839 if (list == NULL)
1840 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04001841#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01001842 const char *suffix;
1843 unsigned int index = 0;
1844
Brett Cannon2657df42012-05-04 15:20:40 -04001845 while ((suffix = _PyImport_DynLoadFiletab[index])) {
1846 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 if (item == NULL) {
1848 Py_DECREF(list);
1849 return NULL;
1850 }
1851 if (PyList_Append(list, item) < 0) {
1852 Py_DECREF(list);
1853 Py_DECREF(item);
1854 return NULL;
1855 }
1856 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04001857 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 }
Brett Cannon2657df42012-05-04 15:20:40 -04001859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861}
1862
Brett Cannon4caa61d2014-01-09 19:03:32 -05001863/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05001864_imp.init_frozen
1865
1866 name: unicode
1867 /
1868
1869Initializes a frozen module.
1870[clinic start generated code]*/
1871
Brett Cannon4caa61d2014-01-09 19:03:32 -05001872static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001873_imp_init_frozen_impl(PyObject *module, PyObject *name)
1874/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001875{
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001876 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 int ret;
1878 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05001879
Victor Stinner53dc7352011-03-20 01:50:21 +01001880 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 if (ret < 0)
1882 return NULL;
1883 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001884 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +02001886 m = import_add_module(tstate, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 Py_XINCREF(m);
1888 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001889}
1890
Brett Cannon4caa61d2014-01-09 19:03:32 -05001891/*[clinic input]
1892_imp.get_frozen_object
1893
1894 name: unicode
1895 /
1896
1897Create a code object for a frozen module.
1898[clinic start generated code]*/
1899
Brett Cannon4caa61d2014-01-09 19:03:32 -05001900static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001901_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
1902/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001905}
1906
Brett Cannon4caa61d2014-01-09 19:03:32 -05001907/*[clinic input]
1908_imp.is_frozen_package
1909
1910 name: unicode
1911 /
1912
1913Returns True if the module name is of a frozen package.
1914[clinic start generated code]*/
1915
Brett Cannon4caa61d2014-01-09 19:03:32 -05001916static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001917_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
1918/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00001921}
1922
Brett Cannon4caa61d2014-01-09 19:03:32 -05001923/*[clinic input]
1924_imp.is_builtin
1925
1926 name: unicode
1927 /
1928
1929Returns True if the module name corresponds to a built-in module.
1930[clinic start generated code]*/
1931
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001933_imp_is_builtin_impl(PyObject *module, PyObject *name)
1934/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001935{
Brett Cannon4caa61d2014-01-09 19:03:32 -05001936 return PyLong_FromLong(is_builtin(name));
1937}
1938
1939/*[clinic input]
1940_imp.is_frozen
1941
1942 name: unicode
1943 /
1944
1945Returns True if the module name corresponds to a frozen module.
1946[clinic start generated code]*/
1947
Brett Cannon4caa61d2014-01-09 19:03:32 -05001948static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001949_imp_is_frozen_impl(PyObject *module, PyObject *name)
1950/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001951{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001952 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05001953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 p = find_frozen(name);
1955 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956}
1957
Larry Hastings1df0b352015-08-24 19:53:56 -07001958/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
1959static int
1960exec_builtin_or_dynamic(PyObject *mod) {
1961 PyModuleDef *def;
1962 void *state;
1963
1964 if (!PyModule_Check(mod)) {
1965 return 0;
1966 }
1967
1968 def = PyModule_GetDef(mod);
1969 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07001970 return 0;
1971 }
Brett Cannon52794db2016-09-07 17:00:43 -07001972
Larry Hastings1df0b352015-08-24 19:53:56 -07001973 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07001974 if (state) {
1975 /* Already initialized; skip reload */
1976 return 0;
1977 }
Brett Cannon52794db2016-09-07 17:00:43 -07001978
Larry Hastings1df0b352015-08-24 19:53:56 -07001979 return PyModule_ExecDef(mod, def);
1980}
1981
Guido van Rossum96a8fb71999-12-22 14:09:35 +00001982#ifdef HAVE_DYNAMIC_LOADING
1983
Brett Cannon4caa61d2014-01-09 19:03:32 -05001984/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10001985_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05001986
Nick Coghland5cacbb2015-05-23 22:24:10 +10001987 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05001988 file: object = NULL
1989 /
1990
Nick Coghland5cacbb2015-05-23 22:24:10 +10001991Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05001992[clinic start generated code]*/
1993
Brett Cannon4caa61d2014-01-09 19:03:32 -05001994static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001995_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
1996/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05001997{
Nick Coghland5cacbb2015-05-23 22:24:10 +10001998 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04001999 FILE *fp;
2000
Nick Coghland5cacbb2015-05-23 22:24:10 +10002001 name = PyObject_GetAttrString(spec, "name");
2002 if (name == NULL) {
2003 return NULL;
2004 }
2005
2006 path = PyObject_GetAttrString(spec, "origin");
2007 if (path == NULL) {
2008 Py_DECREF(name);
2009 return NULL;
2010 }
2011
2012 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002013 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002014 Py_DECREF(name);
2015 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002016 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002017 return mod;
2018 }
2019
Brett Cannon4caa61d2014-01-09 19:03:32 -05002020 if (file != NULL) {
2021 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002022 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002023 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002024 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002026 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002028 else
2029 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002030
2031 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2032
2033 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002034 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 if (fp)
2036 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002037 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038}
2039
Nick Coghland5cacbb2015-05-23 22:24:10 +10002040/*[clinic input]
2041_imp.exec_dynamic -> int
2042
2043 mod: object
2044 /
2045
2046Initialize an extension module.
2047[clinic start generated code]*/
2048
2049static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002050_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2051/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002052{
Larry Hastings1df0b352015-08-24 19:53:56 -07002053 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002054}
2055
2056
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002057#endif /* HAVE_DYNAMIC_LOADING */
2058
Larry Hastings7726ac92014-01-31 22:03:12 -08002059/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002060_imp.exec_builtin -> int
2061
2062 mod: object
2063 /
2064
2065Initialize a built-in module.
2066[clinic start generated code]*/
2067
2068static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002069_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2070/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002071{
2072 return exec_builtin_or_dynamic(mod);
2073}
2074
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002075/*[clinic input]
2076_imp.source_hash
2077
2078 key: long
2079 source: Py_buffer
2080[clinic start generated code]*/
2081
2082static PyObject *
2083_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2084/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2085{
Benjamin Peterson83620772017-12-09 12:18:56 -08002086 union {
2087 uint64_t x;
2088 char data[sizeof(uint64_t)];
2089 } hash;
2090 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002091#if !PY_LITTLE_ENDIAN
2092 // Force to little-endian. There really ought to be a succinct standard way
2093 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002094 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2095 char tmp = hash.data[i];
2096 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2097 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002098 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002099#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002100 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002101}
2102
Barry Warsaw28a691b2010-04-17 00:19:56 +00002103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002104PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002105"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002106
Guido van Rossum79f25d91997-04-29 20:08:16 +00002107static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002108 _IMP_EXTENSION_SUFFIXES_METHODDEF
2109 _IMP_LOCK_HELD_METHODDEF
2110 _IMP_ACQUIRE_LOCK_METHODDEF
2111 _IMP_RELEASE_LOCK_METHODDEF
2112 _IMP_GET_FROZEN_OBJECT_METHODDEF
2113 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002114 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002115 _IMP_INIT_FROZEN_METHODDEF
2116 _IMP_IS_BUILTIN_METHODDEF
2117 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002118 _IMP_CREATE_DYNAMIC_METHODDEF
2119 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002120 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002121 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002122 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002123 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002124};
2125
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002126
Victor Stinner62230712020-11-18 23:18:29 +01002127static int
2128imp_module_exec(PyObject *module)
2129{
2130 const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode;
2131 PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
2132 if (pyc_mode == NULL) {
2133 return -1;
2134 }
2135 if (PyModule_AddObjectRef(module, "check_hash_based_pycs", pyc_mode) < 0) {
2136 Py_DECREF(pyc_mode);
2137 return -1;
2138 }
2139 Py_DECREF(pyc_mode);
2140
2141 return 0;
2142}
2143
2144
2145static PyModuleDef_Slot imp_slots[] = {
2146 {Py_mod_exec, imp_module_exec},
2147 {0, NULL}
2148};
2149
2150static struct PyModuleDef imp_module = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 PyModuleDef_HEAD_INIT,
Victor Stinner62230712020-11-18 23:18:29 +01002152 .m_name = "_imp",
2153 .m_doc = doc_imp,
2154 .m_size = 0,
2155 .m_methods = imp_methods,
2156 .m_slots = imp_slots,
Martin v. Löwis1a214512008-06-11 05:26:20 +00002157};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002158
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002159PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002160PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002161{
Victor Stinner62230712020-11-18 23:18:29 +01002162 return PyModuleDef_Init(&imp_module);
2163}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002164
Victor Stinner62230712020-11-18 23:18:29 +01002165
2166// Import the _imp extension by calling manually _imp.create_builtin() and
2167// _imp.exec_builtin() since importlib is not initialized yet. Initializing
2168// importlib requires the _imp module: this function fix the bootstrap issue.
2169PyObject*
2170_PyImport_BootstrapImp(PyThreadState *tstate)
2171{
2172 PyObject *name = PyUnicode_FromString("_imp");
2173 if (name == NULL) {
2174 return NULL;
Victor Stinner410b85a2019-05-13 17:12:45 +02002175 }
2176
Victor Stinner62230712020-11-18 23:18:29 +01002177 // Mock a ModuleSpec object just good enough for PyModule_FromDefAndSpec():
2178 // an object with just a name attribute.
2179 //
2180 // _imp.__spec__ is overriden by importlib._bootstrap._instal() anyway.
2181 PyObject *attrs = Py_BuildValue("{sO}", "name", name);
2182 if (attrs == NULL) {
2183 goto error;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002184 }
Victor Stinner62230712020-11-18 23:18:29 +01002185 PyObject *spec = _PyNamespace_New(attrs);
2186 Py_DECREF(attrs);
2187 if (spec == NULL) {
2188 goto error;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002189 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190
Victor Stinner62230712020-11-18 23:18:29 +01002191 // Create the _imp module from its definition.
2192 PyObject *mod = create_builtin(tstate, name, spec);
2193 Py_CLEAR(name);
2194 Py_DECREF(spec);
2195 if (mod == NULL) {
2196 goto error;
2197 }
2198 assert(mod != Py_None); // not found
2199
2200 // Execute the _imp module: call imp_module_exec().
2201 if (exec_builtin_or_dynamic(mod) < 0) {
2202 Py_DECREF(mod);
2203 goto error;
2204 }
2205 return mod;
2206
2207error:
2208 Py_XDECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002210}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002211
2212
Guido van Rossumb18618d2000-05-03 23:44:39 +00002213/* API for embedding applications that want to add their own entries
2214 to the table of built-in modules. This should normally be called
2215 *before* Py_Initialize(). When the table resize fails, -1 is
2216 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002217
2218 After a similar function by Just van Rossum. */
2219
2220int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002221PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002224 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002225 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 /* Count the number of entries in both tables */
2228 for (n = 0; newtab[n].name != NULL; n++)
2229 ;
2230 if (n == 0)
2231 return 0; /* Nothing to do */
2232 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2233 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002234
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002235 /* Force default raw memory allocator to get a known allocator to be able
2236 to release the memory in _PyImport_Fini2() */
2237 PyMemAllocatorEx old_alloc;
2238 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002241 p = NULL;
2242 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002243 size_t size = sizeof(struct _inittab) * (i + n + 1);
2244 p = PyMem_RawRealloc(inittab_copy, size);
2245 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002246 if (p == NULL) {
2247 res = -1;
2248 goto done;
2249 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002250
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002251 /* Copy the tables into the new memory at the first call
2252 to PyImport_ExtendInittab(). */
2253 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002255 }
2256 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2257 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002258
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002259done:
2260 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2261 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002262}
2263
2264/* Shorthand to add a single entry given a name and a function */
2265
2266int
Brett Cannona826f322009-04-02 03:41:46 +00002267PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002272
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002273 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002277}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002278
2279#ifdef __cplusplus
2280}
2281#endif