17#include "nuitka/prelude.h"
20#include "nuitka/unfreezing.h"
26extern PyTypeObject Nuitka_Loader_Type;
37static inline bool isVerbose(
void) {
return Py_VerboseFlag != 0; }
38#elif _NUITKA_SYSFLAG_VERBOSE
39static inline bool isVerbose(
void) {
return true; }
41static inline bool isVerbose(
void) {
return false; }
46static bool hasFrozenModule(
char const *name) {
47 for (
struct _frozen
const *p = PyImport_FrozenModules; p != NULL; p++) {
48 if (p->name == NULL) {
52 if (strcmp(p->name, name) == 0) {
60static char *appendModuleNameAsPath(
char *buffer,
char const *module_name,
size_t buffer_size) {
62 while (*buffer != 0) {
67 while (*module_name) {
68 if (buffer_size < 1) {
72 if (*module_name ==
'.') {
76 *buffer++ = *module_name++;
87#if defined(_WIN32) && _NUITKA_STANDALONE_MODE
89static void appendModuleNameAsPathW(
wchar_t *buffer, PyObject *module_name,
size_t buffer_size) {
91 wchar_t const *module_name_wstr = Nuitka_UnicodeAsWideString(module_name, &size);
94 wchar_t c = *module_name_wstr++;
98 c = FILENAME_SEP_CHAR;
101 appendWCharSafeW(buffer, c, buffer_size);
109#if _NUITKA_STANDALONE_MODE
110static void patchCodeObjectPaths(PyCodeObject *code_object, PyObject *module_path) {
111 code_object->co_filename = module_path;
112 Py_INCREF(module_path);
114 Py_ssize_t consts_count = PyTuple_GET_SIZE(code_object->co_consts);
116 for (Py_ssize_t i = 0; i < consts_count; i++) {
117 PyObject *constant = PyTuple_GET_ITEM(code_object->co_consts, i);
119 if (PyCode_Check(constant)) {
120 patchCodeObjectPaths((PyCodeObject *)constant, module_path);
126NUITKA_MAY_BE_UNUSED
static PyObject *MAKE_RELATIVE_PATH_FROM_NAME(
char const *name,
bool is_package,
bool dir_only) {
127 char buffer[MAXPATHLEN + 1] = {0};
129 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
131 if (dir_only ==
false) {
133 appendCharSafe(buffer, SEP,
sizeof(buffer));
134 appendStringSafe(buffer,
"__init__.py",
sizeof(buffer));
136 appendStringSafe(buffer,
".py",
sizeof(buffer));
139 if (is_package ==
false) {
140 char *sep = strrchr(buffer, SEP);
150 PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
152 PyObject *result = MAKE_RELATIVE_PATH(module_path_entry_base);
154 Py_DECREF(module_path_entry_base);
159static PyObject *_makeDunderPathObject(PyThreadState *tstate, PyObject *module_path_entry) {
160 CHECK_OBJECT(module_path_entry);
162 PyObject *path_list = MAKE_LIST_EMPTY(tstate, 1);
163 if (unlikely(path_list == NULL)) {
167 PyList_SET_ITEM0(path_list, 0, module_path_entry);
169 CHECK_OBJECT(path_list);
173static PyObject *loadModuleFromCodeObject(PyThreadState *tstate, PyObject *module, PyCodeObject *code_object,
174 char const *name,
bool is_package) {
175 assert(code_object != NULL);
178 NUITKA_MAY_BE_UNUSED
bool b_res = Nuitka_SetModuleString(name, module);
179 assert(b_res !=
false);
182 char buffer[MAXPATHLEN + 1] = {0};
184 PyObject *module_path_entry = NULL;
187 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
188 PyObject *module_path_entry_base = Nuitka_String_FromString(buffer);
190 module_path_entry = MAKE_RELATIVE_PATH(module_path_entry_base);
191 Py_DECREF(module_path_entry_base);
193 appendCharSafe(buffer, SEP,
sizeof(buffer));
194 appendStringSafe(buffer,
"__init__.py",
sizeof(buffer));
196 appendModuleNameAsPath(buffer, name,
sizeof(buffer));
197 appendStringSafe(buffer,
".py",
sizeof(buffer));
200 PyObject *module_path_name = Nuitka_String_FromString(buffer);
202 PyObject *module_path = MAKE_RELATIVE_PATH(module_path_name);
203 Py_DECREF(module_path_name);
207 PyObject *path_list = _makeDunderPathObject(tstate, module_path_entry);
209 int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
210 if (unlikely(res != 0)) {
214 Py_DECREF(path_list);
216 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
217 CHECK_OBJECT(module_name);
219 res = PyObject_SetAttr(module, const_str_plain___package__, module_name);
221 if (unlikely(res != 0)) {
226#if _NUITKA_STANDALONE_MODE
227 patchCodeObjectPaths(code_object, module_path);
230 PGO_onModuleEntered(name);
231 module = PyImport_ExecCodeModuleEx((char *)name, (PyObject *)code_object, Nuitka_String_AsString(module_path));
232 PGO_onModuleExit(name, module == NULL);
234 Py_DECREF(module_path);
243 while (current->name != NULL) {
244 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
245 current->name = UN_TRANSLATE(current->name);
246 current->flags -= NUITKA_TRANSLATED_FLAG;
249 if (strcmp(name, current->name) == 0) {
259#if !_NUITKA_STANDALONE_MODE
264 char const *package_name_end = strrchr(name,
'.');
265 if (package_name_end == NULL) {
269 size_t length = package_name_end - name;
271 while (current->name != NULL) {
272 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
273 current->name = UN_TRANSLATE(current->name);
274 current->flags -= NUITKA_TRANSLATED_FLAG;
277 if ((current->flags & NUITKA_PACKAGE_FLAG) != 0) {
278 if (strlen(current->name) == length && strncmp(name, current->name, length) == 0) {
289static PyObject *_getFileList(PyThreadState *tstate, PyObject *dirname) {
290 static PyObject *listdir_func = NULL;
294 if (listdir_func == NULL) {
295 listdir_func = PyObject_GetAttrString(IMPORT_HARD_OS(),
"listdir");
298 if (unlikely(listdir_func == NULL)) {
302 PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, listdir_func, dirname);
307#if PYTHON_VERSION < 0x300
308static PyObject *_getImportingSuffixesByPriority(PyThreadState *tstate,
int kind) {
309 static PyObject *result = NULL;
311 if (result == NULL) {
312 result = MAKE_LIST_EMPTY(tstate, 0);
314 PyObject *imp_module = PyImport_ImportModule(
"imp");
315 PyObject *get_suffixes_func = PyObject_GetAttrString(imp_module,
"get_suffixes");
317 PyObject *suffix_list = CALL_FUNCTION_NO_ARGS(tstate, get_suffixes_func);
319 for (
int i = 0; i < PyList_GET_SIZE(suffix_list); i++) {
320 PyObject *module_kind = PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 2);
322 if (PyInt_AsLong(module_kind) == kind) {
323 LIST_APPEND0(result, PyTuple_GET_ITEM(PyList_GET_ITEM(suffix_list, i), 0));
327 Py_DECREF(suffix_list);
334static PyObject *getExtensionModuleSuffixesByPriority(PyThreadState *tstate) {
335 static PyObject *result = NULL;
337 if (result == NULL) {
338#if PYTHON_VERSION < 0x300
339 result = _getImportingSuffixesByPriority(tstate, 3);
341 static PyObject *machinery_module = NULL;
343 if (machinery_module == NULL) {
344 machinery_module = PyImport_ImportModule(
"importlib.machinery");
347 result = PyObject_GetAttrString(machinery_module,
"EXTENSION_SUFFIXES");
351 CHECK_OBJECT(result);
355static PyObject *installed_extension_modules = NULL;
357static bool scanModuleInPackagePath(PyThreadState *tstate, PyObject *module_name,
char const *parent_module_name) {
358 PyObject *sys_modules = Nuitka_GetSysModules();
360 PyObject *parent_module = PyDict_GetItemString(sys_modules, parent_module_name);
361 CHECK_OBJECT(parent_module);
363 PyObject *parent_path = PyObject_GetAttr(parent_module, const_str_plain___path__);
366 if (parent_path == NULL || !PyList_Check(parent_path)) {
370 PyObject *candidates = MAKE_LIST_EMPTY(tstate, 0);
373 char const *module_relative_name_str = Nuitka_String_AsString(module_name) + strlen(parent_module_name) + 1;
375 Py_ssize_t parent_path_size = PyList_GET_SIZE(parent_path);
377 for (Py_ssize_t i = 0; i < parent_path_size; i += 1) {
378 PyObject *path_element = PyList_GET_ITEM(parent_path, i);
380 PyObject *filenames_list = _getFileList(tstate, path_element);
382 if (filenames_list == NULL) {
383 CLEAR_ERROR_OCCURRED(tstate);
387 Py_ssize_t filenames_list_size = PyList_GET_SIZE(filenames_list);
389 for (Py_ssize_t j = 0; j < filenames_list_size; j += 1) {
390 PyObject *filename = PyList_GET_ITEM(filenames_list, j);
392 if (Nuitka_String_CheckExact(filename)) {
393 char const *filename_str = Nuitka_String_AsString(filename);
395 if (strncmp(filename_str, module_relative_name_str, strlen(module_relative_name_str)) == 0 &&
396 filename_str[strlen(module_relative_name_str)] ==
'.') {
397 LIST_APPEND1(candidates, MAKE_TUPLE2(tstate, path_element, filename));
404 PRINT_STRING(
"CANDIDATES:");
405 PRINT_STRING(Nuitka_String_AsString(module_name));
406 PRINT_STRING(module_relative_name_str);
407 PRINT_ITEM(candidates);
412 PyObject *suffix_list = getExtensionModuleSuffixesByPriority(tstate);
416 for (Py_ssize_t i = 0; i < PyList_GET_SIZE(suffix_list); i += 1) {
417 PyObject *suffix = PyList_GET_ITEM(suffix_list, i);
419 char const *suffix_str = Nuitka_String_AsString(suffix);
421 for (Py_ssize_t j = 0; j < PyList_GET_SIZE(candidates); j += 1) {
422 PyObject *entry = PyList_GET_ITEM(candidates, j);
424 PyObject *directory = PyTuple_GET_ITEM(entry, 0);
425 PyObject *candidate = PyTuple_GET_ITEM(entry, 1);
427 char const *candidate_str = Nuitka_String_AsString(candidate);
429 if (strcmp(suffix_str, candidate_str + strlen(module_relative_name_str)) == 0) {
430 PyObject *fullpath = JOIN_PATH2(directory, candidate);
432 if (installed_extension_modules == NULL) {
433 installed_extension_modules = MAKE_DICT_EMPTY(tstate);
438#if PYTHON_VERSION < 0x300 && defined(_WIN32)
439 PyObject *tmp = PyUnicode_FromObject(fullpath);
444 DICT_SET_ITEM(installed_extension_modules, module_name, fullpath);
452 Py_DECREF(candidates);
457static PyObject *callIntoExtensionModule(PyThreadState *tstate,
char const *full_name,
const filename_char_t *filename,
460static PyObject *callIntoInstalledExtensionModule(PyThreadState *tstate, PyObject *module_name,
461 PyObject *extension_module_filename) {
465 assert(PyUnicode_CheckExact(extension_module_filename));
467 wchar_t const *extension_module_filename_str = Nuitka_UnicodeAsWideString(extension_module_filename, NULL);
469 char const *extension_module_filename_str = Nuitka_String_AsString(extension_module_filename);
474 return callIntoExtensionModule(tstate, Nuitka_String_AsString(module_name), extension_module_filename_str,
false);
480 char const *mode =
"compiled";
482 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
484 }
else if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
491static char *_kw_list_find_module[] = {(
char *)
"fullname", (
char *)
"unused", NULL};
493static PyObject *_nuitka_loader_find_module(PyObject *self, PyObject *args, PyObject *kwds) {
494 PyObject *module_name;
497 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:find_module", (
char **)_kw_list_find_module, &module_name,
500 if (unlikely(res == 0)) {
504 char const *name = Nuitka_String_AsString(module_name);
507 PySys_WriteStderr(
"import %s # considering responsibility (find_module)\n", name);
514 PySys_WriteStderr(
"import %s # claimed responsibility (%s)\n", name, getEntryModeString(entry));
517 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
519 Py_INCREF(metapath_based_loader);
520 return metapath_based_loader;
523 if (hasFrozenModule(name)) {
525 PySys_WriteStderr(
"import %s # claimed responsibility (frozen)\n", name);
528 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
530 Py_INCREF(metapath_based_loader);
531 return metapath_based_loader;
534#if !_NUITKA_STANDALONE_MODE
535 entry = findContainingPackageEntry(name);
538 PyThreadState *tstate = PyThreadState_GET();
540 bool result = scanModuleInPackagePath(tstate, module_name, entry->name);
543 PyObject *metapath_based_loader = (PyObject *)&Nuitka_Loader_Type;
545 Py_INCREF(metapath_based_loader);
546 return metapath_based_loader;
552 PySys_WriteStderr(
"import %s # denied responsibility\n", name);
555 Py_INCREF_IMMORTAL(Py_None);
559static char const *_kw_list_get_data[] = {
"filename", NULL};
561static PyObject *_nuitka_loader_get_data(PyObject *self, PyObject *args, PyObject *kwds) {
564 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:get_data", (
char **)_kw_list_get_data, &filename);
566 if (unlikely(res == 0)) {
570 PyThreadState *tstate = PyThreadState_GET();
572 return GET_FILE_BYTES(tstate, filename);
575static void setModuleFileValue(PyThreadState *tstate, PyObject *module, filename_char_t
const *filename) {
576 CHECK_OBJECT(module);
577 assert(filename != NULL);
579 assert(PyModule_Check(module));
581 PyObject *dict = PyModule_GetDict(module);
584 PyObject *new_file_value = Nuitka_String_FromFilename(filename);
585 DICT_SET_ITEM(dict, const_str_plain___file__, new_file_value);
586 Py_DECREF(new_file_value);
589#if PYTHON_VERSION < 0x300
590typedef void (*entrypoint_t)(void);
592typedef PyObject *(*entrypoint_t)(void);
600#if PYTHON_VERSION >= 0x350
601static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin,
bool is_package);
604static void _fillExtensionModuleDllEntryFunctionName(PyThreadState *tstate,
char *buffer,
size_t buffer_size,
607#if PYTHON_VERSION >= 0x350
608 PyObject *name_bytes_obj = PyBytes_FromString(name);
609 PyObject *name_obj = BYTES_DECODE2(tstate, name_bytes_obj, Nuitka_String_FromString(
"utf8"));
610 Py_DECREF(name_bytes_obj);
612 PyObject *name_ascii = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_ascii);
614 if (name_ascii == NULL) {
615 DROP_ERROR_OCCURRED(tstate);
617 PyObject *name_punycode = UNICODE_ENCODE2(tstate, name_obj, const_str_plain_punycode);
619 CHECK_OBJECT(name_punycode);
621 snprintf(buffer, buffer_size,
"PyInitU_%s", PyBytes_AsString(name_punycode));
623 Py_DECREF(name_punycode);
625 Py_DECREF(name_ascii);
627 snprintf(buffer, buffer_size,
"PyInit_%s", name);
632 snprintf(buffer, buffer_size,
633#
if PYTHON_VERSION < 0x300
642#if _NUITKA_STANDALONE_MODE
645static void _makeModuleCFilenameValue(filename_char_t *filename,
size_t filename_size,
char const *module_name_cstr,
646 PyObject *module_name,
bool is_package) {
648#if _NUITKA_ONEFILE_DLL_MODE
649 filename_char_t
const *base_directory = getDllDirectory();
651 filename_char_t
const *base_directory = getBinaryDirectoryWideChars(
true);
653 copyStringSafeW(filename, base_directory, filename_size);
654 appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
655 appendModuleNameAsPathW(filename, module_name, filename_size);
657 appendWCharSafeW(filename, FILENAME_SEP_CHAR, filename_size);
658 appendStringSafeW(filename,
"__init__", filename_size);
660 appendStringSafeW(filename,
".pyd", filename_size);
662#if _NUITKA_ONEFILE_DLL_MODE
663 filename_char_t
const *base_directory = getDllDirectory();
665 filename_char_t
const *base_directory = getBinaryDirectoryHostEncoded(
true);
667 copyStringSafe(filename, base_directory, filename_size);
668 appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
669 appendModuleNameAsPath(filename, module_name_cstr, filename_size);
671 appendCharSafe(filename, FILENAME_SEP_CHAR, filename_size);
672 appendStringSafe(filename,
"__init__", filename_size);
674 appendStringSafe(filename,
".so", filename_size);
679#if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
680extern _Thread_local
const char *pkgcontext;
683static const char *NuitkaImport_SwapPackageContext(
const char *new_context) {
686#if PYTHON_VERSION >= 0x3c0
688 const char *old_context = _PyRuntime.imports.pkgcontext;
689 _PyRuntime.imports.pkgcontext = new_context;
690#if PYTHON_VERSION >= 0x3c0 && defined(_NUITKA_USE_UNEXPOSED_API)
691 pkgcontext = new_context;
694#elif PYTHON_VERSION >= 0x370
695 char const *old_context = _Py_PackageContext;
696 _Py_PackageContext = (
char *)new_context;
699 char *old_context = _Py_PackageContext;
700 _Py_PackageContext = (
char *)new_context;
701 return (
char const *)old_context;
705static PyObject *callIntoExtensionModule(PyThreadState *tstate,
char const *full_name,
const filename_char_t *filename,
708 char const *dot = strrchr(full_name,
'.');
717 package = (char *)full_name;
721 char entry_function_name[1024];
722 _fillExtensionModuleDllEntryFunctionName(tstate, entry_function_name,
sizeof(entry_function_name), name);
726 PySys_WriteStderr(
"import %s # LoadLibraryExW(\"%S\");\n", full_name, filename);
729#ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
732 unsigned int old_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
736#if PYTHON_VERSION >= 0x380
737 Py_BEGIN_ALLOW_THREADS;
738 hDLL = LoadLibraryExW(filename, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
739 Py_END_ALLOW_THREADS;
741 hDLL = LoadLibraryExW(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
744#ifndef _NUITKA_EXPERIMENTAL_DEBUG_STANDALONE
745 SetErrorMode(old_mode);
748 if (unlikely(hDLL == NULL)) {
751 char error_message[1024];
754 unsigned int error_code = GetLastError();
756 size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error_code, 0,
757 (LPTSTR)error_message,
sizeof(error_message), NULL);
761 int ret = PyOS_snprintf(buffer,
sizeof(buffer),
"LoadLibraryExW '%S' failed with error code %d", filename,
767 if (size >= 2 && error_message[size - 2] ==
'\r' && error_message[size - 1] ==
'\n') {
769 error_message[size] =
'\0';
771 int ret = PyOS_snprintf(buffer,
sizeof(buffer),
"LoadLibraryExW '%S' failed: %s", filename, error_message);
775 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, buffer);
779 entrypoint_t entrypoint = (entrypoint_t)GetProcAddress(hDLL, entry_function_name);
786 const char *error =
"dynamic libraries are not implemented in wasi";
787 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
790 entrypoint_t entrypoint = NULL;
792 static PyObject *dlopenflags_object = NULL;
793 if (dlopenflags_object == NULL) {
794 dlopenflags_object = CALL_FUNCTION_NO_ARGS(tstate, Nuitka_SysGetObject(
"getdlopenflags"));
796 int dlopenflags = PyInt_AsLong(dlopenflags_object);
799 PySys_WriteStderr(
"import %s # dlopen(\"%s\", %x);\n", full_name, filename, dlopenflags);
802 void *handle = dlopen(filename, dlopenflags);
804 if (unlikely(handle == NULL)) {
805 const char *error = dlerror();
807 if (unlikely(error == NULL)) {
808 error =
"unknown dlopen() error";
811 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ImportError, error);
815 entrypoint_t entrypoint = (entrypoint_t)dlsym(handle, entry_function_name);
820 char const *old_context = NuitkaImport_SwapPackageContext(package);
822#if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
823 char const *base_name = strrchr(full_name,
'.');
824 PyObject *base_name_obj = NULL;
825 PyObject *prefix_name_obj = NULL;
826 PyObject *preserved_basename_module = NULL;
827 PyObject *preserved_sub_modules = NULL;
829 if (base_name != NULL) {
830 base_name_obj = Nuitka_String_FromString(base_name + 1);
831 preserved_basename_module = Nuitka_GetModule(tstate, base_name_obj);
832 Py_XINCREF(preserved_basename_module);
834 prefix_name_obj = Nuitka_String_FromStringAndSize(full_name, base_name - full_name + 1);
836 if (preserved_basename_module != NULL) {
837 preserved_sub_modules = MAKE_DICT_EMPTY(tstate);
839 PyObject *modules_dict = Nuitka_GetSysModules();
842 PyObject *key, *value;
844 PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
845#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
846 PRINT_STRING(
"Scanning for sub-modules needing protection:");
847 PRINT_ITEM_LINE(base_name_prefix);
849 while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
851 PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
853 if (CHECK_IF_TRUE(starts_with_result) == 1) {
854 DICT_SET_ITEM(preserved_sub_modules, key, value);
857 Py_DECREF(starts_with_result);
860#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
861 PRINT_ITEM_LINE(preserved_sub_modules);
868 PGO_onModuleEntered(full_name);
871 PySys_WriteStderr(
"import %s # calling entrypoint\n", full_name);
874 Nuitka_DelModuleString(tstate, full_name);
876#if PYTHON_VERSION < 0x300
879 PyObject *
module = (*entrypoint)();
883 PySys_WriteStderr(
"import %s # return from entrypoint\n", full_name);
887 PRINT_FORMAT(
"import %s # create module as ", full_name);
892 NuitkaImport_SwapPackageContext(old_context);
894#if PYTHON_VERSION < 0x300
895 PyObject *
module = Nuitka_GetModuleString(tstate, full_name);
898 PGO_onModuleExit(name, module == NULL);
900 if (unlikely(module == NULL)) {
901 if (unlikely(!HAS_ERROR_OCCURRED(tstate))) {
902 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly", full_name);
908#if PYTHON_VERSION >= 0x300
909#if PYTHON_VERSION >= 0x350
912 if (Py_TYPE(module) == &PyModuleDef_Type) {
914 PySys_WriteStderr(
"import %s # entrypoint returned module def\n", full_name);
917 def = (PyModuleDef *)module;
919 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
921 PyObject *origin = Nuitka_String_FromFilename(filename);
923 PyObject *spec_value = createModuleSpec(tstate, full_name_obj, origin, is_package);
924 CHECK_OBJECT(spec_value);
926 module = PyModule_FromDefAndSpec(def, spec_value);
928 if (unlikely(module == NULL)) {
929 Py_DECREF(spec_value);
931 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly from def", full_name);
936 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
938 setModuleFileValue(tstate, module, filename);
941 PyObject *path_list = _makeDunderPathObject(tstate, origin);
943 int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
944 if (unlikely(res != 0)) {
948 Py_DECREF(path_list);
950 Nuitka_SetModule(full_name_obj, module);
951 Py_DECREF(full_name_obj);
953#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
954 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_True);
955 res = PyModule_ExecDef(module, def);
956 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
958 Py_DECREF(spec_value);
959 CHECK_OBJECT(spec_value);
961 if (unlikely(res == -1)) {
966 PySys_WriteStderr(
"import %s # executed module def\n", full_name);
970 CHECK_OBJECT(module);
975 PySys_WriteStderr(
"import %s # entrypoint returned module\n", full_name);
978 def = PyModule_GetDef(module);
981 def->m_base.m_init = entrypoint;
983#if PYTHON_VERSION >= 0x3d0
984 if (PyState_AddModule(module, def) == -1) {
990 setModuleFileValue(tstate, module, filename);
991 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
992 SET_ATTRIBUTE(tstate, module, const_str_plain___name__, full_name_obj);
993 PyObject *spec_value =
994 createModuleSpec(tstate, full_name_obj, LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__),
false);
996 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
1000 if (package != NULL) {
1001 PyObject *package_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___package__);
1003 if (package_name == Py_None) {
1004 char package2[2048];
1005 copyStringSafeN(package2, full_name, dot - full_name,
sizeof(package2));
1007 PyObject *package_name_obj = Nuitka_String_FromString(package2);
1008 SET_ATTRIBUTE(tstate, module, const_str_plain___package__, package_name_obj);
1009 Py_DECREF(package_name_obj);
1012 Py_DECREF(package_name);
1016 if (likely(def != NULL)) {
1017 def->m_base.m_init = entrypoint;
1021 PyModuleDef *def = PyModule_GetDef(module);
1023 if (unlikely(def == NULL)) {
1024 PyErr_Format(PyExc_SystemError,
"initialization of %s did not return an extension module", filename);
1029 def->m_base.m_init = entrypoint;
1036 setModuleFileValue(tstate, module, filename);
1040#if PYTHON_VERSION < 0x300
1041 PyObject *res2 = _PyImport_FixupExtension((
char *)full_name, (
char *)filename);
1043 if (unlikely(res2 == NULL)) {
1047 PyObject *full_name_obj = PyUnicode_FromString(full_name);
1048 CHECK_OBJECT(full_name_obj);
1049 PyObject *filename_obj = Nuitka_String_FromFilename(filename);
1051 CHECK_OBJECT(filename_obj);
1055#if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
1056 if (preserved_basename_module != NULL) {
1057#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1058 PRINT_STRING(
"Handling for preservation: ");
1059 PRINT_ITEM_LINE(full_name_obj);
1060 PRINT_STRING(
"Restoring preserved module: ");
1061 PRINT_ITEM(base_name_obj);
1062 if (Nuitka_HasModule(tstate, base_name_obj)) {
1063 PRINT_STRING(
" changes ");
1064 PRINT_ITEM(Nuitka_GetModule(tstate, base_name_obj));
1066 PRINT_STRING(
" -> ");
1067 PRINT_ITEM_LINE(preserved_basename_module);
1069 Nuitka_SetModule(base_name_obj, preserved_basename_module);
1070 Py_DECREF(preserved_basename_module);
1073 if (base_name_obj != NULL) {
1074 PyObject *need_correction = MAKE_LIST_EMPTY(tstate, 0);
1077 PyObject *modules_dict = Nuitka_GetSysModules();
1080 PyObject *key, *value;
1082 PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
1083#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1084 PRINT_STRING(
"Scanning for modules needing correction: ");
1085 PRINT_ITEM_LINE(base_name_prefix);
1087 while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
1089 if (preserved_sub_modules != NULL && DICT_HAS_ITEM(tstate, preserved_sub_modules, key) == 1) {
1093 PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
1095 if (CHECK_IF_TRUE(starts_with_result) == 1) {
1096 LIST_APPEND0(need_correction, key);
1099 Py_DECREF(starts_with_result);
1102 Py_XDECREF(preserved_sub_modules);
1105#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1106 PRINT_STRING(
"Correction needed:");
1107 PRINT_ITEM_LINE(need_correction);
1110 Py_ssize_t n = PyList_GET_SIZE(need_correction);
1112 for (Py_ssize_t i = 0; i < n; i++) {
1113 PyObject *module_to_correct_name = PyList_GET_ITEM(need_correction, i);
1115 PyObject *correct_module_name =
1116 BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(prefix_name_obj, module_to_correct_name);
1118 PyObject *module_to_correct = Nuitka_GetModule(tstate, module_to_correct_name);
1120#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1121 PRINT_ITEM(module_to_correct_name);
1122 PRINT_STRING(
" -> ");
1123 PRINT_ITEM(correct_module_name);
1124 PRINT_STRING(
" changes ");
1125 PRINT_ITEM_LINE(module_to_correct);
1127 Nuitka_SetModule(correct_module_name, module_to_correct);
1129 Nuitka_DelModule(tstate, module_to_correct_name);
1132 Py_DECREF(base_name_obj);
1133 Py_DECREF(prefix_name_obj);
1137#if PYTHON_VERSION < 0x3d0
1138 int res = _PyImport_FixupExtensionObject(module, full_name_obj, filename_obj
1139#
if PYTHON_VERSION >= 0x370
1141 Nuitka_GetSysModules()
1146#if PYTHON_VERSION >= 0x3d0
1147 Nuitka_SetModuleString(full_name, module);
1150 Py_DECREF(full_name_obj);
1151 Py_DECREF(filename_obj);
1153#if PYTHON_VERSION < 0x3d0
1154 if (unlikely(res == -1)) {
1163static void loadTriggeredModule(PyThreadState *tstate,
char const *name,
char const *trigger_name) {
1164 char trigger_module_name[2048];
1166 copyStringSafe(trigger_module_name, name,
sizeof(trigger_module_name));
1167 appendStringSafe(trigger_module_name, trigger_name,
sizeof(trigger_module_name));
1171 if (entry != NULL) {
1173 PySys_WriteStderr(
"Loading %s\n", trigger_module_name);
1176 IMPORT_EMBEDDED_MODULE(tstate, trigger_module_name);
1178 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1179 if ((entry->flags & NUITKA_ABORT_MODULE_FLAG) != 0) {
1180 printf(
"Critical error loading %s.\n", trigger_module_name);
1183 PyObject *trigger_module_name_str = Nuitka_String_FromString(trigger_module_name);
1184 PyErr_WriteUnraisable(trigger_module_name_str);
1185 Py_DECREF(trigger_module_name_str);
1191#if PYTHON_VERSION >= 0x300
1192static void _fixupSpecAttribute(PyThreadState *tstate, PyObject *module) {
1193 PyObject *spec_value = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___spec__);
1195 if (spec_value && spec_value != Py_None) {
1196 if (HAS_ATTR_BOOL(tstate, spec_value, const_str_plain__initializing)) {
1197 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
1204static char **_bytecode_data = NULL;
1206static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1208#if _NUITKA_STANDALONE_MODE
1209 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1210 bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
1212 filename_char_t filename[MAXPATHLEN + 1];
1213 _makeModuleCFilenameValue(filename,
sizeof(filename) /
sizeof(filename_char_t), entry->name, module_name,
1216 callIntoExtensionModule(tstate, entry->name, filename, is_package);
1219 if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
1223 PyCodeObject *code_object =
1224 (PyCodeObject *)PyMarshal_ReadObjectFromString(_bytecode_data[entry->bytecode_index], entry->bytecode_size);
1227 if (unlikely(code_object == NULL)) {
1232 return loadModuleFromCodeObject(tstate, module, code_object, entry->name,
1233 (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1235 assert((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0);
1236 assert(entry->python_init_func);
1239 NUITKA_MAY_BE_UNUSED
bool res = Nuitka_SetModule(module_name, module);
1240 assert(res !=
false);
1244#if PYTHON_VERSION < 0x300
1245 NUITKA_MAY_BE_UNUSED
1247 PyObject *result = entry->python_init_func(tstate, module, entry);
1248 CHECK_OBJECT_X(result);
1250#if PYTHON_VERSION >= 0x300
1251 if (likely(result != NULL)) {
1252 _fixupSpecAttribute(tstate, result);
1257 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1262 PySys_WriteStderr(
"Loaded %s\n", entry->name);
1265 return Nuitka_GetModule(tstate, module_name);
1268static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1271 CHECK_OBJECT_X(module);
1272 CHECK_OBJECT(module_name);
1275 bool frozen_import = entry == NULL && hasFrozenModule(name);
1277 if (entry != NULL || frozen_import) {
1282 loadTriggeredModule(tstate, name,
"-preLoad");
1285 PyObject *result = NULL;
1287 if (entry != NULL) {
1288#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1292 result = loadModule(tstate, module, module_name, entry);
1294#if !defined(_NUITKA_DEPLOYMENT_MODE) && !defined(_NUITKA_NO_DEPLOYMENT_PERFECT_SUPPORT)
1295 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1296 if ((entry->flags & NUITKA_PERFECT_SUPPORTED_FLAG) != 0) {
1298 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception);
1300 PyObject *exception_arg = PyUnicode_FromFormat(
"Nuitka: import of module '%s' failed unexpectedly "
1301 "despite intended perfect support, please raise a "
1302 "Nuitka issue and compile with an older version of "
1303 "the module in the meantime",
1306 raiseReplacementRuntimeError(tstate, &saved_exception, exception_arg);
1311#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1315 if (unlikely(result == NULL)) {
1320 if (frozen_import) {
1321 PGO_onModuleEntered(name);
1322 int res = PyImport_ImportFrozenModule((
char *)name);
1323 PGO_onModuleExit(name, res == -1);
1325 if (unlikely(res == -1)) {
1330 result = Nuitka_GetModule(tstate, module_name);
1334 if (result != NULL) {
1339 loadTriggeredModule(tstate, name,
"-postLoad");
1344 Py_INCREF_IMMORTAL(Py_None);
1350PyObject *IMPORT_EMBEDDED_MODULE(PyThreadState *tstate,
char const *name) {
1351 PyObject *module_name = Nuitka_String_FromString(name);
1354 PyObject *
module = Nuitka_GetModule(tstate, module_name);
1356 if (module != NULL) {
1357 Py_DECREF(module_name);
1361#if PYTHON_VERSION < 0x300
1362 module = PyModule_New(name);
1364 module = PyModule_NewObject(module_name);
1367 PyObject *result = _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1369#if PYTHON_VERSION < 0x350
1370 if (unlikely(result == NULL)) {
1371 Nuitka_DelModule(tstate, module_name);
1375 Py_DECREF(module_name);
1380PyObject *EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module) {
1381 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1382 assert(module_name);
1384 char const *name = Nuitka_String_AsString(module_name);
1386 return _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1389static PyObject *_nuitka_loader_load_module(PyObject *self, PyObject *args, PyObject *kwds) {
1390 PyObject *module_name;
1393 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:load_module", (
char **)_kw_list_find_module, &module_name,
1396 if (unlikely(res == 0)) {
1400 assert(module_name);
1401 assert(Nuitka_String_Check(module_name));
1403 char const *name = Nuitka_String_AsString(module_name);
1406 PySys_WriteStderr(
"Loading %s\n", name);
1409 PyThreadState *tstate = PyThreadState_GET();
1411#if !_NUITKA_STANDALONE_MODE
1412 if (installed_extension_modules != NULL) {
1413 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1415 if (extension_module_filename != NULL) {
1417 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1422 return IMPORT_EMBEDDED_MODULE(tstate, name);
1425static char const *_kw_list_is_package[] = {
"fullname", NULL};
1427static PyObject *_nuitka_loader_is_package(PyObject *self, PyObject *args, PyObject *kwds) {
1428 PyObject *module_name;
1430 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:is_package", (
char **)_kw_list_is_package, &module_name);
1432 if (unlikely(res == 0)) {
1436 assert(module_name);
1437 assert(Nuitka_String_Check(module_name));
1439 char const *name = Nuitka_String_AsString(module_name);
1446 result = BOOL_FROM((entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1452 Py_INCREF_IMMORTAL(result);
1456static char const *_kw_list_iter_modules[] = {
"package", NULL};
1458static PyObject *_nuitka_loader_iter_modules(
struct Nuitka_LoaderObject *self, PyObject *args, PyObject *kwds) {
1461 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:iter_modules", (
char **)_kw_list_iter_modules, &prefix);
1463 if (unlikely(res == 0)) {
1467 NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
1469 PyObject *result = MAKE_LIST_EMPTY(tstate, 0);
1476 if (self->m_loader_entry) {
1477 s = self->m_loader_entry->name;
1482 while (current->name != NULL) {
1483 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1484 current->name = UN_TRANSLATE(current->name);
1485 current->flags -= NUITKA_TRANSLATED_FLAG;
1488 int c = strncmp(s, current->name, strlen(s));
1495 if (strcmp(current->name,
"__main__") == 0) {
1500 if (current->name[strlen(s)] !=
'.') {
1505 char const *sub = strchr(current->name + strlen(s) + 1,
'.');
1513 if (self->m_loader_entry) {
1514 name = Nuitka_String_FromString(current->name + strlen(s) + 1);
1516 name = Nuitka_String_FromString(current->name);
1519 if (CHECK_IF_TRUE(prefix)) {
1520 PyObject *old = name;
1521 name = PyUnicode_Concat(prefix, name);
1525 PyObject *r = MAKE_TUPLE_EMPTY(tstate, 2);
1526 PyTuple_SET_ITEM(r, 0, name);
1527 PyTuple_SET_ITEM_IMMORTAL(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1529 LIST_APPEND1(result, r);
1538#if defined(_NUITKA_FREEZER_HAS_FILE_PATH)
1540 wchar_t buffer[1024];
1543 appendWStringSafeW(buffer, entry->file_path,
sizeof(buffer));
1544 stripFilenameW(buffer);
1545 PyObject *dir_name = NuitkaUnicode_FromWideChar(buffer, -1);
1548 copyStringSafe(buffer, entry->file_path,
sizeof(buffer));
1550 PyObject *dir_name = Nuitka_String_FromString(dirname(buffer));
1553 PyObject *module_name;
1554 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1555 module_name = Nuitka_String_FromString(entry->name);
1558 copyStringSafe(buffer, entry->name,
sizeof(buffer));
1560 char *dot = strrchr(buffer,
'.');
1565 module_name = Nuitka_String_FromString(buffer);
1568#if PYTHON_VERSION < 0x300
1569 PyObject *module_path = STR_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1571 PyObject *module_path = UNICODE_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1573 Py_DECREF(module_name);
1575 if (unlikely(module_path == NULL)) {
1579 PyObject *dir_name = MAKE_RELATIVE_PATH(module_path);
1580 Py_DECREF(module_path);
1586#if PYTHON_VERSION >= 0x300
1588PyObject *getImportLibBootstrapModule(
void) {
1589 static PyObject *importlib = NULL;
1590 if (importlib == NULL) {
1591 importlib = PyImport_ImportModule(
"importlib._bootstrap");
1599 PyObject *dir_name = getModuleDirectory(tstate, entry);
1601 char filename_buffer[1024];
1603 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1604 copyStringSafe(filename_buffer,
"__init__",
sizeof(filename_buffer));
1606 char const *basename = strrchr(entry->name,
'.');
1608 if (basename == NULL) {
1609 basename = entry->name;
1614 copyStringSafe(filename_buffer, basename,
sizeof(filename_buffer));
1617 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1619 appendStringSafe(filename_buffer,
".pyd",
sizeof(filename_buffer));
1621 appendStringSafe(filename_buffer,
".so",
sizeof(filename_buffer));
1624 appendStringSafe(filename_buffer,
".py",
sizeof(filename_buffer));
1627 PyObject *module_filename = Nuitka_String_FromString(filename_buffer);
1629 PyObject *result = JOIN_PATH2(dir_name, module_filename);
1631 Py_DECREF(module_filename);
1636#if PYTHON_VERSION >= 0x300
1638static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1643 PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:module_repr", (
char **)_kw_list_find_module, &module, &unused);
1645 if (unlikely(res == 0)) {
1649 PyThreadState *tstate = PyThreadState_GET();
1651 return PyUnicode_FromFormat(
"<module '%s' from %R>", PyModule_GetName(module),
1652 Nuitka_GetFilenameObject(tstate, module));
1655static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1656 static PyObject *module_spec_class = NULL;
1658 if (module_spec_class == NULL) {
1659 module_spec_class = PyObject_GetAttrString(importlib_module,
"ModuleSpec");
1662 return module_spec_class;
1665static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin,
bool is_package) {
1666 CHECK_OBJECT(module_name);
1667 assert(Nuitka_String_Check(module_name));
1668 CHECK_OBJECT_X(origin);
1670 PyObject *importlib_module = getImportLibBootstrapModule();
1672 if (unlikely(importlib_module == NULL)) {
1676 PyObject *module_spec_class = getModuleSpecClass(importlib_module);
1678 if (unlikely(module_spec_class == NULL)) {
1682 PyObject *args = MAKE_TUPLE2(tstate, module_name, (PyObject *)&Nuitka_Loader_Type);
1684 PyObject *kw_values[] = {is_package ? Py_True : Py_False, origin};
1686 char const *kw_keys[] = {
"is_package",
"origin"};
1688 PyObject *kw_args = MAKE_DICT_X_CSTR(kw_keys, kw_values,
sizeof(kw_values) /
sizeof(PyObject *));
1690 PyObject *result = CALL_FUNCTION(tstate, module_spec_class, args, kw_args);
1698#if !_NUITKA_STANDALONE_MODE
1700static PyObject *createModuleSpecViaPathFinder(PyThreadState *tstate, PyObject *module_name,
1701 char const *parent_module_name) {
1702 if (scanModuleInPackagePath(tstate, module_name, parent_module_name)) {
1703 return createModuleSpec(tstate, module_name, NULL,
false);
1711static char const *_kw_list_find_spec[] = {
"fullname",
"is_package",
"path", NULL};
1713static PyObject *_nuitka_loader_find_spec(PyObject *self, PyObject *args, PyObject *kwds) {
1714 PyObject *module_name;
1718 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|OO:find_spec", (
char **)_kw_list_find_spec, &module_name,
1719 &unused1, &unused2);
1721 if (unlikely(res == 0)) {
1725 char const *full_name = Nuitka_String_AsString(module_name);
1728 PySys_WriteStderr(
"import %s # considering responsibility (find_spec)\n", full_name);
1733 PyThreadState *tstate = PyThreadState_GET();
1735#if !_NUITKA_STANDALONE_MODE
1739 if (entry == NULL) {
1740 entry = findContainingPackageEntry(full_name);
1742 if (entry != NULL) {
1743 PyObject *result = createModuleSpecViaPathFinder(tstate, module_name, entry->name);
1745 if (result != NULL) {
1747 PySys_WriteStderr(
"import %s # claimed responsibility (%s, contained in compiled package %s)\n",
1748 full_name, getEntryModeString(entry), entry->name);
1754 if (HAS_ERROR_OCCURRED(tstate)) {
1763 if (entry == NULL) {
1765 PySys_WriteStderr(
"import %s # denied responsibility\n", full_name);
1768 Py_INCREF_IMMORTAL(Py_None);
1773 PySys_WriteStderr(
"import %s # claimed responsibility (%s)\n", Nuitka_String_AsString(module_name),
1774 getEntryModeString(entry));
1777 return createModuleSpec(tstate, module_name, getModuleFileValue(tstate, entry),
1778 (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1781#if PYTHON_VERSION >= 0x350
1782static char const *_kw_list_create_module[] = {
"spec", NULL};
1784static PyObject *_nuitka_loader_create_module(PyObject *self, PyObject *args, PyObject *kwds) {
1787 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:create_module", (
char **)_kw_list_create_module, &spec);
1789 if (unlikely(res == 0)) {
1793 PyThreadState *tstate = PyThreadState_GET();
1795 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, spec, const_str_plain_name);
1797 if (unlikely(module_name == NULL)) {
1802 char const *name = Nuitka_String_AsString(module_name);
1803 if (unlikely(name == NULL)) {
1804 Py_DECREF(module_name);
1809 PySys_WriteStderr(
"import %s # create module\n", name);
1814#if !_NUITKA_STANDALONE_MODE && !_NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1815 if (installed_extension_modules != NULL) {
1816 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1818 if (extension_module_filename != NULL) {
1819 Py_DECREF(module_name);
1820 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1825#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1833 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1834 result = _EXECUTE_EMBEDDED_MODULE(tstate, NULL, module_name, name);
1836 result = PyModule_NewObject(module_name);
1839 Py_DECREF(module_name);
1844static char const *_kw_list_exec_module[] = {
"module", NULL};
1846static PyObject *_nuitka_loader_exec_module(PyObject *self, PyObject *args, PyObject *kwds) {
1849 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:exec_module", (
char **)_kw_list_exec_module, &module);
1851 if (unlikely(res == 0)) {
1855 PyThreadState *tstate = PyThreadState_GET();
1857 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1859 if (unlikely(module_name == NULL)) {
1864 char const *name = Nuitka_String_AsString(module_name);
1865 if (unlikely(name == NULL)) {
1866 Py_DECREF(module_name);
1871 PySys_WriteStderr(
"import %s # execute module\n", name);
1876#if !_NUITKA_STANDALONE_MODE && _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1877 if (installed_extension_modules != NULL) {
1878 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1880 if (extension_module_filename != NULL) {
1882 bool b_res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
1884 if (unlikely(b_res ==
false)) {
1886 CLEAR_ERROR_OCCURRED(tstate);
1889 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1894#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1900 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1903 if (unlikely(!PyModule_Check(module))) {
1907 PyModuleDef *def = PyModule_GetDef(module);
1912 void *state = PyModule_GetState(module);
1913 if (state != NULL) {
1917 res = PyModule_ExecDef(module, def);
1919 if (unlikely(res == -1)) {
1925 CHECK_OBJECT(module);
1930 Py_DECREF(module_name);
1932 return EXECUTE_EMBEDDED_MODULE(tstate, module);
1935#if PYTHON_VERSION >= 0x370
1938#include "MetaPathBasedLoaderResourceReader.c"
1940static PyObject *_nuitka_loader_get_resource_reader(PyObject *self, PyObject *args, PyObject *kwds) {
1941 PyObject *module_name;
1944 PyArg_ParseTupleAndKeywords(args, kwds,
"O:get_resource_reader", (
char **)_kw_list_exec_module, &module_name);
1946 if (unlikely(res == 0)) {
1950 char const *name = Nuitka_String_AsString(module_name);
1956 PySys_WriteStderr(
"import %s # get_resource_reader (%s)\n", name, getEntryModeString(entry));
1959 return Nuitka_ResourceReader_New(entry);
1962 PyErr_Format(PyExc_RuntimeError,
"Requested resource reader for unhandled module %s", module_name);
1972static char const *_kw_list_find_distributions[] = {
"context", NULL};
1974static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *args, PyObject *kwds) {
1978 PyArg_ParseTupleAndKeywords(args, kwds,
"O:find_distributions", (
char **)_kw_list_find_distributions, &context);
1980 if (unlikely(res == 0)) {
1984 PyObject *name = PyObject_GetAttr(context, const_str_plain_name);
1986 if (unlikely(name == NULL)) {
1990 PyThreadState *tstate = PyThreadState_GET();
1992 PyObject *temp = MAKE_LIST_EMPTY(tstate, 0);
1995 PyObject *distribution_name;
1997 while (Nuitka_DistributionNext(&pos, &distribution_name)) {
1998 bool include =
false;
1999 if (name == Py_None) {
2002 nuitka_bool cmp_res = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(name, distribution_name);
2004 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2009 include = cmp_res == NUITKA_BOOL_TRUE;
2014 PyObject *distribution = Nuitka_Distribution_New(tstate, distribution_name);
2016 if (distribution == NULL) {
2021 LIST_APPEND1(temp, distribution);
2026 PyObject *result = MAKE_ITERATOR_INFALLIBLE(temp);
2032static char const *_kw_list_sys_path_hook[] = {
"path", NULL};
2034static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, PyObject *kwds) {
2037 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:sys_path_hook", (
char **)_kw_list_sys_path_hook, &path);
2039 if (unlikely(res == 0)) {
2044 PRINT_STRING(
"CONSIDER PATH:");
2052 PyThreadState *tstate = PyThreadState_GET();
2054 while (entry->name != NULL) {
2055 if ((entry->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2056 entry->name = UN_TRANSLATE(entry->name);
2057 entry->flags -= NUITKA_TRANSLATED_FLAG;
2060 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
2061 PyObject *module_directory = getModuleDirectory(tstate, entry);
2064 PRINT_STRING(entry->name);
2066 PRINT_ITEM(module_directory);
2070 nuitka_bool cmp_res = compareFilePaths(tstate, module_directory, path);
2072 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2077 if (cmp_res == NUITKA_BOOL_TRUE) {
2078 return Nuitka_Loader_New(entry);
2085 SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_ImportError);
2089static PyMethodDef Nuitka_Loader_methods[] = {
2090 {
"iter_modules", (PyCFunction)_nuitka_loader_iter_modules, METH_VARARGS | METH_KEYWORDS, NULL},
2091 {
"get_data", (PyCFunction)_nuitka_loader_get_data, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2092 {
"find_module", (PyCFunction)_nuitka_loader_find_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2093 {
"load_module", (PyCFunction)_nuitka_loader_load_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2094 {
"is_package", (PyCFunction)_nuitka_loader_is_package, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2095#if PYTHON_VERSION >= 0x300
2096 {
"module_repr", (PyCFunction)_nuitka_loader_repr_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2097 {
"find_spec", (PyCFunction)_nuitka_loader_find_spec, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2099#if PYTHON_VERSION >= 0x350
2100 {
"create_module", (PyCFunction)_nuitka_loader_create_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2101 {
"exec_module", (PyCFunction)_nuitka_loader_exec_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2103#if PYTHON_VERSION >= 0x370
2104 {
"get_resource_reader", (PyCFunction)_nuitka_loader_get_resource_reader, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2108 {
"find_distributions", (PyCFunction)_nuitka_loader_find_distributions, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2111 {
"sys_path_hook", (PyCFunction)_nuitka_loader_sys_path_hook, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2117 if (loader->m_loader_entry == NULL) {
2119 return Nuitka_String_FromString(
"<nuitka_module_loader>");
2121 return Nuitka_String_FromFormat(
"<nuitka_module_loader for '%s'>", loader->m_loader_entry->name);
2125#include "nuitka/freelists.h"
2132#define MAX_LOADER_FREE_LIST_COUNT 10
2134static int free_list_loaders_count = 0;
2137 Nuitka_GC_UnTrack(loader);
2139 releaseToFreeList(free_list_loaders, loader, MAX_LOADER_FREE_LIST_COUNT);
2142static int Nuitka_Loader_tp_traverse(
struct Nuitka_LoaderObject *loader, visitproc visit,
void *arg) {
return 0; }
2144static PyObject *Nuitka_Loader_get_name(
struct Nuitka_LoaderObject *loader,
void *closure) {
2145 PyObject *result = Nuitka_String_FromString(loader->m_loader_entry->name);
2149static PyObject *Nuitka_Loader_get_path(
struct Nuitka_LoaderObject *loader,
void *closure) {
2150 PyThreadState *tstate = PyThreadState_GET();
2151 PyObject *result = getModuleFileValue(tstate, loader->m_loader_entry);
2156static PyObject *Nuitka_Loader_get__module__(
struct Nuitka_LoaderObject *loader,
void *closure) {
2157 PyObject *result = const_str_plain___nuitka__;
2159 Py_INCREF_IMMORTAL(result);
2163static PyGetSetDef Nuitka_Loader_tp_getset[] = {{(
char *)
"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
2164 {(
char *)
"name", (getter)Nuitka_Loader_get_name, NULL, NULL},
2165 {(
char *)
"path", (getter)Nuitka_Loader_get_path, NULL, NULL},
2168PyTypeObject Nuitka_Loader_Type = {
2169 PyVarObject_HEAD_INIT(NULL, 0)
"nuitka_module_loader",
2172 (destructor)Nuitka_Loader_tp_dealloc,
2177 (reprfunc)Nuitka_Loader_tp_repr,
2187 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
2189 (traverseproc)Nuitka_Loader_tp_traverse,
2195 Nuitka_Loader_methods,
2197 Nuitka_Loader_tp_getset,
2204 allocateFromFreeListFixed(free_list_loaders,
struct Nuitka_LoaderObject, Nuitka_Loader_Type);
2205 Nuitka_GC_Track(result);
2207 result->m_loader_entry = entry;
2209 return (PyObject *)result;
2212#if _NUITKA_MODULE_MODE
2213void updateMetaPathBasedLoaderModuleRoot(
char const *module_root_name) {
2214 assert(module_root_name != NULL);
2215 char const *last_dot = strrchr(module_root_name,
'.');
2217 if (last_dot != NULL) {
2221 while (current->name != NULL) {
2222 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2223 current->name = UN_TRANSLATE(current->name);
2224 current->flags -= NUITKA_TRANSLATED_FLAG;
2229 if (strcmp(last_dot + 1, current->name) == 0) {
2230 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2231 appendStringSafe(name, current->name,
sizeof(name));
2233 current->name = strdup(name);
2234 }
else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
2235 current->name[strlen(last_dot + 1)] ==
'.') {
2236 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2237 appendStringSafe(name, current->name,
sizeof(name));
2239 current->name = strdup(name);
2249 unsigned char **bytecode_data) {
2251 if (loader_entries) {
2252 assert(_loader_entries == loader_entries);
2257 _bytecode_data = (
char **)bytecode_data;
2260 PySys_WriteStderr(
"Setup nuitka compiled module/bytecode/extension importer.\n");
2263 loader_entries = _loader_entries;
2265#if _NUITKA_MODULE_MODE && PYTHON_VERSION < 0x3c0
2266 if (_Py_PackageContext != NULL) {
2267 updateMetaPathBasedLoaderModuleRoot(_Py_PackageContext);
2271 Nuitka_PyType_Ready(&Nuitka_Loader_Type, NULL,
true,
false,
false,
false,
false);
2273#if PYTHON_VERSION >= 0x370
2274 Nuitka_PyType_Ready(&Nuitka_ResourceReader_Type, NULL,
true,
false,
false,
false,
false);
2278 PyObject *global_loader = Nuitka_Loader_New(NULL);
2280 LIST_INSERT_CONST(Nuitka_SysGetObject(
"meta_path"),
2281#
if PYTHON_VERSION < 0x300
2291 PyThreadState *tstate = PyThreadState_GET();
2292 IMPORT_HARD_OS_PATH(tstate);
2295#if _NUITKA_STANDALONE_MODE
2296 LIST_INSERT_CONST(Nuitka_SysGetObject(
"path_hooks"), 0, PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2301 LIST_APPEND1(Nuitka_SysGetObject(
"path_hooks"), PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2305#if _NUITKA_STANDALONE_MODE
2308void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
2309 PyObject *sys_modules = Nuitka_GetSysModules();
2311 PyObject *key, *value;
2313 PyObject *builtin_module_names = Nuitka_SysGetObject(
"builtin_module_names");
2315 while (Nuitka_DictNext(sys_modules, &pos, &key, &value)) {
2316 if (key != NULL && value != NULL && PyModule_Check(value)) {
2317 bool is_package = HAS_ATTR_BOOL(tstate, value, const_str_plain___path__);
2319 if (is_package || HAS_ATTR_BOOL(tstate, value, const_str_plain___file__) ||
2320 PySequence_Contains(builtin_module_names, key) == 0) {
2321 PyObject *file_value = MAKE_RELATIVE_PATH_FROM_NAME(Nuitka_String_AsString(key), is_package,
false);
2322 PyObject_SetAttr(value, const_str_plain___file__, file_value);
2323 Py_DECREF(file_value);
2324 CHECK_OBJECT(file_value);
2329 assert(!HAS_ERROR_OCCURRED(tstate));
2335#include "MetaPathBasedLoaderImportlibMetadataDistribution.c"
Definition exceptions.h:712
Definition MetaPathBasedLoader.c:28
Definition unfreezing.h:31