blob: 898321ac3b475bbfec20fbf1a65103d5367e9d8b [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. */
538 _PyGC_DumpShutdownStats();
539
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);
969 if (m == NULL) {
Brett Cannon18fc4e72014-04-04 10:01:46 -0400970 PyErr_Format(PyExc_ImportError,
971 "Loaded module %R not found in sys.modules",
972 name);
973 return NULL;
974 }
975
Brett Cannon18fc4e72014-04-04 10:01:46 -0400976 return m;
977}
978
979PyObject*
980PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
981 PyObject *cpathname)
982{
Eric Snow32439d62015-05-02 19:15:18 -0600983 PyObject *d, *external, *res;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200984 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Eric Snow08197a42014-05-12 17:54:55 -0600985 _Py_IDENTIFIER(_fix_up_module);
Brett Cannon18fc4e72014-04-04 10:01:46 -0400986
987 d = module_dict_for_exec(name);
988 if (d == NULL) {
989 return NULL;
990 }
991
Eric Snow08197a42014-05-12 17:54:55 -0600992 if (pathname == NULL) {
993 pathname = ((PyCodeObject *)co)->co_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 }
Eric Snow32439d62015-05-02 19:15:18 -0600995 external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
996 if (external == NULL)
997 return NULL;
998 res = _PyObject_CallMethodIdObjArgs(external,
Eric Snow08197a42014-05-12 17:54:55 -0600999 &PyId__fix_up_module,
1000 d, name, pathname, cpathname, NULL);
Eric Snow32439d62015-05-02 19:15:18 -06001001 Py_DECREF(external);
Eric Snow08197a42014-05-12 17:54:55 -06001002 if (res != NULL) {
Eric Snow58cfdd82014-05-29 12:31:39 -06001003 Py_DECREF(res);
Eric Snow08197a42014-05-12 17:54:55 -06001004 res = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 }
Eric Snow08197a42014-05-12 17:54:55 -06001006 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007}
1008
1009
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001010static void
1011update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 PyObject *constants, *tmp;
1014 Py_ssize_t i, n;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if (PyUnicode_Compare(co->co_filename, oldname))
1017 return;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001018
Serhiy Storchaka576f1322016-01-05 21:27:54 +02001019 Py_INCREF(newname);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001020 Py_XSETREF(co->co_filename, newname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 constants = co->co_consts;
1023 n = PyTuple_GET_SIZE(constants);
1024 for (i = 0; i < n; i++) {
1025 tmp = PyTuple_GET_ITEM(constants, i);
1026 if (PyCode_Check(tmp))
1027 update_code_filenames((PyCodeObject *)tmp,
1028 oldname, newname);
1029 }
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001030}
1031
Victor Stinner2f42ae52011-03-20 00:41:24 +01001032static void
1033update_compiled_module(PyCodeObject *co, PyObject *newname)
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001034{
Victor Stinner2f42ae52011-03-20 00:41:24 +01001035 PyObject *oldname;
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001036
Victor Stinner2f42ae52011-03-20 00:41:24 +01001037 if (PyUnicode_Compare(co->co_filename, newname) == 0)
1038 return;
Hirokazu Yamamoto4f447fb2009-03-04 01:52:10 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 oldname = co->co_filename;
1041 Py_INCREF(oldname);
1042 update_code_filenames(co, oldname, newname);
1043 Py_DECREF(oldname);
Antoine Pitroud35cbf62009-01-06 19:02:24 +00001044}
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001045
Brett Cannon4caa61d2014-01-09 19:03:32 -05001046/*[clinic input]
1047_imp._fix_co_filename
1048
1049 code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
1050 Code object to change.
1051
1052 path: unicode
1053 File path to use.
1054 /
1055
1056Changes code.co_filename to specify the passed-in file path.
1057[clinic start generated code]*/
1058
Brett Cannon4caa61d2014-01-09 19:03:32 -05001059static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001060_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
Larry Hastings89964c42015-04-14 18:07:59 -04001061 PyObject *path)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001062/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
Brett Cannon442c9b92011-03-23 16:14:42 -07001063
Brett Cannon4caa61d2014-01-09 19:03:32 -05001064{
Brett Cannona6dec2e2014-01-10 07:43:55 -05001065 update_compiled_module(code, path);
Brett Cannon442c9b92011-03-23 16:14:42 -07001066
1067 Py_RETURN_NONE;
1068}
1069
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001070
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001071/* Forward */
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001072static const struct _frozen * find_frozen(PyObject *);
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001073
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001074
1075/* Helper to test for built-in module */
1076
1077static int
Victor Stinner95872862011-03-07 18:20:56 +01001078is_builtin(PyObject *name)
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001079{
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001080 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001082 if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 if (PyImport_Inittab[i].initfunc == NULL)
1084 return -1;
1085 else
1086 return 1;
1087 }
1088 }
1089 return 0;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001090}
1091
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001092
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001093/* Return a finder object for a sys.path/pkg.__path__ item 'p',
Just van Rossum52e14d62002-12-30 22:08:05 +00001094 possibly by fetching it from the path_importer_cache dict. If it
Thomas Wouters89f507f2006-12-13 04:49:30 +00001095 wasn't yet cached, traverse path_hooks until a hook is found
Just van Rossum52e14d62002-12-30 22:08:05 +00001096 that can handle the path item. Return None if no hook could;
Brett Cannonfdcdd9e2016-07-08 11:00:00 -07001097 this tells our caller that the path based finder could not find
1098 a finder for this path item. Cache the result in
1099 path_importer_cache.
Just van Rossum52e14d62002-12-30 22:08:05 +00001100 Returns a borrowed reference. */
1101
1102static PyObject *
1103get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 PyObject *p)
Just van Rossum52e14d62002-12-30 22:08:05 +00001105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 PyObject *importer;
1107 Py_ssize_t j, nhooks;
Just van Rossum52e14d62002-12-30 22:08:05 +00001108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 /* These conditions are the caller's responsibility: */
1110 assert(PyList_Check(path_hooks));
1111 assert(PyDict_Check(path_importer_cache));
Just van Rossum52e14d62002-12-30 22:08:05 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 nhooks = PyList_Size(path_hooks);
1114 if (nhooks < 0)
1115 return NULL; /* Shouldn't happen */
Just van Rossum52e14d62002-12-30 22:08:05 +00001116
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001117 importer = PyDict_GetItemWithError(path_importer_cache, p);
1118 if (importer != NULL || PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 /* set path_importer_cache[p] to None to avoid recursion */
1122 if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
1123 return NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 for (j = 0; j < nhooks; j++) {
1126 PyObject *hook = PyList_GetItem(path_hooks, j);
1127 if (hook == NULL)
1128 return NULL;
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01001129 importer = PyObject_CallFunctionObjArgs(hook, p, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 if (importer != NULL)
1131 break;
Just van Rossum52e14d62002-12-30 22:08:05 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 if (!PyErr_ExceptionMatches(PyExc_ImportError)) {
1134 return NULL;
1135 }
1136 PyErr_Clear();
1137 }
1138 if (importer == NULL) {
Brett Cannonaa936422012-04-27 15:30:58 -04001139 return Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 }
1141 if (importer != NULL) {
1142 int err = PyDict_SetItem(path_importer_cache, p, importer);
1143 Py_DECREF(importer);
1144 if (err != 0)
1145 return NULL;
1146 }
1147 return importer;
Just van Rossum52e14d62002-12-30 22:08:05 +00001148}
1149
Benjamin Petersone5024512018-09-12 12:06:42 -07001150PyObject *
Christian Heimes9cd17752007-11-18 19:35:23 +00001151PyImport_GetImporter(PyObject *path) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL;
Christian Heimes9cd17752007-11-18 19:35:23 +00001153
Victor Stinner1e53bba2013-07-16 22:26:05 +02001154 path_importer_cache = PySys_GetObject("path_importer_cache");
1155 path_hooks = PySys_GetObject("path_hooks");
1156 if (path_importer_cache != NULL && path_hooks != NULL) {
1157 importer = get_path_importer(path_importer_cache,
1158 path_hooks, path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 }
1160 Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */
1161 return importer;
Christian Heimes9cd17752007-11-18 19:35:23 +00001162}
1163
Nick Coghland5cacbb2015-05-23 22:24:10 +10001164/*[clinic input]
1165_imp.create_builtin
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166
Nick Coghland5cacbb2015-05-23 22:24:10 +10001167 spec: object
1168 /
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001169
Nick Coghland5cacbb2015-05-23 22:24:10 +10001170Create an extension module.
1171[clinic start generated code]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001172
Nick Coghland5cacbb2015-05-23 22:24:10 +10001173static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001174_imp_create_builtin(PyObject *module, PyObject *spec)
1175/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 struct _inittab *p;
Nick Coghland5cacbb2015-05-23 22:24:10 +10001178 PyObject *name;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001179 const char *namestr;
Victor Stinner5eb4f592013-11-14 22:38:52 +01001180 PyObject *mod;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001181
Nick Coghland5cacbb2015-05-23 22:24:10 +10001182 name = PyObject_GetAttrString(spec, "name");
1183 if (name == NULL) {
1184 return NULL;
1185 }
1186
Victor Stinner5eb4f592013-11-14 22:38:52 +01001187 mod = _PyImport_FindExtensionObject(name, name);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001188 if (mod || PyErr_Occurred()) {
1189 Py_DECREF(name);
Raymond Hettingerf0afe772016-08-31 08:44:11 -07001190 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10001191 return mod;
1192 }
1193
1194 namestr = PyUnicode_AsUTF8(name);
1195 if (namestr == NULL) {
1196 Py_DECREF(name);
1197 return NULL;
1198 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001199
Eric Snowd393c1b2017-09-14 12:18:12 -06001200 PyObject *modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 for (p = PyImport_Inittab; p->name != NULL; p++) {
Antoine Pitrou6c40eb72012-01-18 20:16:09 +01001202 PyModuleDef *def;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001203 if (_PyUnicode_EqualToASCIIString(name, p->name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 if (p->initfunc == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001205 /* Cannot re-init internal module ("sys" or "builtins") */
1206 mod = PyImport_AddModule(namestr);
1207 Py_DECREF(name);
1208 return mod;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 mod = (*p->initfunc)();
Nick Coghland5cacbb2015-05-23 22:24:10 +10001211 if (mod == NULL) {
1212 Py_DECREF(name);
1213 return NULL;
1214 }
1215 if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1216 Py_DECREF(name);
1217 return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
1218 } else {
1219 /* Remember pointer to module init function. */
1220 def = PyModule_GetDef(mod);
Christian Heimesa78b6272016-09-09 00:25:03 +02001221 if (def == NULL) {
1222 Py_DECREF(name);
1223 return NULL;
1224 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001225 def->m_base.m_init = p->initfunc;
Eric Snowd393c1b2017-09-14 12:18:12 -06001226 if (modules == NULL) {
1227 modules = PyImport_GetModuleDict();
1228 }
1229 if (_PyImport_FixupExtensionObject(mod, name, name,
1230 modules) < 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10001231 Py_DECREF(name);
1232 return NULL;
1233 }
1234 Py_DECREF(name);
1235 return mod;
1236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 }
1238 }
Nick Coghland5cacbb2015-05-23 22:24:10 +10001239 Py_DECREF(name);
1240 Py_RETURN_NONE;
Guido van Rossum7f133ed1991-02-19 12:23:57 +00001241}
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001242
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001244/* Frozen modules */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001246static const struct _frozen *
Victor Stinner53dc7352011-03-20 01:50:21 +01001247find_frozen(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001248{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001249 const struct _frozen *p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001250
Victor Stinner53dc7352011-03-20 01:50:21 +01001251 if (name == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 return NULL;
Benjamin Petersond968e272008-11-05 22:48:33 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 for (p = PyImport_FrozenModules; ; p++) {
1255 if (p->name == NULL)
1256 return NULL;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001257 if (_PyUnicode_EqualToASCIIString(name, p->name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 break;
1259 }
1260 return p;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001261}
1262
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001264get_frozen_object(PyObject *name)
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001265{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001266 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 if (p == NULL) {
1270 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001271 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 name);
1273 return NULL;
1274 }
1275 if (p->code == NULL) {
1276 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001277 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 name);
1279 return NULL;
1280 }
1281 size = p->size;
1282 if (size < 0)
1283 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001284 return PyMarshal_ReadObjectFromString((const char *)p->code, size);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001285}
1286
Brett Cannon8d110132009-03-15 02:20:16 +00001287static PyObject *
Victor Stinner53dc7352011-03-20 01:50:21 +01001288is_frozen_package(PyObject *name)
Brett Cannon8d110132009-03-15 02:20:16 +00001289{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001290 const struct _frozen *p = find_frozen(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 int size;
Brett Cannon8d110132009-03-15 02:20:16 +00001292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 if (p == NULL) {
1294 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001295 "No such frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 name);
1297 return NULL;
1298 }
Brett Cannon8d110132009-03-15 02:20:16 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 size = p->size;
Brett Cannon8d110132009-03-15 02:20:16 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (size < 0)
1303 Py_RETURN_TRUE;
1304 else
1305 Py_RETURN_FALSE;
Brett Cannon8d110132009-03-15 02:20:16 +00001306}
1307
1308
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001309/* Initialize a frozen module.
Brett Cannon3c2ac442009-03-08 20:49:47 +00001310 Return 1 for success, 0 if the module is not found, and -1 with
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001311 an exception set if the initialization failed.
1312 This function is also used from frozenmain.c */
Guido van Rossum0b344901995-02-07 15:35:27 +00001313
1314int
Victor Stinner53dc7352011-03-20 01:50:21 +01001315PyImport_ImportFrozenModuleObject(PyObject *name)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001316{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07001317 const struct _frozen *p;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001318 PyObject *co, *m, *d;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 int ispackage;
1320 int size;
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00001321
Victor Stinner53dc7352011-03-20 01:50:21 +01001322 p = find_frozen(name);
1323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 if (p == NULL)
1325 return 0;
1326 if (p->code == NULL) {
1327 PyErr_Format(PyExc_ImportError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001328 "Excluded frozen object named %R",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 name);
1330 return -1;
1331 }
1332 size = p->size;
1333 ispackage = (size < 0);
1334 if (ispackage)
1335 size = -size;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001336 co = PyMarshal_ReadObjectFromString((const char *)p->code, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 if (co == NULL)
1338 return -1;
1339 if (!PyCode_Check(co)) {
1340 PyErr_Format(PyExc_TypeError,
Victor Stinner53dc7352011-03-20 01:50:21 +01001341 "frozen object %R is not a code object",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 name);
1343 goto err_return;
1344 }
1345 if (ispackage) {
Brett Cannon3e0651b2013-05-31 23:18:39 -04001346 /* Set __path__ to the empty list */
Brett Cannon18fc4e72014-04-04 10:01:46 -04001347 PyObject *l;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 int err;
Victor Stinner53dc7352011-03-20 01:50:21 +01001349 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 if (m == NULL)
1351 goto err_return;
1352 d = PyModule_GetDict(m);
Brett Cannon3e0651b2013-05-31 23:18:39 -04001353 l = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 if (l == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 goto err_return;
1356 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 err = PyDict_SetItemString(d, "__path__", l);
1358 Py_DECREF(l);
1359 if (err != 0)
1360 goto err_return;
1361 }
Brett Cannon18fc4e72014-04-04 10:01:46 -04001362 d = module_dict_for_exec(name);
1363 if (d == NULL) {
Victor Stinner53dc7352011-03-20 01:50:21 +01001364 goto err_return;
Brett Cannon18fc4e72014-04-04 10:01:46 -04001365 }
1366 m = exec_code_in_module(name, d, co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 if (m == NULL)
1368 goto err_return;
1369 Py_DECREF(co);
1370 Py_DECREF(m);
1371 return 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001372err_return:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 Py_DECREF(co);
1374 return -1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001375}
Guido van Rossum74e6a111994-08-29 12:54:38 +00001376
Victor Stinner53dc7352011-03-20 01:50:21 +01001377int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001378PyImport_ImportFrozenModule(const char *name)
Victor Stinner53dc7352011-03-20 01:50:21 +01001379{
1380 PyObject *nameobj;
1381 int ret;
1382 nameobj = PyUnicode_InternFromString(name);
1383 if (nameobj == NULL)
1384 return -1;
1385 ret = PyImport_ImportFrozenModuleObject(nameobj);
1386 Py_DECREF(nameobj);
1387 return ret;
1388}
1389
Guido van Rossum74e6a111994-08-29 12:54:38 +00001390
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001391/* Import a module, either built-in, frozen, or external, and return
Guido van Rossum7f9fa971995-01-20 16:53:12 +00001392 its module object WITH INCREMENTED REFERENCE COUNT */
Guido van Rossum74e6a111994-08-29 12:54:38 +00001393
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001395PyImport_ImportModule(const char *name)
Guido van Rossum74e6a111994-08-29 12:54:38 +00001396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 PyObject *pname;
1398 PyObject *result;
Marc-André Lemburg3c61c352001-02-09 19:40:15 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 pname = PyUnicode_FromString(name);
1401 if (pname == NULL)
1402 return NULL;
1403 result = PyImport_Import(pname);
1404 Py_DECREF(pname);
1405 return result;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001406}
1407
Christian Heimes072c0f12008-01-03 23:01:04 +00001408/* Import a module without blocking
1409 *
1410 * At first it tries to fetch the module from sys.modules. If the module was
1411 * never loaded before it loads it with PyImport_ImportModule() unless another
1412 * thread holds the import lock. In the latter case the function raises an
1413 * ImportError instead of blocking.
1414 *
1415 * Returns the module object with incremented ref count.
1416 */
1417PyObject *
1418PyImport_ImportModuleNoBlock(const char *name)
1419{
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001420 return PyImport_ImportModule(name);
Christian Heimes072c0f12008-01-03 23:01:04 +00001421}
1422
Guido van Rossum17fc85f1997-09-06 18:52:03 +00001423
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001424/* Remove importlib frames from the traceback,
1425 * except in Verbose mode. */
1426static void
1427remove_importlib_frames(void)
1428{
1429 const char *importlib_filename = "<frozen importlib._bootstrap>";
Eric Snow32439d62015-05-02 19:15:18 -06001430 const char *external_filename = "<frozen importlib._bootstrap_external>";
Nick Coghlan42c07662012-07-31 21:14:18 +10001431 const char *remove_frames = "_call_with_frames_removed";
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001432 int always_trim = 0;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001433 int in_importlib = 0;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001434 PyObject *exception, *value, *base_tb, *tb;
Benjamin Petersonfa873702012-07-09 13:43:53 -07001435 PyObject **prev_link, **outer_link = NULL;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001436
1437 /* Synopsis: if it's an ImportError, we trim all importlib chunks
Nick Coghlan42c07662012-07-31 21:14:18 +10001438 from the traceback. We always trim chunks
1439 which end with a call to "_call_with_frames_removed". */
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001440
1441 PyErr_Fetch(&exception, &value, &base_tb);
1442 if (!exception || Py_VerboseFlag)
1443 goto done;
1444 if (PyType_IsSubtype((PyTypeObject *) exception,
1445 (PyTypeObject *) PyExc_ImportError))
1446 always_trim = 1;
1447
1448 prev_link = &base_tb;
1449 tb = base_tb;
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001450 while (tb != NULL) {
1451 PyTracebackObject *traceback = (PyTracebackObject *)tb;
1452 PyObject *next = (PyObject *) traceback->tb_next;
1453 PyFrameObject *frame = traceback->tb_frame;
1454 PyCodeObject *code = frame->f_code;
1455 int now_in_importlib;
1456
1457 assert(PyTraceBack_Check(tb));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001458 now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1459 _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001460 if (now_in_importlib && !in_importlib) {
1461 /* This is the link to this chunk of importlib tracebacks */
1462 outer_link = prev_link;
1463 }
1464 in_importlib = now_in_importlib;
1465
1466 if (in_importlib &&
1467 (always_trim ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001468 _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001469 Py_XINCREF(next);
Serhiy Storchakaec397562016-04-06 09:50:03 +03001470 Py_XSETREF(*outer_link, next);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001471 prev_link = outer_link;
1472 }
1473 else {
1474 prev_link = (PyObject **) &traceback->tb_next;
1475 }
1476 tb = next;
1477 }
1478done:
1479 PyErr_Restore(exception, value, base_tb);
1480}
1481
1482
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001483static PyObject *
1484resolve_name(PyObject *name, PyObject *globals, int level)
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001485{
Eric Snowb523f842013-11-22 09:05:39 -07001486 _Py_IDENTIFIER(__spec__);
Brett Cannonfd074152012-04-14 14:10:13 -04001487 _Py_IDENTIFIER(__package__);
1488 _Py_IDENTIFIER(__path__);
1489 _Py_IDENTIFIER(__name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001490 _Py_IDENTIFIER(parent);
1491 PyObject *abs_name;
1492 PyObject *package = NULL;
1493 PyObject *spec;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001494 Py_ssize_t last_dot;
1495 PyObject *base;
1496 int level_up;
1497
1498 if (globals == NULL) {
1499 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1500 goto error;
1501 }
1502 if (!PyDict_Check(globals)) {
1503 PyErr_SetString(PyExc_TypeError, "globals must be a dict");
1504 goto error;
1505 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001506 package = _PyDict_GetItemIdWithError(globals, &PyId___package__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001507 if (package == Py_None) {
1508 package = NULL;
1509 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001510 else if (package == NULL && PyErr_Occurred()) {
1511 goto error;
1512 }
1513 spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__);
1514 if (spec == NULL && PyErr_Occurred()) {
1515 goto error;
1516 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001517
1518 if (package != NULL) {
1519 Py_INCREF(package);
1520 if (!PyUnicode_Check(package)) {
1521 PyErr_SetString(PyExc_TypeError, "package must be a string");
1522 goto error;
1523 }
1524 else if (spec != NULL && spec != Py_None) {
1525 int equal;
1526 PyObject *parent = _PyObject_GetAttrId(spec, &PyId_parent);
1527 if (parent == NULL) {
1528 goto error;
1529 }
1530
1531 equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1532 Py_DECREF(parent);
1533 if (equal < 0) {
1534 goto error;
1535 }
1536 else if (equal == 0) {
1537 if (PyErr_WarnEx(PyExc_ImportWarning,
1538 "__package__ != __spec__.parent", 1) < 0) {
1539 goto error;
1540 }
1541 }
1542 }
1543 }
1544 else if (spec != NULL && spec != Py_None) {
1545 package = _PyObject_GetAttrId(spec, &PyId_parent);
1546 if (package == NULL) {
1547 goto error;
1548 }
1549 else if (!PyUnicode_Check(package)) {
1550 PyErr_SetString(PyExc_TypeError,
1551 "__spec__.parent must be a string");
1552 goto error;
1553 }
1554 }
1555 else {
1556 if (PyErr_WarnEx(PyExc_ImportWarning,
1557 "can't resolve package from __spec__ or __package__, "
1558 "falling back on __name__ and __path__", 1) < 0) {
1559 goto error;
1560 }
1561
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001562 package = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001563 if (package == NULL) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001564 if (!PyErr_Occurred()) {
1565 PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
1566 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001567 goto error;
1568 }
1569
1570 Py_INCREF(package);
1571 if (!PyUnicode_Check(package)) {
1572 PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
1573 goto error;
1574 }
1575
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001576 if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001577 Py_ssize_t dot;
1578
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001579 if (PyErr_Occurred() || PyUnicode_READY(package) < 0) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001580 goto error;
1581 }
1582
1583 dot = PyUnicode_FindChar(package, '.',
1584 0, PyUnicode_GET_LENGTH(package), -1);
1585 if (dot == -2) {
1586 goto error;
1587 }
1588
1589 if (dot >= 0) {
1590 PyObject *substr = PyUnicode_Substring(package, 0, dot);
1591 if (substr == NULL) {
1592 goto error;
1593 }
1594 Py_SETREF(package, substr);
1595 }
1596 }
1597 }
1598
1599 last_dot = PyUnicode_GET_LENGTH(package);
1600 if (last_dot == 0) {
1601 PyErr_SetString(PyExc_ImportError,
1602 "attempted relative import with no known parent package");
1603 goto error;
1604 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001605
1606 for (level_up = 1; level_up < level; level_up += 1) {
1607 last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1608 if (last_dot == -2) {
1609 goto error;
1610 }
1611 else if (last_dot == -1) {
1612 PyErr_SetString(PyExc_ValueError,
1613 "attempted relative import beyond top-level "
1614 "package");
1615 goto error;
1616 }
1617 }
1618
1619 base = PyUnicode_Substring(package, 0, last_dot);
1620 Py_DECREF(package);
1621 if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1622 return base;
1623 }
1624
1625 abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1626 Py_DECREF(base);
1627 return abs_name;
1628
1629 error:
1630 Py_XDECREF(package);
1631 return NULL;
1632}
1633
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001634static PyObject *
1635import_find_and_load(PyObject *abs_name)
1636{
1637 _Py_IDENTIFIER(_find_and_load);
1638 PyObject *mod = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001639 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001640 int import_time = interp->core_config.import_time;
1641 static int import_level;
1642 static _PyTime_t accumulated;
1643
1644 _PyTime_t t1 = 0, accumulated_copy = accumulated;
1645
1646 /* XOptions is initialized after first some imports.
1647 * So we can't have negative cache before completed initialization.
1648 * Anyway, importlib._find_and_load is much slower than
1649 * _PyDict_GetItemIdWithError().
1650 */
1651 if (import_time) {
1652 static int header = 1;
1653 if (header) {
1654 fputs("import time: self [us] | cumulative | imported package\n",
1655 stderr);
1656 header = 0;
1657 }
1658
1659 import_level++;
1660 t1 = _PyTime_GetPerfCounter();
1661 accumulated = 0;
1662 }
1663
1664 if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1665 PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1666
1667 mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
1668 &PyId__find_and_load, abs_name,
1669 interp->import_func, NULL);
1670
1671 if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1672 PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1673 mod != NULL);
1674
1675 if (import_time) {
1676 _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1677
1678 import_level--;
1679 fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1680 (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1681 (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1682 import_level*2, "", PyUnicode_AsUTF8(abs_name));
1683
1684 accumulated = accumulated_copy + cum;
1685 }
1686
1687 return mod;
1688}
1689
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001690PyObject *
1691PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1692 PyObject *locals, PyObject *fromlist,
1693 int level)
1694{
Brett Cannonfd074152012-04-14 14:10:13 -04001695 _Py_IDENTIFIER(_handle_fromlist);
Brett Cannonfd074152012-04-14 14:10:13 -04001696 PyObject *abs_name = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -04001697 PyObject *final_mod = NULL;
1698 PyObject *mod = NULL;
1699 PyObject *package = NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001700 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001701 int has_from;
Brett Cannonfd074152012-04-14 14:10:13 -04001702
Brett Cannonfd074152012-04-14 14:10:13 -04001703 if (name == NULL) {
1704 PyErr_SetString(PyExc_ValueError, "Empty module name");
1705 goto error;
1706 }
1707
1708 /* The below code is importlib.__import__() & _gcd_import(), ported to C
1709 for added performance. */
1710
1711 if (!PyUnicode_Check(name)) {
1712 PyErr_SetString(PyExc_TypeError, "module name must be a string");
1713 goto error;
1714 }
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001715 if (PyUnicode_READY(name) < 0) {
Brett Cannonfd074152012-04-14 14:10:13 -04001716 goto error;
1717 }
1718 if (level < 0) {
1719 PyErr_SetString(PyExc_ValueError, "level must be >= 0");
1720 goto error;
1721 }
Brett Cannon849113a2016-01-22 15:25:50 -08001722
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001723 if (level > 0) {
1724 abs_name = resolve_name(name, globals, level);
1725 if (abs_name == NULL)
Brett Cannon9fa81262016-01-22 16:39:02 -08001726 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001727 }
1728 else { /* level == 0 */
1729 if (PyUnicode_GET_LENGTH(name) == 0) {
1730 PyErr_SetString(PyExc_ValueError, "Empty module name");
1731 goto error;
1732 }
Brett Cannonfd074152012-04-14 14:10:13 -04001733 abs_name = name;
1734 Py_INCREF(abs_name);
1735 }
1736
Eric Snow3f9eee62017-09-15 16:35:20 -06001737 mod = PyImport_GetModule(abs_name);
Serhiy Storchakab4baace2017-07-06 08:09:03 +03001738 if (mod != NULL && mod != Py_None) {
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001739 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001740 _Py_IDENTIFIER(_lock_unlock_module);
Eric Snowb523f842013-11-22 09:05:39 -07001741 PyObject *spec;
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001742
Antoine Pitrou03989852012-08-28 00:24:52 +02001743 /* Optimization: only call _bootstrap._lock_unlock_module() if
Eric Snowb523f842013-11-22 09:05:39 -07001744 __spec__._initializing is true.
1745 NOTE: because of this, initializing must be set *before*
Antoine Pitrou03989852012-08-28 00:24:52 +02001746 stuffing the new module in sys.modules.
1747 */
Eric Snowb523f842013-11-22 09:05:39 -07001748 spec = _PyObject_GetAttrId(mod, &PyId___spec__);
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001749 if (_PyModuleSpec_IsInitializing(spec)) {
1750 PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib,
1751 &PyId__lock_unlock_module, abs_name,
1752 NULL);
1753 if (value == NULL) {
1754 Py_DECREF(spec);
1755 goto error;
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001756 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001757 Py_DECREF(value);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001758 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +02001759 Py_XDECREF(spec);
Brett Cannonfd074152012-04-14 14:10:13 -04001760 }
1761 else {
Neil Schemenauer11cc2892017-12-07 16:24:59 -08001762 Py_XDECREF(mod);
Neil Schemenauereea3cc12017-12-03 09:26:03 -08001763 mod = import_find_and_load(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001764 if (mod == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001765 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001766 }
1767 }
1768
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001769 has_from = 0;
1770 if (fromlist != NULL && fromlist != Py_None) {
1771 has_from = PyObject_IsTrue(fromlist);
1772 if (has_from < 0)
1773 goto error;
1774 }
Serhiy Storchakafa494fd2015-05-30 17:45:22 +03001775 if (!has_from) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001776 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1777 if (level == 0 || len > 0) {
1778 Py_ssize_t dot;
Brett Cannonfd074152012-04-14 14:10:13 -04001779
Victor Stinner744c34e2016-05-20 11:36:13 +02001780 dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1781 if (dot == -2) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001782 goto error;
Brett Cannonfd074152012-04-14 14:10:13 -04001783 }
1784
Victor Stinner744c34e2016-05-20 11:36:13 +02001785 if (dot == -1) {
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001786 /* No dot in module name, simple exit */
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001787 final_mod = mod;
1788 Py_INCREF(mod);
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001789 goto error;
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001790 }
1791
Brett Cannonfd074152012-04-14 14:10:13 -04001792 if (level == 0) {
Victor Stinner744c34e2016-05-20 11:36:13 +02001793 PyObject *front = PyUnicode_Substring(name, 0, dot);
1794 if (front == NULL) {
1795 goto error;
1796 }
1797
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001798 final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
Antoine Pitroub78174c2012-05-06 17:15:23 +02001799 Py_DECREF(front);
Brett Cannonfd074152012-04-14 14:10:13 -04001800 }
1801 else {
Victor Stinner744c34e2016-05-20 11:36:13 +02001802 Py_ssize_t cut_off = len - dot;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001803 Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001804 PyObject *to_return = PyUnicode_Substring(abs_name, 0,
Brett Cannonfd074152012-04-14 14:10:13 -04001805 abs_name_len - cut_off);
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001806 if (to_return == NULL) {
Antoine Pitrouea3eb882012-05-17 18:55:59 +02001807 goto error;
Antoine Pitrou22a1d172012-04-16 22:06:21 +02001808 }
Brett Cannonfd074152012-04-14 14:10:13 -04001809
Eric Snow3f9eee62017-09-15 16:35:20 -06001810 final_mod = PyImport_GetModule(to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001811 Py_DECREF(to_return);
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001812 if (final_mod == NULL) {
1813 PyErr_Format(PyExc_KeyError,
1814 "%R not in sys.modules as expected",
1815 to_return);
Serhiy Storchaka133138a2016-08-02 22:51:21 +03001816 goto error;
Brett Cannon49f8d8b2012-04-14 21:50:00 -04001817 }
Brett Cannonfd074152012-04-14 14:10:13 -04001818 }
1819 }
1820 else {
1821 final_mod = mod;
1822 Py_INCREF(mod);
1823 }
1824 }
1825 else {
Serhiy Storchaka4e244252018-03-11 10:52:37 +02001826 _Py_IDENTIFIER(__path__);
1827 PyObject *path;
1828 if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) {
1829 goto error;
1830 }
1831 if (path) {
1832 Py_DECREF(path);
1833 final_mod = _PyObject_CallMethodIdObjArgs(
1834 interp->importlib, &PyId__handle_fromlist,
1835 mod, fromlist, interp->import_func, NULL);
1836 }
1837 else {
1838 final_mod = mod;
1839 Py_INCREF(mod);
1840 }
Brett Cannonfd074152012-04-14 14:10:13 -04001841 }
Antoine Pitrou6efa50a2012-05-07 21:41:59 +02001842
Brett Cannonfd074152012-04-14 14:10:13 -04001843 error:
1844 Py_XDECREF(abs_name);
Brett Cannonfd074152012-04-14 14:10:13 -04001845 Py_XDECREF(mod);
1846 Py_XDECREF(package);
Antoine Pitroubc07a5c2012-07-08 12:01:27 +02001847 if (final_mod == NULL)
1848 remove_importlib_frames();
Brett Cannonfd074152012-04-14 14:10:13 -04001849 return final_mod;
Guido van Rossum75acc9c1998-03-03 22:26:50 +00001850}
1851
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001852PyObject *
Benjamin Peterson04778a82011-05-25 09:29:00 -05001853PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
Victor Stinnerfe93faf2011-03-14 15:54:52 -04001854 PyObject *fromlist, int level)
1855{
1856 PyObject *nameobj, *mod;
1857 nameobj = PyUnicode_FromString(name);
1858 if (nameobj == NULL)
1859 return NULL;
1860 mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1861 fromlist, level);
1862 Py_DECREF(nameobj);
1863 return mod;
1864}
1865
1866
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867/* Re-import a module of any kind and return its module object, WITH
1868 INCREMENTED REFERENCE COUNT */
1869
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871PyImport_ReloadModule(PyObject *m)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872{
Eric Snow3f9eee62017-09-15 16:35:20 -06001873 _Py_IDENTIFIER(imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001874 _Py_IDENTIFIER(reload);
1875 PyObject *reloaded_module = NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001876 PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
Brett Cannon62228db2012-04-29 14:38:11 -04001877 if (imp == NULL) {
1878 imp = PyImport_ImportModule("imp");
1879 if (imp == NULL) {
1880 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 }
Victor Stinnerad3c03b2011-03-14 09:21:33 -04001883
Victor Stinner55ba38a2016-12-09 16:09:30 +01001884 reloaded_module = _PyObject_CallMethodIdObjArgs(imp, &PyId_reload, m, NULL);
Brett Cannon62228db2012-04-29 14:38:11 -04001885 Py_DECREF(imp);
1886 return reloaded_module;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887}
1888
1889
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001890/* Higher-level import emulator which emulates the "import" statement
1891 more accurately -- it invokes the __import__() function from the
1892 builtins of the current globals. This means that the import is
1893 done using whatever import hooks are installed in the current
Brett Cannonbc2eff32010-09-19 21:39:02 +00001894 environment.
Guido van Rossum6058eb41998-12-21 19:51:00 +00001895 A dummy list ["__doc__"] is passed as the 4th argument so that
Neal Norwitz80e7f272007-08-26 06:45:23 +00001896 e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
Guido van Rossum6058eb41998-12-21 19:51:00 +00001897 will return <module "gencache"> instead of <module "win32com">. */
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001898
1899PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900PyImport_Import(PyObject *module_name)
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 static PyObject *silly_list = NULL;
1903 static PyObject *builtins_str = NULL;
1904 static PyObject *import_str = NULL;
1905 PyObject *globals = NULL;
1906 PyObject *import = NULL;
1907 PyObject *builtins = NULL;
1908 PyObject *r = NULL;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 /* Initialize constant string objects */
1911 if (silly_list == NULL) {
1912 import_str = PyUnicode_InternFromString("__import__");
1913 if (import_str == NULL)
1914 return NULL;
1915 builtins_str = PyUnicode_InternFromString("__builtins__");
1916 if (builtins_str == NULL)
1917 return NULL;
Brett Cannonbc2eff32010-09-19 21:39:02 +00001918 silly_list = PyList_New(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 if (silly_list == NULL)
1920 return NULL;
1921 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 /* Get the builtins from current globals */
1924 globals = PyEval_GetGlobals();
1925 if (globals != NULL) {
1926 Py_INCREF(globals);
1927 builtins = PyObject_GetItem(globals, builtins_str);
1928 if (builtins == NULL)
1929 goto err;
1930 }
1931 else {
1932 /* No globals -- use standard builtins, and fake globals */
1933 builtins = PyImport_ImportModuleLevel("builtins",
1934 NULL, NULL, NULL, 0);
1935 if (builtins == NULL)
1936 return NULL;
1937 globals = Py_BuildValue("{OO}", builtins_str, builtins);
1938 if (globals == NULL)
1939 goto err;
1940 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 /* Get the __import__ function from the builtins */
1943 if (PyDict_Check(builtins)) {
1944 import = PyObject_GetItem(builtins, import_str);
1945 if (import == NULL)
1946 PyErr_SetObject(PyExc_KeyError, import_str);
1947 }
1948 else
1949 import = PyObject_GetAttr(builtins, import_str);
1950 if (import == NULL)
1951 goto err;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 /* Call the __import__ function with the proper argument list
Brett Cannonbc2eff32010-09-19 21:39:02 +00001954 Always use absolute import here.
1955 Calling for side-effect of import. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
1957 globals, silly_list, 0, NULL);
Brett Cannonbc2eff32010-09-19 21:39:02 +00001958 if (r == NULL)
1959 goto err;
1960 Py_DECREF(r);
1961
Eric Snow3f9eee62017-09-15 16:35:20 -06001962 r = PyImport_GetModule(module_name);
1963 if (r == NULL && !PyErr_Occurred()) {
Serhiy Storchaka145541c2017-06-15 20:54:38 +03001964 PyErr_SetObject(PyExc_KeyError, module_name);
1965 }
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001966
1967 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 Py_XDECREF(globals);
1969 Py_XDECREF(builtins);
1970 Py_XDECREF(import);
Tim Peters50d8d372001-02-28 05:34:27 +00001971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 return r;
Guido van Rossumd47a0a81997-08-14 20:11:26 +00001973}
1974
Brett Cannon4caa61d2014-01-09 19:03:32 -05001975/*[clinic input]
1976_imp.extension_suffixes
1977
1978Returns the list of file suffixes used to identify extension modules.
1979[clinic start generated code]*/
1980
Brett Cannon4caa61d2014-01-09 19:03:32 -05001981static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001982_imp_extension_suffixes_impl(PyObject *module)
1983/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 PyObject *list;
Brett Cannon2657df42012-05-04 15:20:40 -04001986 const char *suffix;
1987 unsigned int index = 0;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 list = PyList_New(0);
1990 if (list == NULL)
1991 return NULL;
Brett Cannon2657df42012-05-04 15:20:40 -04001992#ifdef HAVE_DYNAMIC_LOADING
1993 while ((suffix = _PyImport_DynLoadFiletab[index])) {
1994 PyObject *item = PyUnicode_FromString(suffix);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 if (item == NULL) {
1996 Py_DECREF(list);
1997 return NULL;
1998 }
1999 if (PyList_Append(list, item) < 0) {
2000 Py_DECREF(list);
2001 Py_DECREF(item);
2002 return NULL;
2003 }
2004 Py_DECREF(item);
Brett Cannon2657df42012-05-04 15:20:40 -04002005 index += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 }
Brett Cannon2657df42012-05-04 15:20:40 -04002007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 return list;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009}
2010
Brett Cannon4caa61d2014-01-09 19:03:32 -05002011/*[clinic input]
Brett Cannon4caa61d2014-01-09 19:03:32 -05002012_imp.init_frozen
2013
2014 name: unicode
2015 /
2016
2017Initializes a frozen module.
2018[clinic start generated code]*/
2019
Brett Cannon4caa61d2014-01-09 19:03:32 -05002020static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002021_imp_init_frozen_impl(PyObject *module, PyObject *name)
2022/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 int ret;
2025 PyObject *m;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002026
Victor Stinner53dc7352011-03-20 01:50:21 +01002027 ret = PyImport_ImportFrozenModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 if (ret < 0)
2029 return NULL;
2030 if (ret == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002031 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 }
Victor Stinner53dc7352011-03-20 01:50:21 +01002033 m = PyImport_AddModuleObject(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 Py_XINCREF(m);
2035 return m;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036}
2037
Brett Cannon4caa61d2014-01-09 19:03:32 -05002038/*[clinic input]
2039_imp.get_frozen_object
2040
2041 name: unicode
2042 /
2043
2044Create a code object for a frozen module.
2045[clinic start generated code]*/
2046
Brett Cannon4caa61d2014-01-09 19:03:32 -05002047static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002048_imp_get_frozen_object_impl(PyObject *module, PyObject *name)
2049/*[clinic end generated code: output=2568cc5b7aa0da63 input=ed689bc05358fdbd]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 return get_frozen_object(name);
Guido van Rossum6ec1efb1995-08-04 04:08:57 +00002052}
2053
Brett Cannon4caa61d2014-01-09 19:03:32 -05002054/*[clinic input]
2055_imp.is_frozen_package
2056
2057 name: unicode
2058 /
2059
2060Returns True if the module name is of a frozen package.
2061[clinic start generated code]*/
2062
Brett Cannon4caa61d2014-01-09 19:03:32 -05002063static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002064_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2065/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 return is_frozen_package(name);
Brett Cannon8d110132009-03-15 02:20:16 +00002068}
2069
Brett Cannon4caa61d2014-01-09 19:03:32 -05002070/*[clinic input]
2071_imp.is_builtin
2072
2073 name: unicode
2074 /
2075
2076Returns True if the module name corresponds to a built-in module.
2077[clinic start generated code]*/
2078
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002080_imp_is_builtin_impl(PyObject *module, PyObject *name)
2081/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002082{
Brett Cannon4caa61d2014-01-09 19:03:32 -05002083 return PyLong_FromLong(is_builtin(name));
2084}
2085
2086/*[clinic input]
2087_imp.is_frozen
2088
2089 name: unicode
2090 /
2091
2092Returns True if the module name corresponds to a frozen module.
2093[clinic start generated code]*/
2094
Brett Cannon4caa61d2014-01-09 19:03:32 -05002095static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002096_imp_is_frozen_impl(PyObject *module, PyObject *name)
2097/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002098{
Benjamin Peterson6fba3db2013-03-18 23:13:31 -07002099 const struct _frozen *p;
Brett Cannon4caa61d2014-01-09 19:03:32 -05002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 p = find_frozen(name);
2102 return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103}
2104
Larry Hastings1df0b352015-08-24 19:53:56 -07002105/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2106static int
2107exec_builtin_or_dynamic(PyObject *mod) {
2108 PyModuleDef *def;
2109 void *state;
2110
2111 if (!PyModule_Check(mod)) {
2112 return 0;
2113 }
2114
2115 def = PyModule_GetDef(mod);
2116 if (def == NULL) {
Larry Hastings1df0b352015-08-24 19:53:56 -07002117 return 0;
2118 }
Brett Cannon52794db2016-09-07 17:00:43 -07002119
Larry Hastings1df0b352015-08-24 19:53:56 -07002120 state = PyModule_GetState(mod);
Larry Hastings1df0b352015-08-24 19:53:56 -07002121 if (state) {
2122 /* Already initialized; skip reload */
2123 return 0;
2124 }
Brett Cannon52794db2016-09-07 17:00:43 -07002125
Larry Hastings1df0b352015-08-24 19:53:56 -07002126 return PyModule_ExecDef(mod, def);
2127}
2128
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002129#ifdef HAVE_DYNAMIC_LOADING
2130
Brett Cannon4caa61d2014-01-09 19:03:32 -05002131/*[clinic input]
Nick Coghland5cacbb2015-05-23 22:24:10 +10002132_imp.create_dynamic
Brett Cannon4caa61d2014-01-09 19:03:32 -05002133
Nick Coghland5cacbb2015-05-23 22:24:10 +10002134 spec: object
Brett Cannon4caa61d2014-01-09 19:03:32 -05002135 file: object = NULL
2136 /
2137
Nick Coghland5cacbb2015-05-23 22:24:10 +10002138Create an extension module.
Brett Cannon4caa61d2014-01-09 19:03:32 -05002139[clinic start generated code]*/
2140
Brett Cannon4caa61d2014-01-09 19:03:32 -05002141static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002142_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2143/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
Brett Cannon4caa61d2014-01-09 19:03:32 -05002144{
Nick Coghland5cacbb2015-05-23 22:24:10 +10002145 PyObject *mod, *name, *path;
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002146 FILE *fp;
2147
Nick Coghland5cacbb2015-05-23 22:24:10 +10002148 name = PyObject_GetAttrString(spec, "name");
2149 if (name == NULL) {
2150 return NULL;
2151 }
2152
2153 path = PyObject_GetAttrString(spec, "origin");
2154 if (path == NULL) {
2155 Py_DECREF(name);
2156 return NULL;
2157 }
2158
2159 mod = _PyImport_FindExtensionObject(name, path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002160 if (mod != NULL || PyErr_Occurred()) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002161 Py_DECREF(name);
2162 Py_DECREF(path);
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +02002163 Py_XINCREF(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002164 return mod;
2165 }
2166
Brett Cannon4caa61d2014-01-09 19:03:32 -05002167 if (file != NULL) {
2168 fp = _Py_fopen_obj(path, "r");
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002169 if (fp == NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +10002170 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002171 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 return NULL;
Victor Stinnere9ddbf62011-03-22 10:46:35 +01002173 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 }
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002175 else
2176 fp = NULL;
Nick Coghland5cacbb2015-05-23 22:24:10 +10002177
2178 mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2179
2180 Py_DECREF(name);
Brett Cannon4caa61d2014-01-09 19:03:32 -05002181 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 if (fp)
2183 fclose(fp);
Victor Stinnerfefd70c2011-03-14 15:54:07 -04002184 return mod;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002185}
2186
Nick Coghland5cacbb2015-05-23 22:24:10 +10002187/*[clinic input]
2188_imp.exec_dynamic -> int
2189
2190 mod: object
2191 /
2192
2193Initialize an extension module.
2194[clinic start generated code]*/
2195
2196static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002197_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2198/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
Nick Coghland5cacbb2015-05-23 22:24:10 +10002199{
Larry Hastings1df0b352015-08-24 19:53:56 -07002200 return exec_builtin_or_dynamic(mod);
Nick Coghland5cacbb2015-05-23 22:24:10 +10002201}
2202
2203
Guido van Rossum96a8fb71999-12-22 14:09:35 +00002204#endif /* HAVE_DYNAMIC_LOADING */
2205
Larry Hastings7726ac92014-01-31 22:03:12 -08002206/*[clinic input]
Larry Hastings1df0b352015-08-24 19:53:56 -07002207_imp.exec_builtin -> int
2208
2209 mod: object
2210 /
2211
2212Initialize a built-in module.
2213[clinic start generated code]*/
2214
2215static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002216_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2217/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
Larry Hastings1df0b352015-08-24 19:53:56 -07002218{
2219 return exec_builtin_or_dynamic(mod);
2220}
2221
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002222/*[clinic input]
2223_imp.source_hash
2224
2225 key: long
2226 source: Py_buffer
2227[clinic start generated code]*/
2228
2229static PyObject *
2230_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2231/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2232{
Benjamin Peterson83620772017-12-09 12:18:56 -08002233 union {
2234 uint64_t x;
2235 char data[sizeof(uint64_t)];
2236 } hash;
2237 hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002238#if !PY_LITTLE_ENDIAN
2239 // Force to little-endian. There really ought to be a succinct standard way
2240 // to do this.
Benjamin Peterson83620772017-12-09 12:18:56 -08002241 for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2242 char tmp = hash.data[i];
2243 hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2244 hash.data[sizeof(hash.data) - i - 1] = tmp;
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002245 }
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002246#endif
Benjamin Peterson83620772017-12-09 12:18:56 -08002247 return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002248}
2249
Barry Warsaw28a691b2010-04-17 00:19:56 +00002250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251PyDoc_STRVAR(doc_imp,
Brett Cannon6f44d662012-04-15 16:08:47 -04002252"(Extremely) low-level import machinery bits as used by importlib and imp.");
Guido van Rossum0207e6d1997-09-09 22:04:42 +00002253
Guido van Rossum79f25d91997-04-29 20:08:16 +00002254static PyMethodDef imp_methods[] = {
Brett Cannon4caa61d2014-01-09 19:03:32 -05002255 _IMP_EXTENSION_SUFFIXES_METHODDEF
2256 _IMP_LOCK_HELD_METHODDEF
2257 _IMP_ACQUIRE_LOCK_METHODDEF
2258 _IMP_RELEASE_LOCK_METHODDEF
2259 _IMP_GET_FROZEN_OBJECT_METHODDEF
2260 _IMP_IS_FROZEN_PACKAGE_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002261 _IMP_CREATE_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002262 _IMP_INIT_FROZEN_METHODDEF
2263 _IMP_IS_BUILTIN_METHODDEF
2264 _IMP_IS_FROZEN_METHODDEF
Nick Coghland5cacbb2015-05-23 22:24:10 +10002265 _IMP_CREATE_DYNAMIC_METHODDEF
2266 _IMP_EXEC_DYNAMIC_METHODDEF
Larry Hastings1df0b352015-08-24 19:53:56 -07002267 _IMP_EXEC_BUILTIN_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002268 _IMP__FIX_CO_FILENAME_METHODDEF
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002269 _IMP_SOURCE_HASH_METHODDEF
Brett Cannon4caa61d2014-01-09 19:03:32 -05002270 {NULL, NULL} /* sentinel */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002271};
2272
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002273
Martin v. Löwis1a214512008-06-11 05:26:20 +00002274static struct PyModuleDef impmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 PyModuleDef_HEAD_INIT,
Brett Cannon6f44d662012-04-15 16:08:47 -04002276 "_imp",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 doc_imp,
2278 0,
2279 imp_methods,
2280 NULL,
2281 NULL,
2282 NULL,
2283 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002284};
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002285
Jason Tishler6bc06ec2003-09-04 11:59:50 +00002286PyMODINIT_FUNC
Benjamin Petersonc65ef772018-01-29 11:33:57 -08002287PyInit__imp(void)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *m, *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 m = PyModule_Create(&impmodule);
2292 if (m == NULL)
2293 goto failure;
2294 d = PyModule_GetDict(m);
2295 if (d == NULL)
2296 goto failure;
Victor Stinnercaba55b2018-08-03 15:33:52 +02002297 _PyCoreConfig *config = &_PyInterpreterState_Get()->core_config;
Victor Stinner80b762f2018-08-01 18:18:07 +02002298 PyObject *pyc_mode = PyUnicode_FromString(config->_check_hash_pycs_mode);
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08002299 if (pyc_mode == NULL) {
2300 goto failure;
2301 }
2302 if (PyDict_SetItemString(d, "check_hash_based_pycs", pyc_mode) < 0) {
2303 Py_DECREF(pyc_mode);
2304 goto failure;
2305 }
2306 Py_DECREF(pyc_mode);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 return m;
Guido van Rossumaee0bad1997-09-05 07:33:22 +00002309 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 Py_XDECREF(m);
2311 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002312}
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002313
2314
Guido van Rossumb18618d2000-05-03 23:44:39 +00002315/* API for embedding applications that want to add their own entries
2316 to the table of built-in modules. This should normally be called
2317 *before* Py_Initialize(). When the table resize fails, -1 is
2318 returned and the existing table is unchanged.
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002319
2320 After a similar function by Just van Rossum. */
2321
2322int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002323PyImport_ExtendInittab(struct _inittab *newtab)
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 struct _inittab *p;
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002326 size_t i, n;
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002327 int res = 0;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 /* Count the number of entries in both tables */
2330 for (n = 0; newtab[n].name != NULL; n++)
2331 ;
2332 if (n == 0)
2333 return 0; /* Nothing to do */
2334 for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2335 ;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002336
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002337 /* Force default raw memory allocator to get a known allocator to be able
2338 to release the memory in _PyImport_Fini2() */
2339 PyMemAllocatorEx old_alloc;
2340 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 /* Allocate new memory for the combined table */
Benjamin Peterson0c644fc2017-12-15 23:42:33 -08002343 p = NULL;
2344 if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002345 size_t size = sizeof(struct _inittab) * (i + n + 1);
2346 p = PyMem_RawRealloc(inittab_copy, size);
2347 }
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002348 if (p == NULL) {
2349 res = -1;
2350 goto done;
2351 }
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002352
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002353 /* Copy the tables into the new memory at the first call
2354 to PyImport_ExtendInittab(). */
2355 if (inittab_copy != PyImport_Inittab) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002357 }
2358 memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2359 PyImport_Inittab = inittab_copy = p;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002360
Victor Stinner92a3c6f2017-12-06 18:12:59 +01002361done:
2362 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2363 return res;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002364}
2365
2366/* Shorthand to add a single entry given a name and a function */
2367
2368int
Brett Cannona826f322009-04-02 03:41:46 +00002369PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 struct _inittab newtab[2];
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 memset(newtab, '\0', sizeof newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002374
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002375 newtab[0].name = name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 newtab[0].initfunc = initfunc;
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 return PyImport_ExtendInittab(newtab);
Guido van Rossum09cae1f1998-05-14 02:32:54 +00002379}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002380
2381#ifdef __cplusplus
2382}
2383#endif