blob: b03bc98773ae74dcd5fa5ef5eb44d2db678f8e6d [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module definition and import implementation */
2
Guido van Rossum79f25d91997-04-29 20:08:16 +00003#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "Python-ast.h"
Victor Stinner3bb183d2018-11-22 18:38:38 +01006#undef Yield /* undefine macro conflicting with <winbase.h> */
Victor Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pyhash.h"
8#include "pycore_pylifecycle.h"
9#include "pycore_pymem.h"
10#include "pycore_pystate.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011#include "errcode.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000012#include "marshal.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Antoine Pitroubc07a5c2012-07-08 12:01:27 +020014#include "frameobject.h"
Guido van Rossumd8bac6d1992-02-26 15:19:13 +000015#include "osdefs.h"
Guido van Rossum1ae940a1995-01-02 19:04:15 +000016#include "importdl.h"
Christian Heimes3d2b4072017-09-30 00:53:19 +020017#include "pydtrace.h"
Guido van Rossumc405b7b1991-06-04 19:39:42 +000018
Guido van Rossum55a83382000-09-20 20:31:38 +000019#ifdef HAVE_FCNTL_H
20#include <fcntl.h>
21#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000022#ifdef __cplusplus
Brett Cannon9a5b25a2010-03-01 02:09:17 +000023extern "C" {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024#endif
Guido van Rossum55a83382000-09-20 20:31:38 +000025
Barry Warsaw28a691b2010-04-17 00:19:56 +000026#define CACHEDIR "__pycache__"
Guido van Rossum96774c12000-05-01 20:19:08 +000027
Victor Stinner95872862011-03-07 18:20:56 +010028/* See _PyImport_FixupExtensionObject() below */
Guido van Rossum25ce5661997-08-02 03:10:38 +000029static PyObject *extensions = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000030
Guido van Rossum771c6c81997-10-31 18:37:24 +000031/* This table is defined in config.c: */
32extern struct _inittab _PyImport_Inittab[];
33
34struct _inittab *PyImport_Inittab = _PyImport_Inittab;
Victor Stinner92a3c6f2017-12-06 18:12:59 +010035static struct _inittab *inittab_copy = NULL;
Guido van Rossum66f1fa81991-04-03 19:03:52 +000036
Brett Cannon4caa61d2014-01-09 19:03:32 -050037/*[clinic input]
38module _imp
39[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030040/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
Brett Cannonfd4d0502014-05-30 11:21:14 -040041
42#include "clinic/import.c.h"
Brett Cannon4caa61d2014-01-09 19:03:32 -050043
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044/* Initialize things */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Victor Stinnerf7e5b562017-11-15 15:48:08 -080046_PyInitError
Victor Stinner672b6ba2017-12-06 17:25:50 +010047_PyImport_Init(PyInterpreterState *interp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048{
Serhiy Storchaka013bb912014-02-10 18:21:34 +020049 interp->builtins_copy = PyDict_Copy(interp->builtins);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080050 if (interp->builtins_copy == NULL) {
51 return _Py_INIT_ERR("Can't backup builtins dict");
52 }
53 return _Py_INIT_OK();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054}
55
Victor Stinnerf7e5b562017-11-15 15:48:08 -080056_PyInitError
Just van Rossum52e14d62002-12-30 22:08:05 +000057_PyImportHooks_Init(void)
58{
Brett Cannonfd074152012-04-14 14:10:13 -040059 PyObject *v, *path_hooks = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int err = 0;
Just van Rossum52e14d62002-12-30 22:08:05 +000061
Brett Cannonfd074152012-04-14 14:10:13 -040062 /* adding sys.path_hooks and sys.path_importer_cache */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 v = PyList_New(0);
64 if (v == NULL)
65 goto error;
66 err = PySys_SetObject("meta_path", v);
67 Py_DECREF(v);
68 if (err)
69 goto error;
70 v = PyDict_New();
71 if (v == NULL)
72 goto error;
73 err = PySys_SetObject("path_importer_cache", v);
74 Py_DECREF(v);
75 if (err)
76 goto error;
77 path_hooks = PyList_New(0);
78 if (path_hooks == NULL)
79 goto error;
80 err = PySys_SetObject("path_hooks", path_hooks);
81 if (err) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -080082 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 }
Brett Cannonfd074152012-04-14 14:10:13 -040084 Py_DECREF(path_hooks);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080085 return _Py_INIT_OK();
86
87 error:
88 PyErr_Print();
89 return _Py_INIT_ERR("initializing sys.meta_path, sys.path_hooks, "
90 "or path_importer_cache failed");
Brett Cannonfd074152012-04-14 14:10:13 -040091}
92
Victor Stinnerf7e5b562017-11-15 15:48:08 -080093_PyInitError
Brett Cannonfd074152012-04-14 14:10:13 -040094_PyImportZip_Init(void)
95{
ukwksk5e6312c2018-05-15 04:10:52 +090096 PyObject *path_hooks, *zipimport;
Brett Cannonfd074152012-04-14 14:10:13 -040097 int err = 0;
98
99 path_hooks = PySys_GetObject("path_hooks");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200100 if (path_hooks == NULL) {
101 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path_hooks");
Brett Cannonfd074152012-04-14 14:10:13 -0400102 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200103 }
Brett Cannonfd074152012-04-14 14:10:13 -0400104
105 if (Py_VerboseFlag)
106 PySys_WriteStderr("# installing zipimport hook\n");
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000107
ukwksk5e6312c2018-05-15 04:10:52 +0900108 zipimport = PyImport_ImportModule("zipimport");
109 if (zipimport == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 PyErr_Clear(); /* No zip import module -- okay */
111 if (Py_VerboseFlag)
112 PySys_WriteStderr("# can't import zipimport\n");
113 }
114 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200115 _Py_IDENTIFIER(zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900116 PyObject *zipimporter = _PyObject_GetAttrId(zipimport,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200117 &PyId_zipimporter);
ukwksk5e6312c2018-05-15 04:10:52 +0900118 Py_DECREF(zipimport);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 if (zipimporter == NULL) {
120 PyErr_Clear(); /* No zipimporter object -- okay */
121 if (Py_VerboseFlag)
122 PySys_WriteStderr(
123 "# can't import zipimport.zipimporter\n");
124 }
125 else {
Brett Cannon8923a4d2012-04-24 22:03:46 -0400126 /* sys.path_hooks.insert(0, zipimporter) */
127 err = PyList_Insert(path_hooks, 0, zipimporter);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_DECREF(zipimporter);
Brett Cannonfd074152012-04-14 14:10:13 -0400129 if (err < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -0400131 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 if (Py_VerboseFlag)
133 PySys_WriteStderr(
134 "# installed zipimport hook\n");
135 }
136 }
Brett Cannonfd074152012-04-14 14:10:13 -0400137
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800138 return _Py_INIT_OK();
Brett Cannonfd074152012-04-14 14:10:13 -0400139
140 error:
141 PyErr_Print();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800142 return _Py_INIT_ERR("initializing zipimport failed");
Just van Rossum52e14d62002-12-30 22:08:05 +0000143}
144
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000145/* Locking primitives to prevent parallel imports of the same module
146 in different threads to return with a partially loaded module.
147 These calls are serialized by the global interpreter lock. */
148
Guido van Rossum49b56061998-10-01 20:42:43 +0000149#include "pythread.h"
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000150
Guido van Rossum65d5b571998-12-21 19:32:43 +0000151static PyThread_type_lock import_lock = 0;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200152static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000153static int import_lock_level = 0;
154
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000155void
156_PyImport_AcquireLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000157{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200158 unsigned long me = PyThread_get_thread_ident();
159 if (me == PYTHREAD_INVALID_THREAD_ID)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 return; /* Too bad */
161 if (import_lock == NULL) {
162 import_lock = PyThread_allocate_lock();
163 if (import_lock == NULL)
164 return; /* Nothing much we can do. */
165 }
166 if (import_lock_thread == me) {
167 import_lock_level++;
168 return;
169 }
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200170 if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
171 !PyThread_acquire_lock(import_lock, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 {
173 PyThreadState *tstate = PyEval_SaveThread();
174 PyThread_acquire_lock(import_lock, 1);
175 PyEval_RestoreThread(tstate);
176 }
Antoine Pitrou202b6062012-12-18 22:18:17 +0100177 assert(import_lock_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 import_lock_thread = me;
179 import_lock_level = 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000180}
181
Benjamin Peterson0df35a92009-10-04 20:32:25 +0000182int
183_PyImport_ReleaseLock(void)
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000184{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200185 unsigned long me = PyThread_get_thread_ident();
186 if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 return 0; /* Too bad */
188 if (import_lock_thread != me)
189 return -1;
190 import_lock_level--;
Antoine Pitrou202b6062012-12-18 22:18:17 +0100191 assert(import_lock_level >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (import_lock_level == 0) {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200193 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 PyThread_release_lock(import_lock);
195 }
196 return 1;
Guido van Rossum75acc9c1998-03-03 22:26:50 +0000197}
198
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200199/* This function is called from PyOS_AfterFork_Child to ensure that newly
Gregory P. Smith24cec9f2010-03-01 06:18:41 +0000200 created child processes do not share locks with the parent.
201 We now acquire the import lock around fork() calls but on some platforms
202 (Solaris 9 and earlier? see isue7242) that still left us with problems. */
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000203
204void
205_PyImport_ReInitLock(void)
206{
Christian Heimes418fd742015-04-19 21:08:42 +0200207 if (import_lock != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 import_lock = PyThread_allocate_lock();
Christian Heimes418fd742015-04-19 21:08:42 +0200209 if (import_lock == NULL) {
210 Py_FatalError("PyImport_ReInitLock failed to create a new lock");
211 }
212 }
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000213 if (import_lock_level > 1) {
214 /* Forked as a side effect of import */
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200215 unsigned long me = PyThread_get_thread_ident();
Brett Cannone4710cf2012-11-15 21:39:36 -0500216 /* The following could fail if the lock is already held, but forking as
217 a side-effect of an import is a) rare, b) nuts, and c) difficult to
218 do thanks to the lock only being held when doing individual module
219 locks per import. */
220 PyThread_acquire_lock(import_lock, NOWAIT_LOCK);
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000221 import_lock_thread = me;
222 import_lock_level--;
223 } else {
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200224 import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
Nick Coghlanb2ddf792010-12-02 04:11:46 +0000225 import_lock_level = 0;
226 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +0000227}
228
Brett Cannon4caa61d2014-01-09 19:03:32 -0500229/*[clinic input]
230_imp.lock_held
231
232Return True if the import lock is currently held, else False.
233
234On platforms without threads, return False.
235[clinic start generated code]*/
236
Brett Cannon4caa61d2014-01-09 19:03:32 -0500237static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300238_imp_lock_held_impl(PyObject *module)
239/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
Tim Peters69232342001-08-30 05:16:13 +0000240{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200241 return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
Tim Peters69232342001-08-30 05:16:13 +0000242}
243
Brett Cannon4caa61d2014-01-09 19:03:32 -0500244/*[clinic input]
245_imp.acquire_lock
246
247Acquires the interpreter's import lock for the current thread.
248
249This lock should be used by import hooks to ensure thread-safety when importing
250modules. On platforms without threads, this function does nothing.
251[clinic start generated code]*/
252
Brett Cannon4caa61d2014-01-09 19:03:32 -0500253static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300254_imp_acquire_lock_impl(PyObject *module)
255/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 _PyImport_AcquireLock();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200258 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000259}
260
Brett Cannon4caa61d2014-01-09 19:03:32 -0500261/*[clinic input]
262_imp.release_lock
263
264Release the interpreter's import lock.
265
266On platforms without threads, this function does nothing.
267[clinic start generated code]*/
268
Brett Cannon4caa61d2014-01-09 19:03:32 -0500269static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300270_imp_release_lock_impl(PyObject *module)
271/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 if (_PyImport_ReleaseLock() < 0) {
274 PyErr_SetString(PyExc_RuntimeError,
275 "not holding the import lock");
276 return NULL;
277 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200278 Py_RETURN_NONE;
Guido van Rossumc4f4ca92003-02-12 21:46:11 +0000279}
280
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100281void
282_PyImport_Fini(void)
283{
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200284 Py_CLEAR(extensions);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100285 if (import_lock != NULL) {
286 PyThread_free_lock(import_lock);
287 import_lock = NULL;
288 }
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100289}
290
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100291void
292_PyImport_Fini2(void)
293{
294 /* Use the same memory allocator than PyImport_ExtendInittab(). */
295 PyMemAllocatorEx old_alloc;
296 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
297
298 /* Free memory allocated by PyImport_ExtendInittab() */
299 PyMem_RawFree(inittab_copy);
300
301 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
302}
303
Guido van Rossum25ce5661997-08-02 03:10:38 +0000304/* Helper for sys */
305
306PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000307PyImport_GetModuleDict(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000308{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200309 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow3f9eee62017-09-15 16:35:20 -0600310 if (interp->modules == NULL) {
Eric Snow93c92f72017-09-13 23:46:04 -0700311 Py_FatalError("PyImport_GetModuleDict: no module dictionary!");
Eric Snow3f9eee62017-09-15 16:35:20 -0600312 }
Eric Snow93c92f72017-09-13 23:46:04 -0700313 return interp->modules;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314}
315
Eric Snowd393c1b2017-09-14 12:18:12 -0600316/* In some corner cases it is important to be sure that the import
317 machinery has been initialized (or not cleaned up yet). For
318 example, see issue #4236 and PyModule_Create2(). */
319
320int
321_PyImport_IsInitialized(PyInterpreterState *interp)
322{
323 if (interp->modules == NULL)
324 return 0;
325 return 1;
326}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327
Eric Snow3f9eee62017-09-15 16:35:20 -0600328PyObject *
329_PyImport_GetModuleId(struct _Py_Identifier *nameid)
330{
331 PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
332 if (name == NULL) {
333 return NULL;
334 }
335 return PyImport_GetModule(name);
336}
337
338int
339_PyImport_SetModule(PyObject *name, PyObject *m)
340{
341 PyObject *modules = PyImport_GetModuleDict();
342 return PyObject_SetItem(modules, name, m);
343}
344
345int
346_PyImport_SetModuleString(const char *name, PyObject *m)
347{
348 PyObject *modules = PyImport_GetModuleDict();
349 return PyMapping_SetItemString(modules, name, m);
350}
351
352PyObject *
353PyImport_GetModule(PyObject *name)
354{
355 PyObject *m;
356 PyObject *modules = PyImport_GetModuleDict();
357 if (modules == NULL) {
358 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
359 return NULL;
360 }
361 Py_INCREF(modules);
362 if (PyDict_CheckExact(modules)) {
363 m = PyDict_GetItemWithError(modules, name); /* borrowed */
364 Py_XINCREF(m);
365 }
366 else {
367 m = PyObject_GetItem(modules, name);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300368 if (m == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600369 PyErr_Clear();
370 }
371 }
372 Py_DECREF(modules);
373 return m;
374}
375
376
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000377/* List of names to clear in sys */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200378static const char * const sys_deletes[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 "path", "argv", "ps1", "ps2",
380 "last_type", "last_value", "last_traceback",
381 "path_hooks", "path_importer_cache", "meta_path",
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200382 "__interactivehook__",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 /* misc stuff */
384 "flags", "float_info",
385 NULL
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000386};
387
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200388static const char * const sys_files[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 "stdin", "__stdin__",
390 "stdout", "__stdout__",
391 "stderr", "__stderr__",
392 NULL
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000393};
394
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395/* Un-initialize things, as good as we can */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398PyImport_Cleanup(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399{
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200400 Py_ssize_t pos;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 PyObject *key, *value, *dict;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200402 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snowd393c1b2017-09-14 12:18:12 -0600403 PyObject *modules = PyImport_GetModuleDict();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200404 PyObject *weaklist = NULL;
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200405 const char * const *p;
Guido van Rossum758eec01998-01-19 21:58:26 +0000406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 if (modules == NULL)
408 return; /* Already done */
Guido van Rossum758eec01998-01-19 21:58:26 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 /* Delete some special variables first. These are common
411 places where user values hide and people complain when their
412 destructors fail. Since the modules containing them are
413 deleted *last* of all, they would come too late in the normal
414 destruction order. Sigh. */
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000415
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200416 /* XXX Perhaps these precautions are obsolete. Who knows? */
417
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200418 if (Py_VerboseFlag)
419 PySys_WriteStderr("# clear builtins._\n");
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300420 if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300421 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300422 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200423
424 for (p = sys_deletes; *p != NULL; p++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 if (Py_VerboseFlag)
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200426 PySys_WriteStderr("# clear sys.%s\n", *p);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300427 if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300428 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200431 for (p = sys_files; *p != NULL; p+=2) {
432 if (Py_VerboseFlag)
433 PySys_WriteStderr("# restore sys.%s\n", *p);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200434 value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1));
435 if (value == NULL) {
436 if (PyErr_Occurred()) {
437 PyErr_WriteUnraisable(NULL);
438 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200439 value = Py_None;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200440 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300441 if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300442 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300443 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 }
Guido van Rossum05f9dce1998-02-19 20:58:44 +0000445
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200446 /* We prepare a list which will receive (name, weakref) tuples of
447 modules when they are removed from sys.modules. The name is used
448 for diagnosis messages (in verbose mode), while the weakref helps
449 detect those modules which have been held alive. */
450 weaklist = PyList_New(0);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300451 if (weaklist == NULL) {
452 PyErr_WriteUnraisable(NULL);
453 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200454
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200455#define STORE_MODULE_WEAKREF(name, mod) \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200456 if (weaklist != NULL) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200457 PyObject *wr = PyWeakref_NewRef(mod, NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300458 if (wr) { \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200459 PyObject *tup = PyTuple_Pack(2, name, wr); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300460 if (!tup || PyList_Append(weaklist, tup) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300461 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300462 } \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200463 Py_XDECREF(tup); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300464 Py_DECREF(wr); \
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200465 } \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300466 else { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300467 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300468 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600470#define CLEAR_MODULE(name, mod) \
471 if (PyModule_Check(mod)) { \
472 if (Py_VerboseFlag && PyUnicode_Check(name)) \
473 PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
474 STORE_MODULE_WEAKREF(name, mod); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300475 if (PyObject_SetItem(modules, name, Py_None) < 0) { \
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300476 PyErr_WriteUnraisable(NULL); \
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300477 } \
Eric Snow3f9eee62017-09-15 16:35:20 -0600478 }
Guido van Rossuma0fec2b1998-02-06 17:16:02 +0000479
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200480 /* Remove all modules from sys.modules, hoping that garbage collection
481 can reclaim most of them. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600482 if (PyDict_CheckExact(modules)) {
483 pos = 0;
484 while (PyDict_Next(modules, &pos, &key, &value)) {
485 CLEAR_MODULE(key, value);
486 }
487 }
488 else {
489 PyObject *iterator = PyObject_GetIter(modules);
490 if (iterator == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300491 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600492 }
493 else {
494 while ((key = PyIter_Next(iterator))) {
495 value = PyObject_GetItem(modules, key);
496 if (value == NULL) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300497 PyErr_WriteUnraisable(NULL);
Eric Snow3f9eee62017-09-15 16:35:20 -0600498 continue;
499 }
500 CLEAR_MODULE(key, value);
501 Py_DECREF(value);
502 Py_DECREF(key);
503 }
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300504 if (PyErr_Occurred()) {
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300505 PyErr_WriteUnraisable(NULL);
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300506 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600507 Py_DECREF(iterator);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 }
509 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000510
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200511 /* Clear the modules dict. */
Eric Snow3f9eee62017-09-15 16:35:20 -0600512 if (PyDict_CheckExact(modules)) {
513 PyDict_Clear(modules);
514 }
515 else {
516 _Py_IDENTIFIER(clear);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300517 if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) {
518 PyErr_WriteUnraisable(NULL);
519 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600520 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200521 /* Restore the original builtins dict, to ensure that any
522 user data gets cleared. */
523 dict = PyDict_Copy(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300524 if (dict == NULL) {
525 PyErr_WriteUnraisable(NULL);
526 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200527 PyDict_Clear(interp->builtins);
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300528 if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200529 PyErr_Clear();
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300530 }
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200531 Py_XDECREF(dict);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200532 /* Clear module dict copies stored in the interpreter state */
533 _PyState_ClearModules();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200534 /* Collect references */
535 _PyGC_CollectNoFail();
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200536 /* Dump GC stats before it's too late, since it uses the warnings
537 machinery. */
Victor Stinner9db03242019-04-26 02:32:01 +0200538 _PyGC_DumpShutdownStats(&_PyRuntime);
Antoine Pitrou5f454a02013-05-06 21:15:57 +0200539
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200540 /* Now, if there are any modules left alive, clear their globals to
541 minimize potential leaks. All C extension modules actually end
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200542 up here, since they are kept alive in the interpreter state.
543
544 The special treatment of "builtins" here is because even
545 when it's not referenced as a module, its dictionary is
546 referenced by almost every module's __builtins__. Since
547 deleting a module clears its dictionary (even if there are
548 references left to it), we need to delete the "builtins"
549 module last. Likewise, we don't delete sys until the very
550 end because it is implicitly referenced (e.g. by print). */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200551 if (weaklist != NULL) {
Serhiy Storchakac93c58b2018-10-29 19:30:16 +0200552 Py_ssize_t i;
553 /* Since dict is ordered in CPython 3.6+, modules are saved in
554 importing order. First clear modules imported later. */
555 for (i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200556 PyObject *tup = PyList_GET_ITEM(weaklist, i);
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200557 PyObject *name = PyTuple_GET_ITEM(tup, 0);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200558 PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1));
559 if (mod == Py_None)
560 continue;
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200561 assert(PyModule_Check(mod));
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200562 dict = PyModule_GetDict(mod);
563 if (dict == interp->builtins || dict == interp->sysdict)
564 continue;
565 Py_INCREF(mod);
Antoine Pitrou79ba3882013-08-06 22:50:15 +0200566 if (Py_VerboseFlag && PyUnicode_Check(name))
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200567 PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200568 _PyModule_Clear(mod);
569 Py_DECREF(mod);
Antoine Pitrou070cb3c2013-05-08 13:23:25 +0200570 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200571 Py_DECREF(weaklist);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 }
Guido van Rossum758eec01998-01-19 21:58:26 +0000573
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200574 /* Next, delete sys and builtins (in that order) */
575 if (Py_VerboseFlag)
576 PySys_FormatStderr("# cleanup[3] wiping sys\n");
577 _PyModule_ClearDict(interp->sysdict);
578 if (Py_VerboseFlag)
579 PySys_FormatStderr("# cleanup[3] wiping builtins\n");
580 _PyModule_ClearDict(interp->builtins);
581
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200582 /* Clear and delete the modules directory. Actual modules will
583 still be there only if imported during the execution of some
584 destructor. */
Eric Snow93c92f72017-09-13 23:46:04 -0700585 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 Py_DECREF(modules);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200587
588 /* Once more */
589 _PyGC_CollectNoFail();
590
Serhiy Storchakae9d94942018-04-25 20:58:40 +0300591#undef CLEAR_MODULE
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200592#undef STORE_MODULE_WEAKREF
Guido van Rossum8d15b5d1990-10-26 14:58:58 +0000593}
Guido van Rossum7f133ed1991-02-19 12:23:57 +0000594
595
Barry Warsaw28a691b2010-04-17 00:19:56 +0000596/* Helper for pythonrun.c -- return magic number and tag. */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
598long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599PyImport_GetMagicNumber(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600{
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200601 long res;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200602 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow32439d62015-05-02 19:15:18 -0600603 PyObject *external, *pyc_magic;
604
605 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
606 if (external == NULL)
607 return -1;
608 pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
609 Py_DECREF(external);
Brett Cannon77b2abd2012-07-09 16:09:00 -0400610 if (pyc_magic == NULL)
611 return -1;
Antoine Pitrou44b4b6a2012-07-10 18:27:54 +0200612 res = PyLong_AsLong(pyc_magic);
Benjamin Peterson66f36592012-07-09 22:21:55 -0700613 Py_DECREF(pyc_magic);
614 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615}
616
617
Brett Cannon3adc7b72012-07-09 14:22:12 -0400618extern const char * _PySys_ImplCacheTag;
619
Barry Warsaw28a691b2010-04-17 00:19:56 +0000620const char *
621PyImport_GetMagicTag(void)
622{
Brett Cannon3adc7b72012-07-09 14:22:12 -0400623 return _PySys_ImplCacheTag;
Barry Warsaw28a691b2010-04-17 00:19:56 +0000624}
625
Brett Cannon98979b82012-07-02 15:13:11 -0400626
Guido van Rossum25ce5661997-08-02 03:10:38 +0000627/* Magic for extension modules (built-in as well as dynamically
628 loaded). To prevent initializing an extension module more than
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200629 once, we keep a static dictionary 'extensions' keyed by the tuple
630 (module name, module name) (for built-in modules) or by
631 (filename, module name) (for dynamically loaded modules), containing these
632 modules. A copy of the module's dictionary is stored by calling
633 _PyImport_FixupExtensionObject() immediately after the module initialization
634 function succeeds. A copy can be retrieved from there by calling
Victor Stinner95872862011-03-07 18:20:56 +0100635 _PyImport_FindExtensionObject().
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636
Barry Warsaw7c9627b2010-06-17 18:38:20 +0000637 Modules which do support multiple initialization set their m_size
638 field to a non-negative number (indicating the size of the
639 module-specific state). They are still recorded in the extensions
640 dictionary, to avoid loading shared libraries twice.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000641*/
642
643int
Victor Stinner95872862011-03-07 18:20:56 +0100644_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
Eric Snowd393c1b2017-09-14 12:18:12 -0600645 PyObject *filename, PyObject *modules)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646{
Eric Snowd393c1b2017-09-14 12:18:12 -0600647 PyObject *dict, *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 struct PyModuleDef *def;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500649 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 if (extensions == NULL) {
651 extensions = PyDict_New();
652 if (extensions == NULL)
653 return -1;
654 }
655 if (mod == NULL || !PyModule_Check(mod)) {
656 PyErr_BadInternalCall();
657 return -1;
658 }
659 def = PyModule_GetDef(mod);
660 if (!def) {
661 PyErr_BadInternalCall();
662 return -1;
663 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600664 if (PyObject_SetItem(modules, name, mod) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 return -1;
666 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600667 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 return -1;
669 }
670 if (def->m_size == -1) {
671 if (def->m_base.m_copy) {
672 /* Somebody already imported the module,
673 likely under a different name.
674 XXX this should really not happen. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200675 Py_CLEAR(def->m_base.m_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 }
677 dict = PyModule_GetDict(mod);
678 if (dict == NULL)
679 return -1;
680 def->m_base.m_copy = PyDict_Copy(dict);
681 if (def->m_base.m_copy == NULL)
682 return -1;
683 }
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500684 key = PyTuple_Pack(2, filename, name);
685 if (key == NULL)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200686 return -1;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500687 res = PyDict_SetItem(extensions, key, (PyObject *)def);
688 Py_DECREF(key);
689 if (res < 0)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200690 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 return 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000692}
693
Victor Stinner49d3f252010-10-17 01:24:53 +0000694int
Eric Snowd393c1b2017-09-14 12:18:12 -0600695_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000696{
697 int res;
Victor Stinner95872862011-03-07 18:20:56 +0100698 PyObject *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100699 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100700 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000701 return -1;
Eric Snowd393c1b2017-09-14 12:18:12 -0600702 res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100703 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000704 return res;
705}
706
Guido van Rossum25ce5661997-08-02 03:10:38 +0000707PyObject *
Victor Stinner95872862011-03-07 18:20:56 +0100708_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000709{
Eric Snowd393c1b2017-09-14 12:18:12 -0600710 PyObject *modules = PyImport_GetModuleDict();
711 return _PyImport_FindExtensionObjectEx(name, filename, modules);
712}
713
714PyObject *
715_PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename,
716 PyObject *modules)
717{
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500718 PyObject *mod, *mdict, *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 PyModuleDef* def;
720 if (extensions == NULL)
721 return NULL;
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500722 key = PyTuple_Pack(2, filename, name);
723 if (key == NULL)
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200724 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200725 def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
Benjamin Peterson5cb8a312012-12-15 00:05:16 -0500726 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 if (def == NULL)
728 return NULL;
729 if (def->m_size == -1) {
730 /* Module does not support repeated initialization */
731 if (def->m_base.m_copy == NULL)
732 return NULL;
Eric Snowd393c1b2017-09-14 12:18:12 -0600733 mod = _PyImport_AddModuleObject(name, modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (mod == NULL)
735 return NULL;
736 mdict = PyModule_GetDict(mod);
737 if (mdict == NULL)
738 return NULL;
739 if (PyDict_Update(mdict, def->m_base.m_copy))
740 return NULL;
741 }
742 else {
743 if (def->m_base.m_init == NULL)
744 return NULL;
745 mod = def->m_base.m_init();
746 if (mod == NULL)
747 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600748 if (PyObject_SetItem(modules, name, mod) == -1) {
Christian Heimes09ca7942013-07-20 14:51:53 +0200749 Py_DECREF(mod);
750 return NULL;
751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 Py_DECREF(mod);
753 }
754 if (_PyState_AddModule(mod, def) < 0) {
Eric Snow3f9eee62017-09-15 16:35:20 -0600755 PyMapping_DelItem(modules, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 return NULL;
757 }
758 if (Py_VerboseFlag)
Victor Stinner95872862011-03-07 18:20:56 +0100759 PySys_FormatStderr("import %U # previously loaded (%R)\n",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 name, filename);
761 return mod;
Brett Cannon9a5b25a2010-03-01 02:09:17 +0000762
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763}
764
Victor Stinner49d3f252010-10-17 01:24:53 +0000765PyObject *
Eric Snowd393c1b2017-09-14 12:18:12 -0600766_PyImport_FindBuiltin(const char *name, PyObject *modules)
Victor Stinner49d3f252010-10-17 01:24:53 +0000767{
Victor Stinner95872862011-03-07 18:20:56 +0100768 PyObject *res, *nameobj;
Victor Stinner21fcd0c2011-03-07 18:28:15 +0100769 nameobj = PyUnicode_InternFromString(name);
Victor Stinner95872862011-03-07 18:20:56 +0100770 if (nameobj == NULL)
Victor Stinner49d3f252010-10-17 01:24:53 +0000771 return NULL;
Eric Snowd393c1b2017-09-14 12:18:12 -0600772 res = _PyImport_FindExtensionObjectEx(nameobj, nameobj, modules);
Victor Stinner95872862011-03-07 18:20:56 +0100773 Py_DECREF(nameobj);
Victor Stinner49d3f252010-10-17 01:24:53 +0000774 return res;
775}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000776
777/* Get the module object corresponding to a module name.
778 First check the modules dictionary if there's one there,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000779 if not, create a new one and insert it in the modules dictionary.
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000780 Because the former action is most common, THIS DOES NOT RETURN A
781 'NEW' REFERENCE! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783PyObject *
Victor Stinner27ee0892011-03-04 12:57:09 +0000784PyImport_AddModuleObject(PyObject *name)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyObject *modules = PyImport_GetModuleDict();
Eric Snowd393c1b2017-09-14 12:18:12 -0600787 return _PyImport_AddModuleObject(name, modules);
788}
789
790PyObject *
791_PyImport_AddModuleObject(PyObject *name, PyObject *modules)
792{
Eric Snow86b7afd2017-09-04 17:54:09 -0600793 PyObject *m;
Eric Snow3f9eee62017-09-15 16:35:20 -0600794 if (PyDict_CheckExact(modules)) {
795 m = PyDict_GetItemWithError(modules, name);
796 }
797 else {
798 m = PyObject_GetItem(modules, name);
799 // For backward-comaptibility we copy the behavior
800 // of PyDict_GetItemWithError().
801 if (PyErr_ExceptionMatches(PyExc_KeyError)) {
802 PyErr_Clear();
803 }
Serhiy Storchaka48a583b2016-02-10 10:31:20 +0200804 }
805 if (PyErr_Occurred()) {
806 return NULL;
807 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600808 if (m != NULL && PyModule_Check(m)) {
809 return m;
810 }
Victor Stinner27ee0892011-03-04 12:57:09 +0000811 m = PyModule_NewObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 if (m == NULL)
813 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -0600814 if (PyObject_SetItem(modules, name, m) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 Py_DECREF(m);
816 return NULL;
817 }
818 Py_DECREF(m); /* Yes, it still exists, in modules! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821}
822
Victor Stinner27ee0892011-03-04 12:57:09 +0000823PyObject *
824PyImport_AddModule(const char *name)
825{
826 PyObject *nameobj, *module;
827 nameobj = PyUnicode_FromString(name);
828 if (nameobj == NULL)
829 return NULL;
830 module = PyImport_AddModuleObject(nameobj);
831 Py_DECREF(nameobj);
832 return module;
833}
834
835
Tim Peters1cd70172004-08-02 03:52:12 +0000836/* Remove name from sys.modules, if it's there. */
837static void
Victor Stinner27ee0892011-03-04 12:57:09 +0000838remove_module(PyObject *name)
Tim Peters1cd70172004-08-02 03:52:12 +0000839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 PyObject *modules = PyImport_GetModuleDict();
Eric Snow3f9eee62017-09-15 16:35:20 -0600841 if (PyMapping_DelItem(modules, name) < 0) {
842 if (!PyMapping_HasKey(modules, name)) {
843 return;
844 }
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +0200845 Py_FatalError("import: deleting existing key in "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 "sys.modules failed");
Eric Snow3f9eee62017-09-15 16:35:20 -0600847 }
Tim Peters1cd70172004-08-02 03:52:12 +0000848}
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849
Christian Heimes3b06e532008-01-07 20:12:44 +0000850
Guido van Rossum7f9fa971995-01-20 16:53:12 +0000851/* Execute a code object in a module and return the module object
Tim Peters1cd70172004-08-02 03:52:12 +0000852 * WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
853 * removed from sys.modules, to avoid leaving damaged module objects
854 * in sys.modules. The caller may wish to restore the original
855 * module object (if any) in this case; PyImport_ReloadModule is an
856 * example.
Barry Warsaw28a691b2010-04-17 00:19:56 +0000857 *
858 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
859 * interface. The other two exist primarily for backward compatibility.
Tim Peters1cd70172004-08-02 03:52:12 +0000860 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300862PyImport_ExecCodeModule(const char *name, PyObject *co)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 return PyImport_ExecCodeModuleWithPathnames(
865 name, co, (char *)NULL, (char *)NULL);
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000866}
867
868PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300869PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Guido van Rossume32bf6e1998-02-11 05:53:02 +0000870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 return PyImport_ExecCodeModuleWithPathnames(
872 name, co, pathname, (char *)NULL);
Barry Warsaw28a691b2010-04-17 00:19:56 +0000873}
874
875PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +0300876PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
877 const char *pathname,
878 const char *cpathname)
Barry Warsaw28a691b2010-04-17 00:19:56 +0000879{
Victor Stinner27ee0892011-03-04 12:57:09 +0000880 PyObject *m = NULL;
Eric Snow32439d62015-05-02 19:15:18 -0600881 PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
Victor Stinner27ee0892011-03-04 12:57:09 +0000882
883 nameobj = PyUnicode_FromString(name);
884 if (nameobj == NULL)
885 return NULL;
886
Victor Stinner27ee0892011-03-04 12:57:09 +0000887 if (cpathname != NULL) {
888 cpathobj = PyUnicode_DecodeFSDefault(cpathname);
889 if (cpathobj == NULL)
890 goto error;
Brett Cannona6473f92012-07-13 13:57:03 -0400891 }
892 else
Victor Stinner27ee0892011-03-04 12:57:09 +0000893 cpathobj = NULL;
Brett Cannona6473f92012-07-13 13:57:03 -0400894
895 if (pathname != NULL) {
896 pathobj = PyUnicode_DecodeFSDefault(pathname);
897 if (pathobj == NULL)
898 goto error;
899 }
900 else if (cpathobj != NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200901 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Brett Cannona6473f92012-07-13 13:57:03 -0400902 _Py_IDENTIFIER(_get_sourcefile);
903
904 if (interp == NULL) {
905 Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
906 "no interpreter!");
907 }
908
Eric Snow32439d62015-05-02 19:15:18 -0600909 external= PyObject_GetAttrString(interp->importlib,
910 "_bootstrap_external");
911 if (external != NULL) {
912 pathobj = _PyObject_CallMethodIdObjArgs(external,
913 &PyId__get_sourcefile, cpathobj,
914 NULL);
915 Py_DECREF(external);
916 }
Brett Cannona6473f92012-07-13 13:57:03 -0400917 if (pathobj == NULL)
918 PyErr_Clear();
919 }
920 else
921 pathobj = NULL;
922
Victor Stinner27ee0892011-03-04 12:57:09 +0000923 m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
924error:
925 Py_DECREF(nameobj);
926 Py_XDECREF(pathobj);
927 Py_XDECREF(cpathobj);
928 return m;
929}
930
Brett Cannon18fc4e72014-04-04 10:01:46 -0400931static PyObject *
932module_dict_for_exec(PyObject *name)
Victor Stinner27ee0892011-03-04 12:57:09 +0000933{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200934 _Py_IDENTIFIER(__builtins__);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400935 PyObject *m, *d = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936
Victor Stinner27ee0892011-03-04 12:57:09 +0000937 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (m == NULL)
939 return NULL;
940 /* If the module is being reloaded, we get the old module back
941 and re-use its dict to exec the new code. */
942 d = PyModule_GetDict(m);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200943 if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) {
944 if (PyErr_Occurred() ||
945 _PyDict_SetItemId(d, &PyId___builtins__,
946 PyEval_GetBuiltins()) != 0)
947 {
Brett Cannon18fc4e72014-04-04 10:01:46 -0400948 remove_module(name);
949 return NULL;
950 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 }
Brett Cannon18fc4e72014-04-04 10:01:46 -0400952
Eric Snow08197a42014-05-12 17:54:55 -0600953 return d; /* Return a borrowed reference. */
Brett Cannon18fc4e72014-04-04 10:01:46 -0400954}
955
956static PyObject *
957exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object)
958{
Brett Cannon18fc4e72014-04-04 10:01:46 -0400959 PyObject *v, *m;
960
961 v = PyEval_EvalCode(code_object, module_dict, module_dict);
962 if (v == NULL) {
963 remove_module(name);
964 return NULL;
965 }
966 Py_DECREF(v);
967
Eric Snow3f9eee62017-09-15 16:35:20 -0600968 m = PyImport_GetModule(name);
Stefan Krah027b09c2019-03-25 21:50:58 +0100969 if (m == NULL && !PyErr_Occurred()) {
Brett Cannon18fc4e72014-04-04 10:01:46 -0400970 PyErr_Format(PyExc_ImportError,
971 "Loaded module %R not found in sys.modules",
972 name);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400973 }
974
Brett Cannon18fc4e72014-04-04 10:01:46 -0400975 return m;
976}
977
978PyObject*
979PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
980 PyObject *cpathname)
981{
Eric Snow32439d62015-05-02 19:15:18 -0600982 PyObject *d, *external, *res;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200983 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow08197a42014-05-12 17:54:55 -0600984 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400985
986 d = module_dict_for_exec(name);
987 if (d == NULL) {
988 return NULL;
989 }
990
Eric Snow08197a42014-05-12 17:54:55 -0600991 if (pathname == NULL) {
992 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 }
Eric Snow32439d62015-05-02 19:15:18 -0600994 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
995 if (external == NULL)
996 return NULL;
997 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -0600998 &PyId__fix_up_module,
999 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -06001000 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -06001001 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -06001002 Py_DECREF(res);
Eric Snow08197a42014-05-12 17:54:55 -06001003 res = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 }
Eric Snow08197a42014-05-12 17:54:55 -06001005 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006}
1007
1008
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001009static void
1010update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 PyObject *constants, *tmp;
1013 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 if (PyUnicode_Compare(co->co_filename, oldname))
1016 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001017
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001018 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001019 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 constants = co->co_consts;
1022 n = PyTuple_GET_SIZE(constants);
1023 for (i = 0; i < n; i++) {
1024 tmp = PyTuple_GET_ITEM(constants, i);
1025 if (PyCode_Check(tmp))
1026 update_code_filenames((PyCodeObject *)tmp,
1027 oldname, newname);
1028 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001029}
1030
Victor Stinner2f42ae52011-03-20 00:41:24 +01001031static void
1032update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001033{
Victor Stinner2f42ae52011-03-20 00:41:24 +01001034 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001035
Victor Stinner2f42ae52011-03-20 00:41:24 +01001036 if (PyUnicode_Compare(co->co_filename, newname) == 0)
1037 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 oldname = co->co_filename;
1040 Py_INCREF(oldname);
1041 update_code_filenames(co, oldname, newname);
1042 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001043}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044
Brett Cannon4caa61d2014-01-09 19:03:32 -05001045/*[clinic input]
1046_imp._fix_co_filename
1047
1048 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
1049 Code object to change.
1050
1051 path: unicode
1052 File path to use.
1053 /
1054
1055Changes code.co_filename to specify the passed-in file path.
1056[clinic start generated code]*/
1057
Brett Cannon4caa61d2014-01-09 19:03:32 -05001058static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001059_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -04001060 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001061/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -07001062
Brett Cannon4caa61d2014-01-09 19:03:32 -05001063{
Brett Cannona6dec2e2014-01-10 07:43:55 -05001064 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -07001065
1066 Py_RETURN_NONE;
1067}
1068
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001069
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001070/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001071static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001072
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001073
1074/* Helper to test for built-in module */
1075
1076static int
Victor Stinner95872862011-03-07 18:20:56 +01001077is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001078{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001079 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001081 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 if (PyImport_Inittab[i].initfunc == NULL)
1083 return -1;
1084 else
1085 return 1;
1086 }
1087 }
1088 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001089}
1090
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001091
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001092/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +00001093 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001094 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001095 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001096 this tells our caller that the path based finder could not find
1097 a finder for this path item. Cache the result in
1098 path_importer_cache.
Just van Rossum52e14d62002-12-30 22:08:05 +00001099 Returns a borrowed reference. */
1100
1101static PyObject *
1102get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 PyObject *importer;
1106 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 /* These conditions are the caller's responsibility: */
1109 assert(PyList_Check(path_hooks));
1110 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 nhooks = PyList_Size(path_hooks);
1113 if (nhooks < 0)
1114 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001115
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001116 importer = PyDict_GetItemWithError(path_importer_cache, p);
1117 if (importer != NULL || PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 /* set path_importer_cache[p] to None to avoid recursion */
1121 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1122 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 for (j = 0; j < nhooks; j++) {
1125 PyObject *hook = PyList_GetItem(path_hooks, j);
1126 if (hook == NULL)
1127 return NULL;
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001128 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 if (importer != NULL)
1130 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1133 return NULL;
1134 }
1135 PyErr_Clear();
1136 }
1137 if (importer == NULL) {
Brett Cannonaa936422012-04-27 15:30:58 -04001138 return Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 }
1140 if (importer != NULL) {
1141 int err = PyDict_SetItem(path_importer_cache, p, importer);
1142 Py_DECREF(importer);
1143 if (err != 0)
1144 return NULL;
1145 }
1146 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001147}
1148
Benjamin Petersone5024512018-09-12 12:06:42 -07001149PyObject *
Christian Heimes9cd17752007-11-18 19:35:23 +00001150PyImport_GetImporter(PyObject *path) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001152
Victor Stinner1e53bba2013-07-16 22:26:05 +02001153 path_importer_cache = PySys_GetObject("path_importer_cache");
1154 path_hooks = PySys_GetObject("path_hooks");
1155 if (path_importer_cache != NULL && path_hooks != NULL) {
1156 importer = get_path_importer(path_importer_cache,
1157 path_hooks, path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 }
1159 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1160 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001161}
1162
Nick Coghland5cacbb2015-05-23 22:24:10 +10001163/*[clinic input]
1164_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001165
Nick Coghland5cacbb2015-05-23 22:24:10 +10001166 spec: object
1167 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001168
Nick Coghland5cacbb2015-05-23 22:24:10 +10001169Create an extension module.
1170[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001171
Nick Coghland5cacbb2015-05-23 22:24:10 +10001172static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001173_imp_create_builtin(PyObject *module, PyObject *spec)
1174/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 struct _inittab *p;
Nick Coghland5cacbb2015-05-23 22:24:10 +10001177 PyObject *name;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001178 const char *namestr;
Victor Stinner5eb4f592013-11-14 22:38:52 +01001179 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001180
Nick Coghland5cacbb2015-05-23 22:24:10 +10001181 name = PyObject_GetAttrString(spec, "name");
1182 if (name == NULL) {
1183 return NULL;
1184 }
1185
Victor Stinner5eb4f592013-11-14 22:38:52 +01001186 mod = _PyImport_FindExtensionObject(name, name);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001187 if (mod || PyErr_Occurred()) {
1188 Py_DECREF(name);
Raymond Hettingerf0afe772016-08-31 08:44:11 -07001189 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001190 return mod;
1191 }
1192
1193 namestr = PyUnicode_AsUTF8(name);
1194 if (namestr == NULL) {
1195 Py_DECREF(name);
1196 return NULL;
1197 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001198
Eric Snowd393c1b2017-09-14 12:18:12 -06001199 PyObject *modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 for (p = PyImport_Inittab; p->name != NULL; p++) {
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001201 PyModuleDef *def;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001202 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 if (p->initfunc == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001204 /* Cannot re-init internal module ("sys" or "builtins") */
1205 mod = PyImport_AddModule(namestr);
1206 Py_DECREF(name);
1207 return mod;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 mod = (*p->initfunc)();
Nick Coghland5cacbb2015-05-23 22:24:10 +10001210 if (mod == NULL) {
1211 Py_DECREF(name);
1212 return NULL;
1213 }
1214 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1215 Py_DECREF(name);
1216 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1217 } else {
1218 /* Remember pointer to module init function. */
1219 def = PyModule_GetDef(mod);
Christian Heimesa78b6272016-09-09 00:25:03 +02001220 if (def == NULL) {
1221 Py_DECREF(name);
1222 return NULL;
1223 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001224 def->m_base.m_init = p->initfunc;
Eric Snowd393c1b2017-09-14 12:18:12 -06001225 if (modules == NULL) {
1226 modules = PyImport_GetModuleDict();
1227 }
1228 if (_PyImport_FixupExtensionObject(mod, name, name,
1229 modules) < 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001230 Py_DECREF(name);
1231 return NULL;
1232 }
1233 Py_DECREF(name);
1234 return mod;
1235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 }
1237 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001238 Py_DECREF(name);
1239 Py_RETURN_NONE;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001240}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001241
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001243/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001244
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001245static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001246find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001247{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001248 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001249
Victor Stinner53dc7352011-03-20 01:50:21 +01001250 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 for (p = PyImport_FrozenModules; ; p++) {
1254 if (p->name == NULL)
1255 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001256 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 break;
1258 }
1259 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001260}
1261
Guido van Rossum79f25d91997-04-29 20:08:16 +00001262static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001263get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001264{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001265 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 if (p == NULL) {
1269 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001270 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 name);
1272 return NULL;
1273 }
1274 if (p->code == NULL) {
1275 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001276 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 name);
1278 return NULL;
1279 }
1280 size = p->size;
1281 if (size < 0)
1282 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001283 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001284}
1285
Brett Cannon8d110132009-03-15 02:20:16 +00001286static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001287is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001288{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001289 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 if (p == NULL) {
1293 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001294 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 name);
1296 return NULL;
1297 }
Brett Cannon8d110132009-03-15 02:20:16 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 if (size < 0)
1302 Py_RETURN_TRUE;
1303 else
1304 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001305}
1306
1307
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001308/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001309 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001310 an exception set if the initialization failed.
1311 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001312
1313int
Victor Stinner53dc7352011-03-20 01:50:21 +01001314PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001315{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001316 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001317 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 int ispackage;
1319 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001320
Victor Stinner53dc7352011-03-20 01:50:21 +01001321 p = find_frozen(name);
1322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 if (p == NULL)
1324 return 0;
1325 if (p->code == NULL) {
1326 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001327 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 name);
1329 return -1;
1330 }
1331 size = p->size;
1332 ispackage = (size < 0);
1333 if (ispackage)
1334 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001335 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 if (co == NULL)
1337 return -1;
1338 if (!PyCode_Check(co)) {
1339 PyErr_Format(PyExc_TypeError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001340 "frozen object %R is not a code object",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 name);
1342 goto err_return;
1343 }
1344 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001345 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001346 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 int err;
Victor Stinner53dc7352011-03-20 01:50:21 +01001348 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 if (m == NULL)
1350 goto err_return;
1351 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001352 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 goto err_return;
1355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 err = PyDict_SetItemString(d, "__path__", l);
1357 Py_DECREF(l);
1358 if (err != 0)
1359 goto err_return;
1360 }
Brett Cannon18fc4e72014-04-04 10:01:46 -04001361 d = module_dict_for_exec(name);
1362 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001363 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001364 }
1365 m = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 if (m == NULL)
1367 goto err_return;
1368 Py_DECREF(co);
1369 Py_DECREF(m);
1370 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001371err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 Py_DECREF(co);
1373 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001374}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001375
Victor Stinner53dc7352011-03-20 01:50:21 +01001376int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001377PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001378{
1379 PyObject *nameobj;
1380 int ret;
1381 nameobj = PyUnicode_InternFromString(name);
1382 if (nameobj == NULL)
1383 return -1;
1384 ret = PyImport_ImportFrozenModuleObject(nameobj);
1385 Py_DECREF(nameobj);
1386 return ret;
1387}
1388
Guido van Rossum74e6a111994-08-29 12:54:38 +00001389
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001391 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001392
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001394PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 PyObject *pname;
1397 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 pname = PyUnicode_FromString(name);
1400 if (pname == NULL)
1401 return NULL;
1402 result = PyImport_Import(pname);
1403 Py_DECREF(pname);
1404 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001405}
1406
Christian Heimes072c0f12008-01-03 23:01:04 +00001407/* Import a module without blocking
1408 *
1409 * At first it tries to fetch the module from sys.modules. If the module was
1410 * never loaded before it loads it with PyImport_ImportModule() unless another
1411 * thread holds the import lock. In the latter case the function raises an
1412 * ImportError instead of blocking.
1413 *
1414 * Returns the module object with incremented ref count.
1415 */
1416PyObject *
1417PyImport_ImportModuleNoBlock(const char *name)
1418{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001419 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001420}
1421
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001422
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001423/* Remove importlib frames from the traceback,
1424 * except in Verbose mode. */
1425static void
1426remove_importlib_frames(void)
1427{
1428 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001429 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001430 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001431 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001432 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001433 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001434 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001435
1436 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001437 from the traceback. We always trim chunks
1438 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001439
1440 PyErr_Fetch(&exception, &value, &base_tb);
1441 if (!exception || Py_VerboseFlag)
1442 goto done;
1443 if (PyType_IsSubtype((PyTypeObject *) exception,
1444 (PyTypeObject *) PyExc_ImportError))
1445 always_trim = 1;
1446
1447 prev_link = &base_tb;
1448 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001449 while (tb != NULL) {
1450 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1451 PyObject *next = (PyObject *) traceback->tb_next;
1452 PyFrameObject *frame = traceback->tb_frame;
1453 PyCodeObject *code = frame->f_code;
1454 int now_in_importlib;
1455
1456 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001457 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1458 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001459 if (now_in_importlib && !in_importlib) {
1460 /* This is the link to this chunk of importlib tracebacks */
1461 outer_link = prev_link;
1462 }
1463 in_importlib = now_in_importlib;
1464
1465 if (in_importlib &&
1466 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001467 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001468 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001469 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001470 prev_link = outer_link;
1471 }
1472 else {
1473 prev_link = (PyObject **) &traceback->tb_next;
1474 }
1475 tb = next;
1476 }
1477done:
1478 PyErr_Restore(exception, value, base_tb);
1479}
1480
1481
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001482static PyObject *
1483resolve_name(PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001484{
Eric Snowb523f842013-11-22 09:05:39 -07001485 _Py_IDENTIFIER(__spec__);
Brett Cannonfd074152012-04-14 14:10:13 -04001486 _Py_IDENTIFIER(__package__);
1487 _Py_IDENTIFIER(__path__);
1488 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001489 _Py_IDENTIFIER(parent);
1490 PyObject *abs_name;
1491 PyObject *package = NULL;
1492 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001493 Py_ssize_t last_dot;
1494 PyObject *base;
1495 int level_up;
1496
1497 if (globals == NULL) {
1498 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1499 goto error;
1500 }
1501 if (!PyDict_Check(globals)) {
1502 PyErr_SetString(PyExc_TypeError, "globals must be a dict");
1503 goto error;
1504 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001505 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001506 if (package == Py_None) {
1507 package = NULL;
1508 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001509 else if (package == NULL && PyErr_Occurred()) {
1510 goto error;
1511 }
1512 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
1513 if (spec == NULL && PyErr_Occurred()) {
1514 goto error;
1515 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001516
1517 if (package != NULL) {
1518 Py_INCREF(package);
1519 if (!PyUnicode_Check(package)) {
1520 PyErr_SetString(PyExc_TypeError, "package must be a string");
1521 goto error;
1522 }
1523 else if (spec != NULL && spec != Py_None) {
1524 int equal;
1525 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1526 if (parent == NULL) {
1527 goto error;
1528 }
1529
1530 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1531 Py_DECREF(parent);
1532 if (equal < 0) {
1533 goto error;
1534 }
1535 else if (equal == 0) {
1536 if (PyErr_WarnEx(PyExc_ImportWarning,
1537 "__package__ != __spec__.parent", 1) < 0) {
1538 goto error;
1539 }
1540 }
1541 }
1542 }
1543 else if (spec != NULL && spec != Py_None) {
1544 package = _PyObject_GetAttrId(spec, &PyId_parent);
1545 if (package == NULL) {
1546 goto error;
1547 }
1548 else if (!PyUnicode_Check(package)) {
1549 PyErr_SetString(PyExc_TypeError,
1550 "__spec__.parent must be a string");
1551 goto error;
1552 }
1553 }
1554 else {
1555 if (PyErr_WarnEx(PyExc_ImportWarning,
1556 "can't resolve package from __spec__ or __package__, "
1557 "falling back on __name__ and __path__", 1) < 0) {
1558 goto error;
1559 }
1560
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001561 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001562 if (package == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001563 if (!PyErr_Occurred()) {
1564 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1565 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001566 goto error;
1567 }
1568
1569 Py_INCREF(package);
1570 if (!PyUnicode_Check(package)) {
1571 PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
1572 goto error;
1573 }
1574
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001575 if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001576 Py_ssize_t dot;
1577
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001578 if (PyErr_Occurred() || PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001579 goto error;
1580 }
1581
1582 dot = PyUnicode_FindChar(package, '.',
1583 0, PyUnicode_GET_LENGTH(package), -1);
1584 if (dot == -2) {
1585 goto error;
1586 }
1587
1588 if (dot >= 0) {
1589 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1590 if (substr == NULL) {
1591 goto error;
1592 }
1593 Py_SETREF(package, substr);
1594 }
1595 }
1596 }
1597
1598 last_dot = PyUnicode_GET_LENGTH(package);
1599 if (last_dot == 0) {
1600 PyErr_SetString(PyExc_ImportError,
1601 "attempted relative import with no known parent package");
1602 goto error;
1603 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001604
1605 for (level_up = 1; level_up < level; level_up += 1) {
1606 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1607 if (last_dot == -2) {
1608 goto error;
1609 }
1610 else if (last_dot == -1) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "attempted relative import beyond top-level "
1613 "package");
1614 goto error;
1615 }
1616 }
1617
1618 base = PyUnicode_Substring(package, 0, last_dot);
1619 Py_DECREF(package);
1620 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1621 return base;
1622 }
1623
1624 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1625 Py_DECREF(base);
1626 return abs_name;
1627
1628 error:
1629 Py_XDECREF(package);
1630 return NULL;
1631}
1632
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001633static PyObject *
1634import_find_and_load(PyObject *abs_name)
1635{
1636 _Py_IDENTIFIER(_find_and_load);
1637 PyObject *mod = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001638 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001639 int import_time = interp->core_config.import_time;
1640 static int import_level;
1641 static _PyTime_t accumulated;
1642
1643 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1644
1645 /* XOptions is initialized after first some imports.
1646 * So we can't have negative cache before completed initialization.
1647 * Anyway, importlib._find_and_load is much slower than
1648 * _PyDict_GetItemIdWithError().
1649 */
1650 if (import_time) {
1651 static int header = 1;
1652 if (header) {
1653 fputs("import time: self [us] | cumulative | imported package\n",
1654 stderr);
1655 header = 0;
1656 }
1657
1658 import_level++;
1659 t1 = _PyTime_GetPerfCounter();
1660 accumulated = 0;
1661 }
1662
1663 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1664 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1665
1666 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1667 &PyId__find_and_load, abs_name,
1668 interp->import_func, NULL);
1669
1670 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1671 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1672 mod != NULL);
1673
1674 if (import_time) {
1675 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1676
1677 import_level--;
1678 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1679 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1680 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1681 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1682
1683 accumulated = accumulated_copy + cum;
1684 }
1685
1686 return mod;
1687}
1688
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001689PyObject *
1690PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1691 PyObject *locals, PyObject *fromlist,
1692 int level)
1693{
Brett Cannonfd074152012-04-14 14:10:13 -04001694 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001695 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001696 PyObject *final_mod = NULL;
1697 PyObject *mod = NULL;
1698 PyObject *package = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001699 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001700 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001701
Brett Cannonfd074152012-04-14 14:10:13 -04001702 if (name == NULL) {
1703 PyErr_SetString(PyExc_ValueError, "Empty module name");
1704 goto error;
1705 }
1706
1707 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1708 for added performance. */
1709
1710 if (!PyUnicode_Check(name)) {
1711 PyErr_SetString(PyExc_TypeError, "module name must be a string");
1712 goto error;
1713 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001714 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001715 goto error;
1716 }
1717 if (level < 0) {
1718 PyErr_SetString(PyExc_ValueError, "level must be >= 0");
1719 goto error;
1720 }
Brett Cannon849113a2016-01-22 15:25:50 -08001721
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001722 if (level > 0) {
1723 abs_name = resolve_name(name, globals, level);
1724 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001725 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001726 }
1727 else { /* level == 0 */
1728 if (PyUnicode_GET_LENGTH(name) == 0) {
1729 PyErr_SetString(PyExc_ValueError, "Empty module name");
1730 goto error;
1731 }
Brett Cannonfd074152012-04-14 14:10:13 -04001732 abs_name = name;
1733 Py_INCREF(abs_name);
1734 }
1735
Eric Snow3f9eee62017-09-15 16:35:20 -06001736 mod = PyImport_GetModule(abs_name);
Stefan Krah027b09c2019-03-25 21:50:58 +01001737 if (mod == NULL && PyErr_Occurred()) {
1738 goto error;
1739 }
1740
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001741 if (mod != NULL && mod != Py_None) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001742 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001743 _Py_IDENTIFIER(_lock_unlock_module);
Eric Snowb523f842013-11-22 09:05:39 -07001744 PyObject *spec;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001745
Antoine Pitrou03989852012-08-28 00:24:52 +02001746 /* Optimization: only call _bootstrap._lock_unlock_module() if
Eric Snowb523f842013-11-22 09:05:39 -07001747 __spec__._initializing is true.
1748 NOTE: because of this, initializing must be set *before*
Antoine Pitrou03989852012-08-28 00:24:52 +02001749 stuffing the new module in sys.modules.
1750 */
Eric Snowb523f842013-11-22 09:05:39 -07001751 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001752 if (_PyModuleSpec_IsInitializing(spec)) {
1753 PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib,
1754 &PyId__lock_unlock_module, abs_name,
1755 NULL);
1756 if (value == NULL) {
1757 Py_DECREF(spec);
1758 goto error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001759 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001760 Py_DECREF(value);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001761 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001762 Py_XDECREF(spec);
Brett Cannonfd074152012-04-14 14:10:13 -04001763 }
1764 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001765 Py_XDECREF(mod);
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001766 mod = import_find_and_load(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001767 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001768 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001769 }
1770 }
1771
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001772 has_from = 0;
1773 if (fromlist != NULL && fromlist != Py_None) {
1774 has_from = PyObject_IsTrue(fromlist);
1775 if (has_from < 0)
1776 goto error;
1777 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001778 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001779 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1780 if (level == 0 || len > 0) {
1781 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001782
Victor Stinner744c34e2016-05-20 11:36:13 +02001783 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1784 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001785 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001786 }
1787
Victor Stinner744c34e2016-05-20 11:36:13 +02001788 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001789 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001790 final_mod = mod;
1791 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001792 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001793 }
1794
Brett Cannonfd074152012-04-14 14:10:13 -04001795 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001796 PyObject *front = PyUnicode_Substring(name, 0, dot);
1797 if (front == NULL) {
1798 goto error;
1799 }
1800
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001801 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001802 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001803 }
1804 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001805 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001806 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001807 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001808 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001809 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001810 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001811 }
Brett Cannonfd074152012-04-14 14:10:13 -04001812
Eric Snow3f9eee62017-09-15 16:35:20 -06001813 final_mod = PyImport_GetModule(to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001814 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001815 if (final_mod == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001816 if (!PyErr_Occurred()) {
1817 PyErr_Format(PyExc_KeyError,
1818 "%R not in sys.modules as expected",
1819 to_return);
1820 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001821 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001822 }
Brett Cannonfd074152012-04-14 14:10:13 -04001823 }
1824 }
1825 else {
1826 final_mod = mod;
1827 Py_INCREF(mod);
1828 }
1829 }
1830 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001831 _Py_IDENTIFIER(__path__);
1832 PyObject *path;
1833 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1834 goto error;
1835 }
1836 if (path) {
1837 Py_DECREF(path);
1838 final_mod = _PyObject_CallMethodIdObjArgs(
1839 interp->importlib, &PyId__handle_fromlist,
1840 mod, fromlist, interp->import_func, NULL);
1841 }
1842 else {
1843 final_mod = mod;
1844 Py_INCREF(mod);
1845 }
Brett Cannonfd074152012-04-14 14:10:13 -04001846 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001847
Brett Cannonfd074152012-04-14 14:10:13 -04001848 error:
1849 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001850 Py_XDECREF(mod);
1851 Py_XDECREF(package);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001852 if (final_mod == NULL)
1853 remove_importlib_frames();
Brett Cannonfd074152012-04-14 14:10:13 -04001854 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001855}
1856
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001857PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001858PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001859 PyObject *fromlist, int level)
1860{
1861 PyObject *nameobj, *mod;
1862 nameobj = PyUnicode_FromString(name);
1863 if (nameobj == NULL)
1864 return NULL;
1865 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1866 fromlist, level);
1867 Py_DECREF(nameobj);
1868 return mod;
1869}
1870
1871
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872/* Re-import a module of any kind and return its module object, WITH
1873 INCREMENTED REFERENCE COUNT */
1874
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001876PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877{
Eric Snow3f9eee62017-09-15 16:35:20 -06001878 _Py_IDENTIFIER(imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001879 _Py_IDENTIFIER(reload);
1880 PyObject *reloaded_module = NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001881 PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001882 if (imp == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +01001883 if (PyErr_Occurred()) {
1884 return NULL;
1885 }
1886
Brett Cannon62228db2012-04-29 14:38:11 -04001887 imp = PyImport_ImportModule("imp");
1888 if (imp == NULL) {
1889 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001892
Victor Stinner55ba38a2016-12-09 16:09:30 +01001893 reloaded_module = _PyObject_CallMethodIdObjArgs(imp, &PyId_reload, m, NULL);
Brett Cannon62228db2012-04-29 14:38:11 -04001894 Py_DECREF(imp);
1895 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896}
1897
1898
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001899/* Higher-level import emulator which emulates the "import" statement
1900 more accurately -- it invokes the __import__() function from the
1901 builtins of the current globals. This means that the import is
1902 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001903 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001904 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001905 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001906 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001907
1908PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001909PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 static PyObject *silly_list = NULL;
1912 static PyObject *builtins_str = NULL;
1913 static PyObject *import_str = NULL;
1914 PyObject *globals = NULL;
1915 PyObject *import = NULL;
1916 PyObject *builtins = NULL;
1917 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 /* Initialize constant string objects */
1920 if (silly_list == NULL) {
1921 import_str = PyUnicode_InternFromString("__import__");
1922 if (import_str == NULL)
1923 return NULL;
1924 builtins_str = PyUnicode_InternFromString("__builtins__");
1925 if (builtins_str == NULL)
1926 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001927 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 if (silly_list == NULL)
1929 return NULL;
1930 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 /* Get the builtins from current globals */
1933 globals = PyEval_GetGlobals();
1934 if (globals != NULL) {
1935 Py_INCREF(globals);
1936 builtins = PyObject_GetItem(globals, builtins_str);
1937 if (builtins == NULL)
1938 goto err;
1939 }
1940 else {
1941 /* No globals -- use standard builtins, and fake globals */
1942 builtins = PyImport_ImportModuleLevel("builtins",
1943 NULL, NULL, NULL, 0);
1944 if (builtins == NULL)
1945 return NULL;
1946 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1947 if (globals == NULL)
1948 goto err;
1949 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 /* Get the __import__ function from the builtins */
1952 if (PyDict_Check(builtins)) {
1953 import = PyObject_GetItem(builtins, import_str);
1954 if (import == NULL)
1955 PyErr_SetObject(PyExc_KeyError, import_str);
1956 }
1957 else
1958 import = PyObject_GetAttr(builtins, import_str);
1959 if (import == NULL)
1960 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001963 Always use absolute import here.
1964 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1966 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001967 if (r == NULL)
1968 goto err;
1969 Py_DECREF(r);
1970
Eric Snow3f9eee62017-09-15 16:35:20 -06001971 r = PyImport_GetModule(module_name);
1972 if (r == NULL && !PyErr_Occurred()) {
Serhiy Storchaka145541c2017-06-15 20:54:38 +03001973 PyErr_SetObject(PyExc_KeyError, module_name);
1974 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001975
1976 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 Py_XDECREF(globals);
1978 Py_XDECREF(builtins);
1979 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001982}
1983
Brett Cannon4caa61d2014-01-09 19:03:32 -05001984/*[clinic input]
1985_imp.extension_suffixes
1986
1987Returns the list of file suffixes used to identify extension modules.
1988[clinic start generated code]*/
1989
Brett Cannon4caa61d2014-01-09 19:03:32 -05001990static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001991_imp_extension_suffixes_impl(PyObject *module)
1992/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 PyObject *list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 list = PyList_New(0);
1997 if (list == NULL)
1998 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04001999#ifdef HAVE_DYNAMIC_LOADING
Stéphane Wirtel0d765e32019-03-20 00:37:20 +01002000 const char *suffix;
2001 unsigned int index = 0;
2002
Brett Cannon2657df42012-05-04 15:20:40 -04002003 while ((suffix = _PyImport_DynLoadFiletab[index])) {
2004 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (item == NULL) {
2006 Py_DECREF(list);
2007 return NULL;
2008 }
2009 if (PyList_Append(list, item) < 0) {
2010 Py_DECREF(list);
2011 Py_DECREF(item);
2012 return NULL;
2013 }
2014 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04002015 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 }
Brett Cannon2657df42012-05-04 15:20:40 -04002017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019}
2020
Brett Cannon4caa61d2014-01-09 19:03:32 -05002021/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05002022_imp.init_frozen
2023
2024 name: unicode
2025 /
2026
2027Initializes a frozen module.
2028[clinic start generated code]*/
2029
Brett Cannon4caa61d2014-01-09 19:03:32 -05002030static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002031_imp_init_frozen_impl(PyObject *module, PyObject *name)
2032/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 int ret;
2035 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002036
Victor Stinner53dc7352011-03-20 01:50:21 +01002037 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 if (ret < 0)
2039 return NULL;
2040 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002041 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 }
Victor Stinner53dc7352011-03-20 01:50:21 +01002043 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 Py_XINCREF(m);
2045 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002046}
2047
Brett Cannon4caa61d2014-01-09 19:03:32 -05002048/*[clinic input]
2049_imp.get_frozen_object
2050
2051 name: unicode
2052 /
2053
2054Create a code object for a frozen module.
2055[clinic start generated code]*/
2056
Brett Cannon4caa61d2014-01-09 19:03:32 -05002057static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002058_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
2059/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002062}
2063
Brett Cannon4caa61d2014-01-09 19:03:32 -05002064/*[clinic input]
2065_imp.is_frozen_package
2066
2067 name: unicode
2068 /
2069
2070Returns True if the module name is of a frozen package.
2071[clinic start generated code]*/
2072
Brett Cannon4caa61d2014-01-09 19:03:32 -05002073static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002074_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2075/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002078}
2079
Brett Cannon4caa61d2014-01-09 19:03:32 -05002080/*[clinic input]
2081_imp.is_builtin
2082
2083 name: unicode
2084 /
2085
2086Returns True if the module name corresponds to a built-in module.
2087[clinic start generated code]*/
2088
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002090_imp_is_builtin_impl(PyObject *module, PyObject *name)
2091/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002092{
Brett Cannon4caa61d2014-01-09 19:03:32 -05002093 return PyLong_FromLong(is_builtin(name));
2094}
2095
2096/*[clinic input]
2097_imp.is_frozen
2098
2099 name: unicode
2100 /
2101
2102Returns True if the module name corresponds to a frozen module.
2103[clinic start generated code]*/
2104
Brett Cannon4caa61d2014-01-09 19:03:32 -05002105static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002106_imp_is_frozen_impl(PyObject *module, PyObject *name)
2107/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002108{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07002109 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 p = find_frozen(name);
2112 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113}
2114
Larry Hastings1df0b352015-08-24 19:53:56 -07002115/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2116static int
2117exec_builtin_or_dynamic(PyObject *mod) {
2118 PyModuleDef *def;
2119 void *state;
2120
2121 if (!PyModule_Check(mod)) {
2122 return 0;
2123 }
2124
2125 def = PyModule_GetDef(mod);
2126 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07002127 return 0;
2128 }
Brett Cannon52794db2016-09-07 17:00:43 -07002129
Larry Hastings1df0b352015-08-24 19:53:56 -07002130 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07002131 if (state) {
2132 /* Already initialized; skip reload */
2133 return 0;
2134 }
Brett Cannon52794db2016-09-07 17:00:43 -07002135
Larry Hastings1df0b352015-08-24 19:53:56 -07002136 return PyModule_ExecDef(mod, def);
2137}
2138
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002139#ifdef HAVE_DYNAMIC_LOADING
2140
Brett Cannon4caa61d2014-01-09 19:03:32 -05002141/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002142_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002143
Nick Coghland5cacbb2015-05-23 22:24:10 +10002144 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002145 file: object = NULL
2146 /
2147
Nick Coghland5cacbb2015-05-23 22:24:10 +10002148Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002149[clinic start generated code]*/
2150
Brett Cannon4caa61d2014-01-09 19:03:32 -05002151static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002152_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2153/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002154{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002155 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002156 FILE *fp;
2157
Nick Coghland5cacbb2015-05-23 22:24:10 +10002158 name = PyObject_GetAttrString(spec, "name");
2159 if (name == NULL) {
2160 return NULL;
2161 }
2162
2163 path = PyObject_GetAttrString(spec, "origin");
2164 if (path == NULL) {
2165 Py_DECREF(name);
2166 return NULL;
2167 }
2168
2169 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002170 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002171 Py_DECREF(name);
2172 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002173 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002174 return mod;
2175 }
2176
Brett Cannon4caa61d2014-01-09 19:03:32 -05002177 if (file != NULL) {
2178 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002179 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002180 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002181 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002183 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002185 else
2186 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002187
2188 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2189
2190 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002191 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 if (fp)
2193 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002194 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002195}
2196
Nick Coghland5cacbb2015-05-23 22:24:10 +10002197/*[clinic input]
2198_imp.exec_dynamic -> int
2199
2200 mod: object
2201 /
2202
2203Initialize an extension module.
2204[clinic start generated code]*/
2205
2206static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002207_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2208/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002209{
Larry Hastings1df0b352015-08-24 19:53:56 -07002210 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002211}
2212
2213
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002214#endif /* HAVE_DYNAMIC_LOADING */
2215
Larry Hastings7726ac92014-01-31 22:03:12 -08002216/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002217_imp.exec_builtin -> int
2218
2219 mod: object
2220 /
2221
2222Initialize a built-in module.
2223[clinic start generated code]*/
2224
2225static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002226_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2227/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002228{
2229 return exec_builtin_or_dynamic(mod);
2230}
2231
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002232/*[clinic input]
2233_imp.source_hash
2234
2235 key: long
2236 source: Py_buffer
2237[clinic start generated code]*/
2238
2239static PyObject *
2240_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2241/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2242{
Benjamin Peterson83620772017-12-09 12:18:56 -08002243 union {
2244 uint64_t x;
2245 char data[sizeof(uint64_t)];
2246 } hash;
2247 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002248#if !PY_LITTLE_ENDIAN
2249 // Force to little-endian. There really ought to be a succinct standard way
2250 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002251 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2252 char tmp = hash.data[i];
2253 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2254 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002255 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002256#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002257 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002258}
2259
Barry Warsaw28a691b2010-04-17 00:19:56 +00002260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002261PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002262"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002263
Guido van Rossum79f25d91997-04-29 20:08:16 +00002264static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002265 _IMP_EXTENSION_SUFFIXES_METHODDEF
2266 _IMP_LOCK_HELD_METHODDEF
2267 _IMP_ACQUIRE_LOCK_METHODDEF
2268 _IMP_RELEASE_LOCK_METHODDEF
2269 _IMP_GET_FROZEN_OBJECT_METHODDEF
2270 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002271 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002272 _IMP_INIT_FROZEN_METHODDEF
2273 _IMP_IS_BUILTIN_METHODDEF
2274 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002275 _IMP_CREATE_DYNAMIC_METHODDEF
2276 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002277 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002278 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002279 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002280 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002281};
2282
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002283
Martin v. Löwis1a214512008-06-11 05:26:20 +00002284static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002286 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 doc_imp,
2288 0,
2289 imp_methods,
2290 NULL,
2291 NULL,
2292 NULL,
2293 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002294};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002295
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002296PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002297PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 m = PyModule_Create(&impmodule);
2302 if (m == NULL)
2303 goto failure;
2304 d = PyModule_GetDict(m);
2305 if (d == NULL)
2306 goto failure;
Victor Stinnercaba55b2018-08-03 15:33:52 +02002307 _PyCoreConfig *config = &_PyInterpreterState_Get()->core_config;
Victor Stinnercb9fbd32019-05-01 23:51:56 -04002308 PyObject *pyc_mode = PyUnicode_FromWideChar(config->check_hash_pycs_mode, -1);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002309 if (pyc_mode == NULL) {
2310 goto failure;
2311 }
2312 if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) {
2313 Py_DECREF(pyc_mode);
2314 goto failure;
2315 }
2316 Py_DECREF(pyc_mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002319 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 Py_XDECREF(m);
2321 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002322}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002323
2324
Guido van Rossumb18618d2000-05-03 23:44:39 +00002325/* API for embedding applications that want to add their own entries
2326 to the table of built-in modules. This should normally be called
2327 *before* Py_Initialize(). When the table resize fails, -1 is
2328 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002329
2330 After a similar function by Just van Rossum. */
2331
2332int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002336 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002337 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 /* Count the number of entries in both tables */
2340 for (n = 0; newtab[n].name != NULL; n++)
2341 ;
2342 if (n == 0)
2343 return 0; /* Nothing to do */
2344 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2345 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002346
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002347 /* Force default raw memory allocator to get a known allocator to be able
2348 to release the memory in _PyImport_Fini2() */
2349 PyMemAllocatorEx old_alloc;
2350 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002353 p = NULL;
2354 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002355 size_t size = sizeof(struct _inittab) * (i + n + 1);
2356 p = PyMem_RawRealloc(inittab_copy, size);
2357 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002358 if (p == NULL) {
2359 res = -1;
2360 goto done;
2361 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002362
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002363 /* Copy the tables into the new memory at the first call
2364 to PyImport_ExtendInittab(). */
2365 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002367 }
2368 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2369 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002370
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002371done:
2372 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2373 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002374}
2375
2376/* Shorthand to add a single entry given a name and a function */
2377
2378int
Brett Cannona826f322009-04-02 03:41:46 +00002379PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002384
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002385 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002389}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002390
2391#ifdef __cplusplus
2392}
2393#endif