17#include "nuitka/prelude.h"
20#include "nuitka/unfreezing.h"
44#if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
45#define _NUITKA_EXTENSION_MODULE_PRESERVATION_HACK 1
48extern PyTypeObject Nuitka_Loader_Type;
59static inline bool isVerbose(
void) {
return Py_VerboseFlag != 0; }
60#elif _NUITKA_SYSFLAG_VERBOSE
61static inline bool isVerbose(
void) {
return true; }
63static inline bool isVerbose(
void) {
return false; }
68static bool hasFrozenModule(
char const *name) {
69 for (
struct _frozen
const *p = PyImport_FrozenModules; p != NULL; p++) {
70 if (p->name == NULL) {
74 if (strcmp(p->name, name) == 0) {
82static char *appendModuleNameAsPath(
char *buffer,
char const *module_name,
size_t buffer_size) {
84 while (*buffer != 0) {
89 while (*module_name) {
90 if (buffer_size < 1) {
94 if (*module_name ==
'.') {
98 *buffer++ = *module_name++;
109#if defined(_WIN32) && _NUITKA_STANDALONE_MODE
111static void appendModuleNameAsPathW(
wchar_t *buffer, PyObject *module_name,
size_t buffer_size) {
113 wchar_t const *module_name_wstr = Nuitka_UnicodeAsWideString(module_name, &size);
116 wchar_t c = *module_name_wstr++;
120 c = FILENAME_SEP_CHAR;
123 appendWCharSafeW(buffer, c, buffer_size);
131#if _NUITKA_STANDALONE_MODE
132static void patchCodeObjectPaths(PyCodeObject *code_object, PyObject *module_path) {
133 code_object->co_filename = module_path;
134 Py_INCREF(module_path);
136 Py_ssize_t consts_count = PyTuple_GET_SIZE(code_object->co_consts);
138 for (Py_ssize_t i = 0; i < consts_count; i++) {
139 PyObject *constant = PyTuple_GET_ITEM(code_object->co_consts, i);
141 if (PyCode_Check(constant)) {
142 patchCodeObjectPaths((PyCodeObject *)constant, module_path);
148NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_RELATIVE_PATH_FROM_NAME(
char const *name,
bool is_package,
bool dir_only) {
149 char buffer[MAXPATHLEN + 1] = {0};
151 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
153 if (dir_only ==
false) {
155 appendCharSafe(buffer, SEP,
sizeof(buffer));
156 appendStringSafe(buffer,
"__init__.py",
sizeof(buffer));
158 appendStringSafe(buffer,
".py",
sizeof(buffer));
161 if (is_package ==
false) {
162 char *sep = strrchr(buffer, SEP);
172 PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
174 PyObject *result = MAKE_RELATIVE_PATH(module_path_entry_base);
176 Py_DECREF(module_path_entry_base);
181static PyObject *_makeDunderPathObject(PyThreadState *tstate, PyObject *module_path_entry) {
182 CHECK_OBJECT(module_path_entry);
184 PyObject *path_list = MAKE_LIST_EMPTY(tstate, 1);
185 if (unlikely(path_list == NULL)) {
189 PyList_SET_ITEM0(path_list, 0, module_path_entry);
191 CHECK_OBJECT(path_list);
198static PyObject *loadModuleFromCodeObject(PyThreadState *tstate, PyObject *module, PyCodeObject *code_object,
200 assert(code_object != NULL);
202 char const *name = entry->name;
203 bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
206 NUITKA_MAY_BE_UNUSED
bool b_res = Nuitka_SetModuleString(name, module);
207 assert(b_res !=
false);
210 PyObject *module_path_entry = NULL;
211 PyObject *module_path;
213#if defined(_NUITKA_FREEZER_HAS_FILE_PATH)
214 if (entry->file_path != NULL) {
215 module_path = getModuleFileValue(tstate, entry);
217 if (unlikely(module_path == NULL)) {
222 module_path_entry = getModuleDirectory(tstate, entry);
224 if (unlikely(module_path_entry == NULL)) {
225 Py_DECREF(module_path);
233 char buffer[MAXPATHLEN + 1] = {0};
236 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
237 PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
239 module_path_entry = MAKE_RELATIVE_PATH(module_path_entry_base);
240 Py_DECREF(module_path_entry_base);
242 appendCharSafe(buffer, SEP,
sizeof(buffer));
243 appendStringSafe(buffer,
"__init__.py",
sizeof(buffer));
245 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
246 appendStringSafe(buffer,
".py",
sizeof(buffer));
249 PyObject *module_path_name = Nuitka_String_FromString(buffer);
251 module_path = MAKE_RELATIVE_PATH(module_path_name);
252 Py_DECREF(module_path_name);
257 PyObject *path_list = _makeDunderPathObject(tstate, module_path_entry);
259 int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
260 if (unlikely(res != 0)) {
264 Py_DECREF(path_list);
266 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
267 CHECK_OBJECT(module_name);
269 res = PyObject_SetAttr(module, const_str_plain___package__, module_name);
271 if (unlikely(res != 0)) {
276#if _NUITKA_STANDALONE_MODE
277 patchCodeObjectPaths(code_object, module_path);
280 PGO_onModuleEntered(name);
281 module = PyImport_ExecCodeModuleEx((char *)name, (PyObject *)code_object, Nuitka_String_AsString(module_path));
282 PGO_onModuleExit(name, module == NULL);
284 Py_DECREF(module_path);
293 while (current->name != NULL) {
294 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
295 current->name = UN_TRANSLATE_NAME(current->name);
296 current->flags -= NUITKA_TRANSLATED_FLAG;
299 if (strcmp(name, current->name) == 0) {
309#if !_NUITKA_STANDALONE_MODE
314 char const *package_name_end = strrchr(name,
'.');
315 if (package_name_end == NULL) {
319 size_t length = package_name_end - name;
321 while (current->name != NULL) {
322 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
323 current->name = UN_TRANSLATE_NAME(current->name);
324 current->flags -= NUITKA_TRANSLATED_FLAG;
327 if ((current->flags & NUITKA_PACKAGE_FLAG) != 0) {
328 if (strlen(current->name) == length && strncmp(name, current->name, length) == 0) {
339static PyObject *_getFileList(PyThreadState *tstate, PyObject *dirname) {
340 static PyObject *listdir_func = NULL;
344 if (listdir_func == NULL) {
345 listdir_func = PyObject_GetAttrString(IMPORT_HARD_OS(),
"listdir");
348 if (unlikely(listdir_func == NULL)) {
352 PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, listdir_func, dirname);
357#if PYTHON_VERSION < 0x300
358static PyObject *_getImportingSuffixesByPriority(PyThreadState *tstate,
int kind) {
359 static PyObject *result = NULL;
361 if (result == NULL) {
362 result = MAKE_LIST_EMPTY(tstate, 0);
364 PyObject *imp_module = PyImport_ImportModule(
"imp");
365 PyObject *get_suffixes_func = PyObject_GetAttrString(imp_module,
"get_suffixes");
367 PyObject *suffix_list = CALL_FUNCTION_NO_ARGS(tstate, get_suffixes_func);
369 for (
int i = 0; i < PyList_GET_SIZE(suffix_list); i++) {
370 PyObject *module_kind = PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 2);
372 if (PyInt_AsLong(module_kind) == kind) {
373 LIST_APPEND0(result, PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 0));
377 Py_DECREF(suffix_list);
384static PyObject *getExtensionModuleSuffixesByPriority(PyThreadState *tstate) {
385 static PyObject *result = NULL;
387 if (result == NULL) {
388#if PYTHON_VERSION < 0x300
389 result = _getImportingSuffixesByPriority(tstate, 3);
391 static PyObject *machinery_module = NULL;
393 if (machinery_module == NULL) {
394 machinery_module = PyImport_ImportModule(
"importlib.machinery");
397 result = PyObject_GetAttrString(machinery_module,
"EXTENSION_SUFFIXES");
401 CHECK_OBJECT(result);
405static PyObject *installed_extension_modules = NULL;
407static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name,
char const *parent_module_name) {
408 PyObject *sys_modules = Nuitka_GetSysModules();
410 PyObject *parent_module = PyDict_GetItemString(sys_modules, parent_module_name);
411 CHECK_OBJECT(parent_module);
413 PyObject *parent_path = PyObject_GetAttr(parent_module, const_str_plain___path__);
416 if (parent_path == NULL || !PyList_Check(parent_path)) {
420 PyObject *candidates = MAKE_LIST_EMPTY(tstate, 0);
423 char const *module_relative_name_str = Nuitka_String_AsString(module_name) + strlen(parent_module_name) + 1;
425 Py_ssize_t parent_path_size = PyList_GET_SIZE(parent_path);
427 for (Py_ssize_t i = 0; i < parent_path_size; i += 1) {
428 PyObject *path_element = PyList_GET_ITEM(parent_path, i);
430 PyObject *filenames_list = _getFileList(tstate, path_element);
432 if (filenames_list == NULL) {
433 CLEAR_ERROR_OCCURRED(tstate);
437 Py_ssize_t filenames_list_size = PyList_GET_SIZE(filenames_list);
439 for (Py_ssize_t j = 0; j < filenames_list_size; j += 1) {
440 PyObject *filename = PyList_GET_ITEM(filenames_list, j);
442 if (Nuitka_String_CheckExact(filename)) {
443 char const *filename_str = Nuitka_String_AsString(filename);
445 if (strncmp(filename_str, module_relative_name_str, strlen(module_relative_name_str)) == 0 &&
446 filename_str[strlen(module_relative_name_str)] ==
'.') {
447 LIST_APPEND1(candidates, MAKE_TUPLE2(tstate, path_element, filename));
454 PRINT_STRING(
"CANDIDATES:");
455 PRINT_STRING(Nuitka_String_AsString(module_name));
456 PRINT_STRING(module_relative_name_str);
457 PRINT_ITEM(candidates);
462 PyObject *suffix_list = getExtensionModuleSuffixesByPriority(tstate);
466 for (Py_ssize_t i = 0; i < PyList_GET_SIZE(suffix_list); i += 1) {
467 PyObject *suffix = PyList_GET_ITEM(suffix_list, i);
469 char const *suffix_str = Nuitka_String_AsString(suffix);
471 for (Py_ssize_t j = 0; j < PyList_GET_SIZE(candidates); j += 1) {
472 PyObject *entry = PyList_GET_ITEM(candidates, j);
474 PyObject *directory = PyTuple_GET_ITEM(entry, 0);
475 PyObject *candidate = PyTuple_GET_ITEM(entry, 1);
477 char const *candidate_str = Nuitka_String_AsString(candidate);
479 if (strcmp(suffix_str, candidate_str + strlen(module_relative_name_str)) == 0) {
480 PyObject *fullpath = JOIN_PATH2(directory, candidate);
482 if (installed_extension_modules == NULL) {
483 installed_extension_modules = MAKE_DICT_EMPTY(tstate);
488#if PYTHON_VERSION < 0x300 && defined(_WIN32)
489 PyObject *tmp = PyUnicode_FromObject(fullpath);
494 DICT_SET_ITEM(installed_extension_modules, module_name, fullpath);
502 Py_DECREF(candidates);
507static PyObject *callIntoExtensionModule(PyThreadState *tstate,
char const *full_name,
const filename_char_t *filename,
510static PyObject *callIntoInstalledExtensionModule(PyThreadState *tstate, PyObject *module_name,
511 PyObject *extension_module_filename) {
515 assert(PyUnicode_CheckExact(extension_module_filename));
517 wchar_t const *extension_module_filename_str = Nuitka_UnicodeAsWideString(extension_module_filename, NULL);
519 char const *extension_module_filename_str = Nuitka_String_AsString(extension_module_filename);
524 return callIntoExtensionModule(tstate, Nuitka_String_AsString(module_name), extension_module_filename_str,
false);
530 char const *mode =
"compiled";
532 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
534 }
else if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
541static char *_kw_list_find_module[] = {(
char *)
"fullname", (
char *)
"unused", NULL};
543static PyObject *_nuitka_loader_find_module(PyObject *self, PyObject *args, PyObject *kwds) {
544 PyObject *module_name;
547 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:find_module", (
char **)_kw_list_find_module, &module_name,
550 if (unlikely(res == 0)) {
554 char const *name = Nuitka_String_AsString(module_name);
557 PySys_WriteStderr(
"import %s # considering responsibility (find_module)\n", name);
564 PySys_WriteStderr(
"import %s # claimed responsibility (%s)\n", name, getEntryModeString(entry));
567 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
569 Py_INCREF(metapath_based_loader);
570 return metapath_based_loader;
573 if (hasFrozenModule(name)) {
575 PySys_WriteStderr(
"import %s # claimed responsibility (frozen)\n", name);
578 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
580 Py_INCREF(metapath_based_loader);
581 return metapath_based_loader;
584#if !_NUITKA_STANDALONE_MODE
585 entry = findContainingPackageEntry(name);
588 PyThreadState *tstate = PyThreadState_GET();
590 bool result = scanModuleInPackagePath(tstate, module_name, entry->name);
593 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
595 Py_INCREF(metapath_based_loader);
596 return metapath_based_loader;
602 PySys_WriteStderr(
"import %s # denied responsibility\n", name);
605 Py_INCREF_IMMORTAL(Py_None);
609static char const *_kw_list_get_data[] = {
"filename", NULL};
611static PyObject *_nuitka_loader_get_data(PyObject *self, PyObject *args, PyObject *kwds) {
614 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:get_data", (
char **)_kw_list_get_data, &filename);
616 if (unlikely(res == 0)) {
620 PyThreadState *tstate = PyThreadState_GET();
622 return GET_FILE_BYTES(tstate, filename);
625static void setModuleFileValue(PyThreadState *tstate, PyObject *module, filename_char_t
const *filename) {
626 CHECK_OBJECT(module);
627 assert(filename != NULL);
629 assert(PyModule_Check(module));
631 PyObject *dict = PyModule_GetDict(module);
634 PyObject *new_file_value = Nuitka_String_FromFilename(filename);
635 DICT_SET_ITEM(dict, const_str_plain___file__, new_file_value);
636 Py_DECREF(new_file_value);
639#if PYTHON_VERSION < 0x300
640typedef void (*entrypoint_t)(void);
642typedef PyObject *(*entrypoint_t)(void);
650#if PYTHON_VERSION >= 0x350
651static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin,
bool is_package);
654static void _fillExtensionModuleDllEntryFunctionName(PyThreadState *tstate,
char *buffer,
size_t buffer_size,
657#if PYTHON_VERSION >= 0x350
658 PyObject *name_bytes_obj = PyBytes_FromString(name);
659 PyObject *name_obj = BYTES_DECODE2(tstate, name_bytes_obj, Nuitka_String_FromString(
"utf8"));
660 Py_DECREF(name_bytes_obj);
662 PyObject *name_ascii = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_ascii);
664 if (name_ascii == NULL) {
665 DROP_ERROR_OCCURRED(tstate);
667 PyObject *name_punycode = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_punycode);
669 CHECK_OBJECT(name_punycode);
671 snprintf(buffer, buffer_size,
"PyInitU_%s", Nuitka_Bytes_AsString(name_punycode));
673 Py_DECREF(name_punycode);
675 Py_DECREF(name_ascii);
677 snprintf(buffer, buffer_size,
"PyInit_%s", name);
682 snprintf(buffer, buffer_size,
683#
if PYTHON_VERSION < 0x300
692#if _NUITKA_STANDALONE_MODE
695static void _makeModuleCFilenameValue(filename_char_t *filename,
size_t filename_size,
char const *module_name_cstr,
696 PyObject *module_name,
bool is_package) {
698#if _NUITKA_ONEFILE_DLL_MODE
699 filename_char_t
const *base_directory = getDllDirectory();
701 filename_char_t
const *base_directory = getBinaryDirectoryWideChars(
true);
703 copyStringSafeW(filename, base_directory, filename_size);
704 appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
705 appendModuleNameAsPathW(filename, module_name, filename_size);
707 appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
708 appendStringSafeW(filename,
"__init__", filename_size);
710 appendStringSafeW(filename,
".pyd", filename_size);
712#if _NUITKA_ONEFILE_DLL_MODE
713 filename_char_t
const *base_directory = getDllDirectory();
715 filename_char_t
const *base_directory = getBinaryDirectoryHostEncoded(
true);
717 copyStringSafe(filename, base_directory, filename_size);
718 appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
719 appendModuleNameAsPath(filename, module_name_cstr, filename_size);
721 appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
722 appendStringSafe(filename,
"__init__", filename_size);
724 appendStringSafe(filename,
".so", filename_size);
729#if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
730extern _Thread_local
const char *pkgcontext;
733static const char *NuitkaImport_SwapPackageContext(
const char *new_context) {
736#if PYTHON_VERSION >= 0x3c0
738 struct _import_runtime_state *imports = Nuitka_PyRuntime__imports;
739 const char *old_context = imports->pkgcontext;
740 imports->pkgcontext = new_context;
741#if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
742 pkgcontext = new_context;
745#elif PYTHON_VERSION >= 0x370
746 char const *old_context = _Py_PackageContext;
747 _Py_PackageContext = (
char *)new_context;
750 char *old_context = _Py_PackageContext;
751 _Py_PackageContext = (
char *)new_context;
752 return (
char const *)old_context;
756static entrypoint_t _loadExtensionModuleInitAddress(PyThreadState *tstate,
char const *full_name,
757 const filename_char_t *filename) {
759 char const *dot = strrchr(full_name,
'.');
768 char entry_function_name[1024];
769 _fillExtensionModuleDllEntryFunctionName(tstate, entry_function_name,
sizeof(entry_function_name), name);
773 PySys_WriteStderr(
"import %s # LoadLibraryExW(\"%S\");\n", full_name, filename);
776#ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
779 unsigned int old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
783#if PYTHON_VERSION >= 0x380
784 Py_BEGIN_ALLOW_THREADS;
785 hDLL = LoadLibraryExW(filename, NULL,
787#
if !_NUITKA_ONEFILE_DLL_MODE
788 LOAD_LIBRARY_SEARCH_APPLICATION_DIR |
790 LOAD_LIBRARY_SEARCH_SYSTEM32 | LOAD_LIBRARY_SEARCH_USER_DIRS |
791 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
792 Py_END_ALLOW_THREADS;
794 hDLL = LoadLibraryExW(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
797#ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
798 SetErrorMode(old_mode);
801 if (unlikely(hDLL == NULL)) {
804 char error_message[1024];
807 unsigned int error_code = GetLastError();
809 size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error_code, 0,
810 (LPTSTR)error_message,
sizeof(error_message), NULL);
814 int ret = PyOS_snprintf(buffer,
sizeof(buffer),
"LoadLibraryExW '%S' failed with error code %d", filename,
820 if (size >= 2 && error_message[size - 2] ==
'\r' && error_message[size - 1] ==
'\n') {
822 error_message[size] =
'\0';
824 int ret = PyOS_snprintf(buffer,
sizeof(buffer),
"LoadLibraryExW '%S' failed: %s", filename, error_message);
828 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, buffer);
832 entrypoint_t entrypoint = (entrypoint_t)GetProcAddress(hDLL, entry_function_name);
839 const char *error =
"dynamic libraries are not implemented in wasi";
840 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
843 entrypoint_t entrypoint = NULL;
845 static PyObject *dlopenflags_object = NULL;
846 if (dlopenflags_object == NULL) {
847 dlopenflags_object = CALL_FUNCTION_NO_ARGS(tstate, Nuitka_SysGetObject(
"getdlopenflags"));
849 int dlopenflags = PyInt_AsLong(dlopenflags_object);
852 PySys_WriteStderr(
"import %s # dlopen(\"%s\", %x);\n", full_name, filename, dlopenflags);
855 void *handle = dlopen(filename, dlopenflags);
857 if (unlikely(handle == NULL)) {
858 const char *error = dlerror();
860 if (unlikely(error == NULL)) {
861 error =
"unknown dlopen() error";
864 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
868 entrypoint_t entrypoint = (entrypoint_t)dlsym(handle, entry_function_name);
875static PyObject *callIntoExtensionModule(PyThreadState *tstate,
char const *full_name,
const filename_char_t *filename,
878 char const *dot = strrchr(full_name,
'.');
885 package = (char *)full_name;
888 entrypoint_t entrypoint = _loadExtensionModuleInitAddress(tstate, full_name, filename);
890 if (entrypoint == NULL) {
896 char const *old_context = NuitkaImport_SwapPackageContext(package);
898#if _NUITKA_EXTENSION_MODULE_PRESERVATION_HACK
899 char const *base_name = strrchr(full_name,
'.');
900 PyObject *base_name_obj = NULL;
901 PyObject *prefix_name_obj = NULL;
902 PyObject *preserved_basename_module = NULL;
903 PyObject *preserved_sub_modules = NULL;
905 if (base_name != NULL) {
906 base_name_obj = Nuitka_String_FromString(base_name + 1);
907 preserved_basename_module = Nuitka_GetModule(tstate, base_name_obj);
908 Py_XINCREF(preserved_basename_module);
910 prefix_name_obj = Nuitka_String_FromStringAndSize(full_name, base_name - full_name + 1);
912 if (preserved_basename_module != NULL) {
913 preserved_sub_modules = MAKE_DICT_EMPTY(tstate);
915 PyObject *modules_dict = Nuitka_GetSysModules();
918 PyObject *key, *value;
920 PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
921#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
922 PRINT_STRING(
"Scanning for sub-modules needing protection:");
923 PRINT_ITEM_LINE(base_name_prefix);
925 while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
927 PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
929 if (CHECK_IF_TRUE(starts_with_result) == 1) {
930 DICT_SET_ITEM(preserved_sub_modules, key, value);
933 Py_DECREF(starts_with_result);
936#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
937 PRINT_ITEM_LINE(preserved_sub_modules);
944 PGO_onModuleEntered(full_name);
947 PySys_WriteStderr(
"import %s # calling entrypoint\n", full_name);
950 Nuitka_DelModuleString(tstate, full_name);
952#if PYTHON_VERSION < 0x300
955 PyObject *
module = (*entrypoint)();
959 PySys_WriteStderr(
"import %s # return from entrypoint\n", full_name);
963 PRINT_FORMAT(
"import %s # create module as ", full_name);
968 NuitkaImport_SwapPackageContext(old_context);
970#if PYTHON_VERSION < 0x300
971 PyObject *
module = Nuitka_GetModuleString(tstate, full_name);
974 PGO_onModuleExit(full_name, module == NULL);
976 if (unlikely(module == NULL)) {
977 if (unlikely(!HAS_ERROR_OCCURRED(tstate))) {
978 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly", full_name);
984#if PYTHON_VERSION >= 0x300
985#if PYTHON_VERSION >= 0x350
988 if (Py_TYPE(module) == &PyModuleDef_Type) {
990 PySys_WriteStderr(
"import %s # entrypoint returned module def\n", full_name);
993 def = (PyModuleDef *)module;
995 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
997 PyObject *origin = Nuitka_String_FromFilename(filename);
999 PyObject *spec_value = createModuleSpec(tstate, full_name_obj, origin, is_package);
1000 CHECK_OBJECT(spec_value);
1002 module = PyModule_FromDefAndSpec(def, spec_value);
1004 if (unlikely(module == NULL)) {
1005 Py_DECREF(spec_value);
1007 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly from def", full_name);
1012 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
1014 setModuleFileValue(tstate, module, filename);
1017 PyObject *path_list = _makeDunderPathObject(tstate, origin);
1019 int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
1020 if (unlikely(res != 0)) {
1024 Py_DECREF(path_list);
1026 Nuitka_SetModule(full_name_obj, module);
1027 Py_DECREF(full_name_obj);
1029#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1030 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_True);
1031 res = PyModule_ExecDef(module, def);
1032 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
1034 Py_DECREF(spec_value);
1035 CHECK_OBJECT(spec_value);
1037 if (unlikely(res == -1)) {
1042 PySys_WriteStderr(
"import %s # executed module def\n", full_name);
1046 CHECK_OBJECT(module);
1051 PySys_WriteStderr(
"import %s # entrypoint returned module\n", full_name);
1054 def = PyModule_GetDef(module);
1055 assert(def != NULL);
1057 def->m_base.m_init = entrypoint;
1059#if PYTHON_VERSION >= 0x3d0
1060 if (PyState_FindModule(def) == NULL) {
1061 if (PyState_AddModule(module, def) == -1) {
1068 setModuleFileValue(tstate, module, filename);
1069 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
1070 SET_ATTRIBUTE(tstate, module, const_str_plain___name__, full_name_obj);
1071 PyObject *spec_value =
1072 createModuleSpec(tstate, full_name_obj, LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__),
false);
1074 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
1078 if (package != NULL) {
1079 PyObject *package_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___package__);
1081 if (package_name == Py_None) {
1082 char package2[2048];
1083 copyStringSafeN(package2, full_name, dot - full_name,
sizeof(package2));
1085 PyObject *package_name_obj = Nuitka_String_FromString(package2);
1086 SET_ATTRIBUTE(tstate, module, const_str_plain___package__, package_name_obj);
1087 Py_DECREF(package_name_obj);
1090 Py_DECREF(package_name);
1094 if (likely(def != NULL)) {
1095 def->m_base.m_init = entrypoint;
1099 PyModuleDef *def = PyModule_GetDef(module);
1101 if (unlikely(def == NULL)) {
1102 PyErr_Format(PyExc_SystemError,
"initialization of %s did not return an extension module", filename);
1107 def->m_base.m_init = entrypoint;
1113 setModuleFileValue(tstate, module, filename);
1117#if PYTHON_VERSION < 0x300
1118 PyObject *res2 = _PyImport_FixupExtension((
char *)full_name, (
char *)filename);
1120 if (unlikely(res2 == NULL)) {
1124 PyObject *full_name_obj = PyUnicode_FromString(full_name);
1125 CHECK_OBJECT(full_name_obj);
1126 PyObject *filename_obj = Nuitka_String_FromFilename(filename);
1128 CHECK_OBJECT(filename_obj);
1132#if _NUITKA_EXTENSION_MODULE_PRESERVATION_HACK
1133 if (preserved_basename_module != NULL) {
1134#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1135 PRINT_STRING(
"Module Preservation: Handling preservation for extension module ");
1136 PRINT_ITEM_LINE(full_name_obj);
1137 PRINT_STRING(
"Module Preservation: Restoring preserved module ");
1138 PRINT_ITEM(base_name_obj);
1140 PyObject *current = Nuitka_GetModule(tstate, base_name_obj);
1141 if (current == preserved_basename_module) {
1142 PRINT_STRING(
" (unchanged, identical object)");
1143 }
else if (current != NULL) {
1144 PRINT_STRING(
" (overwriting current value ");
1145 PRINT_ITEM(current);
1148 PRINT_STRING(
" with preserved value ");
1149 PRINT_ITEM_LINE(preserved_basename_module);
1151 Nuitka_SetModule(base_name_obj, preserved_basename_module);
1152 Py_DECREF(preserved_basename_module);
1155 if (base_name_obj != NULL) {
1156 PyObject *need_correction = MAKE_LIST_EMPTY(tstate, 0);
1159 PyObject *modules_dict = Nuitka_GetSysModules();
1162 PyObject *key, *value;
1164 PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
1165#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1166 PRINT_STRING(
"Module Preservation: Scanning for modules needing correction (renaming) under '");
1167 PRINT_ITEM(base_name_prefix);
1168 PRINT_STRING(
"'\n");
1170 while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
1172 PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
1174 if (CHECK_IF_TRUE(starts_with_result) == 1) {
1175 LIST_APPEND0(need_correction, key);
1178 Py_DECREF(starts_with_result);
1182#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1183 PRINT_STRING(
"Module Preservation: The following modules need correction: ");
1184 PRINT_ITEM_LINE(need_correction);
1187 Py_ssize_t n = PyList_GET_SIZE(need_correction);
1189 for (Py_ssize_t i = 0; i < n; i++) {
1190 PyObject *module_to_correct_name = PyList_GET_ITEM(need_correction, i);
1192 PyObject *correct_module_name =
1193 BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(prefix_name_obj, module_to_correct_name);
1195 PyObject *module_to_correct = Nuitka_GetModule(tstate, module_to_correct_name);
1197#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1198 PRINT_STRING(
"Module Preservation: Relocating (moving) ");
1199 PRINT_ITEM(module_to_correct_name);
1200 PRINT_STRING(
" to ");
1201 PRINT_ITEM(correct_module_name);
1202 PRINT_STRING(
" (Module object: ");
1203 PRINT_ITEM(module_to_correct);
1204 PRINT_STRING(
")\n");
1206 Nuitka_SetModule(correct_module_name, module_to_correct);
1208 Nuitka_DelModule(tstate, module_to_correct_name);
1211 if (preserved_sub_modules != NULL) {
1213 PyObject *key, *value;
1215 while (Nuitka_DictNext(preserved_sub_modules, &pos, &key, &value)) {
1216#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1217 PRINT_STRING(
"Module Preservation: Restoring preserved submodule: ");
1220 PyObject *current = Nuitka_GetModule(tstate, key);
1221 if (current == value) {
1222 PRINT_STRING(
" (unchanged, identical object)\n");
1223 }
else if (current != NULL) {
1224 PRINT_STRING(
" (changed from ");
1225 PRINT_ITEM(current);
1226 PRINT_STRING(
")\n");
1228 PRINT_STRING(
" (new)\n");
1231 Nuitka_SetModule(key, value);
1235 Py_XDECREF(preserved_sub_modules);
1237 Py_DECREF(base_name_obj);
1238 Py_DECREF(prefix_name_obj);
1242#if PYTHON_VERSION < 0x3d0
1243 int res = _PyImport_FixupExtensionObject(module, full_name_obj, filename_obj
1244#
if PYTHON_VERSION >= 0x370
1246 Nuitka_GetSysModules()
1251#if PYTHON_VERSION >= 0x3d0
1252 Nuitka_SetModuleString(full_name, module);
1255 Py_DECREF(full_name_obj);
1256 Py_DECREF(filename_obj);
1258#if PYTHON_VERSION < 0x3d0
1259 if (unlikely(res == -1)) {
1268static void loadTriggeredModule(PyThreadState *tstate,
char const *name,
char const *trigger_name) {
1269 char trigger_module_name[2048];
1271 copyStringSafe(trigger_module_name, name,
sizeof(trigger_module_name));
1272 appendStringSafe(trigger_module_name, trigger_name,
sizeof(trigger_module_name));
1276 if (entry != NULL) {
1278 PySys_WriteStderr(
"Loading %s\n", trigger_module_name);
1281 IMPORT_EMBEDDED_MODULE(tstate, trigger_module_name);
1283 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1284 if ((entry->flags & NUITKA_ABORT_MODULE_FLAG) != 0) {
1285 printf(
"Critical error loading %s.\n", trigger_module_name);
1288 PyObject *trigger_module_name_str = Nuitka_String_FromString(trigger_module_name);
1289 PyErr_WriteUnraisable(trigger_module_name_str);
1290 Py_DECREF(trigger_module_name_str);
1296static void loadPostLoadCode(PyThreadState *tstate, PyObject *module_name,
char const *name, PyObject *module) {
1297 PyObject *parent_module = NULL;
1298 PyObject *base_name_obj = NULL;
1299 PyObject *parent_name_obj = NULL;
1305 if (Nuitka_GetModule(tstate, module_name) == NULL) {
1307 PySys_WriteStderr(
"Adding module '%s' to sys.modules temporarily for -postLoad.\n", name);
1310 Nuitka_SetModule(module_name, module);
1313 char const *dot = strrchr(name,
'.');
1315 parent_name_obj = Nuitka_String_FromStringAndSize(name, dot - name);
1316 parent_module = Nuitka_GetModule(tstate, parent_name_obj);
1318 if (parent_module != NULL) {
1319 base_name_obj = Nuitka_String_FromString(dot + 1);
1322 PySys_WriteStderr(
"Binding submodule '%s' to parent module temporarily for -postLoad.\n", name);
1325 SET_ATTRIBUTE(tstate, parent_module, base_name_obj, module);
1329 loadTriggeredModule(tstate, name,
"-postLoad");
1331 Py_XDECREF(parent_name_obj);
1332 Py_XDECREF(base_name_obj);
1335#if PYTHON_VERSION >= 0x350
1336static bool executeExtensionModuleDef(PyThreadState *tstate, PyObject *module) {
1337 if (unlikely(!PyModule_Check(module))) {
1341 PyModuleDef *def = PyModule_GetDef(module);
1346 void *state = PyModule_GetState(module);
1347 if (state != NULL) {
1351 int res = PyModule_ExecDef(module, def);
1353 if (unlikely(res == -1)) {
1361#if PYTHON_VERSION >= 0x300
1362static void _fixupSpecAttribute(PyThreadState *tstate, PyObject *module) {
1363 PyObject *spec_value = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___spec__);
1365 if (spec_value && spec_value != Py_None) {
1366 if (HAS_ATTR_BOOL(tstate, spec_value, const_str_plain__initializing)) {
1367 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
1374static char **_bytecode_data = NULL;
1376#if _NUITKA_STANDALONE_MODE && !defined(_NUITKA_DEPLOYMENT_MODE) && \
1377 !defined(_NUITKA_NO_DEPLOYMENT_EXCLUDED_MODULE_USAGE)
1379 PyErr_Format(PyExc_ImportError,
1380 "Module '%s' was actively excluded from Nuitka compilation. Disable with "
1381 "'--no-deployment-flag=excluded-module-usage': %s",
1382 entry->name, (
char const *)entry->python_init_func);
1386static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1388#if _NUITKA_STANDALONE_MODE && !defined(_NUITKA_DEPLOYMENT_MODE) && \
1389 !defined(_NUITKA_NO_DEPLOYMENT_EXCLUDED_MODULE_USAGE)
1390 if ((entry->flags & NUITKA_EXCLUDED_MODULE_FLAG) != 0) {
1391 raiseExcludedModuleImportError(entry);
1396#if _NUITKA_STANDALONE_MODE
1397 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1398 bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
1400 filename_char_t filename[MAXPATHLEN + 1];
1401 _makeModuleCFilenameValue(filename,
sizeof(filename) /
sizeof(filename_char_t), entry->name, module_name,
1404 callIntoExtensionModule(tstate, entry->name, filename, is_package);
1407 if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
1411 PyCodeObject *code_object =
1412 (PyCodeObject *)PyMarshal_ReadObjectFromString(_bytecode_data[entry->bytecode_index], entry->bytecode_size);
1415 if (unlikely(code_object == NULL)) {
1420 return loadModuleFromCodeObject(tstate, module, code_object, entry);
1422 assert((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0);
1423 assert(entry->python_init_func);
1426 NUITKA_MAY_BE_UNUSED
bool res = Nuitka_SetModule(module_name, module);
1427 assert(res !=
false);
1431#if PYTHON_VERSION < 0x300
1432 NUITKA_MAY_BE_UNUSED
1434 PyObject *result = entry->python_init_func(tstate, module, entry);
1435 CHECK_OBJECT_X(result);
1437#if PYTHON_VERSION >= 0x300
1438 if (likely(result != NULL)) {
1439 _fixupSpecAttribute(tstate, result);
1444 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1449 PySys_WriteStderr(
"Loaded %s\n", entry->name);
1452 return Nuitka_GetModule(tstate, module_name);
1455static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1458 CHECK_OBJECT_X(module);
1459 CHECK_OBJECT(module_name);
1462 bool frozen_import = entry == NULL && hasFrozenModule(name);
1464 if (entry != NULL || frozen_import) {
1469 loadTriggeredModule(tstate, name,
"-preLoad");
1472 PyObject *result = NULL;
1474 if (entry != NULL) {
1475#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1479 result = loadModule(tstate, module, module_name, entry);
1481#if !defined(_NUITKA_DEPLOYMENT_MODE) && !defined(_NUITKA_NO_DEPLOYMENT_PERFECT_SUPPORT)
1482 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1483 if ((entry->flags & NUITKA_PERFECT_SUPPORTED_FLAG) != 0) {
1485 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception);
1487 PyObject *exception_arg = PyUnicode_FromFormat(
"Nuitka: import of module '%s' failed unexpectedly "
1488 "despite intended perfect support, please raise a "
1489 "Nuitka issue and compile with an older version of "
1490 "the module in the meantime",
1493 raiseReplacementRuntimeError(tstate, &saved_exception, exception_arg);
1498#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1502 if (unlikely(result == NULL)) {
1507 if (frozen_import) {
1508 PGO_onModuleEntered(name);
1509 int res = PyImport_ImportFrozenModule((
char *)name);
1510 PGO_onModuleExit(name, res == -1);
1512 if (unlikely(res == -1)) {
1517 result = Nuitka_GetModule(tstate, module_name);
1521 if (result != NULL) {
1522#if PYTHON_VERSION >= 0x350
1523 bool delay_post_load = entry != NULL && (entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0 && module == NULL;
1525 if (delay_post_load ==
false && entry != NULL && (entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0 &&
1527 if (unlikely(executeExtensionModuleDef(tstate, result) == false)) {
1532 bool delay_post_load =
false;
1535 if (delay_post_load ==
false) {
1540 loadPostLoadCode(tstate, module_name, name, result);
1546 Py_INCREF_IMMORTAL(Py_None);
1552PyObject *IMPORT_EMBEDDED_MODULE(PyThreadState *tstate,
char const *name) {
1553 PyObject *module_name = Nuitka_String_FromString(name);
1556 PyObject *
module = Nuitka_GetModule(tstate, module_name);
1558 if (module != NULL) {
1559 Py_DECREF(module_name);
1563#if PYTHON_VERSION < 0x300
1564 module = PyModule_New(name);
1566 module = PyModule_NewObject(module_name);
1569 PyObject *result = _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1571#if PYTHON_VERSION < 0x350
1572 if (unlikely(result == NULL)) {
1573 Nuitka_DelModule(tstate, module_name);
1577 Py_DECREF(module_name);
1582PyObject *EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module) {
1583 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1584 assert(module_name);
1586 char const *name = Nuitka_String_AsString(module_name);
1588 return _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1591static PyObject *_nuitka_loader_load_module(PyObject *self, PyObject *args, PyObject *kwds) {
1592 PyObject *module_name;
1595 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:load_module", (
char **)_kw_list_find_module, &module_name,
1598 if (unlikely(res == 0)) {
1602 assert(module_name);
1603 assert(Nuitka_String_Check(module_name));
1605 char const *name = Nuitka_String_AsString(module_name);
1608 PySys_WriteStderr(
"Loading %s\n", name);
1611 PyThreadState *tstate = PyThreadState_GET();
1613#if !_NUITKA_STANDALONE_MODE
1614 if (installed_extension_modules != NULL) {
1615 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1617 if (extension_module_filename != NULL) {
1619 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1624 return IMPORT_EMBEDDED_MODULE(tstate, name);
1627static char const *_kw_list_is_package[] = {
"fullname", NULL};
1629static PyObject *_nuitka_loader_is_package(PyObject *self, PyObject *args, PyObject *kwds) {
1630 PyObject *module_name;
1632 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:is_package", (
char **)_kw_list_is_package, &module_name);
1634 if (unlikely(res == 0)) {
1638 assert(module_name);
1639 assert(Nuitka_String_Check(module_name));
1641 char const *name = Nuitka_String_AsString(module_name);
1648 result = BOOL_FROM((entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1654 Py_INCREF_IMMORTAL(result);
1658static char const *_kw_list_iter_modules[] = {
"package", NULL};
1660static PyObject *_nuitka_loader_iter_modules(PyObject *self_obj, PyObject *args, PyObject *kwds) {
1664 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:iter_modules", (
char **)_kw_list_iter_modules, &prefix);
1666 if (unlikely(res == 0)) {
1670 NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
1672 PyObject *result = MAKE_LIST_EMPTY(tstate, 0);
1679 if (self->m_loader_entry) {
1680 s = self->m_loader_entry->name;
1685 while (current->name != NULL) {
1686 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1687 current->name = UN_TRANSLATE_NAME(current->name);
1688 current->flags -= NUITKA_TRANSLATED_FLAG;
1691 int c = strncmp(s, current->name, strlen(s));
1698 if (strcmp(current->name,
"__main__") == 0) {
1703 if (current->name[strlen(s)] !=
'.') {
1708 char const *sub = strchr(current->name + strlen(s) + 1,
'.');
1716 if (self->m_loader_entry) {
1717 name = Nuitka_String_FromString(current->name + strlen(s) + 1);
1719 name = Nuitka_String_FromString(current->name);
1722 if (CHECK_IF_TRUE(prefix)) {
1723 PyObject *old = name;
1724 name = PyUnicode_Concat(prefix, name);
1728 PyObject *r = MAKE_TUPLE_EMPTY(tstate, 2);
1729 PyTuple_SET_ITEM(r, 0, name);
1730 PyTuple_SET_ITEM_IMMORTAL(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1732 LIST_APPEND1(result, r);
1741#if defined(_NUITKA_FREEZER_HAS_FILE_PATH)
1743 wchar_t buffer[1024];
1746 appendWStringSafeW(buffer, entry->file_path,
sizeof(buffer));
1747 stripFilenameW(buffer);
1748 PyObject *dir_name = NuitkaUnicode_FromWideChar(buffer, -1);
1751 copyStringSafe(buffer, entry->file_path,
sizeof(buffer));
1753 PyObject *dir_name = Nuitka_String_FromString(dirname(buffer));
1756#if _NUITKA_MODULE_MODE
1757 char const *name = entry->compilation_name;
1762 char const *name = entry->name;
1765 PyObject *module_name;
1767 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1768 module_name = Nuitka_String_FromString(name);
1771 copyStringSafe(buffer, name,
sizeof(buffer));
1773 char *dot = strrchr(buffer,
'.');
1778 module_name = Nuitka_String_FromString(buffer);
1781#if PYTHON_VERSION < 0x300
1782 PyObject *module_path = STR_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1784 PyObject *module_path = UNICODE_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1786 Py_DECREF(module_name);
1788 if (unlikely(module_path == NULL)) {
1792 PyObject *dir_name = MAKE_RELATIVE_PATH(module_path);
1793 Py_DECREF(module_path);
1799#if PYTHON_VERSION >= 0x300
1801PyObject *getImportLibBootstrapModule(
void) {
1802 static PyObject *importlib = NULL;
1803 if (importlib == NULL) {
1804 importlib = PyImport_ImportModule(
"importlib._bootstrap");
1812 PyObject *dir_name = getModuleDirectory(tstate, entry);
1814 char filename_buffer[1024];
1816 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1817 copyStringSafe(filename_buffer,
"__init__",
sizeof(filename_buffer));
1819 char const *basename = strrchr(entry->name,
'.');
1821 if (basename == NULL) {
1822 basename = entry->name;
1827 copyStringSafe(filename_buffer, basename,
sizeof(filename_buffer));
1830 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1832 appendStringSafe(filename_buffer,
".pyd",
sizeof(filename_buffer));
1834 appendStringSafe(filename_buffer,
".so",
sizeof(filename_buffer));
1837 appendStringSafe(filename_buffer,
".py",
sizeof(filename_buffer));
1840 PyObject *module_filename = Nuitka_String_FromString(filename_buffer);
1842 PyObject *result = JOIN_PATH2(dir_name, module_filename);
1844 Py_DECREF(module_filename);
1849#if PYTHON_VERSION >= 0x300
1851static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1856 PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:module_repr", (
char **)_kw_list_find_module, &module, &unused);
1858 if (unlikely(res == 0)) {
1862 PyThreadState *tstate = PyThreadState_GET();
1864 return PyUnicode_FromFormat(
"<module '%s' from %R>", PyModule_GetName(module),
1865 Nuitka_GetFilenameObject(tstate, module));
1868static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1869 static PyObject *module_spec_class = NULL;
1871 if (module_spec_class == NULL) {
1872 module_spec_class = PyObject_GetAttrString(importlib_module,
"ModuleSpec");
1875 return module_spec_class;
1878static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin,
bool is_package) {
1879 CHECK_OBJECT(module_name);
1880 assert(Nuitka_String_Check(module_name));
1881 CHECK_OBJECT_X(origin);
1883 PyObject *importlib_module = getImportLibBootstrapModule();
1885 if (unlikely(importlib_module == NULL)) {
1889 PyObject *module_spec_class = getModuleSpecClass(importlib_module);
1891 if (unlikely(module_spec_class == NULL)) {
1895 PyObject *args = MAKE_TUPLE2(tstate, module_name, (PyObject *)&Nuitka_Loader_Type);
1897 PyObject *kw_values[] = {is_package ? Py_True : Py_False, origin};
1899 char const *kw_keys[] = {
"is_package",
"origin"};
1901 PyObject *kw_args = MAKE_DICT_X_CSTR(kw_keys, kw_values,
sizeof(kw_values) /
sizeof(PyObject *));
1903 PyObject *result = CALL_FUNCTION(tstate, module_spec_class, args, kw_args);
1911#if !_NUITKA_STANDALONE_MODE
1913static PyObject *createModuleSpecViaPathFinder(PyThreadState *tstate, PyObject *module_name,
1914 char const *parent_module_name) {
1915 if (scanModuleInPackagePath(tstate, module_name, parent_module_name)) {
1916 return createModuleSpec(tstate, module_name, NULL,
false);
1924#if _NUITKA_STANDALONE_MODE
1925static PyObject *getImportLibPathFinderClass(
void) {
1926 static PyObject *path_finder_class = NULL;
1928 if (path_finder_class == NULL) {
1929 static PyObject *machinery_module = NULL;
1931 if (machinery_module == NULL) {
1932 machinery_module = PyImport_ImportModule(
"importlib.machinery");
1935 path_finder_class = PyObject_GetAttrString(machinery_module,
"PathFinder");
1938 return path_finder_class;
1941static PyObject *findExternalModuleSpecViaPathFinder(PyThreadState *tstate, PyObject *module_name,
1942 PyObject *search_path,
1944 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0 || (entry->flags & NUITKA_PACKAGE_FLAG) == 0) {
1948 PyObject *path_finder_class = getImportLibPathFinderClass();
1950 if (unlikely(path_finder_class == NULL)) {
1954 PyObject *find_spec = PyObject_GetAttrString(path_finder_class,
"find_spec");
1956 if (unlikely(find_spec == NULL)) {
1960 PyObject *args[2] = {module_name, search_path == NULL ? Py_None : search_path};
1961 PyObject *path_finder_spec = CALL_FUNCTION_WITH_ARGS2(tstate, find_spec, args);
1963 Py_DECREF(find_spec);
1965 if (path_finder_spec == NULL) {
1969 if (path_finder_spec == Py_None) {
1970 Py_DECREF(path_finder_spec);
1974 PyObject *origin = PyObject_GetAttrString(path_finder_spec,
"origin");
1976 if (unlikely(origin == NULL)) {
1977 Py_DECREF(path_finder_spec);
1981 PyObject *module_origin = getModuleFileValue(tstate, entry);
1983 if (unlikely(module_origin == NULL)) {
1984 Py_DECREF(path_finder_spec);
1988 int same_origin = PyObject_RichCompareBool(origin, module_origin, Py_EQ);
1991 Py_DECREF(module_origin);
1993 if (unlikely(same_origin == -1)) {
1994 Py_DECREF(path_finder_spec);
1998 if (same_origin == 1) {
1999 Py_DECREF(path_finder_spec);
2003 return path_finder_spec;
2007static char const *_kw_list_find_spec[] = {
"fullname",
"is_package",
"path", NULL};
2009static PyObject *_nuitka_loader_find_spec(PyObject *self, PyObject *args, PyObject *kwds) {
2010 PyObject *module_name;
2011 PyObject *is_package_arg = Py_None;
2012 PyObject *path_arg = Py_None;
2014 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|OO:find_spec", (
char **)_kw_list_find_spec, &module_name,
2015 &is_package_arg, &path_arg);
2017 if (unlikely(res == 0)) {
2021 char const *full_name = Nuitka_String_AsString(module_name);
2024 PySys_WriteStderr(
"import %s # considering responsibility (find_spec)\n", full_name);
2029 PyThreadState *tstate = PyThreadState_GET();
2031#if !_NUITKA_STANDALONE_MODE
2035 if (entry == NULL) {
2036 entry = findContainingPackageEntry(full_name);
2038 if (entry != NULL) {
2039 PyObject *result = createModuleSpecViaPathFinder(tstate, module_name, entry->name);
2041 if (result != NULL) {
2043 PySys_WriteStderr(
"import %s # claimed responsibility (%s, contained in compiled package %s)\n",
2044 full_name, getEntryModeString(entry), entry->name);
2050 if (HAS_ERROR_OCCURRED(tstate)) {
2059#if _NUITKA_STANDALONE_MODE
2060 if (entry != NULL) {
2061 PyObject *path_finder_spec = findExternalModuleSpecViaPathFinder(tstate, module_name, path_arg, entry);
2063 if (path_finder_spec != NULL) {
2065 PySys_WriteStderr(
"import %s # denied responsibility to PathFinder alternative\n", full_name);
2068 return path_finder_spec;
2071 if (HAS_ERROR_OCCURRED(tstate)) {
2077 if (entry == NULL) {
2079 PySys_WriteStderr(
"import %s # denied responsibility\n", full_name);
2082 Py_INCREF_IMMORTAL(Py_None);
2087 PySys_WriteStderr(
"import %s # claimed responsibility (%s)\n", Nuitka_String_AsString(module_name),
2088 getEntryModeString(entry));
2091#if _NUITKA_STANDALONE_MODE && !defined(_NUITKA_DEPLOYMENT_MODE) && \
2092 !defined(_NUITKA_NO_DEPLOYMENT_EXCLUDED_MODULE_USAGE)
2093 if ((entry->flags & NUITKA_EXCLUDED_MODULE_FLAG) != 0) {
2094 raiseExcludedModuleImportError(entry);
2099 return createModuleSpec(tstate, module_name, getModuleFileValue(tstate, entry),
2100 (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
2103#if PYTHON_VERSION >= 0x350
2104static char const *_kw_list_create_module[] = {
"spec", NULL};
2106static PyObject *_nuitka_loader_create_module(PyObject *self, PyObject *args, PyObject *kwds) {
2109 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:create_module", (
char **)_kw_list_create_module, &spec);
2111 if (unlikely(res == 0)) {
2115 PyThreadState *tstate = PyThreadState_GET();
2117 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, spec, const_str_plain_name);
2119 if (unlikely(module_name == NULL)) {
2124 char const *name = Nuitka_String_AsString(module_name);
2125 if (unlikely(name == NULL)) {
2126 Py_DECREF(module_name);
2131 PySys_WriteStderr(
"import %s # create module\n", name);
2136#if !_NUITKA_STANDALONE_MODE && !_NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
2137 if (installed_extension_modules != NULL) {
2138 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
2140 if (extension_module_filename != NULL) {
2141 Py_DECREF(module_name);
2142 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
2147#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
2155 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
2156 result = _EXECUTE_EMBEDDED_MODULE(tstate, NULL, module_name, name);
2158 result = PyModule_NewObject(module_name);
2161 Py_DECREF(module_name);
2166static char const *_kw_list_exec_module[] = {
"module", NULL};
2168static PyObject *_nuitka_loader_exec_module(PyObject *self, PyObject *args, PyObject *kwds) {
2171 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:exec_module", (
char **)_kw_list_exec_module, &module);
2173 if (unlikely(res == 0)) {
2177 PyThreadState *tstate = PyThreadState_GET();
2179 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
2181 if (unlikely(module_name == NULL)) {
2186 char const *name = Nuitka_String_AsString(module_name);
2187 if (unlikely(name == NULL)) {
2188 Py_DECREF(module_name);
2193 PySys_WriteStderr(
"import %s # execute module\n", name);
2198#if !_NUITKA_STANDALONE_MODE && _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
2199 if (installed_extension_modules != NULL) {
2200 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
2202 if (extension_module_filename != NULL) {
2204 bool b_res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
2206 if (unlikely(b_res ==
false)) {
2208 CLEAR_ERROR_OCCURRED(tstate);
2211 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
2216#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
2222 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
2225 if (unlikely(executeExtensionModuleDef(tstate, module) ==
false)) {
2226 Py_DECREF(module_name);
2232 loadPostLoadCode(tstate, module_name, name, module);
2234 Py_DECREF(module_name);
2236 CHECK_OBJECT(module);
2241 Py_DECREF(module_name);
2243 return EXECUTE_EMBEDDED_MODULE(tstate, module);
2246#if PYTHON_VERSION >= 0x370
2249#include "MetaPathBasedLoaderResourceReader.c"
2251static PyObject *_nuitka_loader_get_resource_reader(PyObject *self, PyObject *args, PyObject *kwds) {
2252 PyObject *module_name;
2255 PyArg_ParseTupleAndKeywords(args, kwds,
"O:get_resource_reader", (
char **)_kw_list_exec_module, &module_name);
2257 if (unlikely(res == 0)) {
2261 char const *name = Nuitka_String_AsString(module_name);
2267 PySys_WriteStderr(
"import %s # get_resource_reader (%s)\n", name, getEntryModeString(entry));
2270 return Nuitka_ResourceReader_New(entry);
2273 PyErr_Format(PyExc_RuntimeError,
"Requested resource reader for unhandled module %s", module_name);
2283static char const *_kw_list_find_distributions[] = {
"context", NULL};
2285static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *args, PyObject *kwds) {
2289 PyArg_ParseTupleAndKeywords(args, kwds,
"O:find_distributions", (
char **)_kw_list_find_distributions, &context);
2291 if (unlikely(res == 0)) {
2295 PyThreadState *tstate = PyThreadState_GET();
2297 PyObject *name = LOOKUP_ATTRIBUTE(tstate, context, const_str_plain_name);
2299 if (unlikely(name == NULL)) {
2303 PyObject *temp = MAKE_LIST_EMPTY(tstate, 0);
2306 PyObject *distribution_name;
2308 while (Nuitka_DistributionNext(&pos, &distribution_name)) {
2309 bool include =
false;
2310 if (name == Py_None) {
2313 PyObject *name_lower = CALL_METHOD_NO_ARGS(tstate, name, const_str_plain_lower);
2314 if (unlikely(name_lower == NULL)) {
2317 PyObject *distribution_name_lower = CALL_METHOD_NO_ARGS(tstate, distribution_name, const_str_plain_lower);
2318 if (unlikely(distribution_name_lower == NULL)) {
2319 Py_DECREF(name_lower);
2323 nuitka_bool cmp_res = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(name_lower, distribution_name_lower);
2325 Py_DECREF(name_lower);
2326 Py_DECREF(distribution_name_lower);
2328 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2333 include = cmp_res == NUITKA_BOOL_TRUE;
2338 PyObject *distribution = Nuitka_Distribution_New(tstate, distribution_name);
2340 if (distribution == NULL) {
2345 LIST_APPEND1(temp, distribution);
2350 PyObject *result = MAKE_ITERATOR_INFALLIBLE(temp);
2356static char const *_kw_list_sys_path_hook[] = {
"path", NULL};
2358static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, PyObject *kwds) {
2361 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:sys_path_hook", (
char **)_kw_list_sys_path_hook, &path);
2363 if (unlikely(res == 0)) {
2368 PRINT_STRING(
"CONSIDER PATH:");
2376 PyThreadState *tstate = PyThreadState_GET();
2378 while (entry->name != NULL) {
2379 if ((entry->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2380 entry->name = UN_TRANSLATE_NAME(entry->name);
2381 entry->flags -= NUITKA_TRANSLATED_FLAG;
2384 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
2385 PyObject *module_directory = getModuleDirectory(tstate, entry);
2388 PRINT_STRING(entry->name);
2390 PRINT_ITEM(module_directory);
2394 nuitka_bool cmp_res = compareFilePaths(tstate, module_directory, path);
2396 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2401 if (cmp_res == NUITKA_BOOL_TRUE) {
2403 PRINT_STRING(
"Success:");
2404 PRINT_STRING(entry->name);
2407 return Nuitka_Loader_New(entry);
2411 PRINT_STRING(entry->name);
2412 PRINT_STRING(
" not a package ");
2421 PRINT_STRING(
"Not responsible:");
2426 SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_ImportError);
2430static PyMethodDef Nuitka_Loader_methods[] = {
2431 {
"iter_modules", CAST_METHOD_KW(_nuitka_loader_iter_modules), METH_VARARGS | METH_KEYWORDS, NULL},
2432 {
"get_data", CAST_METHOD_KW(_nuitka_loader_get_data), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2433 {
"find_module", CAST_METHOD_KW(_nuitka_loader_find_module), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2434 {
"load_module", CAST_METHOD_KW(_nuitka_loader_load_module), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2435 {
"is_package", CAST_METHOD_KW(_nuitka_loader_is_package), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2436#if PYTHON_VERSION >= 0x300
2437 {
"module_repr", CAST_METHOD_KW(_nuitka_loader_repr_module), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2438 {
"find_spec", CAST_METHOD_KW(_nuitka_loader_find_spec), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2440#if PYTHON_VERSION >= 0x350
2441 {
"create_module", CAST_METHOD_KW(_nuitka_loader_create_module), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2442 {
"exec_module", CAST_METHOD_KW(_nuitka_loader_exec_module), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2444#if PYTHON_VERSION >= 0x370
2445 {
"get_resource_reader", CAST_METHOD_KW(_nuitka_loader_get_resource_reader),
2446 METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2449 {
"find_distributions", CAST_METHOD_KW(_nuitka_loader_find_distributions),
2450 METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2452 {
"sys_path_hook", CAST_METHOD_KW(_nuitka_loader_sys_path_hook), METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2458 if (loader->m_loader_entry == NULL) {
2460 return Nuitka_String_FromString(
"<nuitka_module_loader>");
2462 return Nuitka_String_FromFormat(
"<nuitka_module_loader for '%s'>", loader->m_loader_entry->name);
2466#include "nuitka/freelists.h"
2473#define MAX_LOADER_FREE_LIST_COUNT 10
2475static int free_list_loaders_count = 0;
2478 Nuitka_GC_UnTrack(loader);
2480 releaseToFreeList(free_list_loaders, loader, MAX_LOADER_FREE_LIST_COUNT);
2483static int Nuitka_Loader_tp_traverse(
struct Nuitka_LoaderObject *loader, visitproc visit,
void *arg) {
return 0; }
2485static PyObject *Nuitka_Loader_get_name(
struct Nuitka_LoaderObject *loader,
void *closure) {
2486 PyObject *result = Nuitka_String_FromString(loader->m_loader_entry->name);
2490static PyObject *Nuitka_Loader_get_path(
struct Nuitka_LoaderObject *loader,
void *closure) {
2491 PyThreadState *tstate = PyThreadState_GET();
2492 PyObject *result = getModuleFileValue(tstate, loader->m_loader_entry);
2497static PyObject *Nuitka_Loader_get__module__(
struct Nuitka_LoaderObject *loader,
void *closure) {
2498 PyObject *result = const_str_plain___nuitka__;
2500 Py_INCREF_IMMORTAL(result);
2504static PyGetSetDef Nuitka_Loader_tp_getset[] = {{(
char *)
"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
2505 {(
char *)
"name", (getter)Nuitka_Loader_get_name, NULL, NULL},
2506 {(
char *)
"path", (getter)Nuitka_Loader_get_path, NULL, NULL},
2509PyTypeObject Nuitka_Loader_Type = {
2510 PyVarObject_HEAD_INIT(NULL, 0)
"nuitka_module_loader",
2513 (destructor)Nuitka_Loader_tp_dealloc,
2518 (reprfunc)Nuitka_Loader_tp_repr,
2528 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
2530 (traverseproc)Nuitka_Loader_tp_traverse,
2536 Nuitka_Loader_methods,
2538 Nuitka_Loader_tp_getset,
2545 allocateFromFreeListFixed(free_list_loaders,
struct Nuitka_LoaderObject, Nuitka_Loader_Type);
2546 Nuitka_GC_Track(result);
2548 result->m_loader_entry = entry;
2550 return (PyObject *)result;
2553#if _NUITKA_MODULE_MODE
2554void updateMetaPathBasedLoaderModuleRoot(
char const *module_root_name) {
2555 assert(module_root_name != NULL);
2556 char const *last_dot = strrchr(module_root_name,
'.');
2558 if (last_dot != NULL) {
2562 while (current->name != NULL) {
2563 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2564 current->name = UN_TRANSLATE_NAME(current->name);
2565 current->flags -= NUITKA_TRANSLATED_FLAG;
2570 if (strcmp(last_dot + 1, current->name) == 0) {
2571 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2572 appendStringSafe(name, current->name,
sizeof(name));
2574 current->compilation_name = current->name;
2575 current->name = strdup(name);
2576 }
else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
2577 current->name[strlen(last_dot + 1)] ==
'.') {
2578 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2579 appendStringSafe(name, current->name,
sizeof(name));
2581 current->compilation_name = current->name;
2582 current->name = strdup(name);
2592 unsigned char **bytecode_data) {
2594 if (loader_entries) {
2595 assert(_loader_entries == loader_entries);
2600 _bytecode_data = (
char **)bytecode_data;
2603 PySys_WriteStderr(
"Setup nuitka compiled module/bytecode/extension importer.\n");
2606 loader_entries = _loader_entries;
2608#if _NUITKA_MODULE_MODE && PYTHON_VERSION < 0x3c0
2609 if (_Py_PackageContext != NULL) {
2610 updateMetaPathBasedLoaderModuleRoot(_Py_PackageContext);
2614 Nuitka_PyType_Ready(&Nuitka_Loader_Type, NULL,
true,
false,
false,
false,
false);
2616#if PYTHON_VERSION >= 0x370
2617 Nuitka_PyType_Ready(&Nuitka_ResourceReader_Type, NULL,
true,
false,
false,
false,
false);
2621 PyObject *global_loader = Nuitka_Loader_New(NULL);
2623 LIST_INSERT_CONST(Nuitka_SysGetObject(
"meta_path"),
2624#
if PYTHON_VERSION < 0x300
2634 PyThreadState *tstate = PyThreadState_GET();
2635 IMPORT_HARD_OS_PATH(tstate);
2638#if _NUITKA_STANDALONE_MODE
2639 LIST_INSERT_CONST(Nuitka_SysGetObject(
"path_hooks"), 0, PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2644 LIST_APPEND1(Nuitka_SysGetObject(
"path_hooks"), PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2648#if _NUITKA_STANDALONE_MODE
2651void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
2652 PyObject *sys_modules = Nuitka_GetSysModules();
2654 PyObject *key, *value;
2656 PyObject *builtin_module_names = Nuitka_SysGetObject(
"builtin_module_names");
2658 while (Nuitka_DictNext(sys_modules, &pos, &key, &value)) {
2659 if (key != NULL && value != NULL && PyModule_Check(value)) {
2660 bool is_package = HAS_ATTR_BOOL(tstate, value, const_str_plain___path__);
2662 if (is_package || HAS_ATTR_BOOL(tstate, value, const_str_plain___file__) ||
2663 PySequence_Contains(builtin_module_names, key) == 0) {
2664 PyObject *file_value = MAKE_RELATIVE_PATH_FROM_NAME(Nuitka_String_AsString(key), is_package,
false);
2665 PyObject_SetAttr(value, const_str_plain___file__, file_value);
2666 Py_DECREF(file_value);
2667 CHECK_OBJECT(file_value);
2672 assert(!HAS_ERROR_OCCURRED(tstate));
2678#include "MetaPathBasedLoaderImportlibMetadataDistribution.c"
Definition exceptions.h:712
Definition MetaPathBasedLoader.c:50
Definition unfreezing.h:36