LCOV - code coverage report
Current view: | top level - Programs - _bootstrap_python.c (source / functions) |  |  | Hit | Total | Coverage
Test: | CPython 3.12 LCOV report [commit 5e6661bce9] |  | Lines: | 22 | 31 | 71.0 %
Date: | 2023-03-20 08:15:36 |  | Functions: | 3 | 3 | 100.0 %
|  |  | Branches: | 3 | 8 | 37.5 %

               Branch data     Line data    Source code
           1                 :            :
           2                 :            : /* Frozen modules bootstrap
           3                 :            :  *
           4                 :            :  * Limited and restricted Python interpreter to run
           5                 :            :  * "Tools/build/deepfreeze.py" on systems with no or older Python
           6                 :            :  * interpreter.
           7                 :            :  */
           8                 :            :
           9                 :            : #include "Python.h"
          10                 :            : #include "pycore_import.h"
          11                 :            :
          12                 :            : /* Includes for frozen modules: */
          13                 :            : #include "Python/frozen_modules/importlib._bootstrap.h"
          14                 :            : #include "Python/frozen_modules/importlib._bootstrap_external.h"
          15                 :            : #include "Python/frozen_modules/zipimport.h"
          16                 :            : /* End includes */
          17                 :            :
          18                 :            : uint32_t _Py_next_func_version = 1;
          19                 :            :
          20                 :            : /* Empty initializer for deepfrozen modules */
          21                 :         21 : int _Py_Deepfreeze_Init(void)
          22                 :            : {
          23                 :         21 :     return 0;
          24                 :            : }
          25                 :            : /* Empty finalizer for deepfrozen modules */
          26                 :            : void
          27                 :         21 : _Py_Deepfreeze_Fini(void)
          28                 :            : {
          29                 :         21 : }
          30                 :            :
          31                 :            : /* Note that a negative size indicates a package. */
          32                 :            :
          33                 :            : static const struct _frozen bootstrap_modules[] = {
          34                 :            :     {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap)},
          35                 :            :     {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external)},
          36                 :            :     {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport)},
          37                 :            :     {0, 0, 0} /* bootstrap sentinel */
          38                 :            : };
          39                 :            : static const struct _frozen stdlib_modules[] = {
          40                 :            :     {0, 0, 0} /* stdlib sentinel */
          41                 :            : };
          42                 :            : static const struct _frozen test_modules[] = {
          43                 :            :     {0, 0, 0} /* test sentinel */
          44                 :            : };
          45                 :            : const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules;
          46                 :            : const struct _frozen *_PyImport_FrozenStdlib = stdlib_modules;
          47                 :            : const struct _frozen *_PyImport_FrozenTest = test_modules;
          48                 :            :
          49                 :            : static const struct _module_alias aliases[] = {
          50                 :            :     {"_frozen_importlib", "importlib._bootstrap"},
          51                 :            :     {"_frozen_importlib_external", "importlib._bootstrap_external"},
          52                 :            :     {0, 0} /* aliases sentinel */
          53                 :            : };
          54                 :            : const struct _module_alias *_PyImport_FrozenAliases = aliases;
          55                 :            :
          56                 :            : /* Embedding apps may change this pointer to point to their favorite
          57                 :            :    collection of frozen modules: */
          58                 :            :
          59                 :            : const struct _frozen *PyImport_FrozenModules = NULL;
          60                 :            :
          61                 :            : int
          62                 :            : #ifdef MS_WINDOWS
          63                 :            : wmain(int argc, wchar_t **argv)
          64                 :            : #else
          65                 :         21 : main(int argc, char **argv)
          66                 :            : #endif
          67                 :            : {
          68                 :            :     PyStatus status;
          69                 :            :
          70                 :            :     PyConfig config;
          71                 :         21 :     PyConfig_InitIsolatedConfig(&config);
          72                 :            :     // don't warn, pybuilddir.txt does not exist yet
          73                 :         21 :     config.pathconfig_warnings = 0;
          74                 :            :     // parse arguments
          75                 :         21 :     config.parse_argv = 1;
          76                 :            :     // add current script dir to sys.path
          77                 :         21 :     config.isolated = 0;
          78                 :         21 :     config.safe_path = 0;
          79                 :            :
          80                 :            : #ifdef MS_WINDOWS
          81                 :            :     status = PyConfig_SetArgv(&config, argc, argv);
          82                 :            : #else
          83                 :         21 :     status = PyConfig_SetBytesArgv(&config, argc, argv);
          84                 :            : #endif
          85         [ -  + ]:         21 :     if (PyStatus_Exception(status)) {
          86                 :          0 :         goto error;
          87                 :            :     }
          88                 :            :
          89                 :         21 :     status = PyConfig_Read(&config);
          90         [ -  + ]:         21 :     if (config.run_filename == NULL) {
          91                 :          0 :         status = PyStatus_Error("Run filename expected");
          92                 :          0 :         goto error;
          93                 :            :     }
          94                 :            :
          95                 :            : #define CLEAR(ATTR) \
          96                 :            :     do { \
          97                 :            :         PyMem_RawFree(ATTR); \
          98                 :            :         ATTR = NULL; \
          99                 :            :     } while (0)
         100                 :            :
         101                 :            :     // isolate from system Python
         102                 :         21 :     CLEAR(config.base_prefix);
         103                 :         21 :     CLEAR(config.prefix);
         104                 :         21 :     CLEAR(config.base_exec_prefix);
         105                 :         21 :     CLEAR(config.exec_prefix);
         106                 :            :
         107                 :         21 :     status = Py_InitializeFromConfig(&config);
         108         [ -  + ]:         21 :     if (PyStatus_Exception(status)) {
         109                 :          0 :         goto error;
         110                 :            :     }
         111                 :         21 :     PyConfig_Clear(&config);
         112                 :            :
         113                 :         21 :     return Py_RunMain();
         114                 :            :
         115                 :          0 : error:
         116                 :          0 :     PyConfig_Clear(&config);
         117         [ #  # ]:          0 :     if (PyStatus_IsExit(status)) {
         118                 :          0 :         return status.exitcode;
         119                 :            :     }
         120                 :          0 :     Py_ExitStatusException(status);
         121                 :            : }
         122                 :            :

Generated by: LCOV version 1.14