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 : :