xref: /third_party/python/Python/import.c (revision 7db96d56)
1/* Module definition and import implementation */
2
3#include "Python.h"
4
5#include "pycore_import.h"        // _PyImport_BootstrapImp()
6#include "pycore_initconfig.h"    // _PyStatus_OK()
7#include "pycore_interp.h"        // _PyInterpreterState_ClearModules()
8#include "pycore_namespace.h"     // _PyNamespace_Type
9#include "pycore_pyerrors.h"      // _PyErr_SetString()
10#include "pycore_pyhash.h"        // _Py_KeyedHash()
11#include "pycore_pylifecycle.h"
12#include "pycore_pymem.h"         // _PyMem_SetDefaultAllocator()
13#include "pycore_pystate.h"       // _PyInterpreterState_GET()
14#include "pycore_sysmodule.h"     // _PySys_Audit()
15#include "marshal.h"              // PyMarshal_ReadObjectFromString()
16#include "importdl.h"             // _PyImport_DynLoadFiletab
17#include "pydtrace.h"             // PyDTrace_IMPORT_FIND_LOAD_START_ENABLED()
18#include <stdbool.h>              // bool
19
20#ifdef HAVE_FCNTL_H
21#include <fcntl.h>
22#endif
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27/* Forward references */
28static PyObject *import_add_module(PyThreadState *tstate, PyObject *name);
29
30/* See _PyImport_FixupExtensionObject() below */
31static PyObject *extensions = NULL;
32
33/* This table is defined in config.c: */
34extern struct _inittab _PyImport_Inittab[];
35
36struct _inittab *PyImport_Inittab = _PyImport_Inittab;
37static struct _inittab *inittab_copy = NULL;
38
39/*[clinic input]
40module _imp
41[clinic start generated code]*/
42/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9c332475d8686284]*/
43
44#include "clinic/import.c.h"
45
46/* Initialize things */
47
48PyStatus
49_PyImportZip_Init(PyThreadState *tstate)
50{
51    PyObject *path_hooks, *zipimport;
52    int err = 0;
53
54    path_hooks = PySys_GetObject("path_hooks");
55    if (path_hooks == NULL) {
56        _PyErr_SetString(tstate, PyExc_RuntimeError,
57                         "unable to get sys.path_hooks");
58        goto error;
59    }
60
61    int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
62    if (verbose) {
63        PySys_WriteStderr("# installing zipimport hook\n");
64    }
65
66    zipimport = PyImport_ImportModule("zipimport");
67    if (zipimport == NULL) {
68        _PyErr_Clear(tstate); /* No zip import module -- okay */
69        if (verbose) {
70            PySys_WriteStderr("# can't import zipimport\n");
71        }
72    }
73    else {
74        PyObject *zipimporter = PyObject_GetAttr(zipimport, &_Py_ID(zipimporter));
75        Py_DECREF(zipimport);
76        if (zipimporter == NULL) {
77            _PyErr_Clear(tstate); /* No zipimporter object -- okay */
78            if (verbose) {
79                PySys_WriteStderr("# can't import zipimport.zipimporter\n");
80            }
81        }
82        else {
83            /* sys.path_hooks.insert(0, zipimporter) */
84            err = PyList_Insert(path_hooks, 0, zipimporter);
85            Py_DECREF(zipimporter);
86            if (err < 0) {
87                goto error;
88            }
89            if (verbose) {
90                PySys_WriteStderr("# installed zipimport hook\n");
91            }
92        }
93    }
94
95    return _PyStatus_OK();
96
97  error:
98    PyErr_Print();
99    return _PyStatus_ERR("initializing zipimport failed");
100}
101
102/* Locking primitives to prevent parallel imports of the same module
103   in different threads to return with a partially loaded module.
104   These calls are serialized by the global interpreter lock. */
105
106static PyThread_type_lock import_lock = NULL;
107static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
108static int import_lock_level = 0;
109
110void
111_PyImport_AcquireLock(void)
112{
113    unsigned long me = PyThread_get_thread_ident();
114    if (me == PYTHREAD_INVALID_THREAD_ID)
115        return; /* Too bad */
116    if (import_lock == NULL) {
117        import_lock = PyThread_allocate_lock();
118        if (import_lock == NULL)
119            return;  /* Nothing much we can do. */
120    }
121    if (import_lock_thread == me) {
122        import_lock_level++;
123        return;
124    }
125    if (import_lock_thread != PYTHREAD_INVALID_THREAD_ID ||
126        !PyThread_acquire_lock(import_lock, 0))
127    {
128        PyThreadState *tstate = PyEval_SaveThread();
129        PyThread_acquire_lock(import_lock, WAIT_LOCK);
130        PyEval_RestoreThread(tstate);
131    }
132    assert(import_lock_level == 0);
133    import_lock_thread = me;
134    import_lock_level = 1;
135}
136
137int
138_PyImport_ReleaseLock(void)
139{
140    unsigned long me = PyThread_get_thread_ident();
141    if (me == PYTHREAD_INVALID_THREAD_ID || import_lock == NULL)
142        return 0; /* Too bad */
143    if (import_lock_thread != me)
144        return -1;
145    import_lock_level--;
146    assert(import_lock_level >= 0);
147    if (import_lock_level == 0) {
148        import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
149        PyThread_release_lock(import_lock);
150    }
151    return 1;
152}
153
154#ifdef HAVE_FORK
155/* This function is called from PyOS_AfterFork_Child() to ensure that newly
156   created child processes do not share locks with the parent.
157   We now acquire the import lock around fork() calls but on some platforms
158   (Solaris 9 and earlier? see isue7242) that still left us with problems. */
159PyStatus
160_PyImport_ReInitLock(void)
161{
162    if (import_lock != NULL) {
163        if (_PyThread_at_fork_reinit(&import_lock) < 0) {
164            return _PyStatus_ERR("failed to create a new lock");
165        }
166    }
167
168    if (import_lock_level > 1) {
169        /* Forked as a side effect of import */
170        unsigned long me = PyThread_get_thread_ident();
171        PyThread_acquire_lock(import_lock, WAIT_LOCK);
172        import_lock_thread = me;
173        import_lock_level--;
174    } else {
175        import_lock_thread = PYTHREAD_INVALID_THREAD_ID;
176        import_lock_level = 0;
177    }
178    return _PyStatus_OK();
179}
180#endif
181
182/*[clinic input]
183_imp.lock_held
184
185Return True if the import lock is currently held, else False.
186
187On platforms without threads, return False.
188[clinic start generated code]*/
189
190static PyObject *
191_imp_lock_held_impl(PyObject *module)
192/*[clinic end generated code: output=8b89384b5e1963fc input=9b088f9b217d9bdf]*/
193{
194    return PyBool_FromLong(import_lock_thread != PYTHREAD_INVALID_THREAD_ID);
195}
196
197/*[clinic input]
198_imp.acquire_lock
199
200Acquires the interpreter's import lock for the current thread.
201
202This lock should be used by import hooks to ensure thread-safety when importing
203modules. On platforms without threads, this function does nothing.
204[clinic start generated code]*/
205
206static PyObject *
207_imp_acquire_lock_impl(PyObject *module)
208/*[clinic end generated code: output=1aff58cb0ee1b026 input=4a2d4381866d5fdc]*/
209{
210    _PyImport_AcquireLock();
211    Py_RETURN_NONE;
212}
213
214/*[clinic input]
215_imp.release_lock
216
217Release the interpreter's import lock.
218
219On platforms without threads, this function does nothing.
220[clinic start generated code]*/
221
222static PyObject *
223_imp_release_lock_impl(PyObject *module)
224/*[clinic end generated code: output=7faab6d0be178b0a input=934fb11516dd778b]*/
225{
226    if (_PyImport_ReleaseLock() < 0) {
227        PyErr_SetString(PyExc_RuntimeError,
228                        "not holding the import lock");
229        return NULL;
230    }
231    Py_RETURN_NONE;
232}
233
234void
235_PyImport_Fini(void)
236{
237    Py_CLEAR(extensions);
238    if (import_lock != NULL) {
239        PyThread_free_lock(import_lock);
240        import_lock = NULL;
241    }
242}
243
244void
245_PyImport_Fini2(void)
246{
247    /* Use the same memory allocator than PyImport_ExtendInittab(). */
248    PyMemAllocatorEx old_alloc;
249    _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
250
251    // Reset PyImport_Inittab
252    PyImport_Inittab = _PyImport_Inittab;
253
254    /* Free memory allocated by PyImport_ExtendInittab() */
255    PyMem_RawFree(inittab_copy);
256    inittab_copy = NULL;
257
258    PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
259}
260
261/* Helper for sys */
262
263PyObject *
264PyImport_GetModuleDict(void)
265{
266    PyInterpreterState *interp = _PyInterpreterState_GET();
267    if (interp->modules == NULL) {
268        Py_FatalError("interpreter has no modules dictionary");
269    }
270    return interp->modules;
271}
272
273/* In some corner cases it is important to be sure that the import
274   machinery has been initialized (or not cleaned up yet).  For
275   example, see issue #4236 and PyModule_Create2(). */
276
277int
278_PyImport_IsInitialized(PyInterpreterState *interp)
279{
280    if (interp->modules == NULL)
281        return 0;
282    return 1;
283}
284
285PyObject *
286_PyImport_GetModuleId(_Py_Identifier *nameid)
287{
288    PyObject *name = _PyUnicode_FromId(nameid); /* borrowed */
289    if (name == NULL) {
290        return NULL;
291    }
292    return PyImport_GetModule(name);
293}
294
295int
296_PyImport_SetModule(PyObject *name, PyObject *m)
297{
298    PyInterpreterState *interp = _PyInterpreterState_GET();
299    PyObject *modules = interp->modules;
300    return PyObject_SetItem(modules, name, m);
301}
302
303int
304_PyImport_SetModuleString(const char *name, PyObject *m)
305{
306    PyInterpreterState *interp = _PyInterpreterState_GET();
307    PyObject *modules = interp->modules;
308    return PyMapping_SetItemString(modules, name, m);
309}
310
311static PyObject *
312import_get_module(PyThreadState *tstate, PyObject *name)
313{
314    PyObject *modules = tstate->interp->modules;
315    if (modules == NULL) {
316        _PyErr_SetString(tstate, PyExc_RuntimeError,
317                         "unable to get sys.modules");
318        return NULL;
319    }
320
321    PyObject *m;
322    Py_INCREF(modules);
323    if (PyDict_CheckExact(modules)) {
324        m = PyDict_GetItemWithError(modules, name);  /* borrowed */
325        Py_XINCREF(m);
326    }
327    else {
328        m = PyObject_GetItem(modules, name);
329        if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
330            _PyErr_Clear(tstate);
331        }
332    }
333    Py_DECREF(modules);
334    return m;
335}
336
337
338static int
339import_ensure_initialized(PyInterpreterState *interp, PyObject *mod, PyObject *name)
340{
341    PyObject *spec;
342
343    /* Optimization: only call _bootstrap._lock_unlock_module() if
344       __spec__._initializing is true.
345       NOTE: because of this, initializing must be set *before*
346       stuffing the new module in sys.modules.
347    */
348    spec = PyObject_GetAttr(mod, &_Py_ID(__spec__));
349    int busy = _PyModuleSpec_IsInitializing(spec);
350    Py_XDECREF(spec);
351    if (busy) {
352        /* Wait until module is done importing. */
353        PyObject *value = _PyObject_CallMethodOneArg(
354            interp->importlib, &_Py_ID(_lock_unlock_module), name);
355        if (value == NULL) {
356            return -1;
357        }
358        Py_DECREF(value);
359    }
360    return 0;
361}
362
363
364/* Helper for pythonrun.c -- return magic number and tag. */
365
366long
367PyImport_GetMagicNumber(void)
368{
369    long res;
370    PyInterpreterState *interp = _PyInterpreterState_GET();
371    PyObject *external, *pyc_magic;
372
373    external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
374    if (external == NULL)
375        return -1;
376    pyc_magic = PyObject_GetAttrString(external, "_RAW_MAGIC_NUMBER");
377    Py_DECREF(external);
378    if (pyc_magic == NULL)
379        return -1;
380    res = PyLong_AsLong(pyc_magic);
381    Py_DECREF(pyc_magic);
382    return res;
383}
384
385
386extern const char * _PySys_ImplCacheTag;
387
388const char *
389PyImport_GetMagicTag(void)
390{
391    return _PySys_ImplCacheTag;
392}
393
394
395/* Magic for extension modules (built-in as well as dynamically
396   loaded).  To prevent initializing an extension module more than
397   once, we keep a static dictionary 'extensions' keyed by the tuple
398   (module name, module name)  (for built-in modules) or by
399   (filename, module name) (for dynamically loaded modules), containing these
400   modules.  A copy of the module's dictionary is stored by calling
401   _PyImport_FixupExtensionObject() immediately after the module initialization
402   function succeeds.  A copy can be retrieved from there by calling
403   import_find_extension().
404
405   Modules which do support multiple initialization set their m_size
406   field to a non-negative number (indicating the size of the
407   module-specific state). They are still recorded in the extensions
408   dictionary, to avoid loading shared libraries twice.
409*/
410
411int
412_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
413                               PyObject *filename, PyObject *modules)
414{
415    if (mod == NULL || !PyModule_Check(mod)) {
416        PyErr_BadInternalCall();
417        return -1;
418    }
419
420    struct PyModuleDef *def = PyModule_GetDef(mod);
421    if (!def) {
422        PyErr_BadInternalCall();
423        return -1;
424    }
425
426    PyThreadState *tstate = _PyThreadState_GET();
427    if (PyObject_SetItem(modules, name, mod) < 0) {
428        return -1;
429    }
430    if (_PyState_AddModule(tstate, mod, def) < 0) {
431        PyMapping_DelItem(modules, name);
432        return -1;
433    }
434
435    // bpo-44050: Extensions and def->m_base.m_copy can be updated
436    // when the extension module doesn't support sub-interpreters.
437    if (_Py_IsMainInterpreter(tstate->interp) || def->m_size == -1) {
438        if (def->m_size == -1) {
439            if (def->m_base.m_copy) {
440                /* Somebody already imported the module,
441                   likely under a different name.
442                   XXX this should really not happen. */
443                Py_CLEAR(def->m_base.m_copy);
444            }
445            PyObject *dict = PyModule_GetDict(mod);
446            if (dict == NULL) {
447                return -1;
448            }
449            def->m_base.m_copy = PyDict_Copy(dict);
450            if (def->m_base.m_copy == NULL) {
451                return -1;
452            }
453        }
454
455        if (extensions == NULL) {
456            extensions = PyDict_New();
457            if (extensions == NULL) {
458                return -1;
459            }
460        }
461
462        PyObject *key = PyTuple_Pack(2, filename, name);
463        if (key == NULL) {
464            return -1;
465        }
466        int res = PyDict_SetItem(extensions, key, (PyObject *)def);
467        Py_DECREF(key);
468        if (res < 0) {
469            return -1;
470        }
471    }
472
473    return 0;
474}
475
476int
477_PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules)
478{
479    int res;
480    PyObject *nameobj;
481    nameobj = PyUnicode_InternFromString(name);
482    if (nameobj == NULL)
483        return -1;
484    res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj, modules);
485    Py_DECREF(nameobj);
486    return res;
487}
488
489static PyObject *
490import_find_extension(PyThreadState *tstate, PyObject *name,
491                      PyObject *filename)
492{
493    if (extensions == NULL) {
494        return NULL;
495    }
496
497    PyObject *key = PyTuple_Pack(2, filename, name);
498    if (key == NULL) {
499        return NULL;
500    }
501    PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key);
502    Py_DECREF(key);
503    if (def == NULL) {
504        return NULL;
505    }
506
507    PyObject *mod, *mdict;
508    PyObject *modules = tstate->interp->modules;
509
510    if (def->m_size == -1) {
511        /* Module does not support repeated initialization */
512        if (def->m_base.m_copy == NULL)
513            return NULL;
514        mod = import_add_module(tstate, name);
515        if (mod == NULL)
516            return NULL;
517        mdict = PyModule_GetDict(mod);
518        if (mdict == NULL) {
519            Py_DECREF(mod);
520            return NULL;
521        }
522        if (PyDict_Update(mdict, def->m_base.m_copy)) {
523            Py_DECREF(mod);
524            return NULL;
525        }
526    }
527    else {
528        if (def->m_base.m_init == NULL)
529            return NULL;
530        mod = _PyImport_InitFunc_TrampolineCall(def->m_base.m_init);
531        if (mod == NULL)
532            return NULL;
533        if (PyObject_SetItem(modules, name, mod) == -1) {
534            Py_DECREF(mod);
535            return NULL;
536        }
537    }
538    if (_PyState_AddModule(tstate, mod, def) < 0) {
539        PyMapping_DelItem(modules, name);
540        Py_DECREF(mod);
541        return NULL;
542    }
543
544    int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
545    if (verbose) {
546        PySys_FormatStderr("import %U # previously loaded (%R)\n",
547                           name, filename);
548    }
549    return mod;
550}
551
552
553/* Get the module object corresponding to a module name.
554   First check the modules dictionary if there's one there,
555   if not, create a new one and insert it in the modules dictionary. */
556
557static PyObject *
558import_add_module(PyThreadState *tstate, PyObject *name)
559{
560    PyObject *modules = tstate->interp->modules;
561    if (modules == NULL) {
562        _PyErr_SetString(tstate, PyExc_RuntimeError,
563                         "no import module dictionary");
564        return NULL;
565    }
566
567    PyObject *m;
568    if (PyDict_CheckExact(modules)) {
569        m = PyDict_GetItemWithError(modules, name);
570        Py_XINCREF(m);
571    }
572    else {
573        m = PyObject_GetItem(modules, name);
574        // For backward-compatibility we copy the behavior
575        // of PyDict_GetItemWithError().
576        if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
577            _PyErr_Clear(tstate);
578        }
579    }
580    if (_PyErr_Occurred(tstate)) {
581        return NULL;
582    }
583    if (m != NULL && PyModule_Check(m)) {
584        return m;
585    }
586    Py_XDECREF(m);
587    m = PyModule_NewObject(name);
588    if (m == NULL)
589        return NULL;
590    if (PyObject_SetItem(modules, name, m) != 0) {
591        Py_DECREF(m);
592        return NULL;
593    }
594
595    return m;
596}
597
598PyObject *
599PyImport_AddModuleObject(PyObject *name)
600{
601    PyThreadState *tstate = _PyThreadState_GET();
602    PyObject *mod = import_add_module(tstate, name);
603    if (mod) {
604        PyObject *ref = PyWeakref_NewRef(mod, NULL);
605        Py_DECREF(mod);
606        if (ref == NULL) {
607            return NULL;
608        }
609        mod = PyWeakref_GetObject(ref);
610        Py_DECREF(ref);
611    }
612    return mod; /* borrowed reference */
613}
614
615
616PyObject *
617PyImport_AddModule(const char *name)
618{
619    PyObject *nameobj = PyUnicode_FromString(name);
620    if (nameobj == NULL) {
621        return NULL;
622    }
623    PyObject *module = PyImport_AddModuleObject(nameobj);
624    Py_DECREF(nameobj);
625    return module;
626}
627
628
629/* Remove name from sys.modules, if it's there.
630 * Can be called with an exception raised.
631 * If fail to remove name a new exception will be chained with the old
632 * exception, otherwise the old exception is preserved.
633 */
634static void
635remove_module(PyThreadState *tstate, PyObject *name)
636{
637    PyObject *type, *value, *traceback;
638    _PyErr_Fetch(tstate, &type, &value, &traceback);
639
640    PyObject *modules = tstate->interp->modules;
641    if (PyDict_CheckExact(modules)) {
642        PyObject *mod = _PyDict_Pop(modules, name, Py_None);
643        Py_XDECREF(mod);
644    }
645    else if (PyMapping_DelItem(modules, name) < 0) {
646        if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
647            _PyErr_Clear(tstate);
648        }
649    }
650
651    _PyErr_ChainExceptions(type, value, traceback);
652}
653
654
655/* Execute a code object in a module and return the module object
656 * WITH INCREMENTED REFERENCE COUNT.  If an error occurs, name is
657 * removed from sys.modules, to avoid leaving damaged module objects
658 * in sys.modules.  The caller may wish to restore the original
659 * module object (if any) in this case; PyImport_ReloadModule is an
660 * example.
661 *
662 * Note that PyImport_ExecCodeModuleWithPathnames() is the preferred, richer
663 * interface.  The other two exist primarily for backward compatibility.
664 */
665PyObject *
666PyImport_ExecCodeModule(const char *name, PyObject *co)
667{
668    return PyImport_ExecCodeModuleWithPathnames(
669        name, co, (char *)NULL, (char *)NULL);
670}
671
672PyObject *
673PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
674{
675    return PyImport_ExecCodeModuleWithPathnames(
676        name, co, pathname, (char *)NULL);
677}
678
679PyObject *
680PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co,
681                                     const char *pathname,
682                                     const char *cpathname)
683{
684    PyObject *m = NULL;
685    PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL, *external= NULL;
686
687    nameobj = PyUnicode_FromString(name);
688    if (nameobj == NULL)
689        return NULL;
690
691    if (cpathname != NULL) {
692        cpathobj = PyUnicode_DecodeFSDefault(cpathname);
693        if (cpathobj == NULL)
694            goto error;
695    }
696    else
697        cpathobj = NULL;
698
699    if (pathname != NULL) {
700        pathobj = PyUnicode_DecodeFSDefault(pathname);
701        if (pathobj == NULL)
702            goto error;
703    }
704    else if (cpathobj != NULL) {
705        PyInterpreterState *interp = _PyInterpreterState_GET();
706
707        if (interp == NULL) {
708            Py_FatalError("no current interpreter");
709        }
710
711        external= PyObject_GetAttrString(interp->importlib,
712                                         "_bootstrap_external");
713        if (external != NULL) {
714            pathobj = _PyObject_CallMethodOneArg(
715                external, &_Py_ID(_get_sourcefile), cpathobj);
716            Py_DECREF(external);
717        }
718        if (pathobj == NULL)
719            PyErr_Clear();
720    }
721    else
722        pathobj = NULL;
723
724    m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
725error:
726    Py_DECREF(nameobj);
727    Py_XDECREF(pathobj);
728    Py_XDECREF(cpathobj);
729    return m;
730}
731
732static PyObject *
733module_dict_for_exec(PyThreadState *tstate, PyObject *name)
734{
735    PyObject *m, *d;
736
737    m = import_add_module(tstate, name);
738    if (m == NULL)
739        return NULL;
740    /* If the module is being reloaded, we get the old module back
741       and re-use its dict to exec the new code. */
742    d = PyModule_GetDict(m);
743    int r = PyDict_Contains(d, &_Py_ID(__builtins__));
744    if (r == 0) {
745        r = PyDict_SetItem(d, &_Py_ID(__builtins__), PyEval_GetBuiltins());
746    }
747    if (r < 0) {
748        remove_module(tstate, name);
749        Py_DECREF(m);
750        return NULL;
751    }
752
753    Py_INCREF(d);
754    Py_DECREF(m);
755    return d;
756}
757
758static PyObject *
759exec_code_in_module(PyThreadState *tstate, PyObject *name,
760                    PyObject *module_dict, PyObject *code_object)
761{
762    PyObject *v, *m;
763
764    v = PyEval_EvalCode(code_object, module_dict, module_dict);
765    if (v == NULL) {
766        remove_module(tstate, name);
767        return NULL;
768    }
769    Py_DECREF(v);
770
771    m = import_get_module(tstate, name);
772    if (m == NULL && !_PyErr_Occurred(tstate)) {
773        _PyErr_Format(tstate, PyExc_ImportError,
774                      "Loaded module %R not found in sys.modules",
775                      name);
776    }
777
778    return m;
779}
780
781PyObject*
782PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
783                              PyObject *cpathname)
784{
785    PyThreadState *tstate = _PyThreadState_GET();
786    PyObject *d, *external, *res;
787
788    d = module_dict_for_exec(tstate, name);
789    if (d == NULL) {
790        return NULL;
791    }
792
793    if (pathname == NULL) {
794        pathname = ((PyCodeObject *)co)->co_filename;
795    }
796    external = PyObject_GetAttrString(tstate->interp->importlib,
797                                      "_bootstrap_external");
798    if (external == NULL) {
799        Py_DECREF(d);
800        return NULL;
801    }
802    res = PyObject_CallMethodObjArgs(external, &_Py_ID(_fix_up_module),
803                                     d, name, pathname, cpathname, NULL);
804    Py_DECREF(external);
805    if (res != NULL) {
806        Py_DECREF(res);
807        res = exec_code_in_module(tstate, name, d, co);
808    }
809    Py_DECREF(d);
810    return res;
811}
812
813
814static void
815update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
816{
817    PyObject *constants, *tmp;
818    Py_ssize_t i, n;
819
820    if (PyUnicode_Compare(co->co_filename, oldname))
821        return;
822
823    Py_INCREF(newname);
824    Py_XSETREF(co->co_filename, newname);
825
826    constants = co->co_consts;
827    n = PyTuple_GET_SIZE(constants);
828    for (i = 0; i < n; i++) {
829        tmp = PyTuple_GET_ITEM(constants, i);
830        if (PyCode_Check(tmp))
831            update_code_filenames((PyCodeObject *)tmp,
832                                  oldname, newname);
833    }
834}
835
836static void
837update_compiled_module(PyCodeObject *co, PyObject *newname)
838{
839    PyObject *oldname;
840
841    if (PyUnicode_Compare(co->co_filename, newname) == 0)
842        return;
843
844    oldname = co->co_filename;
845    Py_INCREF(oldname);
846    update_code_filenames(co, oldname, newname);
847    Py_DECREF(oldname);
848}
849
850/*[clinic input]
851_imp._fix_co_filename
852
853    code: object(type="PyCodeObject *", subclass_of="&PyCode_Type")
854        Code object to change.
855
856    path: unicode
857        File path to use.
858    /
859
860Changes code.co_filename to specify the passed-in file path.
861[clinic start generated code]*/
862
863static PyObject *
864_imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code,
865                           PyObject *path)
866/*[clinic end generated code: output=1d002f100235587d input=895ba50e78b82f05]*/
867
868{
869    update_compiled_module(code, path);
870
871    Py_RETURN_NONE;
872}
873
874
875/* Helper to test for built-in module */
876
877static int
878is_builtin(PyObject *name)
879{
880    int i;
881    for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
882        if (_PyUnicode_EqualToASCIIString(name, PyImport_Inittab[i].name)) {
883            if (PyImport_Inittab[i].initfunc == NULL)
884                return -1;
885            else
886                return 1;
887        }
888    }
889    return 0;
890}
891
892
893/* Return a finder object for a sys.path/pkg.__path__ item 'p',
894   possibly by fetching it from the path_importer_cache dict. If it
895   wasn't yet cached, traverse path_hooks until a hook is found
896   that can handle the path item. Return None if no hook could;
897   this tells our caller that the path based finder could not find
898   a finder for this path item. Cache the result in
899   path_importer_cache. */
900
901static PyObject *
902get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
903                  PyObject *path_hooks, PyObject *p)
904{
905    PyObject *importer;
906    Py_ssize_t j, nhooks;
907
908    /* These conditions are the caller's responsibility: */
909    assert(PyList_Check(path_hooks));
910    assert(PyDict_Check(path_importer_cache));
911
912    nhooks = PyList_Size(path_hooks);
913    if (nhooks < 0)
914        return NULL; /* Shouldn't happen */
915
916    importer = PyDict_GetItemWithError(path_importer_cache, p);
917    if (importer != NULL || _PyErr_Occurred(tstate)) {
918        Py_XINCREF(importer);
919        return importer;
920    }
921
922    /* set path_importer_cache[p] to None to avoid recursion */
923    if (PyDict_SetItem(path_importer_cache, p, Py_None) != 0)
924        return NULL;
925
926    for (j = 0; j < nhooks; j++) {
927        PyObject *hook = PyList_GetItem(path_hooks, j);
928        if (hook == NULL)
929            return NULL;
930        importer = PyObject_CallOneArg(hook, p);
931        if (importer != NULL)
932            break;
933
934        if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
935            return NULL;
936        }
937        _PyErr_Clear(tstate);
938    }
939    if (importer == NULL) {
940        Py_RETURN_NONE;
941    }
942    if (PyDict_SetItem(path_importer_cache, p, importer) < 0) {
943        Py_DECREF(importer);
944        return NULL;
945    }
946    return importer;
947}
948
949PyObject *
950PyImport_GetImporter(PyObject *path)
951{
952    PyThreadState *tstate = _PyThreadState_GET();
953    PyObject *path_importer_cache = PySys_GetObject("path_importer_cache");
954    PyObject *path_hooks = PySys_GetObject("path_hooks");
955    if (path_importer_cache == NULL || path_hooks == NULL) {
956        return NULL;
957    }
958    return get_path_importer(tstate, path_importer_cache, path_hooks, path);
959}
960
961#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE)
962#include <emscripten.h>
963EM_JS(PyObject*, _PyImport_InitFunc_TrampolineCall, (PyModInitFunction func), {
964    return wasmTable.get(func)();
965});
966#endif // __EMSCRIPTEN__ && PY_CALL_TRAMPOLINE
967
968static PyObject*
969create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
970{
971    PyObject *mod = import_find_extension(tstate, name, name);
972    if (mod || _PyErr_Occurred(tstate)) {
973        return mod;
974    }
975
976    PyObject *modules = tstate->interp->modules;
977    for (struct _inittab *p = PyImport_Inittab; p->name != NULL; p++) {
978        if (_PyUnicode_EqualToASCIIString(name, p->name)) {
979            if (p->initfunc == NULL) {
980                /* Cannot re-init internal module ("sys" or "builtins") */
981                mod = PyImport_AddModuleObject(name);
982                return Py_XNewRef(mod);
983            }
984            mod = _PyImport_InitFunc_TrampolineCall(*p->initfunc);
985            if (mod == NULL) {
986                return NULL;
987            }
988
989            if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
990                return PyModule_FromDefAndSpec((PyModuleDef*)mod, spec);
991            }
992            else {
993                /* Remember pointer to module init function. */
994                PyModuleDef *def = PyModule_GetDef(mod);
995                if (def == NULL) {
996                    return NULL;
997                }
998
999                def->m_base.m_init = p->initfunc;
1000                if (_PyImport_FixupExtensionObject(mod, name, name,
1001                                                   modules) < 0) {
1002                    return NULL;
1003                }
1004                return mod;
1005            }
1006        }
1007    }
1008
1009    // not found
1010    Py_RETURN_NONE;
1011}
1012
1013
1014
1015/*[clinic input]
1016_imp.create_builtin
1017
1018    spec: object
1019    /
1020
1021Create an extension module.
1022[clinic start generated code]*/
1023
1024static PyObject *
1025_imp_create_builtin(PyObject *module, PyObject *spec)
1026/*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/
1027{
1028    PyThreadState *tstate = _PyThreadState_GET();
1029
1030    PyObject *name = PyObject_GetAttrString(spec, "name");
1031    if (name == NULL) {
1032        return NULL;
1033    }
1034
1035    PyObject *mod = create_builtin(tstate, name, spec);
1036    Py_DECREF(name);
1037    return mod;
1038}
1039
1040
1041/* Return true if the name is an alias.  In that case, "alias" is set
1042   to the original module name.  If it is an alias but the original
1043   module isn't known then "alias" is set to NULL while true is returned. */
1044static bool
1045resolve_module_alias(const char *name, const struct _module_alias *aliases,
1046                     const char **alias)
1047{
1048    const struct _module_alias *entry;
1049    for (entry = aliases; ; entry++) {
1050        if (entry->name == NULL) {
1051            /* It isn't an alias. */
1052            return false;
1053        }
1054        if (strcmp(name, entry->name) == 0) {
1055            if (alias != NULL) {
1056                *alias = entry->orig;
1057            }
1058            return true;
1059        }
1060    }
1061}
1062
1063
1064/* Frozen modules */
1065
1066static bool
1067use_frozen(void)
1068{
1069    PyInterpreterState *interp = _PyInterpreterState_GET();
1070    int override = interp->override_frozen_modules;
1071    if (override > 0) {
1072        return true;
1073    }
1074    else if (override < 0) {
1075        return false;
1076    }
1077    else {
1078        return interp->config.use_frozen_modules;
1079    }
1080}
1081
1082static PyObject *
1083list_frozen_module_names(void)
1084{
1085    PyObject *names = PyList_New(0);
1086    if (names == NULL) {
1087        return NULL;
1088    }
1089    bool enabled = use_frozen();
1090    const struct _frozen *p;
1091#define ADD_MODULE(name) \
1092    do { \
1093        PyObject *nameobj = PyUnicode_FromString(name); \
1094        if (nameobj == NULL) { \
1095            goto error; \
1096        } \
1097        int res = PyList_Append(names, nameobj); \
1098        Py_DECREF(nameobj); \
1099        if (res != 0) { \
1100            goto error; \
1101        } \
1102    } while(0)
1103    // We always use the bootstrap modules.
1104    for (p = _PyImport_FrozenBootstrap; ; p++) {
1105        if (p->name == NULL) {
1106            break;
1107        }
1108        ADD_MODULE(p->name);
1109    }
1110    // Frozen stdlib modules may be disabled.
1111    for (p = _PyImport_FrozenStdlib; ; p++) {
1112        if (p->name == NULL) {
1113            break;
1114        }
1115        if (enabled) {
1116            ADD_MODULE(p->name);
1117        }
1118    }
1119    for (p = _PyImport_FrozenTest; ; p++) {
1120        if (p->name == NULL) {
1121            break;
1122        }
1123        if (enabled) {
1124            ADD_MODULE(p->name);
1125        }
1126    }
1127#undef ADD_MODULE
1128    // Add any custom modules.
1129    if (PyImport_FrozenModules != NULL) {
1130        for (p = PyImport_FrozenModules; ; p++) {
1131            if (p->name == NULL) {
1132                break;
1133            }
1134            PyObject *nameobj = PyUnicode_FromString(p->name);
1135            if (nameobj == NULL) {
1136                goto error;
1137            }
1138            int found = PySequence_Contains(names, nameobj);
1139            if (found < 0) {
1140                Py_DECREF(nameobj);
1141                goto error;
1142            }
1143            else if (found) {
1144                Py_DECREF(nameobj);
1145            }
1146            else {
1147                int res = PyList_Append(names, nameobj);
1148                Py_DECREF(nameobj);
1149                if (res != 0) {
1150                    goto error;
1151                }
1152            }
1153        }
1154    }
1155    return names;
1156
1157error:
1158    Py_DECREF(names);
1159    return NULL;
1160}
1161
1162typedef enum {
1163    FROZEN_OKAY,
1164    FROZEN_BAD_NAME,    // The given module name wasn't valid.
1165    FROZEN_NOT_FOUND,   // It wasn't in PyImport_FrozenModules.
1166    FROZEN_DISABLED,    // -X frozen_modules=off (and not essential)
1167    FROZEN_EXCLUDED,    /* The PyImport_FrozenModules entry has NULL "code"
1168                           (module is present but marked as unimportable, stops search). */
1169    FROZEN_INVALID,     /* The PyImport_FrozenModules entry is bogus
1170                           (eg. does not contain executable code). */
1171} frozen_status;
1172
1173static inline void
1174set_frozen_error(frozen_status status, PyObject *modname)
1175{
1176    const char *err = NULL;
1177    switch (status) {
1178        case FROZEN_BAD_NAME:
1179        case FROZEN_NOT_FOUND:
1180            err = "No such frozen object named %R";
1181            break;
1182        case FROZEN_DISABLED:
1183            err = "Frozen modules are disabled and the frozen object named %R is not essential";
1184            break;
1185        case FROZEN_EXCLUDED:
1186            err = "Excluded frozen object named %R";
1187            break;
1188        case FROZEN_INVALID:
1189            err = "Frozen object named %R is invalid";
1190            break;
1191        case FROZEN_OKAY:
1192            // There was no error.
1193            break;
1194        default:
1195            Py_UNREACHABLE();
1196    }
1197    if (err != NULL) {
1198        PyObject *msg = PyUnicode_FromFormat(err, modname);
1199        if (msg == NULL) {
1200            PyErr_Clear();
1201        }
1202        PyErr_SetImportError(msg, modname, NULL);
1203        Py_XDECREF(msg);
1204    }
1205}
1206
1207static const struct _frozen *
1208look_up_frozen(const char *name)
1209{
1210    const struct _frozen *p;
1211    // We always use the bootstrap modules.
1212    for (p = _PyImport_FrozenBootstrap; ; p++) {
1213        if (p->name == NULL) {
1214            // We hit the end-of-list sentinel value.
1215            break;
1216        }
1217        if (strcmp(name, p->name) == 0) {
1218            return p;
1219        }
1220    }
1221    // Prefer custom modules, if any.  Frozen stdlib modules can be
1222    // disabled here by setting "code" to NULL in the array entry.
1223    if (PyImport_FrozenModules != NULL) {
1224        for (p = PyImport_FrozenModules; ; p++) {
1225            if (p->name == NULL) {
1226                break;
1227            }
1228            if (strcmp(name, p->name) == 0) {
1229                return p;
1230            }
1231        }
1232    }
1233    // Frozen stdlib modules may be disabled.
1234    if (use_frozen()) {
1235        for (p = _PyImport_FrozenStdlib; ; p++) {
1236            if (p->name == NULL) {
1237                break;
1238            }
1239            if (strcmp(name, p->name) == 0) {
1240                return p;
1241            }
1242        }
1243        for (p = _PyImport_FrozenTest; ; p++) {
1244            if (p->name == NULL) {
1245                break;
1246            }
1247            if (strcmp(name, p->name) == 0) {
1248                return p;
1249            }
1250        }
1251    }
1252    return NULL;
1253}
1254
1255struct frozen_info {
1256    PyObject *nameobj;
1257    const char *data;
1258    PyObject *(*get_code)(void);
1259    Py_ssize_t size;
1260    bool is_package;
1261    bool is_alias;
1262    const char *origname;
1263};
1264
1265static frozen_status
1266find_frozen(PyObject *nameobj, struct frozen_info *info)
1267{
1268    if (info != NULL) {
1269        memset(info, 0, sizeof(*info));
1270    }
1271
1272    if (nameobj == NULL || nameobj == Py_None) {
1273        return FROZEN_BAD_NAME;
1274    }
1275    const char *name = PyUnicode_AsUTF8(nameobj);
1276    if (name == NULL) {
1277        // Note that this function previously used
1278        // _PyUnicode_EqualToASCIIString().  We clear the error here
1279        // (instead of propagating it) to match the earlier behavior
1280        // more closely.
1281        PyErr_Clear();
1282        return FROZEN_BAD_NAME;
1283    }
1284
1285    const struct _frozen *p = look_up_frozen(name);
1286    if (p == NULL) {
1287        return FROZEN_NOT_FOUND;
1288    }
1289    if (info != NULL) {
1290        info->nameobj = nameobj;  // borrowed
1291        info->data = (const char *)p->code;
1292        info->get_code = p->get_code;
1293        info->size = p->size;
1294        info->is_package = p->is_package;
1295        if (p->size < 0) {
1296            // backward compatibility with negative size values
1297            info->size = -(p->size);
1298            info->is_package = true;
1299        }
1300        info->origname = name;
1301        info->is_alias = resolve_module_alias(name, _PyImport_FrozenAliases,
1302                                              &info->origname);
1303    }
1304    if (p->code == NULL && p->size == 0 && p->get_code != NULL) {
1305        /* It is only deepfrozen. */
1306        return FROZEN_OKAY;
1307    }
1308    if (p->code == NULL) {
1309        /* It is frozen but marked as un-importable. */
1310        return FROZEN_EXCLUDED;
1311    }
1312    if (p->code[0] == '\0' || p->size == 0) {
1313        /* Does not contain executable code. */
1314        return FROZEN_INVALID;
1315    }
1316    return FROZEN_OKAY;
1317}
1318
1319static PyObject *
1320unmarshal_frozen_code(struct frozen_info *info)
1321{
1322    if (info->get_code) {
1323        PyObject *code = info->get_code();
1324        assert(code != NULL);
1325        return code;
1326    }
1327    PyObject *co = PyMarshal_ReadObjectFromString(info->data, info->size);
1328    if (co == NULL) {
1329        /* Does not contain executable code. */
1330        set_frozen_error(FROZEN_INVALID, info->nameobj);
1331        return NULL;
1332    }
1333    if (!PyCode_Check(co)) {
1334        // We stick with TypeError for backward compatibility.
1335        PyErr_Format(PyExc_TypeError,
1336                     "frozen object %R is not a code object",
1337                     info->nameobj);
1338        Py_DECREF(co);
1339        return NULL;
1340    }
1341    return co;
1342}
1343
1344
1345/* Initialize a frozen module.
1346   Return 1 for success, 0 if the module is not found, and -1 with
1347   an exception set if the initialization failed.
1348   This function is also used from frozenmain.c */
1349
1350int
1351PyImport_ImportFrozenModuleObject(PyObject *name)
1352{
1353    PyThreadState *tstate = _PyThreadState_GET();
1354    PyObject *co, *m, *d = NULL;
1355    int err;
1356
1357    struct frozen_info info;
1358    frozen_status status = find_frozen(name, &info);
1359    if (status == FROZEN_NOT_FOUND || status == FROZEN_DISABLED) {
1360        return 0;
1361    }
1362    else if (status == FROZEN_BAD_NAME) {
1363        return 0;
1364    }
1365    else if (status != FROZEN_OKAY) {
1366        set_frozen_error(status, name);
1367        return -1;
1368    }
1369    co = unmarshal_frozen_code(&info);
1370    if (co == NULL) {
1371        return -1;
1372    }
1373    if (info.is_package) {
1374        /* Set __path__ to the empty list */
1375        PyObject *l;
1376        m = import_add_module(tstate, name);
1377        if (m == NULL)
1378            goto err_return;
1379        d = PyModule_GetDict(m);
1380        l = PyList_New(0);
1381        if (l == NULL) {
1382            Py_DECREF(m);
1383            goto err_return;
1384        }
1385        err = PyDict_SetItemString(d, "__path__", l);
1386        Py_DECREF(l);
1387        Py_DECREF(m);
1388        if (err != 0)
1389            goto err_return;
1390    }
1391    d = module_dict_for_exec(tstate, name);
1392    if (d == NULL) {
1393        goto err_return;
1394    }
1395    m = exec_code_in_module(tstate, name, d, co);
1396    if (m == NULL) {
1397        goto err_return;
1398    }
1399    Py_DECREF(m);
1400    /* Set __origname__ (consumed in FrozenImporter._setup_module()). */
1401    PyObject *origname;
1402    if (info.origname) {
1403        origname = PyUnicode_FromString(info.origname);
1404        if (origname == NULL) {
1405            goto err_return;
1406        }
1407    }
1408    else {
1409        Py_INCREF(Py_None);
1410        origname = Py_None;
1411    }
1412    err = PyDict_SetItemString(d, "__origname__", origname);
1413    Py_DECREF(origname);
1414    if (err != 0) {
1415        goto err_return;
1416    }
1417    Py_DECREF(d);
1418    Py_DECREF(co);
1419    return 1;
1420
1421err_return:
1422    Py_XDECREF(d);
1423    Py_DECREF(co);
1424    return -1;
1425}
1426
1427int
1428PyImport_ImportFrozenModule(const char *name)
1429{
1430    PyObject *nameobj;
1431    int ret;
1432    nameobj = PyUnicode_InternFromString(name);
1433    if (nameobj == NULL)
1434        return -1;
1435    ret = PyImport_ImportFrozenModuleObject(nameobj);
1436    Py_DECREF(nameobj);
1437    return ret;
1438}
1439
1440
1441/* Import a module, either built-in, frozen, or external, and return
1442   its module object WITH INCREMENTED REFERENCE COUNT */
1443
1444PyObject *
1445PyImport_ImportModule(const char *name)
1446{
1447    PyObject *pname;
1448    PyObject *result;
1449
1450    pname = PyUnicode_FromString(name);
1451    if (pname == NULL)
1452        return NULL;
1453    result = PyImport_Import(pname);
1454    Py_DECREF(pname);
1455    return result;
1456}
1457
1458
1459/* Import a module without blocking
1460 *
1461 * At first it tries to fetch the module from sys.modules. If the module was
1462 * never loaded before it loads it with PyImport_ImportModule() unless another
1463 * thread holds the import lock. In the latter case the function raises an
1464 * ImportError instead of blocking.
1465 *
1466 * Returns the module object with incremented ref count.
1467 */
1468PyObject *
1469PyImport_ImportModuleNoBlock(const char *name)
1470{
1471    return PyImport_ImportModule(name);
1472}
1473
1474
1475/* Remove importlib frames from the traceback,
1476 * except in Verbose mode. */
1477static void
1478remove_importlib_frames(PyThreadState *tstate)
1479{
1480    const char *importlib_filename = "<frozen importlib._bootstrap>";
1481    const char *external_filename = "<frozen importlib._bootstrap_external>";
1482    const char *remove_frames = "_call_with_frames_removed";
1483    int always_trim = 0;
1484    int in_importlib = 0;
1485    PyObject *exception, *value, *base_tb, *tb;
1486    PyObject **prev_link, **outer_link = NULL;
1487
1488    /* Synopsis: if it's an ImportError, we trim all importlib chunks
1489       from the traceback. We always trim chunks
1490       which end with a call to "_call_with_frames_removed". */
1491
1492    _PyErr_Fetch(tstate, &exception, &value, &base_tb);
1493    if (!exception || _PyInterpreterState_GetConfig(tstate->interp)->verbose) {
1494        goto done;
1495    }
1496
1497    if (PyType_IsSubtype((PyTypeObject *) exception,
1498                         (PyTypeObject *) PyExc_ImportError))
1499        always_trim = 1;
1500
1501    prev_link = &base_tb;
1502    tb = base_tb;
1503    while (tb != NULL) {
1504        PyTracebackObject *traceback = (PyTracebackObject *)tb;
1505        PyObject *next = (PyObject *) traceback->tb_next;
1506        PyFrameObject *frame = traceback->tb_frame;
1507        PyCodeObject *code = PyFrame_GetCode(frame);
1508        int now_in_importlib;
1509
1510        assert(PyTraceBack_Check(tb));
1511        now_in_importlib = _PyUnicode_EqualToASCIIString(code->co_filename, importlib_filename) ||
1512                           _PyUnicode_EqualToASCIIString(code->co_filename, external_filename);
1513        if (now_in_importlib && !in_importlib) {
1514            /* This is the link to this chunk of importlib tracebacks */
1515            outer_link = prev_link;
1516        }
1517        in_importlib = now_in_importlib;
1518
1519        if (in_importlib &&
1520            (always_trim ||
1521             _PyUnicode_EqualToASCIIString(code->co_name, remove_frames))) {
1522            Py_XINCREF(next);
1523            Py_XSETREF(*outer_link, next);
1524            prev_link = outer_link;
1525        }
1526        else {
1527            prev_link = (PyObject **) &traceback->tb_next;
1528        }
1529        Py_DECREF(code);
1530        tb = next;
1531    }
1532done:
1533    _PyErr_Restore(tstate, exception, value, base_tb);
1534}
1535
1536
1537static PyObject *
1538resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level)
1539{
1540    PyObject *abs_name;
1541    PyObject *package = NULL;
1542    PyObject *spec;
1543    Py_ssize_t last_dot;
1544    PyObject *base;
1545    int level_up;
1546
1547    if (globals == NULL) {
1548        _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals");
1549        goto error;
1550    }
1551    if (!PyDict_Check(globals)) {
1552        _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict");
1553        goto error;
1554    }
1555    package = PyDict_GetItemWithError(globals, &_Py_ID(__package__));
1556    if (package == Py_None) {
1557        package = NULL;
1558    }
1559    else if (package == NULL && _PyErr_Occurred(tstate)) {
1560        goto error;
1561    }
1562    spec = PyDict_GetItemWithError(globals, &_Py_ID(__spec__));
1563    if (spec == NULL && _PyErr_Occurred(tstate)) {
1564        goto error;
1565    }
1566
1567    if (package != NULL) {
1568        Py_INCREF(package);
1569        if (!PyUnicode_Check(package)) {
1570            _PyErr_SetString(tstate, PyExc_TypeError,
1571                             "package must be a string");
1572            goto error;
1573        }
1574        else if (spec != NULL && spec != Py_None) {
1575            int equal;
1576            PyObject *parent = PyObject_GetAttr(spec, &_Py_ID(parent));
1577            if (parent == NULL) {
1578                goto error;
1579            }
1580
1581            equal = PyObject_RichCompareBool(package, parent, Py_EQ);
1582            Py_DECREF(parent);
1583            if (equal < 0) {
1584                goto error;
1585            }
1586            else if (equal == 0) {
1587                if (PyErr_WarnEx(PyExc_ImportWarning,
1588                        "__package__ != __spec__.parent", 1) < 0) {
1589                    goto error;
1590                }
1591            }
1592        }
1593    }
1594    else if (spec != NULL && spec != Py_None) {
1595        package = PyObject_GetAttr(spec, &_Py_ID(parent));
1596        if (package == NULL) {
1597            goto error;
1598        }
1599        else if (!PyUnicode_Check(package)) {
1600            _PyErr_SetString(tstate, PyExc_TypeError,
1601                             "__spec__.parent must be a string");
1602            goto error;
1603        }
1604    }
1605    else {
1606        if (PyErr_WarnEx(PyExc_ImportWarning,
1607                    "can't resolve package from __spec__ or __package__, "
1608                    "falling back on __name__ and __path__", 1) < 0) {
1609            goto error;
1610        }
1611
1612        package = PyDict_GetItemWithError(globals, &_Py_ID(__name__));
1613        if (package == NULL) {
1614            if (!_PyErr_Occurred(tstate)) {
1615                _PyErr_SetString(tstate, PyExc_KeyError,
1616                                 "'__name__' not in globals");
1617            }
1618            goto error;
1619        }
1620
1621        Py_INCREF(package);
1622        if (!PyUnicode_Check(package)) {
1623            _PyErr_SetString(tstate, PyExc_TypeError,
1624                             "__name__ must be a string");
1625            goto error;
1626        }
1627
1628        int haspath = PyDict_Contains(globals, &_Py_ID(__path__));
1629        if (haspath < 0) {
1630            goto error;
1631        }
1632        if (!haspath) {
1633            Py_ssize_t dot;
1634
1635            if (PyUnicode_READY(package) < 0) {
1636                goto error;
1637            }
1638
1639            dot = PyUnicode_FindChar(package, '.',
1640                                        0, PyUnicode_GET_LENGTH(package), -1);
1641            if (dot == -2) {
1642                goto error;
1643            }
1644            else if (dot == -1) {
1645                goto no_parent_error;
1646            }
1647            PyObject *substr = PyUnicode_Substring(package, 0, dot);
1648            if (substr == NULL) {
1649                goto error;
1650            }
1651            Py_SETREF(package, substr);
1652        }
1653    }
1654
1655    last_dot = PyUnicode_GET_LENGTH(package);
1656    if (last_dot == 0) {
1657        goto no_parent_error;
1658    }
1659
1660    for (level_up = 1; level_up < level; level_up += 1) {
1661        last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
1662        if (last_dot == -2) {
1663            goto error;
1664        }
1665        else if (last_dot == -1) {
1666            _PyErr_SetString(tstate, PyExc_ImportError,
1667                             "attempted relative import beyond top-level "
1668                             "package");
1669            goto error;
1670        }
1671    }
1672
1673    base = PyUnicode_Substring(package, 0, last_dot);
1674    Py_DECREF(package);
1675    if (base == NULL || PyUnicode_GET_LENGTH(name) == 0) {
1676        return base;
1677    }
1678
1679    abs_name = PyUnicode_FromFormat("%U.%U", base, name);
1680    Py_DECREF(base);
1681    return abs_name;
1682
1683  no_parent_error:
1684    _PyErr_SetString(tstate, PyExc_ImportError,
1685                     "attempted relative import "
1686                     "with no known parent package");
1687
1688  error:
1689    Py_XDECREF(package);
1690    return NULL;
1691}
1692
1693static PyObject *
1694import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
1695{
1696    PyObject *mod = NULL;
1697    PyInterpreterState *interp = tstate->interp;
1698    int import_time = _PyInterpreterState_GetConfig(interp)->import_time;
1699    static int import_level;
1700    static _PyTime_t accumulated;
1701
1702    _PyTime_t t1 = 0, accumulated_copy = accumulated;
1703
1704    PyObject *sys_path = PySys_GetObject("path");
1705    PyObject *sys_meta_path = PySys_GetObject("meta_path");
1706    PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
1707    if (_PySys_Audit(tstate, "import", "OOOOO",
1708                     abs_name, Py_None, sys_path ? sys_path : Py_None,
1709                     sys_meta_path ? sys_meta_path : Py_None,
1710                     sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
1711        return NULL;
1712    }
1713
1714
1715    /* XOptions is initialized after first some imports.
1716     * So we can't have negative cache before completed initialization.
1717     * Anyway, importlib._find_and_load is much slower than
1718     * _PyDict_GetItemIdWithError().
1719     */
1720    if (import_time) {
1721        static int header = 1;
1722        if (header) {
1723            fputs("import time: self [us] | cumulative | imported package\n",
1724                  stderr);
1725            header = 0;
1726        }
1727
1728        import_level++;
1729        t1 = _PyTime_GetPerfCounter();
1730        accumulated = 0;
1731    }
1732
1733    if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
1734        PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
1735
1736    mod = PyObject_CallMethodObjArgs(interp->importlib, &_Py_ID(_find_and_load),
1737                                     abs_name, interp->import_func, NULL);
1738
1739    if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
1740        PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
1741                                       mod != NULL);
1742
1743    if (import_time) {
1744        _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
1745
1746        import_level--;
1747        fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
1748                (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
1749                (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
1750                import_level*2, "", PyUnicode_AsUTF8(abs_name));
1751
1752        accumulated = accumulated_copy + cum;
1753    }
1754
1755    return mod;
1756}
1757
1758PyObject *
1759PyImport_GetModule(PyObject *name)
1760{
1761    PyThreadState *tstate = _PyThreadState_GET();
1762    PyObject *mod;
1763
1764    mod = import_get_module(tstate, name);
1765    if (mod != NULL && mod != Py_None) {
1766        if (import_ensure_initialized(tstate->interp, mod, name) < 0) {
1767            Py_DECREF(mod);
1768            remove_importlib_frames(tstate);
1769            return NULL;
1770        }
1771    }
1772    return mod;
1773}
1774
1775PyObject *
1776PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
1777                                 PyObject *locals, PyObject *fromlist,
1778                                 int level)
1779{
1780    PyThreadState *tstate = _PyThreadState_GET();
1781    PyObject *abs_name = NULL;
1782    PyObject *final_mod = NULL;
1783    PyObject *mod = NULL;
1784    PyObject *package = NULL;
1785    PyInterpreterState *interp = tstate->interp;
1786    int has_from;
1787
1788    if (name == NULL) {
1789        _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
1790        goto error;
1791    }
1792
1793    /* The below code is importlib.__import__() & _gcd_import(), ported to C
1794       for added performance. */
1795
1796    if (!PyUnicode_Check(name)) {
1797        _PyErr_SetString(tstate, PyExc_TypeError,
1798                         "module name must be a string");
1799        goto error;
1800    }
1801    if (PyUnicode_READY(name) < 0) {
1802        goto error;
1803    }
1804    if (level < 0) {
1805        _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0");
1806        goto error;
1807    }
1808
1809    if (level > 0) {
1810        abs_name = resolve_name(tstate, name, globals, level);
1811        if (abs_name == NULL)
1812            goto error;
1813    }
1814    else {  /* level == 0 */
1815        if (PyUnicode_GET_LENGTH(name) == 0) {
1816            _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name");
1817            goto error;
1818        }
1819        abs_name = name;
1820        Py_INCREF(abs_name);
1821    }
1822
1823    mod = import_get_module(tstate, abs_name);
1824    if (mod == NULL && _PyErr_Occurred(tstate)) {
1825        goto error;
1826    }
1827
1828    if (mod != NULL && mod != Py_None) {
1829        if (import_ensure_initialized(tstate->interp, mod, abs_name) < 0) {
1830            goto error;
1831        }
1832    }
1833    else {
1834        Py_XDECREF(mod);
1835        mod = import_find_and_load(tstate, abs_name);
1836        if (mod == NULL) {
1837            goto error;
1838        }
1839    }
1840
1841    has_from = 0;
1842    if (fromlist != NULL && fromlist != Py_None) {
1843        has_from = PyObject_IsTrue(fromlist);
1844        if (has_from < 0)
1845            goto error;
1846    }
1847    if (!has_from) {
1848        Py_ssize_t len = PyUnicode_GET_LENGTH(name);
1849        if (level == 0 || len > 0) {
1850            Py_ssize_t dot;
1851
1852            dot = PyUnicode_FindChar(name, '.', 0, len, 1);
1853            if (dot == -2) {
1854                goto error;
1855            }
1856
1857            if (dot == -1) {
1858                /* No dot in module name, simple exit */
1859                final_mod = mod;
1860                Py_INCREF(mod);
1861                goto error;
1862            }
1863
1864            if (level == 0) {
1865                PyObject *front = PyUnicode_Substring(name, 0, dot);
1866                if (front == NULL) {
1867                    goto error;
1868                }
1869
1870                final_mod = PyImport_ImportModuleLevelObject(front, NULL, NULL, NULL, 0);
1871                Py_DECREF(front);
1872            }
1873            else {
1874                Py_ssize_t cut_off = len - dot;
1875                Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
1876                PyObject *to_return = PyUnicode_Substring(abs_name, 0,
1877                                                        abs_name_len - cut_off);
1878                if (to_return == NULL) {
1879                    goto error;
1880                }
1881
1882                final_mod = import_get_module(tstate, to_return);
1883                Py_DECREF(to_return);
1884                if (final_mod == NULL) {
1885                    if (!_PyErr_Occurred(tstate)) {
1886                        _PyErr_Format(tstate, PyExc_KeyError,
1887                                      "%R not in sys.modules as expected",
1888                                      to_return);
1889                    }
1890                    goto error;
1891                }
1892            }
1893        }
1894        else {
1895            final_mod = mod;
1896            Py_INCREF(mod);
1897        }
1898    }
1899    else {
1900        PyObject *path;
1901        if (_PyObject_LookupAttr(mod, &_Py_ID(__path__), &path) < 0) {
1902            goto error;
1903        }
1904        if (path) {
1905            Py_DECREF(path);
1906            final_mod = PyObject_CallMethodObjArgs(
1907                        interp->importlib, &_Py_ID(_handle_fromlist),
1908                        mod, fromlist, interp->import_func, NULL);
1909        }
1910        else {
1911            final_mod = mod;
1912            Py_INCREF(mod);
1913        }
1914    }
1915
1916  error:
1917    Py_XDECREF(abs_name);
1918    Py_XDECREF(mod);
1919    Py_XDECREF(package);
1920    if (final_mod == NULL) {
1921        remove_importlib_frames(tstate);
1922    }
1923    return final_mod;
1924}
1925
1926PyObject *
1927PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
1928                           PyObject *fromlist, int level)
1929{
1930    PyObject *nameobj, *mod;
1931    nameobj = PyUnicode_FromString(name);
1932    if (nameobj == NULL)
1933        return NULL;
1934    mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
1935                                           fromlist, level);
1936    Py_DECREF(nameobj);
1937    return mod;
1938}
1939
1940
1941/* Re-import a module of any kind and return its module object, WITH
1942   INCREMENTED REFERENCE COUNT */
1943
1944PyObject *
1945PyImport_ReloadModule(PyObject *m)
1946{
1947    PyObject *reloaded_module = NULL;
1948    PyObject *importlib = PyImport_GetModule(&_Py_ID(importlib));
1949    if (importlib == NULL) {
1950        if (PyErr_Occurred()) {
1951            return NULL;
1952        }
1953
1954        importlib = PyImport_ImportModule("importlib");
1955        if (importlib == NULL) {
1956            return NULL;
1957        }
1958    }
1959
1960    reloaded_module = PyObject_CallMethodOneArg(importlib, &_Py_ID(reload), m);
1961    Py_DECREF(importlib);
1962    return reloaded_module;
1963}
1964
1965
1966/* Higher-level import emulator which emulates the "import" statement
1967   more accurately -- it invokes the __import__() function from the
1968   builtins of the current globals.  This means that the import is
1969   done using whatever import hooks are installed in the current
1970   environment.
1971   A dummy list ["__doc__"] is passed as the 4th argument so that
1972   e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
1973   will return <module "gencache"> instead of <module "win32com">. */
1974
1975PyObject *
1976PyImport_Import(PyObject *module_name)
1977{
1978    PyThreadState *tstate = _PyThreadState_GET();
1979    PyObject *globals = NULL;
1980    PyObject *import = NULL;
1981    PyObject *builtins = NULL;
1982    PyObject *r = NULL;
1983
1984    PyObject *from_list = PyList_New(0);
1985    if (from_list == NULL) {
1986        goto err;
1987    }
1988
1989    /* Get the builtins from current globals */
1990    globals = PyEval_GetGlobals();
1991    if (globals != NULL) {
1992        Py_INCREF(globals);
1993        builtins = PyObject_GetItem(globals, &_Py_ID(__builtins__));
1994        if (builtins == NULL)
1995            goto err;
1996    }
1997    else {
1998        /* No globals -- use standard builtins, and fake globals */
1999        builtins = PyImport_ImportModuleLevel("builtins",
2000                                              NULL, NULL, NULL, 0);
2001        if (builtins == NULL) {
2002            goto err;
2003        }
2004        globals = Py_BuildValue("{OO}", &_Py_ID(__builtins__), builtins);
2005        if (globals == NULL)
2006            goto err;
2007    }
2008
2009    /* Get the __import__ function from the builtins */
2010    if (PyDict_Check(builtins)) {
2011        import = PyObject_GetItem(builtins, &_Py_ID(__import__));
2012        if (import == NULL) {
2013            _PyErr_SetObject(tstate, PyExc_KeyError, &_Py_ID(__import__));
2014        }
2015    }
2016    else
2017        import = PyObject_GetAttr(builtins, &_Py_ID(__import__));
2018    if (import == NULL)
2019        goto err;
2020
2021    /* Call the __import__ function with the proper argument list
2022       Always use absolute import here.
2023       Calling for side-effect of import. */
2024    r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
2025                              globals, from_list, 0, NULL);
2026    if (r == NULL)
2027        goto err;
2028    Py_DECREF(r);
2029
2030    r = import_get_module(tstate, module_name);
2031    if (r == NULL && !_PyErr_Occurred(tstate)) {
2032        _PyErr_SetObject(tstate, PyExc_KeyError, module_name);
2033    }
2034
2035  err:
2036    Py_XDECREF(globals);
2037    Py_XDECREF(builtins);
2038    Py_XDECREF(import);
2039    Py_XDECREF(from_list);
2040
2041    return r;
2042}
2043
2044/*[clinic input]
2045_imp.extension_suffixes
2046
2047Returns the list of file suffixes used to identify extension modules.
2048[clinic start generated code]*/
2049
2050static PyObject *
2051_imp_extension_suffixes_impl(PyObject *module)
2052/*[clinic end generated code: output=0bf346e25a8f0cd3 input=ecdeeecfcb6f839e]*/
2053{
2054    PyObject *list;
2055
2056    list = PyList_New(0);
2057    if (list == NULL)
2058        return NULL;
2059#ifdef HAVE_DYNAMIC_LOADING
2060    const char *suffix;
2061    unsigned int index = 0;
2062
2063    while ((suffix = _PyImport_DynLoadFiletab[index])) {
2064        PyObject *item = PyUnicode_FromString(suffix);
2065        if (item == NULL) {
2066            Py_DECREF(list);
2067            return NULL;
2068        }
2069        if (PyList_Append(list, item) < 0) {
2070            Py_DECREF(list);
2071            Py_DECREF(item);
2072            return NULL;
2073        }
2074        Py_DECREF(item);
2075        index += 1;
2076    }
2077#endif
2078    return list;
2079}
2080
2081/*[clinic input]
2082_imp.init_frozen
2083
2084    name: unicode
2085    /
2086
2087Initializes a frozen module.
2088[clinic start generated code]*/
2089
2090static PyObject *
2091_imp_init_frozen_impl(PyObject *module, PyObject *name)
2092/*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/
2093{
2094    PyThreadState *tstate = _PyThreadState_GET();
2095    int ret;
2096
2097    ret = PyImport_ImportFrozenModuleObject(name);
2098    if (ret < 0)
2099        return NULL;
2100    if (ret == 0) {
2101        Py_RETURN_NONE;
2102    }
2103    return import_add_module(tstate, name);
2104}
2105
2106/*[clinic input]
2107_imp.find_frozen
2108
2109    name: unicode
2110    /
2111    *
2112    withdata: bool = False
2113
2114Return info about the corresponding frozen module (if there is one) or None.
2115
2116The returned info (a 2-tuple):
2117
2118 * data         the raw marshalled bytes
2119 * is_package   whether or not it is a package
2120 * origname     the originally frozen module's name, or None if not
2121                a stdlib module (this will usually be the same as
2122                the module's current name)
2123[clinic start generated code]*/
2124
2125static PyObject *
2126_imp_find_frozen_impl(PyObject *module, PyObject *name, int withdata)
2127/*[clinic end generated code: output=8c1c3c7f925397a5 input=22a8847c201542fd]*/
2128{
2129    struct frozen_info info;
2130    frozen_status status = find_frozen(name, &info);
2131    if (status == FROZEN_NOT_FOUND || status == FROZEN_DISABLED) {
2132        Py_RETURN_NONE;
2133    }
2134    else if (status == FROZEN_BAD_NAME) {
2135        Py_RETURN_NONE;
2136    }
2137    else if (status != FROZEN_OKAY) {
2138        set_frozen_error(status, name);
2139        return NULL;
2140    }
2141
2142    PyObject *data = NULL;
2143    if (withdata) {
2144        data = PyMemoryView_FromMemory((char *)info.data, info.size, PyBUF_READ);
2145        if (data == NULL) {
2146            return NULL;
2147        }
2148    }
2149
2150    PyObject *origname = NULL;
2151    if (info.origname != NULL && info.origname[0] != '\0') {
2152        origname = PyUnicode_FromString(info.origname);
2153        if (origname == NULL) {
2154            Py_DECREF(data);
2155            return NULL;
2156        }
2157    }
2158
2159    PyObject *result = PyTuple_Pack(3, data ? data : Py_None,
2160                                    info.is_package ? Py_True : Py_False,
2161                                    origname ? origname : Py_None);
2162    Py_XDECREF(origname);
2163    Py_XDECREF(data);
2164    return result;
2165}
2166
2167/*[clinic input]
2168_imp.get_frozen_object
2169
2170    name: unicode
2171    data as dataobj: object = None
2172    /
2173
2174Create a code object for a frozen module.
2175[clinic start generated code]*/
2176
2177static PyObject *
2178_imp_get_frozen_object_impl(PyObject *module, PyObject *name,
2179                            PyObject *dataobj)
2180/*[clinic end generated code: output=54368a673a35e745 input=034bdb88f6460b7b]*/
2181{
2182    struct frozen_info info = {0};
2183    Py_buffer buf = {0};
2184    if (PyObject_CheckBuffer(dataobj)) {
2185        if (PyObject_GetBuffer(dataobj, &buf, PyBUF_READ) != 0) {
2186            return NULL;
2187        }
2188        info.data = (const char *)buf.buf;
2189        info.size = buf.len;
2190    }
2191    else if (dataobj != Py_None) {
2192        _PyArg_BadArgument("get_frozen_object", "argument 2", "bytes", dataobj);
2193        return NULL;
2194    }
2195    else {
2196        frozen_status status = find_frozen(name, &info);
2197        if (status != FROZEN_OKAY) {
2198            set_frozen_error(status, name);
2199            return NULL;
2200        }
2201    }
2202
2203    if (info.nameobj == NULL) {
2204        info.nameobj = name;
2205    }
2206    if (info.size == 0 && info.get_code == NULL) {
2207        /* Does not contain executable code. */
2208        set_frozen_error(FROZEN_INVALID, name);
2209        return NULL;
2210    }
2211
2212    PyObject *codeobj = unmarshal_frozen_code(&info);
2213    if (dataobj != Py_None) {
2214        PyBuffer_Release(&buf);
2215    }
2216    return codeobj;
2217}
2218
2219/*[clinic input]
2220_imp.is_frozen_package
2221
2222    name: unicode
2223    /
2224
2225Returns True if the module name is of a frozen package.
2226[clinic start generated code]*/
2227
2228static PyObject *
2229_imp_is_frozen_package_impl(PyObject *module, PyObject *name)
2230/*[clinic end generated code: output=e70cbdb45784a1c9 input=81b6cdecd080fbb8]*/
2231{
2232    struct frozen_info info;
2233    frozen_status status = find_frozen(name, &info);
2234    if (status != FROZEN_OKAY && status != FROZEN_EXCLUDED) {
2235        set_frozen_error(status, name);
2236        return NULL;
2237    }
2238    return PyBool_FromLong(info.is_package);
2239}
2240
2241/*[clinic input]
2242_imp.is_builtin
2243
2244    name: unicode
2245    /
2246
2247Returns True if the module name corresponds to a built-in module.
2248[clinic start generated code]*/
2249
2250static PyObject *
2251_imp_is_builtin_impl(PyObject *module, PyObject *name)
2252/*[clinic end generated code: output=3bfd1162e2d3be82 input=86befdac021dd1c7]*/
2253{
2254    return PyLong_FromLong(is_builtin(name));
2255}
2256
2257/*[clinic input]
2258_imp.is_frozen
2259
2260    name: unicode
2261    /
2262
2263Returns True if the module name corresponds to a frozen module.
2264[clinic start generated code]*/
2265
2266static PyObject *
2267_imp_is_frozen_impl(PyObject *module, PyObject *name)
2268/*[clinic end generated code: output=01f408f5ec0f2577 input=7301dbca1897d66b]*/
2269{
2270    struct frozen_info info;
2271    frozen_status status = find_frozen(name, &info);
2272    if (status != FROZEN_OKAY) {
2273        Py_RETURN_FALSE;
2274    }
2275    Py_RETURN_TRUE;
2276}
2277
2278/*[clinic input]
2279_imp._frozen_module_names
2280
2281Returns the list of available frozen modules.
2282[clinic start generated code]*/
2283
2284static PyObject *
2285_imp__frozen_module_names_impl(PyObject *module)
2286/*[clinic end generated code: output=80609ef6256310a8 input=76237fbfa94460d2]*/
2287{
2288    return list_frozen_module_names();
2289}
2290
2291/*[clinic input]
2292_imp._override_frozen_modules_for_tests
2293
2294    override: int
2295    /
2296
2297(internal-only) Override PyConfig.use_frozen_modules.
2298
2299(-1: "off", 1: "on", 0: no override)
2300See frozen_modules() in Lib/test/support/import_helper.py.
2301[clinic start generated code]*/
2302
2303static PyObject *
2304_imp__override_frozen_modules_for_tests_impl(PyObject *module, int override)
2305/*[clinic end generated code: output=36d5cb1594160811 input=8f1f95a3ef21aec3]*/
2306{
2307    PyInterpreterState *interp = _PyInterpreterState_GET();
2308    interp->override_frozen_modules = override;
2309    Py_RETURN_NONE;
2310}
2311
2312/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */
2313static int
2314exec_builtin_or_dynamic(PyObject *mod) {
2315    PyModuleDef *def;
2316    void *state;
2317
2318    if (!PyModule_Check(mod)) {
2319        return 0;
2320    }
2321
2322    def = PyModule_GetDef(mod);
2323    if (def == NULL) {
2324        return 0;
2325    }
2326
2327    state = PyModule_GetState(mod);
2328    if (state) {
2329        /* Already initialized; skip reload */
2330        return 0;
2331    }
2332
2333    return PyModule_ExecDef(mod, def);
2334}
2335
2336#ifdef HAVE_DYNAMIC_LOADING
2337
2338/*[clinic input]
2339_imp.create_dynamic
2340
2341    spec: object
2342    file: object = NULL
2343    /
2344
2345Create an extension module.
2346[clinic start generated code]*/
2347
2348static PyObject *
2349_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
2350/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
2351{
2352    PyObject *mod, *name, *path;
2353    FILE *fp;
2354
2355    name = PyObject_GetAttrString(spec, "name");
2356    if (name == NULL) {
2357        return NULL;
2358    }
2359
2360    path = PyObject_GetAttrString(spec, "origin");
2361    if (path == NULL) {
2362        Py_DECREF(name);
2363        return NULL;
2364    }
2365
2366    PyThreadState *tstate = _PyThreadState_GET();
2367    mod = import_find_extension(tstate, name, path);
2368    if (mod != NULL || PyErr_Occurred()) {
2369        Py_DECREF(name);
2370        Py_DECREF(path);
2371        return mod;
2372    }
2373
2374    if (file != NULL) {
2375        fp = _Py_fopen_obj(path, "r");
2376        if (fp == NULL) {
2377            Py_DECREF(name);
2378            Py_DECREF(path);
2379            return NULL;
2380        }
2381    }
2382    else
2383        fp = NULL;
2384
2385    mod = _PyImport_LoadDynamicModuleWithSpec(spec, fp);
2386
2387    Py_DECREF(name);
2388    Py_DECREF(path);
2389    if (fp)
2390        fclose(fp);
2391    return mod;
2392}
2393
2394/*[clinic input]
2395_imp.exec_dynamic -> int
2396
2397    mod: object
2398    /
2399
2400Initialize an extension module.
2401[clinic start generated code]*/
2402
2403static int
2404_imp_exec_dynamic_impl(PyObject *module, PyObject *mod)
2405/*[clinic end generated code: output=f5720ac7b465877d input=9fdbfcb250280d3a]*/
2406{
2407    return exec_builtin_or_dynamic(mod);
2408}
2409
2410
2411#endif /* HAVE_DYNAMIC_LOADING */
2412
2413/*[clinic input]
2414_imp.exec_builtin -> int
2415
2416    mod: object
2417    /
2418
2419Initialize a built-in module.
2420[clinic start generated code]*/
2421
2422static int
2423_imp_exec_builtin_impl(PyObject *module, PyObject *mod)
2424/*[clinic end generated code: output=0262447b240c038e input=7beed5a2f12a60ca]*/
2425{
2426    return exec_builtin_or_dynamic(mod);
2427}
2428
2429/*[clinic input]
2430_imp.source_hash
2431
2432    key: long
2433    source: Py_buffer
2434[clinic start generated code]*/
2435
2436static PyObject *
2437_imp_source_hash_impl(PyObject *module, long key, Py_buffer *source)
2438/*[clinic end generated code: output=edb292448cf399ea input=9aaad1e590089789]*/
2439{
2440    union {
2441        uint64_t x;
2442        char data[sizeof(uint64_t)];
2443    } hash;
2444    hash.x = _Py_KeyedHash((uint64_t)key, source->buf, source->len);
2445#if !PY_LITTLE_ENDIAN
2446    // Force to little-endian. There really ought to be a succinct standard way
2447    // to do this.
2448    for (size_t i = 0; i < sizeof(hash.data)/2; i++) {
2449        char tmp = hash.data[i];
2450        hash.data[i] = hash.data[sizeof(hash.data) - i - 1];
2451        hash.data[sizeof(hash.data) - i - 1] = tmp;
2452    }
2453#endif
2454    return PyBytes_FromStringAndSize(hash.data, sizeof(hash.data));
2455}
2456
2457
2458PyDoc_STRVAR(doc_imp,
2459"(Extremely) low-level import machinery bits as used by importlib and imp.");
2460
2461static PyMethodDef imp_methods[] = {
2462    _IMP_EXTENSION_SUFFIXES_METHODDEF
2463    _IMP_LOCK_HELD_METHODDEF
2464    _IMP_ACQUIRE_LOCK_METHODDEF
2465    _IMP_RELEASE_LOCK_METHODDEF
2466    _IMP_FIND_FROZEN_METHODDEF
2467    _IMP_GET_FROZEN_OBJECT_METHODDEF
2468    _IMP_IS_FROZEN_PACKAGE_METHODDEF
2469    _IMP_CREATE_BUILTIN_METHODDEF
2470    _IMP_INIT_FROZEN_METHODDEF
2471    _IMP_IS_BUILTIN_METHODDEF
2472    _IMP_IS_FROZEN_METHODDEF
2473    _IMP__FROZEN_MODULE_NAMES_METHODDEF
2474    _IMP__OVERRIDE_FROZEN_MODULES_FOR_TESTS_METHODDEF
2475    _IMP_CREATE_DYNAMIC_METHODDEF
2476    _IMP_EXEC_DYNAMIC_METHODDEF
2477    _IMP_EXEC_BUILTIN_METHODDEF
2478    _IMP__FIX_CO_FILENAME_METHODDEF
2479    _IMP_SOURCE_HASH_METHODDEF
2480    {NULL, NULL}  /* sentinel */
2481};
2482
2483
2484static int
2485imp_module_exec(PyObject *module)
2486{
2487    const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode;
2488    PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
2489    if (pyc_mode == NULL) {
2490        return -1;
2491    }
2492    if (PyModule_AddObjectRef(module, "check_hash_based_pycs", pyc_mode) < 0) {
2493        Py_DECREF(pyc_mode);
2494        return -1;
2495    }
2496    Py_DECREF(pyc_mode);
2497
2498    return 0;
2499}
2500
2501
2502static PyModuleDef_Slot imp_slots[] = {
2503    {Py_mod_exec, imp_module_exec},
2504    {0, NULL}
2505};
2506
2507static struct PyModuleDef imp_module = {
2508    PyModuleDef_HEAD_INIT,
2509    .m_name = "_imp",
2510    .m_doc = doc_imp,
2511    .m_size = 0,
2512    .m_methods = imp_methods,
2513    .m_slots = imp_slots,
2514};
2515
2516PyMODINIT_FUNC
2517PyInit__imp(void)
2518{
2519    return PyModuleDef_Init(&imp_module);
2520}
2521
2522
2523// Import the _imp extension by calling manually _imp.create_builtin() and
2524// _imp.exec_builtin() since importlib is not initialized yet. Initializing
2525// importlib requires the _imp module: this function fix the bootstrap issue.
2526PyObject*
2527_PyImport_BootstrapImp(PyThreadState *tstate)
2528{
2529    PyObject *name = PyUnicode_FromString("_imp");
2530    if (name == NULL) {
2531        return NULL;
2532    }
2533
2534    // Mock a ModuleSpec object just good enough for PyModule_FromDefAndSpec():
2535    // an object with just a name attribute.
2536    //
2537    // _imp.__spec__ is overridden by importlib._bootstrap._instal() anyway.
2538    PyObject *attrs = Py_BuildValue("{sO}", "name", name);
2539    if (attrs == NULL) {
2540        goto error;
2541    }
2542    PyObject *spec = _PyNamespace_New(attrs);
2543    Py_DECREF(attrs);
2544    if (spec == NULL) {
2545        goto error;
2546    }
2547
2548    // Create the _imp module from its definition.
2549    PyObject *mod = create_builtin(tstate, name, spec);
2550    Py_CLEAR(name);
2551    Py_DECREF(spec);
2552    if (mod == NULL) {
2553        goto error;
2554    }
2555    assert(mod != Py_None);  // not found
2556
2557    // Execute the _imp module: call imp_module_exec().
2558    if (exec_builtin_or_dynamic(mod) < 0) {
2559        Py_DECREF(mod);
2560        goto error;
2561    }
2562    return mod;
2563
2564error:
2565    Py_XDECREF(name);
2566    return NULL;
2567}
2568
2569
2570/* API for embedding applications that want to add their own entries
2571   to the table of built-in modules.  This should normally be called
2572   *before* Py_Initialize().  When the table resize fails, -1 is
2573   returned and the existing table is unchanged.
2574
2575   After a similar function by Just van Rossum. */
2576
2577int
2578PyImport_ExtendInittab(struct _inittab *newtab)
2579{
2580    struct _inittab *p;
2581    size_t i, n;
2582    int res = 0;
2583
2584    /* Count the number of entries in both tables */
2585    for (n = 0; newtab[n].name != NULL; n++)
2586        ;
2587    if (n == 0)
2588        return 0; /* Nothing to do */
2589    for (i = 0; PyImport_Inittab[i].name != NULL; i++)
2590        ;
2591
2592    /* Force default raw memory allocator to get a known allocator to be able
2593       to release the memory in _PyImport_Fini2() */
2594    PyMemAllocatorEx old_alloc;
2595    _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2596
2597    /* Allocate new memory for the combined table */
2598    p = NULL;
2599    if (i + n <= SIZE_MAX / sizeof(struct _inittab) - 1) {
2600        size_t size = sizeof(struct _inittab) * (i + n + 1);
2601        p = PyMem_RawRealloc(inittab_copy, size);
2602    }
2603    if (p == NULL) {
2604        res = -1;
2605        goto done;
2606    }
2607
2608    /* Copy the tables into the new memory at the first call
2609       to PyImport_ExtendInittab(). */
2610    if (inittab_copy != PyImport_Inittab) {
2611        memcpy(p, PyImport_Inittab, (i+1) * sizeof(struct _inittab));
2612    }
2613    memcpy(p + i, newtab, (n + 1) * sizeof(struct _inittab));
2614    PyImport_Inittab = inittab_copy = p;
2615
2616done:
2617    PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2618    return res;
2619}
2620
2621/* Shorthand to add a single entry given a name and a function */
2622
2623int
2624PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
2625{
2626    struct _inittab newtab[2];
2627
2628    memset(newtab, '\0', sizeof newtab);
2629
2630    newtab[0].name = name;
2631    newtab[0].initfunc = initfunc;
2632
2633    return PyImport_ExtendInittab(newtab);
2634}
2635
2636
2637PyObject *
2638_PyImport_GetModuleAttr(PyObject *modname, PyObject *attrname)
2639{
2640    PyObject *mod = PyImport_Import(modname);
2641    if (mod == NULL) {
2642        return NULL;
2643    }
2644    PyObject *result = PyObject_GetAttr(mod, attrname);
2645    Py_DECREF(mod);
2646    return result;
2647}
2648
2649PyObject *
2650_PyImport_GetModuleAttrString(const char *modname, const char *attrname)
2651{
2652    PyObject *pmodname = PyUnicode_FromString(modname);
2653    if (pmodname == NULL) {
2654        return NULL;
2655    }
2656    PyObject *pattrname = PyUnicode_FromString(attrname);
2657    if (pattrname == NULL) {
2658        Py_DECREF(pmodname);
2659        return NULL;
2660    }
2661    PyObject *result = _PyImport_GetModuleAttr(pmodname, pattrname);
2662    Py_DECREF(pattrname);
2663    Py_DECREF(pmodname);
2664    return result;
2665}
2666
2667#ifdef __cplusplus
2668}
2669#endif
2670