LCOV - code coverage report
Current view: top level - Python - pylifecycle.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 884 1149 76.9 %
Date: 2022-07-20 13:12:14 Functions: 70 75 93.3 %
Branches: 408 670 60.9 %

           Branch data     Line data    Source code
       1                 :            : /* Python interpreter top-level routines, including init/exit */
       2                 :            : 
       3                 :            : #include "Python.h"
       4                 :            : 
       5                 :            : #include "pycore_bytesobject.h"   // _PyBytes_InitTypes()
       6                 :            : #include "pycore_ceval.h"         // _PyEval_FiniGIL()
       7                 :            : #include "pycore_context.h"       // _PyContext_Init()
       8                 :            : #include "pycore_exceptions.h"    // _PyExc_InitTypes()
       9                 :            : #include "pycore_dict.h"          // _PyDict_Fini()
      10                 :            : #include "pycore_fileutils.h"     // _Py_ResetForceASCII()
      11                 :            : #include "pycore_floatobject.h"   // _PyFloat_InitTypes()
      12                 :            : #include "pycore_genobject.h"     // _PyAsyncGen_Fini()
      13                 :            : #include "pycore_import.h"        // _PyImport_BootstrapImp()
      14                 :            : #include "pycore_initconfig.h"    // _PyStatus_OK()
      15                 :            : #include "pycore_list.h"          // _PyList_Fini()
      16                 :            : #include "pycore_long.h"          // _PyLong_InitTypes()
      17                 :            : #include "pycore_object.h"        // _PyDebug_PrintTotalRefs()
      18                 :            : #include "pycore_pathconfig.h"    // _PyConfig_WritePathConfig()
      19                 :            : #include "pycore_pyerrors.h"      // _PyErr_Occurred()
      20                 :            : #include "pycore_pylifecycle.h"   // _PyErr_Print()
      21                 :            : #include "pycore_pymem.h"         // _PyObject_DebugMallocStats()
      22                 :            : #include "pycore_pystate.h"       // _PyThreadState_GET()
      23                 :            : #include "pycore_runtime.h"       // _Py_ID()
      24                 :            : #include "pycore_runtime_init.h"  // _PyRuntimeState_INIT
      25                 :            : #include "pycore_sliceobject.h"   // _PySlice_Fini()
      26                 :            : #include "pycore_sysmodule.h"     // _PySys_ClearAuditHooks()
      27                 :            : #include "pycore_traceback.h"     // _Py_DumpTracebackThreads()
      28                 :            : #include "pycore_tuple.h"         // _PyTuple_InitTypes()
      29                 :            : #include "pycore_typeobject.h"    // _PyTypes_InitTypes()
      30                 :            : #include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
      31                 :            : 
      32                 :            : extern void _PyIO_Fini(void);
      33                 :            : 
      34                 :            : #include <locale.h>               // setlocale()
      35                 :            : #include <stdlib.h>               // getenv()
      36                 :            : 
      37                 :            : #if defined(__APPLE__)
      38                 :            : #include <mach-o/loader.h>
      39                 :            : #endif
      40                 :            : 
      41                 :            : #ifdef HAVE_SIGNAL_H
      42                 :            : #  include <signal.h>             // SIG_IGN
      43                 :            : #endif
      44                 :            : 
      45                 :            : #ifdef HAVE_LANGINFO_H
      46                 :            : #  include <langinfo.h>           // nl_langinfo(CODESET)
      47                 :            : #endif
      48                 :            : 
      49                 :            : #ifdef HAVE_FCNTL_H
      50                 :            : #  include <fcntl.h>              // F_GETFD
      51                 :            : #endif
      52                 :            : 
      53                 :            : #ifdef MS_WINDOWS
      54                 :            : #  undef BYTE
      55                 :            : #  include "windows.h"
      56                 :            : 
      57                 :            :    extern PyTypeObject PyWindowsConsoleIO_Type;
      58                 :            : #  define PyWindowsConsoleIO_Check(op) \
      59                 :            :        (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type))
      60                 :            : #endif
      61                 :            : 
      62                 :            : #define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
      63                 :            : 
      64                 :            : 
      65                 :            : #ifdef __cplusplus
      66                 :            : extern "C" {
      67                 :            : #endif
      68                 :            : 
      69                 :            : 
      70                 :            : /* Forward declarations */
      71                 :            : static PyStatus add_main_module(PyInterpreterState *interp);
      72                 :            : static PyStatus init_import_site(void);
      73                 :            : static PyStatus init_set_builtins_open(void);
      74                 :            : static PyStatus init_sys_streams(PyThreadState *tstate);
      75                 :            : static void wait_for_thread_shutdown(PyThreadState *tstate);
      76                 :            : static void call_ll_exitfuncs(_PyRuntimeState *runtime);
      77                 :            : 
      78                 :            : int _Py_UnhandledKeyboardInterrupt = 0;
      79                 :            : 
      80                 :            : /* The following places the `_PyRuntime` structure in a location that can be
      81                 :            :  * found without any external information. This is meant to ease access to the
      82                 :            :  * interpreter state for various runtime debugging tools, but is *not* an
      83                 :            :  * officially supported feature */
      84                 :            : 
      85                 :            : #if defined(MS_WINDOWS)
      86                 :            : 
      87                 :            : #pragma section("PyRuntime", read, write)
      88                 :            : __declspec(allocate("PyRuntime"))
      89                 :            : 
      90                 :            : #elif defined(__APPLE__)
      91                 :            : 
      92                 :            : __attribute__((
      93                 :            :     section(SEG_DATA ",PyRuntime")
      94                 :            : ))
      95                 :            : 
      96                 :            : #endif
      97                 :            : 
      98                 :            : /* Suppress deprecation warning for PyBytesObject.ob_shash */
      99                 :            : _Py_COMP_DIAG_PUSH
     100                 :            : _Py_COMP_DIAG_IGNORE_DEPR_DECLS
     101                 :            : _PyRuntimeState _PyRuntime
     102                 :            : #if defined(__linux__) && (defined(__GNUC__) || defined(__clang__))
     103                 :            : __attribute__ ((section (".PyRuntime")))
     104                 :            : #endif
     105                 :            : = _PyRuntimeState_INIT;
     106                 :            : _Py_COMP_DIAG_POP
     107                 :            : 
     108                 :            : static int runtime_initialized = 0;
     109                 :            : 
     110                 :            : PyStatus
     111                 :     226097 : _PyRuntime_Initialize(void)
     112                 :            : {
     113                 :            :     /* XXX We only initialize once in the process, which aligns with
     114                 :            :        the static initialization of the former globals now found in
     115                 :            :        _PyRuntime.  However, _PyRuntime *should* be initialized with
     116                 :            :        every Py_Initialize() call, but doing so breaks the runtime.
     117                 :            :        This is because the runtime state is not properly finalized
     118                 :            :        currently. */
     119         [ +  + ]:     226097 :     if (runtime_initialized) {
     120                 :     223109 :         return _PyStatus_OK();
     121                 :            :     }
     122                 :       2988 :     runtime_initialized = 1;
     123                 :            : 
     124                 :       2988 :     return _PyRuntimeState_Init(&_PyRuntime);
     125                 :            : }
     126                 :            : 
     127                 :            : void
     128                 :       5109 : _PyRuntime_Finalize(void)
     129                 :            : {
     130                 :       5109 :     _PyRuntimeState_Fini(&_PyRuntime);
     131                 :       5109 :     runtime_initialized = 0;
     132                 :       5109 : }
     133                 :            : 
     134                 :            : int
     135                 :       5197 : _Py_IsFinalizing(void)
     136                 :            : {
     137                 :       5197 :     return _PyRuntimeState_GetFinalizing(&_PyRuntime) != NULL;
     138                 :            : }
     139                 :            : 
     140                 :            : /* Hack to force loading of object files */
     141                 :            : int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \
     142                 :            :     PyOS_mystrnicmp; /* Python/pystrcmp.o */
     143                 :            : 
     144                 :            : 
     145                 :            : /* APIs to access the initialization flags
     146                 :            :  *
     147                 :            :  * Can be called prior to Py_Initialize.
     148                 :            :  */
     149                 :            : 
     150                 :            : int
     151                 :          0 : _Py_IsCoreInitialized(void)
     152                 :            : {
     153                 :          0 :     return _PyRuntime.core_initialized;
     154                 :            : }
     155                 :            : 
     156                 :            : int
     157                 :          9 : Py_IsInitialized(void)
     158                 :            : {
     159                 :          9 :     return _PyRuntime.initialized;
     160                 :            : }
     161                 :            : 
     162                 :            : 
     163                 :            : /* Global initializations.  Can be undone by Py_FinalizeEx().  Don't
     164                 :            :    call this twice without an intervening Py_FinalizeEx() call.  When
     165                 :            :    initializations fail, a fatal error is issued and the function does
     166                 :            :    not return.  On return, the first thread and interpreter state have
     167                 :            :    been created.
     168                 :            : 
     169                 :            :    Locking: you must hold the interpreter lock while calling this.
     170                 :            :    (If the lock has not yet been initialized, that's equivalent to
     171                 :            :    having the lock, but you cannot use multiple threads.)
     172                 :            : 
     173                 :            : */
     174                 :            : static int
     175                 :       3134 : init_importlib(PyThreadState *tstate, PyObject *sysmod)
     176                 :            : {
     177                 :            :     assert(!_PyErr_Occurred(tstate));
     178                 :            : 
     179                 :       3134 :     PyInterpreterState *interp = tstate->interp;
     180                 :       3134 :     int verbose = _PyInterpreterState_GetConfig(interp)->verbose;
     181                 :            : 
     182                 :            :     // Import _importlib through its frozen version, _frozen_importlib.
     183         [ +  + ]:       3134 :     if (verbose) {
     184                 :         12 :         PySys_FormatStderr("import _frozen_importlib # frozen\n");
     185                 :            :     }
     186         [ -  + ]:       3134 :     if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
     187                 :          0 :         return -1;
     188                 :            :     }
     189                 :       3134 :     PyObject *importlib = PyImport_AddModule("_frozen_importlib"); // borrowed
     190         [ -  + ]:       3134 :     if (importlib == NULL) {
     191                 :          0 :         return -1;
     192                 :            :     }
     193                 :       3134 :     interp->importlib = Py_NewRef(importlib);
     194                 :            : 
     195                 :            :     // Import the _imp module
     196         [ +  + ]:       3134 :     if (verbose) {
     197                 :         12 :         PySys_FormatStderr("import _imp # builtin\n");
     198                 :            :     }
     199                 :       3134 :     PyObject *imp_mod = _PyImport_BootstrapImp(tstate);
     200         [ -  + ]:       3134 :     if (imp_mod == NULL) {
     201                 :          0 :         return -1;
     202                 :            :     }
     203         [ -  + ]:       3134 :     if (_PyImport_SetModuleString("_imp", imp_mod) < 0) {
     204                 :          0 :         Py_DECREF(imp_mod);
     205                 :          0 :         return -1;
     206                 :            :     }
     207                 :            : 
     208                 :            :     // Install importlib as the implementation of import
     209                 :       3134 :     PyObject *value = PyObject_CallMethod(importlib, "_install",
     210                 :            :                                           "OO", sysmod, imp_mod);
     211                 :       3134 :     Py_DECREF(imp_mod);
     212         [ -  + ]:       3134 :     if (value == NULL) {
     213                 :          0 :         return -1;
     214                 :            :     }
     215                 :       3134 :     Py_DECREF(value);
     216                 :            : 
     217                 :            :     assert(!_PyErr_Occurred(tstate));
     218                 :       3134 :     return 0;
     219                 :            : }
     220                 :            : 
     221                 :            : 
     222                 :            : static PyStatus
     223                 :       3134 : init_importlib_external(PyThreadState *tstate)
     224                 :            : {
     225                 :            :     PyObject *value;
     226                 :       3134 :     value = PyObject_CallMethod(tstate->interp->importlib,
     227                 :            :                                 "_install_external_importers", "");
     228         [ -  + ]:       3134 :     if (value == NULL) {
     229                 :          0 :         _PyErr_Print(tstate);
     230                 :          0 :         return _PyStatus_ERR("external importer setup failed");
     231                 :            :     }
     232                 :       3134 :     Py_DECREF(value);
     233                 :       3134 :     return _PyImportZip_Init(tstate);
     234                 :            : }
     235                 :            : 
     236                 :            : /* Helper functions to better handle the legacy C locale
     237                 :            :  *
     238                 :            :  * The legacy C locale assumes ASCII as the default text encoding, which
     239                 :            :  * causes problems not only for the CPython runtime, but also other
     240                 :            :  * components like GNU readline.
     241                 :            :  *
     242                 :            :  * Accordingly, when the CLI detects it, it attempts to coerce it to a
     243                 :            :  * more capable UTF-8 based alternative as follows:
     244                 :            :  *
     245                 :            :  *     if (_Py_LegacyLocaleDetected()) {
     246                 :            :  *         _Py_CoerceLegacyLocale();
     247                 :            :  *     }
     248                 :            :  *
     249                 :            :  * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
     250                 :            :  *
     251                 :            :  * Locale coercion also impacts the default error handler for the standard
     252                 :            :  * streams: while the usual default is "strict", the default for the legacy
     253                 :            :  * C locale and for any of the coercion target locales is "surrogateescape".
     254                 :            :  */
     255                 :            : 
     256                 :            : int
     257                 :       2856 : _Py_LegacyLocaleDetected(int warn)
     258                 :            : {
     259                 :            : #ifndef MS_WINDOWS
     260         [ +  + ]:       2856 :     if (!warn) {
     261                 :       2842 :         const char *locale_override = getenv("LC_ALL");
     262   [ +  +  +  + ]:       2842 :         if (locale_override != NULL && *locale_override != '\0') {
     263                 :            :             /* Don't coerce C locale if the LC_ALL environment variable
     264                 :            :                is set */
     265                 :       2794 :             return 0;
     266                 :            :         }
     267                 :            :     }
     268                 :            : 
     269                 :            :     /* On non-Windows systems, the C locale is considered a legacy locale */
     270                 :            :     /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat
     271                 :            :      *                 the POSIX locale as a simple alias for the C locale, so
     272                 :            :      *                 we may also want to check for that explicitly.
     273                 :            :      */
     274                 :         62 :     const char *ctype_loc = setlocale(LC_CTYPE, NULL);
     275   [ +  -  +  + ]:         62 :     return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
     276                 :            : #else
     277                 :            :     /* Windows uses code pages instead of locales, so no locale is legacy */
     278                 :            :     return 0;
     279                 :            : #endif
     280                 :            : }
     281                 :            : 
     282                 :            : #ifndef MS_WINDOWS
     283                 :            : static const char *_C_LOCALE_WARNING =
     284                 :            :     "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII "
     285                 :            :     "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, "
     286                 :            :     "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
     287                 :            :     "locales is recommended.\n";
     288                 :            : 
     289                 :            : static void
     290                 :       2961 : emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime)
     291                 :            : {
     292                 :       2961 :     const PyPreConfig *preconfig = &runtime->preconfig;
     293   [ +  +  +  + ]:       2961 :     if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected(1)) {
     294                 :          7 :         PySys_FormatStderr("%s", _C_LOCALE_WARNING);
     295                 :            :     }
     296                 :       2961 : }
     297                 :            : #endif   /* !defined(MS_WINDOWS) */
     298                 :            : 
     299                 :            : typedef struct _CandidateLocale {
     300                 :            :     const char *locale_name; /* The locale to try as a coercion target */
     301                 :            : } _LocaleCoercionTarget;
     302                 :            : 
     303                 :            : static _LocaleCoercionTarget _TARGET_LOCALES[] = {
     304                 :            :     {"C.UTF-8"},
     305                 :            :     {"C.utf8"},
     306                 :            :     {"UTF-8"},
     307                 :            :     {NULL}
     308                 :            : };
     309                 :            : 
     310                 :            : 
     311                 :            : int
     312                 :       2654 : _Py_IsLocaleCoercionTarget(const char *ctype_loc)
     313                 :            : {
     314                 :       2654 :     const _LocaleCoercionTarget *target = NULL;
     315         [ +  + ]:      10480 :     for (target = _TARGET_LOCALES; target->locale_name; target++) {
     316         [ +  + ]:       7872 :         if (strcmp(ctype_loc, target->locale_name) == 0) {
     317                 :         46 :             return 1;
     318                 :            :         }
     319                 :            :     }
     320                 :       2608 :     return 0;
     321                 :            : }
     322                 :            : 
     323                 :            : 
     324                 :            : #ifdef PY_COERCE_C_LOCALE
     325                 :            : static const char C_LOCALE_COERCION_WARNING[] =
     326                 :            :     "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale "
     327                 :            :     "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
     328                 :            : 
     329                 :            : static int
     330                 :         88 : _coerce_default_locale_settings(int warn, const _LocaleCoercionTarget *target)
     331                 :            : {
     332                 :         88 :     const char *newloc = target->locale_name;
     333                 :            : 
     334                 :            :     /* Reset locale back to currently configured defaults */
     335                 :         88 :     _Py_SetLocaleFromEnv(LC_ALL);
     336                 :            : 
     337                 :            :     /* Set the relevant locale environment variable */
     338         [ -  + ]:         88 :     if (setenv("LC_CTYPE", newloc, 1)) {
     339                 :          0 :         fprintf(stderr,
     340                 :            :                 "Error setting LC_CTYPE, skipping C locale coercion\n");
     341                 :          0 :         return 0;
     342                 :            :     }
     343         [ +  + ]:         88 :     if (warn) {
     344                 :          7 :         fprintf(stderr, C_LOCALE_COERCION_WARNING, newloc);
     345                 :            :     }
     346                 :            : 
     347                 :            :     /* Reconfigure with the overridden environment variables */
     348                 :         88 :     _Py_SetLocaleFromEnv(LC_ALL);
     349                 :         88 :     return 1;
     350                 :            : }
     351                 :            : #endif
     352                 :            : 
     353                 :            : int
     354                 :         88 : _Py_CoerceLegacyLocale(int warn)
     355                 :            : {
     356                 :         88 :     int coerced = 0;
     357                 :            : #ifdef PY_COERCE_C_LOCALE
     358                 :         88 :     char *oldloc = NULL;
     359                 :            : 
     360                 :         88 :     oldloc = _PyMem_RawStrdup(setlocale(LC_CTYPE, NULL));
     361         [ -  + ]:         88 :     if (oldloc == NULL) {
     362                 :          0 :         return coerced;
     363                 :            :     }
     364                 :            : 
     365                 :         88 :     const char *locale_override = getenv("LC_ALL");
     366   [ +  +  +  - ]:         88 :     if (locale_override == NULL || *locale_override == '\0') {
     367                 :            :         /* LC_ALL is also not set (or is set to an empty string) */
     368                 :         88 :         const _LocaleCoercionTarget *target = NULL;
     369         [ +  - ]:         88 :         for (target = _TARGET_LOCALES; target->locale_name; target++) {
     370                 :         88 :             const char *new_locale = setlocale(LC_CTYPE,
     371                 :         88 :                                                target->locale_name);
     372         [ +  - ]:         88 :             if (new_locale != NULL) {
     373                 :            : #if !defined(_Py_FORCE_UTF8_LOCALE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
     374                 :            :                 /* Also ensure that nl_langinfo works in this locale */
     375                 :         88 :                 char *codeset = nl_langinfo(CODESET);
     376   [ +  -  -  + ]:         88 :                 if (!codeset || *codeset == '\0') {
     377                 :            :                     /* CODESET is not set or empty, so skip coercion */
     378                 :          0 :                     new_locale = NULL;
     379                 :          0 :                     _Py_SetLocaleFromEnv(LC_CTYPE);
     380                 :          0 :                     continue;
     381                 :            :                 }
     382                 :            : #endif
     383                 :            :                 /* Successfully configured locale, so make it the default */
     384                 :         88 :                 coerced = _coerce_default_locale_settings(warn, target);
     385                 :         88 :                 goto done;
     386                 :            :             }
     387                 :            :         }
     388                 :            :     }
     389                 :            :     /* No C locale warning here, as Py_Initialize will emit one later */
     390                 :            : 
     391                 :          0 :     setlocale(LC_CTYPE, oldloc);
     392                 :            : 
     393                 :         88 : done:
     394                 :         88 :     PyMem_RawFree(oldloc);
     395                 :            : #endif
     396                 :         88 :     return coerced;
     397                 :            : }
     398                 :            : 
     399                 :            : /* _Py_SetLocaleFromEnv() is a wrapper around setlocale(category, "") to
     400                 :            :  * isolate the idiosyncrasies of different libc implementations. It reads the
     401                 :            :  * appropriate environment variable and uses its value to select the locale for
     402                 :            :  * 'category'. */
     403                 :            : char *
     404                 :       6095 : _Py_SetLocaleFromEnv(int category)
     405                 :            : {
     406                 :            :     char *res;
     407                 :            : #ifdef __ANDROID__
     408                 :            :     const char *locale;
     409                 :            :     const char **pvar;
     410                 :            : #ifdef PY_COERCE_C_LOCALE
     411                 :            :     const char *coerce_c_locale;
     412                 :            : #endif
     413                 :            :     const char *utf8_locale = "C.UTF-8";
     414                 :            :     const char *env_var_set[] = {
     415                 :            :         "LC_ALL",
     416                 :            :         "LC_CTYPE",
     417                 :            :         "LANG",
     418                 :            :         NULL,
     419                 :            :     };
     420                 :            : 
     421                 :            :     /* Android setlocale(category, "") doesn't check the environment variables
     422                 :            :      * and incorrectly sets the "C" locale at API 24 and older APIs. We only
     423                 :            :      * check the environment variables listed in env_var_set. */
     424                 :            :     for (pvar=env_var_set; *pvar; pvar++) {
     425                 :            :         locale = getenv(*pvar);
     426                 :            :         if (locale != NULL && *locale != '\0') {
     427                 :            :             if (strcmp(locale, utf8_locale) == 0 ||
     428                 :            :                     strcmp(locale, "en_US.UTF-8") == 0) {
     429                 :            :                 return setlocale(category, utf8_locale);
     430                 :            :             }
     431                 :            :             return setlocale(category, "C");
     432                 :            :         }
     433                 :            :     }
     434                 :            : 
     435                 :            :     /* Android uses UTF-8, so explicitly set the locale to C.UTF-8 if none of
     436                 :            :      * LC_ALL, LC_CTYPE, or LANG is set to a non-empty string.
     437                 :            :      * Quote from POSIX section "8.2 Internationalization Variables":
     438                 :            :      * "4. If the LANG environment variable is not set or is set to the empty
     439                 :            :      * string, the implementation-defined default locale shall be used." */
     440                 :            : 
     441                 :            : #ifdef PY_COERCE_C_LOCALE
     442                 :            :     coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
     443                 :            :     if (coerce_c_locale == NULL || strcmp(coerce_c_locale, "0") != 0) {
     444                 :            :         /* Some other ported code may check the environment variables (e.g. in
     445                 :            :          * extension modules), so we make sure that they match the locale
     446                 :            :          * configuration */
     447                 :            :         if (setenv("LC_CTYPE", utf8_locale, 1)) {
     448                 :            :             fprintf(stderr, "Warning: failed setting the LC_CTYPE "
     449                 :            :                             "environment variable to %s\n", utf8_locale);
     450                 :            :         }
     451                 :            :     }
     452                 :            : #endif
     453                 :            :     res = setlocale(category, utf8_locale);
     454                 :            : #else /* !defined(__ANDROID__) */
     455                 :       6095 :     res = setlocale(category, "");
     456                 :            : #endif
     457                 :       6095 :     _Py_ResetForceASCII();
     458                 :       6095 :     return res;
     459                 :            : }
     460                 :            : 
     461                 :            : 
     462                 :            : static int
     463                 :       3177 : interpreter_update_config(PyThreadState *tstate, int only_update_path_config)
     464                 :            : {
     465                 :       3177 :     const PyConfig *config = &tstate->interp->config;
     466                 :            : 
     467         [ +  + ]:       3177 :     if (!only_update_path_config) {
     468                 :         43 :         PyStatus status = _PyConfig_Write(config, tstate->interp->runtime);
     469         [ -  + ]:         43 :         if (_PyStatus_EXCEPTION(status)) {
     470                 :          0 :             _PyErr_SetFromPyStatus(status);
     471                 :          0 :             return -1;
     472                 :            :         }
     473                 :            :     }
     474                 :            : 
     475         [ +  + ]:       3177 :     if (_Py_IsMainInterpreter(tstate->interp)) {
     476                 :       3006 :         PyStatus status = _PyPathConfig_UpdateGlobal(config);
     477         [ -  + ]:       3006 :         if (_PyStatus_EXCEPTION(status)) {
     478                 :          0 :             _PyErr_SetFromPyStatus(status);
     479                 :          0 :             return -1;
     480                 :            :         }
     481                 :            :     }
     482                 :            : 
     483                 :            :     // Update the sys module for the new configuration
     484         [ -  + ]:       3177 :     if (_PySys_UpdateConfig(tstate) < 0) {
     485                 :          0 :         return -1;
     486                 :            :     }
     487                 :       3177 :     return 0;
     488                 :            : }
     489                 :            : 
     490                 :            : 
     491                 :            : int
     492                 :         42 : _PyInterpreterState_SetConfig(const PyConfig *src_config)
     493                 :            : {
     494                 :         42 :     PyThreadState *tstate = _PyThreadState_GET();
     495                 :         42 :     int res = -1;
     496                 :            : 
     497                 :            :     PyConfig config;
     498                 :         42 :     PyConfig_InitPythonConfig(&config);
     499                 :         42 :     PyStatus status = _PyConfig_Copy(&config, src_config);
     500         [ -  + ]:         42 :     if (_PyStatus_EXCEPTION(status)) {
     501                 :          0 :         _PyErr_SetFromPyStatus(status);
     502                 :          0 :         goto done;
     503                 :            :     }
     504                 :            : 
     505                 :         42 :     status = _PyConfig_Read(&config, 1);
     506         [ -  + ]:         42 :     if (_PyStatus_EXCEPTION(status)) {
     507                 :          0 :         _PyErr_SetFromPyStatus(status);
     508                 :          0 :         goto done;
     509                 :            :     }
     510                 :            : 
     511                 :         42 :     status = _PyConfig_Copy(&tstate->interp->config, &config);
     512         [ -  + ]:         42 :     if (_PyStatus_EXCEPTION(status)) {
     513                 :          0 :         _PyErr_SetFromPyStatus(status);
     514                 :          0 :         goto done;
     515                 :            :     }
     516                 :            : 
     517                 :         42 :     res = interpreter_update_config(tstate, 0);
     518                 :            : 
     519                 :         42 : done:
     520                 :         42 :     PyConfig_Clear(&config);
     521                 :         42 :     return res;
     522                 :            : }
     523                 :            : 
     524                 :            : 
     525                 :            : /* Global initializations.  Can be undone by Py_Finalize().  Don't
     526                 :            :    call this twice without an intervening Py_Finalize() call.
     527                 :            : 
     528                 :            :    Every call to Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
     529                 :            :    must have a corresponding call to Py_Finalize.
     530                 :            : 
     531                 :            :    Locking: you must hold the interpreter lock while calling these APIs.
     532                 :            :    (If the lock has not yet been initialized, that's equivalent to
     533                 :            :    having the lock, but you cannot use multiple threads.)
     534                 :            : 
     535                 :            : */
     536                 :            : 
     537                 :            : static PyStatus
     538                 :          1 : pyinit_core_reconfigure(_PyRuntimeState *runtime,
     539                 :            :                         PyThreadState **tstate_p,
     540                 :            :                         const PyConfig *config)
     541                 :            : {
     542                 :            :     PyStatus status;
     543                 :          1 :     PyThreadState *tstate = _PyThreadState_GET();
     544         [ -  + ]:          1 :     if (!tstate) {
     545                 :          0 :         return _PyStatus_ERR("failed to read thread state");
     546                 :            :     }
     547                 :          1 :     *tstate_p = tstate;
     548                 :            : 
     549                 :          1 :     PyInterpreterState *interp = tstate->interp;
     550         [ -  + ]:          1 :     if (interp == NULL) {
     551                 :          0 :         return _PyStatus_ERR("can't make main interpreter");
     552                 :            :     }
     553                 :            : 
     554                 :          1 :     status = _PyConfig_Write(config, runtime);
     555         [ -  + ]:          1 :     if (_PyStatus_EXCEPTION(status)) {
     556                 :          0 :         return status;
     557                 :            :     }
     558                 :            : 
     559                 :          1 :     status = _PyConfig_Copy(&interp->config, config);
     560         [ -  + ]:          1 :     if (_PyStatus_EXCEPTION(status)) {
     561                 :          0 :         return status;
     562                 :            :     }
     563                 :          1 :     config = _PyInterpreterState_GetConfig(interp);
     564                 :            : 
     565         [ +  - ]:          1 :     if (config->_install_importlib) {
     566                 :          1 :         status = _PyPathConfig_UpdateGlobal(config);
     567         [ -  + ]:          1 :         if (_PyStatus_EXCEPTION(status)) {
     568                 :          0 :             return status;
     569                 :            :         }
     570                 :            :     }
     571                 :          1 :     return _PyStatus_OK();
     572                 :            : }
     573                 :            : 
     574                 :            : 
     575                 :            : static PyStatus
     576                 :       2967 : pycore_init_runtime(_PyRuntimeState *runtime,
     577                 :            :                     const PyConfig *config)
     578                 :            : {
     579         [ -  + ]:       2967 :     if (runtime->initialized) {
     580                 :          0 :         return _PyStatus_ERR("main interpreter already initialized");
     581                 :            :     }
     582                 :            : 
     583                 :       2967 :     PyStatus status = _PyConfig_Write(config, runtime);
     584         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     585                 :          0 :         return status;
     586                 :            :     }
     587                 :            : 
     588                 :            :     /* Py_Finalize leaves _Py_Finalizing set in order to help daemon
     589                 :            :      * threads behave a little more gracefully at interpreter shutdown.
     590                 :            :      * We clobber it here so the new interpreter can start with a clean
     591                 :            :      * slate.
     592                 :            :      *
     593                 :            :      * However, this may still lead to misbehaviour if there are daemon
     594                 :            :      * threads still hanging around from a previous Py_Initialize/Finalize
     595                 :            :      * pair :(
     596                 :            :      */
     597                 :       2967 :     _PyRuntimeState_SetFinalizing(runtime, NULL);
     598                 :            : 
     599                 :       2967 :     status = _Py_HashRandomization_Init(config);
     600         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     601                 :          0 :         return status;
     602                 :            :     }
     603                 :            : 
     604                 :       2967 :     status = _PyInterpreterState_Enable(runtime);
     605         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     606                 :          0 :         return status;
     607                 :            :     }
     608                 :       2967 :     return _PyStatus_OK();
     609                 :            : }
     610                 :            : 
     611                 :            : 
     612                 :            : static PyStatus
     613                 :       3138 : init_interp_create_gil(PyThreadState *tstate)
     614                 :            : {
     615                 :            :     PyStatus status;
     616                 :            : 
     617                 :            :     /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is
     618                 :            :        only called here. */
     619                 :       3138 :     _PyEval_FiniGIL(tstate->interp);
     620                 :            : 
     621                 :            :     /* Auto-thread-state API */
     622                 :       3138 :     status = _PyGILState_SetTstate(tstate);
     623         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     624                 :          0 :         return status;
     625                 :            :     }
     626                 :            : 
     627                 :            :     /* Create the GIL and take it */
     628                 :       3138 :     status = _PyEval_InitGIL(tstate);
     629         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     630                 :          0 :         return status;
     631                 :            :     }
     632                 :            : 
     633                 :       3138 :     return _PyStatus_OK();
     634                 :            : }
     635                 :            : 
     636                 :            : 
     637                 :            : static PyStatus
     638                 :       2967 : pycore_create_interpreter(_PyRuntimeState *runtime,
     639                 :            :                           const PyConfig *config,
     640                 :            :                           PyThreadState **tstate_p)
     641                 :            : {
     642                 :            :     /* Auto-thread-state API */
     643                 :       2967 :     PyStatus status = _PyGILState_Init(runtime);
     644         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     645                 :          0 :         return status;
     646                 :            :     }
     647                 :            : 
     648                 :       2967 :     PyInterpreterState *interp = PyInterpreterState_New();
     649         [ -  + ]:       2967 :     if (interp == NULL) {
     650                 :          0 :         return _PyStatus_ERR("can't make main interpreter");
     651                 :            :     }
     652                 :            :     assert(_Py_IsMainInterpreter(interp));
     653                 :            : 
     654                 :       2967 :     status = _PyConfig_Copy(&interp->config, config);
     655         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     656                 :          0 :         return status;
     657                 :            :     }
     658                 :            : 
     659                 :       2967 :     PyThreadState *tstate = PyThreadState_New(interp);
     660         [ -  + ]:       2967 :     if (tstate == NULL) {
     661                 :          0 :         return _PyStatus_ERR("can't make first thread");
     662                 :            :     }
     663                 :       2967 :     (void) PyThreadState_Swap(tstate);
     664                 :            : 
     665                 :       2967 :     status = init_interp_create_gil(tstate);
     666         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     667                 :          0 :         return status;
     668                 :            :     }
     669                 :            : 
     670                 :       2967 :     *tstate_p = tstate;
     671                 :       2967 :     return _PyStatus_OK();
     672                 :            : }
     673                 :            : 
     674                 :            : 
     675                 :            : static PyStatus
     676                 :       3138 : pycore_init_global_objects(PyInterpreterState *interp)
     677                 :            : {
     678                 :            :     PyStatus status;
     679                 :            : 
     680                 :       3138 :     _PyFloat_InitState(interp);
     681                 :            : 
     682                 :       3138 :     status = _PyUnicode_InitGlobalObjects(interp);
     683         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     684                 :          0 :         return status;
     685                 :            :     }
     686                 :            : 
     687                 :       3138 :     _PyUnicode_InitState(interp);
     688                 :            : 
     689                 :       3138 :     return _PyStatus_OK();
     690                 :            : }
     691                 :            : 
     692                 :            : 
     693                 :            : static PyStatus
     694                 :       3138 : pycore_init_types(PyInterpreterState *interp)
     695                 :            : {
     696                 :            :     PyStatus status;
     697                 :            : 
     698                 :       3138 :     status = _PyTypes_InitState(interp);
     699         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     700                 :          0 :         return status;
     701                 :            :     }
     702                 :            : 
     703                 :       3138 :     status = _PyTypes_InitTypes(interp);
     704         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     705                 :          0 :         return status;
     706                 :            :     }
     707                 :            : 
     708                 :       3138 :     status = _PyBytes_InitTypes(interp);
     709         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     710                 :          0 :         return status;
     711                 :            :     }
     712                 :            : 
     713                 :       3138 :     status = _PyLong_InitTypes(interp);
     714         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     715                 :          0 :         return status;
     716                 :            :     }
     717                 :            : 
     718                 :       3138 :     status = _PyUnicode_InitTypes(interp);
     719         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     720                 :          0 :         return status;
     721                 :            :     }
     722                 :            : 
     723                 :       3138 :     status = _PyFloat_InitTypes(interp);
     724         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     725                 :          0 :         return status;
     726                 :            :     }
     727                 :            : 
     728                 :       3138 :     status = _PyTuple_InitTypes(interp);
     729         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     730                 :          0 :         return status;
     731                 :            :     }
     732                 :            : 
     733         [ -  + ]:       3138 :     if (_PyExc_InitTypes(interp) < 0) {
     734                 :          0 :         return _PyStatus_ERR("failed to initialize an exception type");
     735                 :            :     }
     736                 :            : 
     737                 :       3138 :     status = _PyExc_InitGlobalObjects(interp);
     738         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     739                 :          0 :         return status;
     740                 :            :     }
     741                 :            : 
     742                 :       3138 :     status = _PyExc_InitState(interp);
     743         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     744                 :          0 :         return status;
     745                 :            :     }
     746                 :            : 
     747                 :       3138 :     status = _PyErr_InitTypes(interp);
     748         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     749                 :          0 :         return status;
     750                 :            :     }
     751                 :            : 
     752                 :       3138 :     status = _PyContext_Init(interp);
     753         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     754                 :          0 :         return status;
     755                 :            :     }
     756                 :       3138 :     return _PyStatus_OK();
     757                 :            : }
     758                 :            : 
     759                 :            : 
     760                 :            : static PyStatus
     761                 :       3138 : pycore_init_builtins(PyThreadState *tstate)
     762                 :            : {
     763                 :       3138 :     PyInterpreterState *interp = tstate->interp;
     764                 :            : 
     765                 :       3138 :     PyObject *bimod = _PyBuiltin_Init(interp);
     766         [ -  + ]:       3138 :     if (bimod == NULL) {
     767                 :          0 :         goto error;
     768                 :            :     }
     769                 :            : 
     770         [ -  + ]:       3138 :     if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) {
     771                 :          0 :         goto error;
     772                 :            :     }
     773                 :            : 
     774                 :       3138 :     PyObject *builtins_dict = PyModule_GetDict(bimod);
     775         [ -  + ]:       3138 :     if (builtins_dict == NULL) {
     776                 :          0 :         goto error;
     777                 :            :     }
     778                 :       3138 :     Py_INCREF(builtins_dict);
     779                 :       3138 :     interp->builtins = builtins_dict;
     780                 :            : 
     781                 :       3138 :     PyObject *isinstance = PyDict_GetItem(builtins_dict, &_Py_ID(isinstance));
     782                 :            :     assert(isinstance);
     783                 :       3138 :     interp->callable_cache.isinstance = isinstance;
     784                 :       3138 :     PyObject *len = PyDict_GetItem(builtins_dict, &_Py_ID(len));
     785                 :            :     assert(len);
     786                 :       3138 :     interp->callable_cache.len = len;
     787                 :       3138 :     PyObject *list_append = _PyType_Lookup(&PyList_Type, &_Py_ID(append));
     788                 :            :     assert(list_append);
     789                 :       3138 :     interp->callable_cache.list_append = list_append;
     790                 :            : 
     791         [ -  + ]:       3138 :     if (_PyBuiltins_AddExceptions(bimod) < 0) {
     792                 :          0 :         return _PyStatus_ERR("failed to add exceptions to builtins");
     793                 :            :     }
     794                 :            : 
     795                 :       3138 :     interp->builtins_copy = PyDict_Copy(interp->builtins);
     796         [ -  + ]:       3138 :     if (interp->builtins_copy == NULL) {
     797                 :          0 :         goto error;
     798                 :            :     }
     799                 :       3138 :     Py_DECREF(bimod);
     800                 :            : 
     801                 :            :     // Get the __import__ function
     802                 :       3138 :     PyObject *import_func = _PyDict_GetItemStringWithError(interp->builtins,
     803                 :            :                                                            "__import__");
     804         [ -  + ]:       3138 :     if (import_func == NULL) {
     805                 :          0 :         goto error;
     806                 :            :     }
     807                 :       3138 :     interp->import_func = Py_NewRef(import_func);
     808                 :            : 
     809                 :            :     assert(!_PyErr_Occurred(tstate));
     810                 :       3138 :     return _PyStatus_OK();
     811                 :            : 
     812                 :          0 : error:
     813                 :          0 :     Py_XDECREF(bimod);
     814                 :          0 :     return _PyStatus_ERR("can't initialize builtins module");
     815                 :            : }
     816                 :            : 
     817                 :            : 
     818                 :            : static PyStatus
     819                 :       3138 : pycore_interp_init(PyThreadState *tstate)
     820                 :            : {
     821                 :       3138 :     PyInterpreterState *interp = tstate->interp;
     822                 :            :     PyStatus status;
     823                 :       3138 :     PyObject *sysmod = NULL;
     824                 :            : 
     825                 :            :     // Create singletons before the first PyType_Ready() call, since
     826                 :            :     // PyType_Ready() uses singletons like the Unicode empty string (tp_doc)
     827                 :            :     // and the empty tuple singletons (tp_bases).
     828                 :       3138 :     status = pycore_init_global_objects(interp);
     829         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     830                 :          0 :         return status;
     831                 :            :     }
     832                 :            : 
     833                 :            :     // The GC must be initialized before the first GC collection.
     834                 :       3138 :     status = _PyGC_Init(interp);
     835         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     836                 :          0 :         return status;
     837                 :            :     }
     838                 :            :     // Intern strings in deep-frozen modules first so that others
     839                 :            :     // can use it instead of creating a heap allocated string.
     840         [ -  + ]:       3138 :     if (_Py_Deepfreeze_Init() < 0) {
     841                 :          0 :         return _PyStatus_ERR("failed to initialize deep-frozen modules");
     842                 :            :     }
     843                 :            : 
     844                 :       3138 :     status = pycore_init_types(interp);
     845         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     846                 :          0 :         goto done;
     847                 :            :     }
     848                 :            : 
     849         [ -  + ]:       3138 :     if (_PyWarnings_InitState(interp) < 0) {
     850                 :          0 :         return _PyStatus_ERR("can't initialize warnings");
     851                 :            :     }
     852                 :            : 
     853                 :       3138 :     status = _PyAtExit_Init(interp);
     854         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     855                 :          0 :         return status;
     856                 :            :     }
     857                 :            : 
     858                 :       3138 :     status = _PySys_Create(tstate, &sysmod);
     859         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     860                 :          0 :         goto done;
     861                 :            :     }
     862                 :            : 
     863                 :       3138 :     status = pycore_init_builtins(tstate);
     864         [ -  + ]:       3138 :     if (_PyStatus_EXCEPTION(status)) {
     865                 :          0 :         goto done;
     866                 :            :     }
     867                 :            : 
     868                 :       3138 :     const PyConfig *config = _PyInterpreterState_GetConfig(interp);
     869         [ +  + ]:       3138 :     if (config->_install_importlib) {
     870                 :            :         /* This call sets up builtin and frozen import support */
     871         [ +  - ]:       3134 :         if (init_importlib(tstate, sysmod) < 0) {
     872                 :          0 :             return _PyStatus_ERR("failed to initialize importlib");
     873                 :            :         }
     874                 :            :     }
     875                 :            : 
     876                 :       3138 : done:
     877                 :            :     /* sys.modules['sys'] contains a strong reference to the module */
     878                 :       3138 :     Py_XDECREF(sysmod);
     879                 :       3138 :     return status;
     880                 :            : }
     881                 :            : 
     882                 :            : 
     883                 :            : static PyStatus
     884                 :       2967 : pyinit_config(_PyRuntimeState *runtime,
     885                 :            :               PyThreadState **tstate_p,
     886                 :            :               const PyConfig *config)
     887                 :            : {
     888                 :       2967 :     PyStatus status = pycore_init_runtime(runtime, config);
     889         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     890                 :          0 :         return status;
     891                 :            :     }
     892                 :            : 
     893                 :            :     PyThreadState *tstate;
     894                 :       2967 :     status = pycore_create_interpreter(runtime, config, &tstate);
     895         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     896                 :          0 :         return status;
     897                 :            :     }
     898                 :       2967 :     *tstate_p = tstate;
     899                 :            : 
     900                 :       2967 :     status = pycore_interp_init(tstate);
     901         [ -  + ]:       2967 :     if (_PyStatus_EXCEPTION(status)) {
     902                 :          0 :         return status;
     903                 :            :     }
     904                 :            : 
     905                 :            :     /* Only when we get here is the runtime core fully initialized */
     906                 :       2967 :     runtime->core_initialized = 1;
     907                 :       2967 :     return _PyStatus_OK();
     908                 :            : }
     909                 :            : 
     910                 :            : 
     911                 :            : PyStatus
     912                 :       2989 : _Py_PreInitializeFromPyArgv(const PyPreConfig *src_config, const _PyArgv *args)
     913                 :            : {
     914                 :            :     PyStatus status;
     915                 :            : 
     916         [ -  + ]:       2989 :     if (src_config == NULL) {
     917                 :          0 :         return _PyStatus_ERR("preinitialization config is NULL");
     918                 :            :     }
     919                 :            : 
     920                 :       2989 :     status = _PyRuntime_Initialize();
     921         [ -  + ]:       2989 :     if (_PyStatus_EXCEPTION(status)) {
     922                 :          0 :         return status;
     923                 :            :     }
     924                 :       2989 :     _PyRuntimeState *runtime = &_PyRuntime;
     925                 :            : 
     926         [ +  + ]:       2989 :     if (runtime->preinitialized) {
     927                 :            :         /* If it's already configured: ignored the new configuration */
     928                 :          1 :         return _PyStatus_OK();
     929                 :            :     }
     930                 :            : 
     931                 :            :     /* Note: preinitialized remains 1 on error, it is only set to 0
     932                 :            :        at exit on success. */
     933                 :       2988 :     runtime->preinitializing = 1;
     934                 :            : 
     935                 :            :     PyPreConfig config;
     936                 :            : 
     937                 :       2988 :     status = _PyPreConfig_InitFromPreConfig(&config, src_config);
     938         [ -  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
     939                 :          0 :         return status;
     940                 :            :     }
     941                 :            : 
     942                 :       2988 :     status = _PyPreConfig_Read(&config, args);
     943         [ +  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
     944                 :          1 :         return status;
     945                 :            :     }
     946                 :            : 
     947                 :       2987 :     status = _PyPreConfig_Write(&config);
     948         [ -  + ]:       2987 :     if (_PyStatus_EXCEPTION(status)) {
     949                 :          0 :         return status;
     950                 :            :     }
     951                 :            : 
     952                 :       2987 :     runtime->preinitializing = 0;
     953                 :       2987 :     runtime->preinitialized = 1;
     954                 :       2987 :     return _PyStatus_OK();
     955                 :            : }
     956                 :            : 
     957                 :            : 
     958                 :            : PyStatus
     959                 :          0 : Py_PreInitializeFromBytesArgs(const PyPreConfig *src_config, Py_ssize_t argc, char **argv)
     960                 :            : {
     961                 :          0 :     _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv};
     962                 :          0 :     return _Py_PreInitializeFromPyArgv(src_config, &args);
     963                 :            : }
     964                 :            : 
     965                 :            : 
     966                 :            : PyStatus
     967                 :          1 : Py_PreInitializeFromArgs(const PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv)
     968                 :            : {
     969                 :          1 :     _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv};
     970                 :          1 :     return _Py_PreInitializeFromPyArgv(src_config, &args);
     971                 :            : }
     972                 :            : 
     973                 :            : 
     974                 :            : PyStatus
     975                 :         71 : Py_PreInitialize(const PyPreConfig *src_config)
     976                 :            : {
     977                 :         71 :     return _Py_PreInitializeFromPyArgv(src_config, NULL);
     978                 :            : }
     979                 :            : 
     980                 :            : 
     981                 :            : PyStatus
     982                 :     214074 : _Py_PreInitializeFromConfig(const PyConfig *config,
     983                 :            :                             const _PyArgv *args)
     984                 :            : {
     985                 :            :     assert(config != NULL);
     986                 :            : 
     987                 :     214074 :     PyStatus status = _PyRuntime_Initialize();
     988         [ -  + ]:     214074 :     if (_PyStatus_EXCEPTION(status)) {
     989                 :          0 :         return status;
     990                 :            :     }
     991                 :     214074 :     _PyRuntimeState *runtime = &_PyRuntime;
     992                 :            : 
     993         [ +  + ]:     214074 :     if (runtime->preinitialized) {
     994                 :            :         /* Already initialized: do nothing */
     995                 :     213962 :         return _PyStatus_OK();
     996                 :            :     }
     997                 :            : 
     998                 :            :     PyPreConfig preconfig;
     999                 :            : 
    1000                 :        112 :     _PyPreConfig_InitFromConfig(&preconfig, config);
    1001                 :            : 
    1002         [ +  + ]:        112 :     if (!config->parse_argv) {
    1003                 :         63 :         return Py_PreInitialize(&preconfig);
    1004                 :            :     }
    1005         [ +  + ]:         49 :     else if (args == NULL) {
    1006                 :          8 :         _PyArgv config_args = {
    1007                 :            :             .use_bytes_argv = 0,
    1008                 :          8 :             .argc = config->argv.length,
    1009                 :          8 :             .wchar_argv = config->argv.items};
    1010                 :          8 :         return _Py_PreInitializeFromPyArgv(&preconfig, &config_args);
    1011                 :            :     }
    1012                 :            :     else {
    1013                 :         41 :         return _Py_PreInitializeFromPyArgv(&preconfig, args);
    1014                 :            :     }
    1015                 :            : }
    1016                 :            : 
    1017                 :            : 
    1018                 :            : /* Begin interpreter initialization
    1019                 :            :  *
    1020                 :            :  * On return, the first thread and interpreter state have been created,
    1021                 :            :  * but the compiler, signal handling, multithreading and
    1022                 :            :  * multiple interpreter support, and codec infrastructure are not yet
    1023                 :            :  * available.
    1024                 :            :  *
    1025                 :            :  * The import system will support builtin and frozen modules only.
    1026                 :            :  * The only supported io is writing to sys.stderr
    1027                 :            :  *
    1028                 :            :  * If any operation invoked by this function fails, a fatal error is
    1029                 :            :  * issued and the function does not return.
    1030                 :            :  *
    1031                 :            :  * Any code invoked from this function should *not* assume it has access
    1032                 :            :  * to the Python C API (unless the API is explicitly listed as being
    1033                 :            :  * safe to call without calling Py_Initialize first)
    1034                 :            :  */
    1035                 :            : static PyStatus
    1036                 :       2988 : pyinit_core(_PyRuntimeState *runtime,
    1037                 :            :             const PyConfig *src_config,
    1038                 :            :             PyThreadState **tstate_p)
    1039                 :            : {
    1040                 :            :     PyStatus status;
    1041                 :            : 
    1042                 :       2988 :     status = _Py_PreInitializeFromConfig(src_config, NULL);
    1043         [ -  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
    1044                 :          0 :         return status;
    1045                 :            :     }
    1046                 :            : 
    1047                 :            :     PyConfig config;
    1048                 :       2988 :     PyConfig_InitPythonConfig(&config);
    1049                 :            : 
    1050                 :       2988 :     status = _PyConfig_Copy(&config, src_config);
    1051         [ -  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
    1052                 :          0 :         goto done;
    1053                 :            :     }
    1054                 :            : 
    1055                 :            :     // Read the configuration, but don't compute the path configuration
    1056                 :            :     // (it is computed in the main init).
    1057                 :       2988 :     status = _PyConfig_Read(&config, 0);
    1058         [ +  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
    1059                 :         20 :         goto done;
    1060                 :            :     }
    1061                 :            : 
    1062         [ +  + ]:       2968 :     if (!runtime->core_initialized) {
    1063                 :       2967 :         status = pyinit_config(runtime, tstate_p, &config);
    1064                 :            :     }
    1065                 :            :     else {
    1066                 :          1 :         status = pyinit_core_reconfigure(runtime, tstate_p, &config);
    1067                 :            :     }
    1068         [ +  - ]:       2968 :     if (_PyStatus_EXCEPTION(status)) {
    1069                 :          0 :         goto done;
    1070                 :            :     }
    1071                 :            : 
    1072                 :       2968 : done:
    1073                 :       2988 :     PyConfig_Clear(&config);
    1074                 :       2988 :     return status;
    1075                 :            : }
    1076                 :            : 
    1077                 :            : 
    1078                 :            : /* Py_Initialize() has already been called: update the main interpreter
    1079                 :            :    configuration. Example of bpo-34008: Py_Main() called after
    1080                 :            :    Py_Initialize(). */
    1081                 :            : static PyStatus
    1082                 :          1 : pyinit_main_reconfigure(PyThreadState *tstate)
    1083                 :            : {
    1084         [ -  + ]:          1 :     if (interpreter_update_config(tstate, 0) < 0) {
    1085                 :          0 :         return _PyStatus_ERR("fail to reconfigure Python");
    1086                 :            :     }
    1087                 :          1 :     return _PyStatus_OK();
    1088                 :            : }
    1089                 :            : 
    1090                 :            : 
    1091                 :            : static PyStatus
    1092                 :       3134 : init_interp_main(PyThreadState *tstate)
    1093                 :            : {
    1094                 :            :     assert(!_PyErr_Occurred(tstate));
    1095                 :            : 
    1096                 :            :     PyStatus status;
    1097                 :       3134 :     int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
    1098                 :       3134 :     PyInterpreterState *interp = tstate->interp;
    1099                 :       3134 :     const PyConfig *config = _PyInterpreterState_GetConfig(interp);
    1100                 :            : 
    1101         [ -  + ]:       3134 :     if (!config->_install_importlib) {
    1102                 :            :         /* Special mode for freeze_importlib: run with no import system
    1103                 :            :          *
    1104                 :            :          * This means anything which needs support from extension modules
    1105                 :            :          * or pure Python code in the standard library won't work.
    1106                 :            :          */
    1107         [ #  # ]:          0 :         if (is_main_interp) {
    1108                 :          0 :             interp->runtime->initialized = 1;
    1109                 :            :         }
    1110                 :          0 :         return _PyStatus_OK();
    1111                 :            :     }
    1112                 :            : 
    1113                 :            :     // Initialize the import-related configuration.
    1114                 :       3134 :     status = _PyConfig_InitImportConfig(&interp->config);
    1115         [ -  + ]:       3134 :     if (_PyStatus_EXCEPTION(status)) {
    1116                 :          0 :         return status;
    1117                 :            :     }
    1118                 :            : 
    1119         [ -  + ]:       3134 :     if (interpreter_update_config(tstate, 1) < 0) {
    1120                 :          0 :         return _PyStatus_ERR("failed to update the Python config");
    1121                 :            :     }
    1122                 :            : 
    1123                 :       3134 :     status = init_importlib_external(tstate);
    1124         [ -  + ]:       3134 :     if (_PyStatus_EXCEPTION(status)) {
    1125                 :          0 :         return status;
    1126                 :            :     }
    1127                 :            : 
    1128         [ +  + ]:       3134 :     if (is_main_interp) {
    1129                 :            :         /* initialize the faulthandler module */
    1130                 :       2963 :         status = _PyFaulthandler_Init(config->faulthandler);
    1131         [ -  + ]:       2963 :         if (_PyStatus_EXCEPTION(status)) {
    1132                 :          0 :             return status;
    1133                 :            :         }
    1134                 :            :     }
    1135                 :            : 
    1136                 :       3134 :     status = _PyUnicode_InitEncodings(tstate);
    1137         [ -  + ]:       3134 :     if (_PyStatus_EXCEPTION(status)) {
    1138                 :          0 :         return status;
    1139                 :            :     }
    1140                 :            : 
    1141         [ +  + ]:       3134 :     if (is_main_interp) {
    1142         [ -  + ]:       2963 :         if (_PySignal_Init(config->install_signal_handlers) < 0) {
    1143                 :          0 :             return _PyStatus_ERR("can't initialize signals");
    1144                 :            :         }
    1145                 :            : 
    1146         [ +  + ]:       2963 :         if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
    1147                 :          2 :             return _PyStatus_ERR("can't initialize tracemalloc");
    1148                 :            :         }
    1149                 :            :     }
    1150                 :            : 
    1151                 :       3132 :     status = init_sys_streams(tstate);
    1152         [ -  + ]:       3132 :     if (_PyStatus_EXCEPTION(status)) {
    1153                 :          0 :         return status;
    1154                 :            :     }
    1155                 :            : 
    1156                 :       3132 :     status = init_set_builtins_open();
    1157         [ -  + ]:       3132 :     if (_PyStatus_EXCEPTION(status)) {
    1158                 :          0 :         return status;
    1159                 :            :     }
    1160                 :            : 
    1161                 :       3132 :     status = add_main_module(interp);
    1162         [ -  + ]:       3132 :     if (_PyStatus_EXCEPTION(status)) {
    1163                 :          0 :         return status;
    1164                 :            :     }
    1165                 :            : 
    1166         [ +  + ]:       3132 :     if (is_main_interp) {
    1167                 :            :         /* Initialize warnings. */
    1168                 :       2961 :         PyObject *warnoptions = PySys_GetObject("warnoptions");
    1169   [ +  -  +  + ]:       2961 :         if (warnoptions != NULL && PyList_Size(warnoptions) > 0)
    1170                 :            :         {
    1171                 :       1020 :             PyObject *warnings_module = PyImport_ImportModule("warnings");
    1172         [ -  + ]:       1020 :             if (warnings_module == NULL) {
    1173                 :          0 :                 fprintf(stderr, "'import warnings' failed; traceback:\n");
    1174                 :          0 :                 _PyErr_Print(tstate);
    1175                 :            :             }
    1176                 :       1020 :             Py_XDECREF(warnings_module);
    1177                 :            :         }
    1178                 :            : 
    1179                 :       2961 :         interp->runtime->initialized = 1;
    1180                 :            :     }
    1181                 :            : 
    1182         [ +  + ]:       3132 :     if (config->site_import) {
    1183                 :       3011 :         status = init_import_site();
    1184         [ -  + ]:       3011 :         if (_PyStatus_EXCEPTION(status)) {
    1185                 :          0 :             return status;
    1186                 :            :         }
    1187                 :            :     }
    1188                 :            : 
    1189         [ +  + ]:       3132 :     if (is_main_interp) {
    1190                 :            : #ifndef MS_WINDOWS
    1191                 :       2961 :         emit_stderr_warning_for_legacy_locale(interp->runtime);
    1192                 :            : #endif
    1193                 :            :     }
    1194                 :            : 
    1195                 :            :     assert(!_PyErr_Occurred(tstate));
    1196                 :            : 
    1197                 :       3132 :     return _PyStatus_OK();
    1198                 :            : }
    1199                 :            : 
    1200                 :            : 
    1201                 :            : /* Update interpreter state based on supplied configuration settings
    1202                 :            :  *
    1203                 :            :  * After calling this function, most of the restrictions on the interpreter
    1204                 :            :  * are lifted. The only remaining incomplete settings are those related
    1205                 :            :  * to the main module (sys.argv[0], __main__ metadata)
    1206                 :            :  *
    1207                 :            :  * Calling this when the interpreter is not initializing, is already
    1208                 :            :  * initialized or without a valid current thread state is a fatal error.
    1209                 :            :  * Other errors should be reported as normal Python exceptions with a
    1210                 :            :  * non-zero return code.
    1211                 :            :  */
    1212                 :            : static PyStatus
    1213                 :       2964 : pyinit_main(PyThreadState *tstate)
    1214                 :            : {
    1215                 :       2964 :     PyInterpreterState *interp = tstate->interp;
    1216         [ -  + ]:       2964 :     if (!interp->runtime->core_initialized) {
    1217                 :          0 :         return _PyStatus_ERR("runtime core not initialized");
    1218                 :            :     }
    1219                 :            : 
    1220         [ +  + ]:       2964 :     if (interp->runtime->initialized) {
    1221                 :          1 :         return pyinit_main_reconfigure(tstate);
    1222                 :            :     }
    1223                 :            : 
    1224                 :       2963 :     PyStatus status = init_interp_main(tstate);
    1225         [ +  + ]:       2963 :     if (_PyStatus_EXCEPTION(status)) {
    1226                 :          2 :         return status;
    1227                 :            :     }
    1228                 :       2961 :     return _PyStatus_OK();
    1229                 :            : }
    1230                 :            : 
    1231                 :            : 
    1232                 :            : PyStatus
    1233                 :       2988 : Py_InitializeFromConfig(const PyConfig *config)
    1234                 :            : {
    1235         [ -  + ]:       2988 :     if (config == NULL) {
    1236                 :          0 :         return _PyStatus_ERR("initialization config is NULL");
    1237                 :            :     }
    1238                 :            : 
    1239                 :            :     PyStatus status;
    1240                 :            : 
    1241                 :       2988 :     status = _PyRuntime_Initialize();
    1242         [ -  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
    1243                 :          0 :         return status;
    1244                 :            :     }
    1245                 :       2988 :     _PyRuntimeState *runtime = &_PyRuntime;
    1246                 :            : 
    1247                 :       2988 :     PyThreadState *tstate = NULL;
    1248                 :       2988 :     status = pyinit_core(runtime, config, &tstate);
    1249         [ +  + ]:       2988 :     if (_PyStatus_EXCEPTION(status)) {
    1250                 :         20 :         return status;
    1251                 :            :     }
    1252                 :       2968 :     config = _PyInterpreterState_GetConfig(tstate->interp);
    1253                 :            : 
    1254         [ +  + ]:       2968 :     if (config->_init_main) {
    1255                 :       2962 :         status = pyinit_main(tstate);
    1256         [ +  + ]:       2962 :         if (_PyStatus_EXCEPTION(status)) {
    1257                 :          2 :             return status;
    1258                 :            :         }
    1259                 :            :     }
    1260                 :            : 
    1261                 :       2966 :     return _PyStatus_OK();
    1262                 :            : }
    1263                 :            : 
    1264                 :            : 
    1265                 :            : void
    1266                 :          6 : Py_InitializeEx(int install_sigs)
    1267                 :            : {
    1268                 :            :     PyStatus status;
    1269                 :            : 
    1270                 :          6 :     status = _PyRuntime_Initialize();
    1271         [ -  + ]:          6 :     if (_PyStatus_EXCEPTION(status)) {
    1272                 :          0 :         Py_ExitStatusException(status);
    1273                 :            :     }
    1274                 :          6 :     _PyRuntimeState *runtime = &_PyRuntime;
    1275                 :            : 
    1276         [ +  + ]:          6 :     if (runtime->initialized) {
    1277                 :            :         /* bpo-33932: Calling Py_Initialize() twice does nothing. */
    1278                 :          1 :         return;
    1279                 :            :     }
    1280                 :            : 
    1281                 :            :     PyConfig config;
    1282                 :          5 :     _PyConfig_InitCompatConfig(&config);
    1283                 :            : 
    1284                 :          5 :     config.install_signal_handlers = install_sigs;
    1285                 :            : 
    1286                 :          5 :     status = Py_InitializeFromConfig(&config);
    1287         [ -  + ]:          5 :     if (_PyStatus_EXCEPTION(status)) {
    1288                 :          0 :         Py_ExitStatusException(status);
    1289                 :            :     }
    1290                 :            : }
    1291                 :            : 
    1292                 :            : void
    1293                 :          6 : Py_Initialize(void)
    1294                 :            : {
    1295                 :          6 :     Py_InitializeEx(1);
    1296                 :          6 : }
    1297                 :            : 
    1298                 :            : 
    1299                 :            : PyStatus
    1300                 :          2 : _Py_InitializeMain(void)
    1301                 :            : {
    1302                 :          2 :     PyStatus status = _PyRuntime_Initialize();
    1303         [ -  + ]:          2 :     if (_PyStatus_EXCEPTION(status)) {
    1304                 :          0 :         return status;
    1305                 :            :     }
    1306                 :          2 :     _PyRuntimeState *runtime = &_PyRuntime;
    1307                 :          2 :     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
    1308                 :          2 :     return pyinit_main(tstate);
    1309                 :            : }
    1310                 :            : 
    1311                 :            : 
    1312                 :            : static void
    1313                 :       3125 : finalize_modules_delete_special(PyThreadState *tstate, int verbose)
    1314                 :            : {
    1315                 :            :     // List of names to clear in sys
    1316                 :            :     static const char * const sys_deletes[] = {
    1317                 :            :         "path", "argv", "ps1", "ps2",
    1318                 :            :         "last_type", "last_value", "last_traceback",
    1319                 :            :         "path_hooks", "path_importer_cache", "meta_path",
    1320                 :            :         "__interactivehook__",
    1321                 :            :         NULL
    1322                 :            :     };
    1323                 :            : 
    1324                 :            :     static const char * const sys_files[] = {
    1325                 :            :         "stdin", "__stdin__",
    1326                 :            :         "stdout", "__stdout__",
    1327                 :            :         "stderr", "__stderr__",
    1328                 :            :         NULL
    1329                 :            :     };
    1330                 :            : 
    1331                 :       3125 :     PyInterpreterState *interp = tstate->interp;
    1332         [ +  + ]:       3125 :     if (verbose) {
    1333                 :         12 :         PySys_WriteStderr("# clear builtins._\n");
    1334                 :            :     }
    1335         [ -  + ]:       3125 :     if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
    1336                 :          0 :         PyErr_WriteUnraisable(NULL);
    1337                 :            :     }
    1338                 :            : 
    1339                 :            :     const char * const *p;
    1340         [ +  + ]:      37500 :     for (p = sys_deletes; *p != NULL; p++) {
    1341         [ +  + ]:      34375 :         if (verbose) {
    1342                 :        132 :             PySys_WriteStderr("# clear sys.%s\n", *p);
    1343                 :            :         }
    1344         [ +  + ]:      34375 :         if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
    1345                 :         43 :             PyErr_WriteUnraisable(NULL);
    1346                 :            :         }
    1347                 :            :     }
    1348         [ +  + ]:      12500 :     for (p = sys_files; *p != NULL; p+=2) {
    1349                 :       9375 :         const char *name = p[0];
    1350                 :       9375 :         const char *orig_name = p[1];
    1351         [ +  + ]:       9375 :         if (verbose) {
    1352                 :         36 :             PySys_WriteStderr("# restore sys.%s\n", name);
    1353                 :            :         }
    1354                 :       9375 :         PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict,
    1355                 :            :                                                          orig_name);
    1356         [ +  + ]:       9375 :         if (value == NULL) {
    1357         [ +  - ]:          6 :             if (_PyErr_Occurred(tstate)) {
    1358                 :          6 :                 PyErr_WriteUnraisable(NULL);
    1359                 :            :             }
    1360                 :          6 :             value = Py_None;
    1361                 :            :         }
    1362         [ +  + ]:       9375 :         if (PyDict_SetItemString(interp->sysdict, name, value) < 0) {
    1363                 :          6 :             PyErr_WriteUnraisable(NULL);
    1364                 :            :         }
    1365                 :            :     }
    1366                 :       3125 : }
    1367                 :            : 
    1368                 :            : 
    1369                 :            : static PyObject*
    1370                 :       3125 : finalize_remove_modules(PyObject *modules, int verbose)
    1371                 :            : {
    1372                 :       3125 :     PyObject *weaklist = PyList_New(0);
    1373         [ +  + ]:       3125 :     if (weaklist == NULL) {
    1374                 :          2 :         PyErr_WriteUnraisable(NULL);
    1375                 :            :     }
    1376                 :            : 
    1377                 :            : #define STORE_MODULE_WEAKREF(name, mod) \
    1378                 :            :         if (weaklist != NULL) { \
    1379                 :            :             PyObject *wr = PyWeakref_NewRef(mod, NULL); \
    1380                 :            :             if (wr) { \
    1381                 :            :                 PyObject *tup = PyTuple_Pack(2, name, wr); \
    1382                 :            :                 if (!tup || PyList_Append(weaklist, tup) < 0) { \
    1383                 :            :                     PyErr_WriteUnraisable(NULL); \
    1384                 :            :                 } \
    1385                 :            :                 Py_XDECREF(tup); \
    1386                 :            :                 Py_DECREF(wr); \
    1387                 :            :             } \
    1388                 :            :             else { \
    1389                 :            :                 PyErr_WriteUnraisable(NULL); \
    1390                 :            :             } \
    1391                 :            :         }
    1392                 :            : 
    1393                 :            : #define CLEAR_MODULE(name, mod) \
    1394                 :            :         if (PyModule_Check(mod)) { \
    1395                 :            :             if (verbose && PyUnicode_Check(name)) { \
    1396                 :            :                 PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
    1397                 :            :             } \
    1398                 :            :             STORE_MODULE_WEAKREF(name, mod); \
    1399                 :            :             if (PyObject_SetItem(modules, name, Py_None) < 0) { \
    1400                 :            :                 PyErr_WriteUnraisable(NULL); \
    1401                 :            :             } \
    1402                 :            :         }
    1403                 :            : 
    1404         [ +  - ]:       3125 :     if (PyDict_CheckExact(modules)) {
    1405                 :       3125 :         Py_ssize_t pos = 0;
    1406                 :            :         PyObject *key, *value;
    1407         [ +  + ]:     320911 :         while (PyDict_Next(modules, &pos, &key, &value)) {
    1408   [ +  +  +  +  :     314661 :             CLEAR_MODULE(key, value);
          +  -  +  +  +  
          -  +  -  -  +  
                   +  - ]
    1409                 :            :         }
    1410                 :            :     }
    1411                 :            :     else {
    1412                 :          0 :         PyObject *iterator = PyObject_GetIter(modules);
    1413         [ #  # ]:          0 :         if (iterator == NULL) {
    1414                 :          0 :             PyErr_WriteUnraisable(NULL);
    1415                 :            :         }
    1416                 :            :         else {
    1417                 :            :             PyObject *key;
    1418         [ #  # ]:          0 :             while ((key = PyIter_Next(iterator))) {
    1419                 :          0 :                 PyObject *value = PyObject_GetItem(modules, key);
    1420         [ #  # ]:          0 :                 if (value == NULL) {
    1421                 :          0 :                     PyErr_WriteUnraisable(NULL);
    1422                 :          0 :                     continue;
    1423                 :            :                 }
    1424   [ #  #  #  #  :          0 :                 CLEAR_MODULE(key, value);
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1425                 :          0 :                 Py_DECREF(value);
    1426                 :          0 :                 Py_DECREF(key);
    1427                 :            :             }
    1428         [ #  # ]:          0 :             if (PyErr_Occurred()) {
    1429                 :          0 :                 PyErr_WriteUnraisable(NULL);
    1430                 :            :             }
    1431                 :          0 :             Py_DECREF(iterator);
    1432                 :            :         }
    1433                 :            :     }
    1434                 :            : #undef CLEAR_MODULE
    1435                 :            : #undef STORE_MODULE_WEAKREF
    1436                 :            : 
    1437                 :       3125 :     return weaklist;
    1438                 :            : }
    1439                 :            : 
    1440                 :            : 
    1441                 :            : static void
    1442                 :       3125 : finalize_clear_modules_dict(PyObject *modules)
    1443                 :            : {
    1444         [ +  - ]:       3125 :     if (PyDict_CheckExact(modules)) {
    1445                 :       3125 :         PyDict_Clear(modules);
    1446                 :            :     }
    1447                 :            :     else {
    1448         [ #  # ]:          0 :         if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) {
    1449                 :          0 :             PyErr_WriteUnraisable(NULL);
    1450                 :            :         }
    1451                 :            :     }
    1452                 :       3125 : }
    1453                 :            : 
    1454                 :            : 
    1455                 :            : static void
    1456                 :       3125 : finalize_restore_builtins(PyThreadState *tstate)
    1457                 :            : {
    1458                 :       3125 :     PyInterpreterState *interp = tstate->interp;
    1459                 :       3125 :     PyObject *dict = PyDict_Copy(interp->builtins);
    1460         [ +  + ]:       3125 :     if (dict == NULL) {
    1461                 :          2 :         PyErr_WriteUnraisable(NULL);
    1462                 :            :     }
    1463                 :       3125 :     PyDict_Clear(interp->builtins);
    1464         [ +  + ]:       3125 :     if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
    1465                 :          2 :         PyErr_WriteUnraisable(NULL);
    1466                 :            :     }
    1467                 :       3125 :     Py_XDECREF(dict);
    1468                 :       3125 : }
    1469                 :            : 
    1470                 :            : 
    1471                 :            : static void
    1472                 :       3123 : finalize_modules_clear_weaklist(PyInterpreterState *interp,
    1473                 :            :                                 PyObject *weaklist, int verbose)
    1474                 :            : {
    1475                 :            :     // First clear modules imported later
    1476         [ +  + ]:     315887 :     for (Py_ssize_t i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
    1477                 :     312764 :         PyObject *tup = PyList_GET_ITEM(weaklist, i);
    1478                 :     312764 :         PyObject *name = PyTuple_GET_ITEM(tup, 0);
    1479                 :     312764 :         PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1));
    1480         [ +  + ]:     312764 :         if (mod == Py_None) {
    1481                 :     173857 :             continue;
    1482                 :            :         }
    1483                 :            :         assert(PyModule_Check(mod));
    1484                 :     138907 :         PyObject *dict = PyModule_GetDict(mod);
    1485   [ +  +  +  + ]:     138907 :         if (dict == interp->builtins || dict == interp->sysdict) {
    1486                 :       6246 :             continue;
    1487                 :            :         }
    1488                 :     132661 :         Py_INCREF(mod);
    1489   [ +  +  +  - ]:     132661 :         if (verbose && PyUnicode_Check(name)) {
    1490                 :        205 :             PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
    1491                 :            :         }
    1492                 :     132661 :         _PyModule_Clear(mod);
    1493                 :     132661 :         Py_DECREF(mod);
    1494                 :            :     }
    1495                 :       3123 : }
    1496                 :            : 
    1497                 :            : 
    1498                 :            : static void
    1499                 :       3125 : finalize_clear_sys_builtins_dict(PyInterpreterState *interp, int verbose)
    1500                 :            : {
    1501                 :            :     // Clear sys dict
    1502         [ +  + ]:       3125 :     if (verbose) {
    1503                 :         12 :         PySys_FormatStderr("# cleanup[3] wiping sys\n");
    1504                 :            :     }
    1505                 :       3125 :     _PyModule_ClearDict(interp->sysdict);
    1506                 :            : 
    1507                 :            :     // Clear builtins dict
    1508         [ +  + ]:       3125 :     if (verbose) {
    1509                 :         12 :         PySys_FormatStderr("# cleanup[3] wiping builtins\n");
    1510                 :            :     }
    1511                 :       3125 :     _PyModule_ClearDict(interp->builtins);
    1512                 :       3125 : }
    1513                 :            : 
    1514                 :            : 
    1515                 :            : /* Clear modules, as good as we can */
    1516                 :            : static void
    1517                 :       3125 : finalize_modules(PyThreadState *tstate)
    1518                 :            : {
    1519                 :       3125 :     PyInterpreterState *interp = tstate->interp;
    1520                 :       3125 :     PyObject *modules = interp->modules;
    1521         [ -  + ]:       3125 :     if (modules == NULL) {
    1522                 :            :         // Already done
    1523                 :          0 :         return;
    1524                 :            :     }
    1525                 :       3125 :     int verbose = _PyInterpreterState_GetConfig(interp)->verbose;
    1526                 :            : 
    1527                 :            :     // Delete some special builtins._ and sys attributes first.  These are
    1528                 :            :     // common places where user values hide and people complain when their
    1529                 :            :     // destructors fail.  Since the modules containing them are
    1530                 :            :     // deleted *last* of all, they would come too late in the normal
    1531                 :            :     // destruction order.  Sigh.
    1532                 :            :     //
    1533                 :            :     // XXX Perhaps these precautions are obsolete. Who knows?
    1534                 :       3125 :     finalize_modules_delete_special(tstate, verbose);
    1535                 :            : 
    1536                 :            :     // Remove all modules from sys.modules, hoping that garbage collection
    1537                 :            :     // can reclaim most of them: set all sys.modules values to None.
    1538                 :            :     //
    1539                 :            :     // We prepare a list which will receive (name, weakref) tuples of
    1540                 :            :     // modules when they are removed from sys.modules.  The name is used
    1541                 :            :     // for diagnosis messages (in verbose mode), while the weakref helps
    1542                 :            :     // detect those modules which have been held alive.
    1543                 :       3125 :     PyObject *weaklist = finalize_remove_modules(modules, verbose);
    1544                 :            : 
    1545                 :            :     // Clear the modules dict
    1546                 :       3125 :     finalize_clear_modules_dict(modules);
    1547                 :            : 
    1548                 :            :     // Restore the original builtins dict, to ensure that any
    1549                 :            :     // user data gets cleared.
    1550                 :       3125 :     finalize_restore_builtins(tstate);
    1551                 :            : 
    1552                 :            :     // Collect garbage
    1553                 :       3125 :     _PyGC_CollectNoFail(tstate);
    1554                 :            : 
    1555                 :            :     // Dump GC stats before it's too late, since it uses the warnings
    1556                 :            :     // machinery.
    1557                 :       3125 :     _PyGC_DumpShutdownStats(interp);
    1558                 :            : 
    1559         [ +  + ]:       3125 :     if (weaklist != NULL) {
    1560                 :            :         // Now, if there are any modules left alive, clear their globals to
    1561                 :            :         // minimize potential leaks.  All C extension modules actually end
    1562                 :            :         // up here, since they are kept alive in the interpreter state.
    1563                 :            :         //
    1564                 :            :         // The special treatment of "builtins" here is because even
    1565                 :            :         // when it's not referenced as a module, its dictionary is
    1566                 :            :         // referenced by almost every module's __builtins__.  Since
    1567                 :            :         // deleting a module clears its dictionary (even if there are
    1568                 :            :         // references left to it), we need to delete the "builtins"
    1569                 :            :         // module last.  Likewise, we don't delete sys until the very
    1570                 :            :         // end because it is implicitly referenced (e.g. by print).
    1571                 :            :         //
    1572                 :            :         // Since dict is ordered in CPython 3.6+, modules are saved in
    1573                 :            :         // importing order.  First clear modules imported later.
    1574                 :       3123 :         finalize_modules_clear_weaklist(interp, weaklist, verbose);
    1575                 :       3123 :         Py_DECREF(weaklist);
    1576                 :            :     }
    1577                 :            : 
    1578                 :            :     // Clear sys and builtins modules dict
    1579                 :       3125 :     finalize_clear_sys_builtins_dict(interp, verbose);
    1580                 :            : 
    1581                 :            :     // Clear module dict copies stored in the interpreter state:
    1582                 :            :     // clear PyInterpreterState.modules_by_index and
    1583                 :            :     // clear PyModuleDef.m_base.m_copy (of extensions not using the multi-phase
    1584                 :            :     // initialization API)
    1585                 :       3125 :     _PyInterpreterState_ClearModules(interp);
    1586                 :            : 
    1587                 :            :     // Clear and delete the modules directory.  Actual modules will
    1588                 :            :     // still be there only if imported during the execution of some
    1589                 :            :     // destructor.
    1590                 :       3125 :     Py_SETREF(interp->modules, NULL);
    1591                 :            : 
    1592                 :            :     // Collect garbage once more
    1593                 :       3125 :     _PyGC_CollectNoFail(tstate);
    1594                 :            : }
    1595                 :            : 
    1596                 :            : 
    1597                 :            : /* Flush stdout and stderr */
    1598                 :            : 
    1599                 :            : static int
    1600                 :       5903 : file_is_closed(PyObject *fobj)
    1601                 :            : {
    1602                 :            :     int r;
    1603                 :       5903 :     PyObject *tmp = PyObject_GetAttrString(fobj, "closed");
    1604         [ +  + ]:       5903 :     if (tmp == NULL) {
    1605                 :         31 :         PyErr_Clear();
    1606                 :         31 :         return 0;
    1607                 :            :     }
    1608                 :       5872 :     r = PyObject_IsTrue(tmp);
    1609                 :       5872 :     Py_DECREF(tmp);
    1610         [ -  + ]:       5872 :     if (r < 0)
    1611                 :          0 :         PyErr_Clear();
    1612                 :       5872 :     return r > 0;
    1613                 :            : }
    1614                 :            : 
    1615                 :            : 
    1616                 :            : static int
    1617                 :       5916 : flush_std_files(void)
    1618                 :            : {
    1619                 :       5916 :     PyThreadState *tstate = _PyThreadState_GET();
    1620                 :       5916 :     PyObject *fout = _PySys_GetAttr(tstate, &_Py_ID(stdout));
    1621                 :       5916 :     PyObject *ferr = _PySys_GetAttr(tstate, &_Py_ID(stderr));
    1622                 :            :     PyObject *tmp;
    1623                 :       5916 :     int status = 0;
    1624                 :            : 
    1625   [ +  +  +  +  :       5916 :     if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
                   +  + ]
    1626                 :       2887 :         tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush));
    1627         [ +  + ]:       2887 :         if (tmp == NULL) {
    1628                 :          1 :             PyErr_WriteUnraisable(fout);
    1629                 :          1 :             status = -1;
    1630                 :            :         }
    1631                 :            :         else
    1632                 :       2886 :             Py_DECREF(tmp);
    1633                 :            :     }
    1634                 :            : 
    1635   [ +  -  +  +  :       5916 :     if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
                   +  - ]
    1636                 :       2951 :         tmp = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush));
    1637         [ -  + ]:       2951 :         if (tmp == NULL) {
    1638                 :          0 :             PyErr_Clear();
    1639                 :          0 :             status = -1;
    1640                 :            :         }
    1641                 :            :         else
    1642                 :       2951 :             Py_DECREF(tmp);
    1643                 :            :     }
    1644                 :            : 
    1645                 :       5916 :     return status;
    1646                 :            : }
    1647                 :            : 
    1648                 :            : /* Undo the effect of Py_Initialize().
    1649                 :            : 
    1650                 :            :    Beware: if multiple interpreter and/or thread states exist, these
    1651                 :            :    are not wiped out; only the current thread and interpreter state
    1652                 :            :    are deleted.  But since everything else is deleted, those other
    1653                 :            :    interpreter and thread states should no longer be used.
    1654                 :            : 
    1655                 :            :    (XXX We should do better, e.g. wipe out all interpreters and
    1656                 :            :    threads.)
    1657                 :            : 
    1658                 :            :    Locking: as above.
    1659                 :            : 
    1660                 :            : */
    1661                 :            : 
    1662                 :            : 
    1663                 :            : static void
    1664                 :       3125 : finalize_interp_types(PyInterpreterState *interp)
    1665                 :            : {
    1666                 :       3125 :     _PyUnicode_FiniTypes(interp);
    1667                 :       3125 :     _PySys_Fini(interp);
    1668                 :       3125 :     _PyExc_Fini(interp);
    1669                 :       3125 :     _PyAsyncGen_Fini(interp);
    1670                 :       3125 :     _PyContext_Fini(interp);
    1671                 :       3125 :     _PyFloat_FiniType(interp);
    1672                 :       3125 :     _PyLong_FiniTypes(interp);
    1673                 :       3125 :     _PyThread_FiniType(interp);
    1674                 :       3125 :     _PyErr_FiniTypes(interp);
    1675                 :       3125 :     _PyTypes_Fini(interp);
    1676                 :       3125 :     _PyTypes_FiniTypes(interp);
    1677                 :            : 
    1678                 :            :     // Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses
    1679                 :            :     // a dict internally.
    1680                 :       3125 :     _PyUnicode_ClearInterned(interp);
    1681                 :            : 
    1682                 :       3125 :     _PyDict_Fini(interp);
    1683                 :       3125 :     _PyList_Fini(interp);
    1684                 :       3125 :     _PyTuple_Fini(interp);
    1685                 :            : 
    1686                 :       3125 :     _PySlice_Fini(interp);
    1687                 :            : 
    1688                 :       3125 :     _PyUnicode_Fini(interp);
    1689                 :       3125 :     _PyFloat_Fini(interp);
    1690                 :       3125 : }
    1691                 :            : 
    1692                 :            : 
    1693                 :            : static void
    1694                 :       3125 : finalize_interp_clear(PyThreadState *tstate)
    1695                 :            : {
    1696                 :       3125 :     int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
    1697                 :            : 
    1698                 :       3125 :     _PyExc_ClearExceptionGroupType(tstate->interp);
    1699                 :            : 
    1700                 :            :     /* Clear interpreter state and all thread states */
    1701                 :       3125 :     _PyInterpreterState_Clear(tstate);
    1702                 :            : 
    1703         [ +  + ]:       3125 :     if (is_main_interp) {
    1704                 :       2956 :         _PyIO_Fini();
    1705                 :            :     }
    1706                 :            : 
    1707                 :            :     /* Clear all loghooks */
    1708                 :            :     /* Both _PySys_Audit function and users still need PyObject, such as tuple.
    1709                 :            :        Call _PySys_ClearAuditHooks when PyObject available. */
    1710         [ +  + ]:       3125 :     if (is_main_interp) {
    1711                 :       2956 :         _PySys_ClearAuditHooks(tstate);
    1712                 :            :     }
    1713                 :            : 
    1714         [ +  + ]:       3125 :     if (is_main_interp) {
    1715                 :       2956 :         _Py_HashRandomization_Fini();
    1716                 :       2956 :         _PyArg_Fini();
    1717                 :       2956 :         _Py_ClearFileSystemEncoding();
    1718                 :       2956 :         _Py_Deepfreeze_Fini();
    1719                 :            :     }
    1720                 :            : 
    1721                 :       3125 :     finalize_interp_types(tstate->interp);
    1722                 :       3125 : }
    1723                 :            : 
    1724                 :            : 
    1725                 :            : static void
    1726                 :       3125 : finalize_interp_delete(PyInterpreterState *interp)
    1727                 :            : {
    1728         [ +  + ]:       3125 :     if (_Py_IsMainInterpreter(interp)) {
    1729                 :            :         /* Cleanup auto-thread-state */
    1730                 :       2956 :         _PyGILState_Fini(interp);
    1731                 :            :     }
    1732                 :            : 
    1733                 :            :     /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can
    1734                 :            :        fail when it is being awaited by another running daemon thread (see
    1735                 :            :        bpo-9901). Instead pycore_create_interpreter() destroys the previously
    1736                 :            :        created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be
    1737                 :            :        called multiple times. */
    1738                 :            : 
    1739                 :       3125 :     PyInterpreterState_Delete(interp);
    1740                 :       3125 : }
    1741                 :            : 
    1742                 :            : 
    1743                 :            : int
    1744                 :       2962 : Py_FinalizeEx(void)
    1745                 :            : {
    1746                 :       2962 :     int status = 0;
    1747                 :            : 
    1748                 :       2962 :     _PyRuntimeState *runtime = &_PyRuntime;
    1749         [ +  + ]:       2962 :     if (!runtime->initialized) {
    1750                 :          5 :         return status;
    1751                 :            :     }
    1752                 :            : 
    1753                 :            :     /* Get current thread state and interpreter pointer */
    1754                 :       2957 :     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
    1755                 :            : 
    1756                 :            :     // Wrap up existing "threading"-module-created, non-daemon threads.
    1757                 :       2957 :     wait_for_thread_shutdown(tstate);
    1758                 :            : 
    1759                 :            :     // Make any remaining pending calls.
    1760                 :       2957 :     _Py_FinishPendingCalls(tstate);
    1761                 :            : 
    1762                 :            :     /* The interpreter is still entirely intact at this point, and the
    1763                 :            :      * exit funcs may be relying on that.  In particular, if some thread
    1764                 :            :      * or exit func is still waiting to do an import, the import machinery
    1765                 :            :      * expects Py_IsInitialized() to return true.  So don't say the
    1766                 :            :      * runtime is uninitialized until after the exit funcs have run.
    1767                 :            :      * Note that Threading.py uses an exit func to do a join on all the
    1768                 :            :      * threads created thru it, so this also protects pending imports in
    1769                 :            :      * the threads created via Threading.
    1770                 :            :      */
    1771                 :            : 
    1772                 :       2957 :     _PyAtExit_Call(tstate->interp);
    1773                 :            : 
    1774                 :            :     /* Copy the core config, PyInterpreterState_Delete() free
    1775                 :            :        the core config memory */
    1776                 :            : #ifdef Py_REF_DEBUG
    1777                 :            :     int show_ref_count = tstate->interp->config.show_ref_count;
    1778                 :            : #endif
    1779                 :            : #ifdef Py_TRACE_REFS
    1780                 :            :     int dump_refs = tstate->interp->config.dump_refs;
    1781                 :            :     wchar_t *dump_refs_file = tstate->interp->config.dump_refs_file;
    1782                 :            : #endif
    1783                 :            : #ifdef WITH_PYMALLOC
    1784                 :       2957 :     int malloc_stats = tstate->interp->config.malloc_stats;
    1785                 :            : #endif
    1786                 :            : 
    1787                 :            :     /* Remaining daemon threads will automatically exit
    1788                 :            :        when they attempt to take the GIL (ex: PyEval_RestoreThread()). */
    1789                 :       2957 :     _PyRuntimeState_SetFinalizing(runtime, tstate);
    1790                 :       2957 :     runtime->initialized = 0;
    1791                 :       2957 :     runtime->core_initialized = 0;
    1792                 :            : 
    1793                 :            :     /* Destroy the state of all threads of the interpreter, except of the
    1794                 :            :        current thread. In practice, only daemon threads should still be alive,
    1795                 :            :        except if wait_for_thread_shutdown() has been cancelled by CTRL+C.
    1796                 :            :        Clear frames of other threads to call objects destructors. Destructors
    1797                 :            :        will be called in the current Python thread. Since
    1798                 :            :        _PyRuntimeState_SetFinalizing() has been called, no other Python thread
    1799                 :            :        can take the GIL at this point: if they try, they will exit
    1800                 :            :        immediately. */
    1801                 :       2957 :     _PyThreadState_DeleteExcept(runtime, tstate);
    1802                 :            : 
    1803                 :            :     /* Flush sys.stdout and sys.stderr */
    1804         [ +  + ]:       2957 :     if (flush_std_files() < 0) {
    1805                 :          1 :         status = -1;
    1806                 :            :     }
    1807                 :            : 
    1808                 :            :     /* Disable signal handling */
    1809                 :       2957 :     _PySignal_Fini();
    1810                 :            : 
    1811                 :            :     /* Collect garbage.  This may call finalizers; it's nice to call these
    1812                 :            :      * before all modules are destroyed.
    1813                 :            :      * XXX If a __del__ or weakref callback is triggered here, and tries to
    1814                 :            :      * XXX import a module, bad things can happen, because Python no
    1815                 :            :      * XXX longer believes it's initialized.
    1816                 :            :      * XXX     Fatal Python error: Interpreter not initialized (version mismatch?)
    1817                 :            :      * XXX is easy to provoke that way.  I've also seen, e.g.,
    1818                 :            :      * XXX     Exception exceptions.ImportError: 'No module named sha'
    1819                 :            :      * XXX         in <function callback at 0x008F5718> ignored
    1820                 :            :      * XXX but I'm unclear on exactly how that one happens.  In any case,
    1821                 :            :      * XXX I haven't seen a real-life report of either of these.
    1822                 :            :      */
    1823                 :       2957 :     PyGC_Collect();
    1824                 :            : 
    1825                 :            :     /* Destroy all modules */
    1826                 :       2957 :     finalize_modules(tstate);
    1827                 :            : 
    1828                 :            :     /* Print debug stats if any */
    1829                 :       2957 :     _PyEval_Fini();
    1830                 :            : 
    1831                 :            :     /* Flush sys.stdout and sys.stderr (again, in case more was printed) */
    1832         [ -  + ]:       2957 :     if (flush_std_files() < 0) {
    1833                 :          0 :         status = -1;
    1834                 :            :     }
    1835                 :            : 
    1836                 :            :     /* Collect final garbage.  This disposes of cycles created by
    1837                 :            :      * class definitions, for example.
    1838                 :            :      * XXX This is disabled because it caused too many problems.  If
    1839                 :            :      * XXX a __del__ or weakref callback triggers here, Python code has
    1840                 :            :      * XXX a hard time running, because even the sys module has been
    1841                 :            :      * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
    1842                 :            :      * XXX One symptom is a sequence of information-free messages
    1843                 :            :      * XXX coming from threads (if a __del__ or callback is invoked,
    1844                 :            :      * XXX other threads can execute too, and any exception they encounter
    1845                 :            :      * XXX triggers a comedy of errors as subsystem after subsystem
    1846                 :            :      * XXX fails to find what it *expects* to find in sys to help report
    1847                 :            :      * XXX the exception and consequent unexpected failures).  I've also
    1848                 :            :      * XXX seen segfaults then, after adding print statements to the
    1849                 :            :      * XXX Python code getting called.
    1850                 :            :      */
    1851                 :            : #if 0
    1852                 :            :     _PyGC_CollectIfEnabled();
    1853                 :            : #endif
    1854                 :            : 
    1855                 :            :     /* Disable tracemalloc after all Python objects have been destroyed,
    1856                 :            :        so it is possible to use tracemalloc in objects destructor. */
    1857                 :       2957 :     _PyTraceMalloc_Fini();
    1858                 :            : 
    1859                 :            :     /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
    1860                 :       2957 :     _PyImport_Fini();
    1861                 :            : 
    1862                 :            :     /* unload faulthandler module */
    1863                 :       2957 :     _PyFaulthandler_Fini();
    1864                 :            : 
    1865                 :            :     /* dump hash stats */
    1866                 :       2957 :     _PyHash_Fini();
    1867                 :            : 
    1868                 :            : #ifdef Py_TRACE_REFS
    1869                 :            :     /* Display all objects still alive -- this can invoke arbitrary
    1870                 :            :      * __repr__ overrides, so requires a mostly-intact interpreter.
    1871                 :            :      * Alas, a lot of stuff may still be alive now that will be cleaned
    1872                 :            :      * up later.
    1873                 :            :      */
    1874                 :            : 
    1875                 :            :     FILE *dump_refs_fp = NULL;
    1876                 :            :     if (dump_refs_file != NULL) {
    1877                 :            :         dump_refs_fp = _Py_wfopen(dump_refs_file, L"w");
    1878                 :            :         if (dump_refs_fp == NULL) {
    1879                 :            :             fprintf(stderr, "PYTHONDUMPREFSFILE: cannot create file: %ls\n", dump_refs_file);
    1880                 :            :         }
    1881                 :            :     }
    1882                 :            : 
    1883                 :            :     if (dump_refs) {
    1884                 :            :         _Py_PrintReferences(stderr);
    1885                 :            :     }
    1886                 :            : 
    1887                 :            :     if (dump_refs_fp != NULL) {
    1888                 :            :         _Py_PrintReferences(dump_refs_fp);
    1889                 :            :     }
    1890                 :            : #endif /* Py_TRACE_REFS */
    1891                 :            : 
    1892                 :       2957 :     finalize_interp_clear(tstate);
    1893                 :       2957 :     finalize_interp_delete(tstate->interp);
    1894                 :            : 
    1895                 :            : #ifdef Py_REF_DEBUG
    1896                 :            :     if (show_ref_count) {
    1897                 :            :         _PyDebug_PrintTotalRefs();
    1898                 :            :     }
    1899                 :            : #endif
    1900                 :            : 
    1901                 :            : #ifdef Py_TRACE_REFS
    1902                 :            :     /* Display addresses (& refcnts) of all objects still alive.
    1903                 :            :      * An address can be used to find the repr of the object, printed
    1904                 :            :      * above by _Py_PrintReferences.
    1905                 :            :      */
    1906                 :            : 
    1907                 :            :     if (dump_refs) {
    1908                 :            :         _Py_PrintReferenceAddresses(stderr);
    1909                 :            :     }
    1910                 :            : 
    1911                 :            :     if (dump_refs_fp != NULL) {
    1912                 :            :         _Py_PrintReferenceAddresses(dump_refs_fp);
    1913                 :            :         fclose(dump_refs_fp);
    1914                 :            :     }
    1915                 :            : #endif /* Py_TRACE_REFS */
    1916                 :            : #ifdef WITH_PYMALLOC
    1917         [ +  + ]:       2957 :     if (malloc_stats) {
    1918                 :          3 :         _PyObject_DebugMallocStats(stderr);
    1919                 :            :     }
    1920                 :            : #endif
    1921                 :            : 
    1922                 :       2957 :     call_ll_exitfuncs(runtime);
    1923                 :            : 
    1924                 :       2957 :     _PyRuntime_Finalize();
    1925                 :       2957 :     return status;
    1926                 :            : }
    1927                 :            : 
    1928                 :            : void
    1929                 :         84 : Py_Finalize(void)
    1930                 :            : {
    1931                 :         84 :     Py_FinalizeEx();
    1932                 :         84 : }
    1933                 :            : 
    1934                 :            : 
    1935                 :            : /* Create and initialize a new interpreter and thread, and return the
    1936                 :            :    new thread.  This requires that Py_Initialize() has been called
    1937                 :            :    first.
    1938                 :            : 
    1939                 :            :    Unsuccessful initialization yields a NULL pointer.  Note that *no*
    1940                 :            :    exception information is available even in this case -- the
    1941                 :            :    exception information is held in the thread, and there is no
    1942                 :            :    thread.
    1943                 :            : 
    1944                 :            :    Locking: as above.
    1945                 :            : 
    1946                 :            : */
    1947                 :            : 
    1948                 :            : static PyStatus
    1949                 :        171 : new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter)
    1950                 :            : {
    1951                 :            :     PyStatus status;
    1952                 :            : 
    1953                 :        171 :     status = _PyRuntime_Initialize();
    1954         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    1955                 :          0 :         return status;
    1956                 :            :     }
    1957                 :        171 :     _PyRuntimeState *runtime = &_PyRuntime;
    1958                 :            : 
    1959         [ -  + ]:        171 :     if (!runtime->initialized) {
    1960                 :          0 :         return _PyStatus_ERR("Py_Initialize must be called first");
    1961                 :            :     }
    1962                 :            : 
    1963                 :            :     /* Issue #10915, #15751: The GIL API doesn't work with multiple
    1964                 :            :        interpreters: disable PyGILState_Check(). */
    1965                 :        171 :     runtime->gilstate.check_enabled = 0;
    1966                 :            : 
    1967                 :        171 :     PyInterpreterState *interp = PyInterpreterState_New();
    1968         [ -  + ]:        171 :     if (interp == NULL) {
    1969                 :          0 :         *tstate_p = NULL;
    1970                 :          0 :         return _PyStatus_OK();
    1971                 :            :     }
    1972                 :            : 
    1973                 :        171 :     PyThreadState *tstate = PyThreadState_New(interp);
    1974         [ -  + ]:        171 :     if (tstate == NULL) {
    1975                 :          0 :         PyInterpreterState_Delete(interp);
    1976                 :          0 :         *tstate_p = NULL;
    1977                 :          0 :         return _PyStatus_OK();
    1978                 :            :     }
    1979                 :            : 
    1980                 :        171 :     PyThreadState *save_tstate = PyThreadState_Swap(tstate);
    1981                 :            : 
    1982                 :            :     /* Copy the current interpreter config into the new interpreter */
    1983                 :            :     const PyConfig *config;
    1984         [ +  + ]:        171 :     if (save_tstate != NULL) {
    1985                 :        124 :         config = _PyInterpreterState_GetConfig(save_tstate->interp);
    1986                 :            :     }
    1987                 :            :     else
    1988                 :            :     {
    1989                 :            :         /* No current thread state, copy from the main interpreter */
    1990                 :         47 :         PyInterpreterState *main_interp = _PyInterpreterState_Main();
    1991                 :         47 :         config = _PyInterpreterState_GetConfig(main_interp);
    1992                 :            :     }
    1993                 :            : 
    1994                 :            : 
    1995                 :        171 :     status = _PyConfig_Copy(&interp->config, config);
    1996         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    1997                 :          0 :         goto error;
    1998                 :            :     }
    1999                 :        171 :     interp->config._isolated_interpreter = isolated_subinterpreter;
    2000                 :            : 
    2001                 :        171 :     status = init_interp_create_gil(tstate);
    2002         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    2003                 :          0 :         goto error;
    2004                 :            :     }
    2005                 :            : 
    2006                 :        171 :     status = pycore_interp_init(tstate);
    2007         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    2008                 :          0 :         goto error;
    2009                 :            :     }
    2010                 :            : 
    2011                 :        171 :     status = init_interp_main(tstate);
    2012         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    2013                 :          0 :         goto error;
    2014                 :            :     }
    2015                 :            : 
    2016                 :        171 :     *tstate_p = tstate;
    2017                 :        171 :     return _PyStatus_OK();
    2018                 :            : 
    2019                 :          0 : error:
    2020                 :          0 :     *tstate_p = NULL;
    2021                 :            : 
    2022                 :            :     /* Oops, it didn't work.  Undo it all. */
    2023                 :          0 :     PyErr_PrintEx(0);
    2024                 :          0 :     PyThreadState_Clear(tstate);
    2025                 :          0 :     PyThreadState_Delete(tstate);
    2026                 :          0 :     PyInterpreterState_Delete(interp);
    2027                 :          0 :     PyThreadState_Swap(save_tstate);
    2028                 :            : 
    2029                 :          0 :     return status;
    2030                 :            : }
    2031                 :            : 
    2032                 :            : PyThreadState *
    2033                 :        171 : _Py_NewInterpreter(int isolated_subinterpreter)
    2034                 :            : {
    2035                 :        171 :     PyThreadState *tstate = NULL;
    2036                 :        171 :     PyStatus status = new_interpreter(&tstate, isolated_subinterpreter);
    2037         [ -  + ]:        171 :     if (_PyStatus_EXCEPTION(status)) {
    2038                 :          0 :         Py_ExitStatusException(status);
    2039                 :            :     }
    2040                 :        171 :     return tstate;
    2041                 :            : 
    2042                 :            : }
    2043                 :            : 
    2044                 :            : PyThreadState *
    2045                 :         50 : Py_NewInterpreter(void)
    2046                 :            : {
    2047                 :         50 :     return _Py_NewInterpreter(0);
    2048                 :            : }
    2049                 :            : 
    2050                 :            : /* Delete an interpreter and its last thread.  This requires that the
    2051                 :            :    given thread state is current, that the thread has no remaining
    2052                 :            :    frames, and that it is its interpreter's only remaining thread.
    2053                 :            :    It is a fatal error to violate these constraints.
    2054                 :            : 
    2055                 :            :    (Py_FinalizeEx() doesn't have these constraints -- it zaps
    2056                 :            :    everything, regardless.)
    2057                 :            : 
    2058                 :            :    Locking: as above.
    2059                 :            : 
    2060                 :            : */
    2061                 :            : 
    2062                 :            : void
    2063                 :        168 : Py_EndInterpreter(PyThreadState *tstate)
    2064                 :            : {
    2065                 :        168 :     PyInterpreterState *interp = tstate->interp;
    2066                 :            : 
    2067         [ -  + ]:        168 :     if (tstate != _PyThreadState_GET()) {
    2068                 :            :         Py_FatalError("thread is not current");
    2069                 :            :     }
    2070         [ -  + ]:        168 :     if (tstate->cframe->current_frame != NULL) {
    2071                 :            :         Py_FatalError("thread still has a frame");
    2072                 :            :     }
    2073                 :        168 :     interp->finalizing = 1;
    2074                 :            : 
    2075                 :            :     // Wrap up existing "threading"-module-created, non-daemon threads.
    2076                 :        168 :     wait_for_thread_shutdown(tstate);
    2077                 :            : 
    2078                 :        168 :     _PyAtExit_Call(tstate->interp);
    2079                 :            : 
    2080   [ +  -  -  + ]:        168 :     if (tstate != interp->threads.head || tstate->next != NULL) {
    2081                 :            :         Py_FatalError("not the last thread");
    2082                 :            :     }
    2083                 :            : 
    2084                 :        168 :     finalize_modules(tstate);
    2085                 :            : 
    2086                 :        168 :     finalize_interp_clear(tstate);
    2087                 :        168 :     finalize_interp_delete(tstate->interp);
    2088                 :        168 : }
    2089                 :            : 
    2090                 :            : /* Add the __main__ module */
    2091                 :            : 
    2092                 :            : static PyStatus
    2093                 :       3132 : add_main_module(PyInterpreterState *interp)
    2094                 :            : {
    2095                 :            :     PyObject *m, *d, *loader, *ann_dict;
    2096                 :       3132 :     m = PyImport_AddModule("__main__");
    2097         [ -  + ]:       3132 :     if (m == NULL)
    2098                 :          0 :         return _PyStatus_ERR("can't create __main__ module");
    2099                 :            : 
    2100                 :       3132 :     d = PyModule_GetDict(m);
    2101                 :       3132 :     ann_dict = PyDict_New();
    2102   [ +  -  -  + ]:       6264 :     if ((ann_dict == NULL) ||
    2103                 :       3132 :         (PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) {
    2104                 :          0 :         return _PyStatus_ERR("Failed to initialize __main__.__annotations__");
    2105                 :            :     }
    2106                 :       3132 :     Py_DECREF(ann_dict);
    2107                 :            : 
    2108         [ +  + ]:       3132 :     if (_PyDict_GetItemStringWithError(d, "__builtins__") == NULL) {
    2109         [ -  + ]:       3131 :         if (PyErr_Occurred()) {
    2110                 :          0 :             return _PyStatus_ERR("Failed to test __main__.__builtins__");
    2111                 :            :         }
    2112                 :       3131 :         PyObject *bimod = PyImport_ImportModule("builtins");
    2113         [ -  + ]:       3131 :         if (bimod == NULL) {
    2114                 :          0 :             return _PyStatus_ERR("Failed to retrieve builtins module");
    2115                 :            :         }
    2116         [ -  + ]:       3131 :         if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
    2117                 :          0 :             return _PyStatus_ERR("Failed to initialize __main__.__builtins__");
    2118                 :            :         }
    2119                 :       3131 :         Py_DECREF(bimod);
    2120                 :            :     }
    2121                 :            : 
    2122                 :            :     /* Main is a little special - imp.is_builtin("__main__") will return
    2123                 :            :      * False, but BuiltinImporter is still the most appropriate initial
    2124                 :            :      * setting for its __loader__ attribute. A more suitable value will
    2125                 :            :      * be set if __main__ gets further initialized later in the startup
    2126                 :            :      * process.
    2127                 :            :      */
    2128                 :       3132 :     loader = _PyDict_GetItemStringWithError(d, "__loader__");
    2129   [ +  -  +  - ]:       3132 :     if (loader == NULL || loader == Py_None) {
    2130         [ -  + ]:       3132 :         if (PyErr_Occurred()) {
    2131                 :          0 :             return _PyStatus_ERR("Failed to test __main__.__loader__");
    2132                 :            :         }
    2133                 :       3132 :         PyObject *loader = PyObject_GetAttrString(interp->importlib,
    2134                 :            :                                                   "BuiltinImporter");
    2135         [ -  + ]:       3132 :         if (loader == NULL) {
    2136                 :          0 :             return _PyStatus_ERR("Failed to retrieve BuiltinImporter");
    2137                 :            :         }
    2138         [ -  + ]:       3132 :         if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
    2139                 :          0 :             return _PyStatus_ERR("Failed to initialize __main__.__loader__");
    2140                 :            :         }
    2141                 :       3132 :         Py_DECREF(loader);
    2142                 :            :     }
    2143                 :       3132 :     return _PyStatus_OK();
    2144                 :            : }
    2145                 :            : 
    2146                 :            : /* Import the site module (not into __main__ though) */
    2147                 :            : 
    2148                 :            : static PyStatus
    2149                 :       3011 : init_import_site(void)
    2150                 :            : {
    2151                 :            :     PyObject *m;
    2152                 :       3011 :     m = PyImport_ImportModule("site");
    2153         [ -  + ]:       3011 :     if (m == NULL) {
    2154                 :          0 :         return _PyStatus_ERR("Failed to import the site module");
    2155                 :            :     }
    2156                 :       3011 :     Py_DECREF(m);
    2157                 :       3011 :     return _PyStatus_OK();
    2158                 :            : }
    2159                 :            : 
    2160                 :            : /* Check if a file descriptor is valid or not.
    2161                 :            :    Return 0 if the file descriptor is invalid, return non-zero otherwise. */
    2162                 :            : static int
    2163                 :       9396 : is_valid_fd(int fd)
    2164                 :            : {
    2165                 :            : /* dup() is faster than fstat(): fstat() can require input/output operations,
    2166                 :            :    whereas dup() doesn't. There is a low risk of EMFILE/ENFILE at Python
    2167                 :            :    startup. Problem: dup() doesn't check if the file descriptor is valid on
    2168                 :            :    some platforms.
    2169                 :            : 
    2170                 :            :    fcntl(fd, F_GETFD) is even faster, because it only checks the process table.
    2171                 :            :    It is preferred over dup() when available, since it cannot fail with the
    2172                 :            :    "too many open files" error (EMFILE).
    2173                 :            : 
    2174                 :            :    bpo-30225: On macOS Tiger, when stdout is redirected to a pipe and the other
    2175                 :            :    side of the pipe is closed, dup(1) succeed, whereas fstat(1, &st) fails with
    2176                 :            :    EBADF. FreeBSD has similar issue (bpo-32849).
    2177                 :            : 
    2178                 :            :    Only use dup() on Linux where dup() is enough to detect invalid FD
    2179                 :            :    (bpo-32849).
    2180                 :            : */
    2181         [ -  + ]:       9396 :     if (fd < 0) {
    2182                 :          0 :         return 0;
    2183                 :            :     }
    2184                 :            : #if defined(F_GETFD) && ( \
    2185                 :            :         defined(__linux__) || \
    2186                 :            :         defined(__APPLE__) || \
    2187                 :            :         defined(__wasm__))
    2188                 :       9396 :     return fcntl(fd, F_GETFD) >= 0;
    2189                 :            : #elif defined(__linux__)
    2190                 :            :     int fd2 = dup(fd);
    2191                 :            :     if (fd2 >= 0) {
    2192                 :            :         close(fd2);
    2193                 :            :     }
    2194                 :            :     return (fd2 >= 0);
    2195                 :            : #elif defined(MS_WINDOWS)
    2196                 :            :     HANDLE hfile;
    2197                 :            :     _Py_BEGIN_SUPPRESS_IPH
    2198                 :            :     hfile = (HANDLE)_get_osfhandle(fd);
    2199                 :            :     _Py_END_SUPPRESS_IPH
    2200                 :            :     return (hfile != INVALID_HANDLE_VALUE
    2201                 :            :             && GetFileType(hfile) != FILE_TYPE_UNKNOWN);
    2202                 :            : #else
    2203                 :            :     struct stat st;
    2204                 :            :     return (fstat(fd, &st) == 0);
    2205                 :            : #endif
    2206                 :            : }
    2207                 :            : 
    2208                 :            : /* returns Py_None if the fd is not valid */
    2209                 :            : static PyObject*
    2210                 :       9396 : create_stdio(const PyConfig *config, PyObject* io,
    2211                 :            :     int fd, int write_mode, const char* name,
    2212                 :            :     const wchar_t* encoding, const wchar_t* errors)
    2213                 :            : {
    2214                 :       9396 :     PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
    2215                 :            :     const char* mode;
    2216                 :            :     const char* newline;
    2217                 :            :     PyObject *line_buffering, *write_through;
    2218                 :            :     int buffering, isatty;
    2219                 :       9396 :     const int buffered_stdio = config->buffered_stdio;
    2220                 :            : 
    2221         [ +  + ]:       9396 :     if (!is_valid_fd(fd))
    2222                 :         12 :         Py_RETURN_NONE;
    2223                 :            : 
    2224                 :            :     /* stdin is always opened in buffered mode, first because it shouldn't
    2225                 :            :        make a difference in common use cases, second because TextIOWrapper
    2226                 :            :        depends on the presence of a read1() method which only exists on
    2227                 :            :        buffered streams.
    2228                 :            :     */
    2229   [ +  +  +  + ]:       9384 :     if (!buffered_stdio && write_mode)
    2230                 :       1264 :         buffering = 0;
    2231                 :            :     else
    2232                 :       8120 :         buffering = -1;
    2233         [ +  + ]:       9384 :     if (write_mode)
    2234                 :       6259 :         mode = "wb";
    2235                 :            :     else
    2236                 :       3125 :         mode = "rb";
    2237                 :       9384 :     buf = _PyObject_CallMethod(io, &_Py_ID(open), "isiOOOO",
    2238                 :            :                                fd, mode, buffering,
    2239                 :            :                                Py_None, Py_None, /* encoding, errors */
    2240                 :            :                                Py_None, Py_False); /* newline, closefd */
    2241         [ -  + ]:       9384 :     if (buf == NULL)
    2242                 :          0 :         goto error;
    2243                 :            : 
    2244         [ +  + ]:       9384 :     if (buffering) {
    2245                 :       8120 :         raw = PyObject_GetAttr(buf, &_Py_ID(raw));
    2246         [ -  + ]:       8120 :         if (raw == NULL)
    2247                 :          0 :             goto error;
    2248                 :            :     }
    2249                 :            :     else {
    2250                 :       1264 :         raw = buf;
    2251                 :       1264 :         Py_INCREF(raw);
    2252                 :            :     }
    2253                 :            : 
    2254                 :            : #ifdef MS_WINDOWS
    2255                 :            :     /* Windows console IO is always UTF-8 encoded */
    2256                 :            :     if (PyWindowsConsoleIO_Check(raw))
    2257                 :            :         encoding = L"utf-8";
    2258                 :            : #endif
    2259                 :            : 
    2260                 :       9384 :     text = PyUnicode_FromString(name);
    2261   [ +  -  -  + ]:       9384 :     if (text == NULL || PyObject_SetAttr(raw, &_Py_ID(name), text) < 0)
    2262                 :          0 :         goto error;
    2263                 :       9384 :     res = PyObject_CallMethodNoArgs(raw, &_Py_ID(isatty));
    2264         [ -  + ]:       9384 :     if (res == NULL)
    2265                 :          0 :         goto error;
    2266                 :       9384 :     isatty = PyObject_IsTrue(res);
    2267                 :       9384 :     Py_DECREF(res);
    2268         [ -  + ]:       9384 :     if (isatty == -1)
    2269                 :          0 :         goto error;
    2270         [ +  + ]:       9384 :     if (!buffered_stdio)
    2271                 :       1896 :         write_through = Py_True;
    2272                 :            :     else
    2273                 :       7488 :         write_through = Py_False;
    2274   [ +  +  +  +  :       9384 :     if (buffered_stdio && (isatty || fd == fileno(stderr)))
                   +  + ]
    2275                 :       3654 :         line_buffering = Py_True;
    2276                 :            :     else
    2277                 :       5730 :         line_buffering = Py_False;
    2278                 :            : 
    2279         [ +  - ]:       9384 :     Py_CLEAR(raw);
    2280         [ +  - ]:       9384 :     Py_CLEAR(text);
    2281                 :            : 
    2282                 :            : #ifdef MS_WINDOWS
    2283                 :            :     /* sys.stdin: enable universal newline mode, translate "\r\n" and "\r"
    2284                 :            :        newlines to "\n".
    2285                 :            :        sys.stdout and sys.stderr: translate "\n" to "\r\n". */
    2286                 :            :     newline = NULL;
    2287                 :            : #else
    2288                 :            :     /* sys.stdin: split lines at "\n".
    2289                 :            :        sys.stdout and sys.stderr: don't translate newlines (use "\n"). */
    2290                 :       9384 :     newline = "\n";
    2291                 :            : #endif
    2292                 :            : 
    2293                 :       9384 :     PyObject *encoding_str = PyUnicode_FromWideChar(encoding, -1);
    2294         [ -  + ]:       9384 :     if (encoding_str == NULL) {
    2295         [ #  # ]:          0 :         Py_CLEAR(buf);
    2296                 :          0 :         goto error;
    2297                 :            :     }
    2298                 :            : 
    2299                 :       9384 :     PyObject *errors_str = PyUnicode_FromWideChar(errors, -1);
    2300         [ -  + ]:       9384 :     if (errors_str == NULL) {
    2301         [ #  # ]:          0 :         Py_CLEAR(buf);
    2302         [ #  # ]:          0 :         Py_CLEAR(encoding_str);
    2303                 :          0 :         goto error;
    2304                 :            :     }
    2305                 :            : 
    2306                 :       9384 :     stream = _PyObject_CallMethod(io, &_Py_ID(TextIOWrapper), "OOOsOO",
    2307                 :            :                                   buf, encoding_str, errors_str,
    2308                 :            :                                   newline, line_buffering, write_through);
    2309         [ +  - ]:       9384 :     Py_CLEAR(buf);
    2310         [ +  - ]:       9384 :     Py_CLEAR(encoding_str);
    2311         [ +  - ]:       9384 :     Py_CLEAR(errors_str);
    2312         [ -  + ]:       9384 :     if (stream == NULL)
    2313                 :          0 :         goto error;
    2314                 :            : 
    2315         [ +  + ]:       9384 :     if (write_mode)
    2316                 :       6259 :         mode = "w";
    2317                 :            :     else
    2318                 :       3125 :         mode = "r";
    2319                 :       9384 :     text = PyUnicode_FromString(mode);
    2320   [ +  -  -  + ]:       9384 :     if (!text || PyObject_SetAttr(stream, &_Py_ID(mode), text) < 0)
    2321                 :          0 :         goto error;
    2322         [ +  - ]:       9384 :     Py_CLEAR(text);
    2323                 :       9384 :     return stream;
    2324                 :            : 
    2325                 :          0 : error:
    2326                 :          0 :     Py_XDECREF(buf);
    2327                 :          0 :     Py_XDECREF(stream);
    2328                 :          0 :     Py_XDECREF(text);
    2329                 :          0 :     Py_XDECREF(raw);
    2330                 :            : 
    2331   [ #  #  #  # ]:          0 :     if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) {
    2332                 :            :         /* Issue #24891: the file descriptor was closed after the first
    2333                 :            :            is_valid_fd() check was called. Ignore the OSError and set the
    2334                 :            :            stream to None. */
    2335                 :          0 :         PyErr_Clear();
    2336                 :          0 :         Py_RETURN_NONE;
    2337                 :            :     }
    2338                 :          0 :     return NULL;
    2339                 :            : }
    2340                 :            : 
    2341                 :            : /* Set builtins.open to io.open */
    2342                 :            : static PyStatus
    2343                 :       3132 : init_set_builtins_open(void)
    2344                 :            : {
    2345                 :            :     PyObject *wrapper;
    2346                 :       3132 :     PyObject *bimod = NULL;
    2347                 :       3132 :     PyStatus res = _PyStatus_OK();
    2348                 :            : 
    2349         [ -  + ]:       3132 :     if (!(bimod = PyImport_ImportModule("builtins"))) {
    2350                 :          0 :         goto error;
    2351                 :            :     }
    2352                 :            : 
    2353         [ -  + ]:       3132 :     if (!(wrapper = _PyImport_GetModuleAttrString("io", "open"))) {
    2354                 :          0 :         goto error;
    2355                 :            :     }
    2356                 :            : 
    2357                 :            :     /* Set builtins.open */
    2358         [ -  + ]:       3132 :     if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
    2359                 :          0 :         Py_DECREF(wrapper);
    2360                 :          0 :         goto error;
    2361                 :            :     }
    2362                 :       3132 :     Py_DECREF(wrapper);
    2363                 :       3132 :     goto done;
    2364                 :            : 
    2365                 :          0 : error:
    2366                 :          0 :     res = _PyStatus_ERR("can't initialize io.open");
    2367                 :            : 
    2368                 :       3132 : done:
    2369                 :       3132 :     Py_XDECREF(bimod);
    2370                 :       3132 :     return res;
    2371                 :            : }
    2372                 :            : 
    2373                 :            : 
    2374                 :            : /* Create sys.stdin, sys.stdout and sys.stderr */
    2375                 :            : static PyStatus
    2376                 :       3132 : init_sys_streams(PyThreadState *tstate)
    2377                 :            : {
    2378                 :       3132 :     PyObject *iomod = NULL;
    2379                 :       3132 :     PyObject *std = NULL;
    2380                 :            :     int fd;
    2381                 :            :     PyObject * encoding_attr;
    2382                 :       3132 :     PyStatus res = _PyStatus_OK();
    2383                 :       3132 :     const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp);
    2384                 :            : 
    2385                 :            :     /* Check that stdin is not a directory
    2386                 :            :        Using shell redirection, you can redirect stdin to a directory,
    2387                 :            :        crashing the Python interpreter. Catch this common mistake here
    2388                 :            :        and output a useful error message. Note that under MS Windows,
    2389                 :            :        the shell already prevents that. */
    2390                 :            : #ifndef MS_WINDOWS
    2391                 :            :     struct _Py_stat_struct sb;
    2392         [ +  + ]:       3132 :     if (_Py_fstat_noraise(fileno(stdin), &sb) == 0 &&
    2393         [ -  + ]:       3125 :         S_ISDIR(sb.st_mode)) {
    2394                 :          0 :         return _PyStatus_ERR("<stdin> is a directory, cannot continue");
    2395                 :            :     }
    2396                 :            : #endif
    2397                 :            : 
    2398         [ -  + ]:       3132 :     if (!(iomod = PyImport_ImportModule("io"))) {
    2399                 :          0 :         goto error;
    2400                 :            :     }
    2401                 :            : 
    2402                 :            :     /* Set sys.stdin */
    2403                 :       3132 :     fd = fileno(stdin);
    2404                 :            :     /* Under some conditions stdin, stdout and stderr may not be connected
    2405                 :            :      * and fileno() may point to an invalid file descriptor. For example
    2406                 :            :      * GUI apps don't have valid standard streams by default.
    2407                 :            :      */
    2408                 :       3132 :     std = create_stdio(config, iomod, fd, 0, "<stdin>",
    2409                 :       3132 :                        config->stdio_encoding,
    2410                 :       3132 :                        config->stdio_errors);
    2411         [ -  + ]:       3132 :     if (std == NULL)
    2412                 :          0 :         goto error;
    2413                 :       3132 :     PySys_SetObject("__stdin__", std);
    2414                 :       3132 :     _PySys_SetAttr(&_Py_ID(stdin), std);
    2415                 :       3132 :     Py_DECREF(std);
    2416                 :            : 
    2417                 :            :     /* Set sys.stdout */
    2418                 :       3132 :     fd = fileno(stdout);
    2419                 :       3132 :     std = create_stdio(config, iomod, fd, 1, "<stdout>",
    2420                 :       3132 :                        config->stdio_encoding,
    2421                 :       3132 :                        config->stdio_errors);
    2422         [ -  + ]:       3132 :     if (std == NULL)
    2423                 :          0 :         goto error;
    2424                 :       3132 :     PySys_SetObject("__stdout__", std);
    2425                 :       3132 :     _PySys_SetAttr(&_Py_ID(stdout), std);
    2426                 :       3132 :     Py_DECREF(std);
    2427                 :            : 
    2428                 :            : #if 1 /* Disable this if you have trouble debugging bootstrap stuff */
    2429                 :            :     /* Set sys.stderr, replaces the preliminary stderr */
    2430                 :       3132 :     fd = fileno(stderr);
    2431                 :       3132 :     std = create_stdio(config, iomod, fd, 1, "<stderr>",
    2432                 :       3132 :                        config->stdio_encoding,
    2433                 :            :                        L"backslashreplace");
    2434         [ -  + ]:       3132 :     if (std == NULL)
    2435                 :          0 :         goto error;
    2436                 :            : 
    2437                 :            :     /* Same as hack above, pre-import stderr's codec to avoid recursion
    2438                 :            :        when import.c tries to write to stderr in verbose mode. */
    2439                 :       3132 :     encoding_attr = PyObject_GetAttrString(std, "encoding");
    2440         [ +  + ]:       3132 :     if (encoding_attr != NULL) {
    2441                 :       3130 :         const char *std_encoding = PyUnicode_AsUTF8(encoding_attr);
    2442         [ +  - ]:       3130 :         if (std_encoding != NULL) {
    2443                 :       3130 :             PyObject *codec_info = _PyCodec_Lookup(std_encoding);
    2444                 :       3130 :             Py_XDECREF(codec_info);
    2445                 :            :         }
    2446                 :       3130 :         Py_DECREF(encoding_attr);
    2447                 :            :     }
    2448                 :       3132 :     _PyErr_Clear(tstate);  /* Not a fatal error if codec isn't available */
    2449                 :            : 
    2450         [ -  + ]:       3132 :     if (PySys_SetObject("__stderr__", std) < 0) {
    2451                 :          0 :         Py_DECREF(std);
    2452                 :          0 :         goto error;
    2453                 :            :     }
    2454         [ -  + ]:       3132 :     if (_PySys_SetAttr(&_Py_ID(stderr), std) < 0) {
    2455                 :          0 :         Py_DECREF(std);
    2456                 :          0 :         goto error;
    2457                 :            :     }
    2458                 :       3132 :     Py_DECREF(std);
    2459                 :            : #endif
    2460                 :            : 
    2461                 :       3132 :     goto done;
    2462                 :            : 
    2463                 :          0 : error:
    2464                 :          0 :     res = _PyStatus_ERR("can't initialize sys standard streams");
    2465                 :            : 
    2466                 :       3132 : done:
    2467                 :       3132 :     _Py_ClearStandardStreamEncoding();
    2468                 :       3132 :     Py_XDECREF(iomod);
    2469                 :       3132 :     return res;
    2470                 :            : }
    2471                 :            : 
    2472                 :            : 
    2473                 :            : static void
    2474                 :            : _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp,
    2475                 :            :                               PyThreadState *tstate)
    2476                 :            : {
    2477                 :          6 :     PUTS(fd, "\n");
    2478                 :            : 
    2479                 :            :     /* display the current Python stack */
    2480                 :          6 :     _Py_DumpTracebackThreads(fd, interp, tstate);
    2481                 :          6 : }
    2482                 :            : 
    2483                 :            : /* Print the current exception (if an exception is set) with its traceback,
    2484                 :            :    or display the current Python stack.
    2485                 :            : 
    2486                 :            :    Don't call PyErr_PrintEx() and the except hook, because Py_FatalError() is
    2487                 :            :    called on catastrophic cases.
    2488                 :            : 
    2489                 :            :    Return 1 if the traceback was displayed, 0 otherwise. */
    2490                 :            : 
    2491                 :            : static int
    2492                 :            : _Py_FatalError_PrintExc(PyThreadState *tstate)
    2493                 :            : {
    2494                 :            :     PyObject *ferr, *res;
    2495                 :            :     PyObject *exception, *v, *tb;
    2496                 :            :     int has_tb;
    2497                 :            : 
    2498                 :          2 :     _PyErr_Fetch(tstate, &exception, &v, &tb);
    2499         [ -  + ]:          2 :     if (exception == NULL) {
    2500                 :            :         /* No current exception */
    2501                 :          0 :         return 0;
    2502                 :            :     }
    2503                 :            : 
    2504                 :          2 :     ferr = _PySys_GetAttr(tstate, &_Py_ID(stderr));
    2505   [ +  -  -  + ]:          2 :     if (ferr == NULL || ferr == Py_None) {
    2506                 :            :         /* sys.stderr is not set yet or set to None,
    2507                 :            :            no need to try to display the exception */
    2508                 :          0 :         return 0;
    2509                 :            :     }
    2510                 :            : 
    2511                 :          2 :     _PyErr_NormalizeException(tstate, &exception, &v, &tb);
    2512         [ +  - ]:          2 :     if (tb == NULL) {
    2513                 :          2 :         tb = Py_None;
    2514                 :          2 :         Py_INCREF(tb);
    2515                 :            :     }
    2516                 :          2 :     PyException_SetTraceback(v, tb);
    2517         [ -  + ]:          2 :     if (exception == NULL) {
    2518                 :            :         /* PyErr_NormalizeException() failed */
    2519                 :          0 :         return 0;
    2520                 :            :     }
    2521                 :            : 
    2522                 :          2 :     has_tb = (tb != Py_None);
    2523                 :          2 :     PyErr_Display(exception, v, tb);
    2524                 :          2 :     Py_XDECREF(exception);
    2525                 :          2 :     Py_XDECREF(v);
    2526                 :          2 :     Py_XDECREF(tb);
    2527                 :            : 
    2528                 :            :     /* sys.stderr may be buffered: call sys.stderr.flush() */
    2529                 :          2 :     res = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush));
    2530         [ -  + ]:          2 :     if (res == NULL) {
    2531                 :          0 :         _PyErr_Clear(tstate);
    2532                 :            :     }
    2533                 :            :     else {
    2534                 :          2 :         Py_DECREF(res);
    2535                 :            :     }
    2536                 :            : 
    2537                 :          2 :     return has_tb;
    2538                 :            : }
    2539                 :            : 
    2540                 :            : /* Print fatal error message and abort */
    2541                 :            : 
    2542                 :            : #ifdef MS_WINDOWS
    2543                 :            : static void
    2544                 :            : fatal_output_debug(const char *msg)
    2545                 :            : {
    2546                 :            :     /* buffer of 256 bytes allocated on the stack */
    2547                 :            :     WCHAR buffer[256 / sizeof(WCHAR)];
    2548                 :            :     size_t buflen = Py_ARRAY_LENGTH(buffer) - 1;
    2549                 :            :     size_t msglen;
    2550                 :            : 
    2551                 :            :     OutputDebugStringW(L"Fatal Python error: ");
    2552                 :            : 
    2553                 :            :     msglen = strlen(msg);
    2554                 :            :     while (msglen) {
    2555                 :            :         size_t i;
    2556                 :            : 
    2557                 :            :         if (buflen > msglen) {
    2558                 :            :             buflen = msglen;
    2559                 :            :         }
    2560                 :            : 
    2561                 :            :         /* Convert the message to wchar_t. This uses a simple one-to-one
    2562                 :            :            conversion, assuming that the this error message actually uses
    2563                 :            :            ASCII only. If this ceases to be true, we will have to convert. */
    2564                 :            :         for (i=0; i < buflen; ++i) {
    2565                 :            :             buffer[i] = msg[i];
    2566                 :            :         }
    2567                 :            :         buffer[i] = L'\0';
    2568                 :            :         OutputDebugStringW(buffer);
    2569                 :            : 
    2570                 :            :         msg += buflen;
    2571                 :            :         msglen -= buflen;
    2572                 :            :     }
    2573                 :            :     OutputDebugStringW(L"\n");
    2574                 :            : }
    2575                 :            : #endif
    2576                 :            : 
    2577                 :            : 
    2578                 :            : static void
    2579                 :          6 : fatal_error_dump_runtime(int fd, _PyRuntimeState *runtime)
    2580                 :            : {
    2581                 :          6 :     PUTS(fd, "Python runtime state: ");
    2582                 :          6 :     PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime);
    2583         [ -  + ]:          6 :     if (finalizing) {
    2584                 :          0 :         PUTS(fd, "finalizing (tstate=0x");
    2585                 :          0 :         _Py_DumpHexadecimal(fd, (uintptr_t)finalizing, sizeof(finalizing) * 2);
    2586                 :          0 :         PUTS(fd, ")");
    2587                 :            :     }
    2588         [ -  + ]:          6 :     else if (runtime->initialized) {
    2589                 :          0 :         PUTS(fd, "initialized");
    2590                 :            :     }
    2591         [ +  + ]:          6 :     else if (runtime->core_initialized) {
    2592                 :          2 :         PUTS(fd, "core initialized");
    2593                 :            :     }
    2594         [ +  + ]:          4 :     else if (runtime->preinitialized) {
    2595                 :          3 :         PUTS(fd, "preinitialized");
    2596                 :            :     }
    2597         [ +  - ]:          1 :     else if (runtime->preinitializing) {
    2598                 :          1 :         PUTS(fd, "preinitializing");
    2599                 :            :     }
    2600                 :            :     else {
    2601                 :          0 :         PUTS(fd, "unknown");
    2602                 :            :     }
    2603                 :          6 :     PUTS(fd, "\n");
    2604                 :          6 : }
    2605                 :            : 
    2606                 :            : 
    2607                 :            : static inline void _Py_NO_RETURN
    2608                 :          6 : fatal_error_exit(int status)
    2609                 :            : {
    2610         [ -  + ]:          6 :     if (status < 0) {
    2611                 :            : #if defined(MS_WINDOWS) && defined(_DEBUG)
    2612                 :            :         DebugBreak();
    2613                 :            : #endif
    2614                 :          0 :         abort();
    2615                 :            :     }
    2616                 :            :     else {
    2617                 :          6 :         exit(status);
    2618                 :            :     }
    2619                 :            : }
    2620                 :            : 
    2621                 :            : 
    2622                 :            : // Dump the list of extension modules of sys.modules, excluding stdlib modules
    2623                 :            : // (sys.stdlib_module_names), into fd file descriptor.
    2624                 :            : //
    2625                 :            : // This function is called by a signal handler in faulthandler: avoid memory
    2626                 :            : // allocations and keep the implementation simple. For example, the list is not
    2627                 :            : // sorted on purpose.
    2628                 :            : void
    2629                 :          6 : _Py_DumpExtensionModules(int fd, PyInterpreterState *interp)
    2630                 :            : {
    2631         [ +  + ]:          6 :     if (interp == NULL) {
    2632                 :          4 :         return;
    2633                 :            :     }
    2634                 :          2 :     PyObject *modules = interp->modules;
    2635   [ +  -  -  + ]:          2 :     if (modules == NULL || !PyDict_Check(modules)) {
    2636                 :          0 :         return;
    2637                 :            :     }
    2638                 :            : 
    2639                 :            :     Py_ssize_t pos;
    2640                 :            :     PyObject *key, *value;
    2641                 :            : 
    2642                 :            :     // Avoid PyDict_GetItemString() which calls PyUnicode_FromString(),
    2643                 :            :     // memory cannot be allocated on the heap in a signal handler.
    2644                 :            :     // Iterate on the dict instead.
    2645                 :          2 :     PyObject *stdlib_module_names = NULL;
    2646         [ +  - ]:          2 :     if (interp->sysdict != NULL) {
    2647                 :          2 :         pos = 0;
    2648         [ +  - ]:        130 :         while (PyDict_Next(interp->sysdict, &pos, &key, &value)) {
    2649         [ -  + ]:        128 :             if (PyUnicode_Check(key)
    2650         [ +  + ]:        128 :                && PyUnicode_CompareWithASCIIString(key, "stdlib_module_names") == 0) {
    2651                 :          2 :                 stdlib_module_names = value;
    2652                 :          2 :                 break;
    2653                 :            :             }
    2654                 :            :         }
    2655                 :            :     }
    2656                 :            :     // If we failed to get sys.stdlib_module_names or it's not a frozenset,
    2657                 :            :     // don't exclude stdlib modules.
    2658   [ +  -  -  +  :          2 :     if (stdlib_module_names != NULL && !PyFrozenSet_Check(stdlib_module_names)) {
                   -  - ]
    2659                 :          0 :         stdlib_module_names = NULL;
    2660                 :            :     }
    2661                 :            : 
    2662                 :            :     // List extensions
    2663                 :          2 :     int header = 1;
    2664                 :          2 :     Py_ssize_t count = 0;
    2665                 :          2 :     pos = 0;
    2666         [ +  + ]:         42 :     while (PyDict_Next(modules, &pos, &key, &value)) {
    2667         [ -  + ]:         40 :         if (!PyUnicode_Check(key)) {
    2668                 :          0 :             continue;
    2669                 :            :         }
    2670         [ +  + ]:         40 :         if (!_PyModule_IsExtension(value)) {
    2671                 :         14 :             continue;
    2672                 :            :         }
    2673                 :            :         // Use the module name from the sys.modules key,
    2674                 :            :         // don't attempt to get the module object name.
    2675         [ +  - ]:         26 :         if (stdlib_module_names != NULL) {
    2676                 :         26 :             int is_stdlib_ext = 0;
    2677                 :            : 
    2678                 :         26 :             Py_ssize_t i = 0;
    2679                 :            :             PyObject *item;
    2680                 :            :             Py_hash_t hash;
    2681         [ +  - ]:       3547 :             while (_PySet_NextEntry(stdlib_module_names, &i, &item, &hash)) {
    2682         [ -  + ]:       3521 :                 if (PyUnicode_Check(item)
    2683         [ +  + ]:       3521 :                     && PyUnicode_Compare(key, item) == 0)
    2684                 :            :                 {
    2685                 :         26 :                     is_stdlib_ext = 1;
    2686                 :         26 :                     break;
    2687                 :            :                 }
    2688                 :            :             }
    2689         [ +  - ]:         26 :             if (is_stdlib_ext) {
    2690                 :            :                 // Ignore stdlib extension
    2691                 :         26 :                 continue;
    2692                 :            :             }
    2693                 :            :         }
    2694                 :            : 
    2695         [ #  # ]:          0 :         if (header) {
    2696                 :          0 :             PUTS(fd, "\nExtension modules: ");
    2697                 :          0 :             header = 0;
    2698                 :            :         }
    2699                 :            :         else {
    2700                 :          0 :             PUTS(fd, ", ");
    2701                 :            :         }
    2702                 :            : 
    2703                 :          0 :         _Py_DumpASCII(fd, key);
    2704                 :          0 :         count++;
    2705                 :            :     }
    2706                 :            : 
    2707         [ -  + ]:          2 :     if (count) {
    2708                 :          0 :         PUTS(fd, " (total: ");
    2709                 :          0 :         _Py_DumpDecimal(fd, count);
    2710                 :          0 :         PUTS(fd, ")");
    2711                 :          0 :         PUTS(fd, "\n");
    2712                 :            :     }
    2713                 :            : }
    2714                 :            : 
    2715                 :            : 
    2716                 :            : static void _Py_NO_RETURN
    2717                 :          6 : fatal_error(int fd, int header, const char *prefix, const char *msg,
    2718                 :            :             int status)
    2719                 :            : {
    2720                 :            :     static int reentrant = 0;
    2721                 :            : 
    2722         [ -  + ]:          6 :     if (reentrant) {
    2723                 :            :         /* Py_FatalError() caused a second fatal error.
    2724                 :            :            Example: flush_std_files() raises a recursion error. */
    2725                 :          0 :         fatal_error_exit(status);
    2726                 :            :     }
    2727                 :          6 :     reentrant = 1;
    2728                 :            : 
    2729         [ +  - ]:          6 :     if (header) {
    2730                 :          6 :         PUTS(fd, "Fatal Python error: ");
    2731         [ +  + ]:          6 :         if (prefix) {
    2732                 :          5 :             PUTS(fd, prefix);
    2733                 :          5 :             PUTS(fd, ": ");
    2734                 :            :         }
    2735         [ +  - ]:          6 :         if (msg) {
    2736                 :          6 :             PUTS(fd, msg);
    2737                 :            :         }
    2738                 :            :         else {
    2739                 :          0 :             PUTS(fd, "<message not set>");
    2740                 :            :         }
    2741                 :          6 :         PUTS(fd, "\n");
    2742                 :            :     }
    2743                 :            : 
    2744                 :          6 :     _PyRuntimeState *runtime = &_PyRuntime;
    2745                 :          6 :     fatal_error_dump_runtime(fd, runtime);
    2746                 :            : 
    2747                 :            :     /* Check if the current thread has a Python thread state
    2748                 :            :        and holds the GIL.
    2749                 :            : 
    2750                 :            :        tss_tstate is NULL if Py_FatalError() is called from a C thread which
    2751                 :            :        has no Python thread state.
    2752                 :            : 
    2753                 :            :        tss_tstate != tstate if the current Python thread does not hold the GIL.
    2754                 :            :        */
    2755                 :          6 :     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
    2756                 :          6 :     PyInterpreterState *interp = NULL;
    2757                 :          6 :     PyThreadState *tss_tstate = PyGILState_GetThisThreadState();
    2758         [ +  + ]:          6 :     if (tstate != NULL) {
    2759                 :          2 :         interp = tstate->interp;
    2760                 :            :     }
    2761         [ -  + ]:          4 :     else if (tss_tstate != NULL) {
    2762                 :          0 :         interp = tss_tstate->interp;
    2763                 :            :     }
    2764   [ +  +  +  - ]:          6 :     int has_tstate_and_gil = (tss_tstate != NULL && tss_tstate == tstate);
    2765                 :            : 
    2766         [ +  + ]:          6 :     if (has_tstate_and_gil) {
    2767                 :            :         /* If an exception is set, print the exception with its traceback */
    2768                 :            :         if (!_Py_FatalError_PrintExc(tss_tstate)) {
    2769                 :            :             /* No exception is set, or an exception is set without traceback */
    2770                 :            :             _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate);
    2771                 :            :         }
    2772                 :            :     }
    2773                 :            :     else {
    2774                 :            :         _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate);
    2775                 :            :     }
    2776                 :            : 
    2777                 :          6 :     _Py_DumpExtensionModules(fd, interp);
    2778                 :            : 
    2779                 :            :     /* The main purpose of faulthandler is to display the traceback.
    2780                 :            :        This function already did its best to display a traceback.
    2781                 :            :        Disable faulthandler to prevent writing a second traceback
    2782                 :            :        on abort(). */
    2783                 :          6 :     _PyFaulthandler_Fini();
    2784                 :            : 
    2785                 :            :     /* Check if the current Python thread hold the GIL */
    2786         [ +  + ]:          6 :     if (has_tstate_and_gil) {
    2787                 :            :         /* Flush sys.stdout and sys.stderr */
    2788                 :          2 :         flush_std_files();
    2789                 :            :     }
    2790                 :            : 
    2791                 :            : #ifdef MS_WINDOWS
    2792                 :            :     fatal_output_debug(msg);
    2793                 :            : #endif /* MS_WINDOWS */
    2794                 :            : 
    2795                 :          6 :     fatal_error_exit(status);
    2796                 :            : }
    2797                 :            : 
    2798                 :            : 
    2799                 :            : #undef Py_FatalError
    2800                 :            : 
    2801                 :            : void _Py_NO_RETURN
    2802                 :            : Py_FatalError(const char *msg)
    2803                 :            : {
    2804                 :          0 :     fatal_error(fileno(stderr), 1, NULL, msg, -1);
    2805                 :            : }
    2806                 :            : 
    2807                 :            : 
    2808                 :            : void _Py_NO_RETURN
    2809                 :            : _Py_FatalErrorFunc(const char *func, const char *msg)
    2810                 :            : {
    2811                 :          0 :     fatal_error(fileno(stderr), 1, func, msg, -1);
    2812                 :            : }
    2813                 :            : 
    2814                 :            : 
    2815                 :            : void _Py_NO_RETURN
    2816                 :            : _Py_FatalErrorFormat(const char *func, const char *format, ...)
    2817                 :            : {
    2818                 :            :     static int reentrant = 0;
    2819         [ #  # ]:          0 :     if (reentrant) {
    2820                 :            :         /* _Py_FatalErrorFormat() caused a second fatal error */
    2821                 :          0 :         fatal_error_exit(-1);
    2822                 :            :     }
    2823                 :          0 :     reentrant = 1;
    2824                 :            : 
    2825                 :          0 :     FILE *stream = stderr;
    2826                 :          0 :     const int fd = fileno(stream);
    2827                 :          0 :     PUTS(fd, "Fatal Python error: ");
    2828         [ #  # ]:          0 :     if (func) {
    2829                 :          0 :         PUTS(fd, func);
    2830                 :          0 :         PUTS(fd, ": ");
    2831                 :            :     }
    2832                 :            : 
    2833                 :            :     va_list vargs;
    2834                 :          0 :     va_start(vargs, format);
    2835                 :          0 :     vfprintf(stream, format, vargs);
    2836                 :          0 :     va_end(vargs);
    2837                 :            : 
    2838                 :          0 :     fputs("\n", stream);
    2839                 :          0 :     fflush(stream);
    2840                 :            : 
    2841                 :          0 :     fatal_error(fd, 0, NULL, NULL, -1);
    2842                 :            : }
    2843                 :            : 
    2844                 :            : 
    2845                 :            : void _Py_NO_RETURN
    2846                 :          0 : _Py_FatalRefcountErrorFunc(const char *func, const char *msg)
    2847                 :            : {
    2848                 :            :     _Py_FatalErrorFormat(func,
    2849                 :            :                          "%s: bug likely caused by a refcount error "
    2850                 :            :                          "in a C extension",
    2851                 :            :                          msg);
    2852                 :            : }
    2853                 :            : 
    2854                 :            : 
    2855                 :            : void _Py_NO_RETURN
    2856                 :          6 : Py_ExitStatusException(PyStatus status)
    2857                 :            : {
    2858         [ -  + ]:          6 :     if (_PyStatus_IS_EXIT(status)) {
    2859                 :          0 :         exit(status.exitcode);
    2860                 :            :     }
    2861         [ +  - ]:          6 :     else if (_PyStatus_IS_ERROR(status)) {
    2862                 :          6 :         fatal_error(fileno(stderr), 1, status.func, status.err_msg, 1);
    2863                 :            :     }
    2864                 :            :     else {
    2865                 :            :         Py_FatalError("Py_ExitStatusException() must not be called on success");
    2866                 :            :     }
    2867                 :            : }
    2868                 :            : 
    2869                 :            : 
    2870                 :            : /* Wait until threading._shutdown completes, provided
    2871                 :            :    the threading module was imported in the first place.
    2872                 :            :    The shutdown routine will wait until all non-daemon
    2873                 :            :    "threading" threads have completed. */
    2874                 :            : static void
    2875                 :       3125 : wait_for_thread_shutdown(PyThreadState *tstate)
    2876                 :            : {
    2877                 :            :     PyObject *result;
    2878                 :       3125 :     PyObject *threading = PyImport_GetModule(&_Py_ID(threading));
    2879         [ +  + ]:       3125 :     if (threading == NULL) {
    2880         [ -  + ]:       1829 :         if (_PyErr_Occurred(tstate)) {
    2881                 :          0 :             PyErr_WriteUnraisable(NULL);
    2882                 :            :         }
    2883                 :            :         /* else: threading not imported */
    2884                 :       1829 :         return;
    2885                 :            :     }
    2886                 :       1296 :     result = PyObject_CallMethodNoArgs(threading, &_Py_ID(_shutdown));
    2887         [ +  + ]:       1296 :     if (result == NULL) {
    2888                 :          1 :         PyErr_WriteUnraisable(threading);
    2889                 :            :     }
    2890                 :            :     else {
    2891                 :       1295 :         Py_DECREF(result);
    2892                 :            :     }
    2893                 :       1296 :     Py_DECREF(threading);
    2894                 :            : }
    2895                 :            : 
    2896                 :            : #define NEXITFUNCS 32
    2897                 :          0 : int Py_AtExit(void (*func)(void))
    2898                 :            : {
    2899         [ #  # ]:          0 :     if (_PyRuntime.nexitfuncs >= NEXITFUNCS)
    2900                 :          0 :         return -1;
    2901                 :          0 :     _PyRuntime.exitfuncs[_PyRuntime.nexitfuncs++] = func;
    2902                 :          0 :     return 0;
    2903                 :            : }
    2904                 :            : 
    2905                 :            : static void
    2906                 :       2957 : call_ll_exitfuncs(_PyRuntimeState *runtime)
    2907                 :            : {
    2908         [ -  + ]:       2957 :     while (runtime->nexitfuncs > 0) {
    2909                 :            :         /* pop last function from the list */
    2910                 :          0 :         runtime->nexitfuncs--;
    2911                 :          0 :         void (*exitfunc)(void) = runtime->exitfuncs[runtime->nexitfuncs];
    2912                 :          0 :         runtime->exitfuncs[runtime->nexitfuncs] = NULL;
    2913                 :            : 
    2914                 :          0 :         exitfunc();
    2915                 :            :     }
    2916                 :            : 
    2917                 :       2957 :     fflush(stdout);
    2918                 :       2957 :     fflush(stderr);
    2919                 :       2957 : }
    2920                 :            : 
    2921                 :            : void _Py_NO_RETURN
    2922                 :        742 : Py_Exit(int sts)
    2923                 :            : {
    2924         [ -  + ]:        742 :     if (Py_FinalizeEx() < 0) {
    2925                 :          0 :         sts = 120;
    2926                 :            :     }
    2927                 :            : 
    2928                 :        742 :     exit(sts);
    2929                 :            : }
    2930                 :            : 
    2931                 :            : 
    2932                 :            : /*
    2933                 :            :  * The file descriptor fd is considered ``interactive'' if either
    2934                 :            :  *   a) isatty(fd) is TRUE, or
    2935                 :            :  *   b) the -i flag was given, and the filename associated with
    2936                 :            :  *      the descriptor is NULL or "<stdin>" or "???".
    2937                 :            :  */
    2938                 :            : int
    2939                 :          0 : Py_FdIsInteractive(FILE *fp, const char *filename)
    2940                 :            : {
    2941         [ #  # ]:          0 :     if (isatty(fileno(fp))) {
    2942                 :          0 :         return 1;
    2943                 :            :     }
    2944         [ #  # ]:          0 :     if (!_Py_GetConfig()->interactive) {
    2945                 :          0 :         return 0;
    2946                 :            :     }
    2947                 :            :     return ((filename == NULL)
    2948         [ #  # ]:          0 :             || (strcmp(filename, "<stdin>") == 0)
    2949   [ #  #  #  # ]:          0 :             || (strcmp(filename, "???") == 0));
    2950                 :            : }
    2951                 :            : 
    2952                 :            : 
    2953                 :            : int
    2954                 :        363 : _Py_FdIsInteractive(FILE *fp, PyObject *filename)
    2955                 :            : {
    2956         [ -  + ]:        363 :     if (isatty(fileno(fp))) {
    2957                 :          0 :         return 1;
    2958                 :            :     }
    2959         [ +  + ]:        363 :     if (!_Py_GetConfig()->interactive) {
    2960                 :        351 :         return 0;
    2961                 :            :     }
    2962                 :            :     return ((filename == NULL)
    2963         [ -  + ]:         12 :             || (PyUnicode_CompareWithASCIIString(filename, "<stdin>") == 0)
    2964   [ +  -  -  - ]:         24 :             || (PyUnicode_CompareWithASCIIString(filename, "???") == 0));
    2965                 :            : }
    2966                 :            : 
    2967                 :            : 
    2968                 :            : /* Wrappers around sigaction() or signal(). */
    2969                 :            : 
    2970                 :            : PyOS_sighandler_t
    2971                 :     188032 : PyOS_getsig(int sig)
    2972                 :            : {
    2973                 :            : #ifdef HAVE_SIGACTION
    2974                 :            :     struct sigaction context;
    2975         [ +  + ]:     188032 :     if (sigaction(sig, NULL, &context) == -1)
    2976                 :       5876 :         return SIG_ERR;
    2977                 :     182156 :     return context.sa_handler;
    2978                 :            : #else
    2979                 :            :     PyOS_sighandler_t handler;
    2980                 :            : /* Special signal handling for the secure CRT in Visual Studio 2005 */
    2981                 :            : #if defined(_MSC_VER) && _MSC_VER >= 1400
    2982                 :            :     switch (sig) {
    2983                 :            :     /* Only these signals are valid */
    2984                 :            :     case SIGINT:
    2985                 :            :     case SIGILL:
    2986                 :            :     case SIGFPE:
    2987                 :            :     case SIGSEGV:
    2988                 :            :     case SIGTERM:
    2989                 :            :     case SIGBREAK:
    2990                 :            :     case SIGABRT:
    2991                 :            :         break;
    2992                 :            :     /* Don't call signal() with other values or it will assert */
    2993                 :            :     default:
    2994                 :            :         return SIG_ERR;
    2995                 :            :     }
    2996                 :            : #endif /* _MSC_VER && _MSC_VER >= 1400 */
    2997                 :            :     handler = signal(sig, SIG_IGN);
    2998                 :            :     if (handler != SIG_ERR)
    2999                 :            :         signal(sig, handler);
    3000                 :            :     return handler;
    3001                 :            : #endif
    3002                 :            : }
    3003                 :            : 
    3004                 :            : /*
    3005                 :            :  * All of the code in this function must only use async-signal-safe functions,
    3006                 :            :  * listed at `man 7 signal` or
    3007                 :            :  * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
    3008                 :            :  */
    3009                 :            : PyOS_sighandler_t
    3010                 :      68933 : PyOS_setsig(int sig, PyOS_sighandler_t handler)
    3011                 :            : {
    3012                 :            : #ifdef HAVE_SIGACTION
    3013                 :            :     /* Some code in Modules/signalmodule.c depends on sigaction() being
    3014                 :            :      * used here if HAVE_SIGACTION is defined.  Fix that if this code
    3015                 :            :      * changes to invalidate that assumption.
    3016                 :            :      */
    3017                 :            :     struct sigaction context, ocontext;
    3018                 :      68933 :     context.sa_handler = handler;
    3019                 :      68933 :     sigemptyset(&context.sa_mask);
    3020                 :            :     /* Using SA_ONSTACK is friendlier to other C/C++/Golang-VM code that
    3021                 :            :      * extension module or embedding code may use where tiny thread stacks
    3022                 :            :      * are used.  https://bugs.python.org/issue43390 */
    3023                 :      68933 :     context.sa_flags = SA_ONSTACK;
    3024         [ +  + ]:      68933 :     if (sigaction(sig, &context, &ocontext) == -1)
    3025                 :          3 :         return SIG_ERR;
    3026                 :      68930 :     return ocontext.sa_handler;
    3027                 :            : #else
    3028                 :            :     PyOS_sighandler_t oldhandler;
    3029                 :            :     oldhandler = signal(sig, handler);
    3030                 :            : #ifdef HAVE_SIGINTERRUPT
    3031                 :            :     siginterrupt(sig, 1);
    3032                 :            : #endif
    3033                 :            :     return oldhandler;
    3034                 :            : #endif
    3035                 :            : }
    3036                 :            : 
    3037                 :            : #ifdef __cplusplus
    3038                 :            : }
    3039                 :            : #endif

Generated by: LCOV version 1.14