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;
828 if (base_name != NULL) {
829 base_name_obj = Nuitka_String_FromString(base_name + 1);
830 preserved_basename_module = Nuitka_GetModule(tstate, base_name_obj);
831 Py_XINCREF(preserved_basename_module);
833 prefix_name_obj = Nuitka_String_FromStringAndSize(full_name, base_name - full_name + 1);
838 PGO_onModuleEntered(full_name);
841 PySys_WriteStderr(
"import %s # calling entrypoint\n", full_name);
844 Nuitka_DelModuleString(tstate, full_name);
846#if PYTHON_VERSION < 0x300
849 PyObject *
module = (*entrypoint)();
853 PySys_WriteStderr(
"import %s # return from entrypoint\n", full_name);
857 PRINT_FORMAT(
"import %s # create module as ", full_name);
862 NuitkaImport_SwapPackageContext(old_context);
864#if PYTHON_VERSION < 0x300
865 PyObject *
module = Nuitka_GetModuleString(tstate, full_name);
868 PGO_onModuleExit(name, module == NULL);
870 if (unlikely(module == NULL)) {
871 if (unlikely(!HAS_ERROR_OCCURRED(tstate))) {
872 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly", full_name);
878#if PYTHON_VERSION >= 0x300
879#if PYTHON_VERSION >= 0x350
882 if (Py_TYPE(module) == &PyModuleDef_Type) {
884 PySys_WriteStderr(
"import %s # entrypoint returned module def\n", full_name);
887 def = (PyModuleDef *)module;
889 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
891 PyObject *origin = Nuitka_String_FromFilename(filename);
893 PyObject *spec_value = createModuleSpec(tstate, full_name_obj, origin, is_package);
894 CHECK_OBJECT(spec_value);
896 module = PyModule_FromDefAndSpec(def, spec_value);
898 if (unlikely(module == NULL)) {
899 Py_DECREF(spec_value);
901 PyErr_Format(PyExc_SystemError,
"dynamic module '%s' not initialized properly from def", full_name);
906 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
908 setModuleFileValue(tstate, module, filename);
911 PyObject *path_list = _makeDunderPathObject(tstate, origin);
913 int res = PyObject_SetAttr(module, const_str_plain___path__, path_list);
914 if (unlikely(res != 0)) {
918 Py_DECREF(path_list);
920 Nuitka_SetModule(full_name_obj, module);
921 Py_DECREF(full_name_obj);
923#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
924 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_True);
925 res = PyModule_ExecDef(module, def);
926 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
928 Py_DECREF(spec_value);
929 CHECK_OBJECT(spec_value);
931 if (unlikely(res == -1)) {
936 PySys_WriteStderr(
"import %s # executed module def\n", full_name);
940 CHECK_OBJECT(module);
945 PySys_WriteStderr(
"import %s # entrypoint returned module\n", full_name);
948 def = PyModule_GetDef(module);
950 def->m_base.m_init = entrypoint;
953 setModuleFileValue(tstate, module, filename);
954 PyObject *full_name_obj = Nuitka_String_FromString(full_name);
955 SET_ATTRIBUTE(tstate, module, const_str_plain___name__, full_name_obj);
956 PyObject *spec_value =
957 createModuleSpec(tstate, full_name_obj, LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___file__),
false);
959 SET_ATTRIBUTE(tstate, module, const_str_plain___spec__, spec_value);
963 if (package != NULL) {
964 PyObject *package_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___package__);
966 if (package_name == Py_None) {
968 copyStringSafeN(package2, full_name, dot - full_name,
sizeof(package2));
970 PyObject *package_name_obj = Nuitka_String_FromString(package2);
971 SET_ATTRIBUTE(tstate, module, const_str_plain___package__, package_name_obj);
972 Py_DECREF(package_name_obj);
975 Py_DECREF(package_name);
979 if (likely(def != NULL)) {
980 def->m_base.m_init = entrypoint;
984 PyModuleDef *def = PyModule_GetDef(module);
986 if (unlikely(def == NULL)) {
987 PyErr_Format(PyExc_SystemError,
"initialization of %s did not return an extension module", filename);
992 def->m_base.m_init = entrypoint;
999 setModuleFileValue(tstate, module, filename);
1003#if PYTHON_VERSION < 0x300
1004 PyObject *res2 = _PyImport_FixupExtension((
char *)full_name, (
char *)filename);
1006 if (unlikely(res2 == NULL)) {
1010 PyObject *full_name_obj = PyUnicode_FromString(full_name);
1011 CHECK_OBJECT(full_name_obj);
1012 PyObject *filename_obj = Nuitka_String_FromFilename(filename);
1014 CHECK_OBJECT(filename_obj);
1018#if PYTHON_VERSION >= 0x3c0 && !defined(_NUITKA_USE_UNEXPOSED_API)
1019 if (preserved_basename_module != NULL) {
1020#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1021 PRINT_STRING(
"Handling for preservation: ");
1022 PRINT_ITEM_LINE(full_name_obj);
1023 PRINT_STRING(
"Restoring preserved module: ");
1024 PRINT_ITEM(base_name_obj);
1025 if (Nuitka_HasModule(tstate, base_name_obj)) {
1026 PRINT_STRING(
" changes ");
1027 PRINT_ITEM(Nuitka_GetModule(tstate, base_name_obj));
1029 PRINT_STRING(
" -> ");
1030 PRINT_ITEM_LINE(preserved_basename_module);
1032 Nuitka_SetModule(base_name_obj, preserved_basename_module);
1033 Py_DECREF(preserved_basename_module);
1036 if (base_name_obj != NULL) {
1037 PyObject *need_correction = MAKE_LIST_EMPTY(tstate, 0);
1040 PyObject *modules_dict = Nuitka_GetSysModules();
1043 PyObject *key, *value;
1045 PyObject *base_name_prefix = BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(base_name_obj, const_str_dot);
1046#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1047 PRINT_STRING(
"Scanning for modules needing correction: ");
1048 PRINT_ITEM_LINE(base_name_prefix);
1050 while (Nuitka_DictNext(modules_dict, &pos, &key, &value)) {
1052 PyObject *starts_with_result = UNICODE_STARTSWITH2(tstate, key, base_name_prefix);
1054 if (CHECK_IF_TRUE(starts_with_result) == 1) {
1055 LIST_APPEND0(need_correction, key);
1058 Py_DECREF(starts_with_result);
1062#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1063 PRINT_STRING(
"Correction needed:");
1064 PRINT_ITEM_LINE(need_correction);
1067 Py_ssize_t n = PyList_GET_SIZE(need_correction);
1069 for (Py_ssize_t i = 0; i < n; i++) {
1070 PyObject *module_to_correct_name = PyList_GET_ITEM(need_correction, i);
1072 PyObject *correct_module_name =
1073 BINARY_OPERATION_ADD_OBJECT_UNICODE_UNICODE(prefix_name_obj, module_to_correct_name);
1075 PyObject *module_to_correct = Nuitka_GetModule(tstate, module_to_correct_name);
1077#if _NUITKA_EXPERIMENTAL_DEBUG_EXTENSION_MODULE_PRESERVATION_HACK
1078 PRINT_ITEM(module_to_correct_name);
1079 PRINT_STRING(
" -> ");
1080 PRINT_ITEM(correct_module_name);
1081 PRINT_STRING(
" changes ");
1082 PRINT_ITEM_LINE(module_to_correct);
1084 Nuitka_SetModule(correct_module_name, module_to_correct);
1086 Nuitka_DelModule(tstate, module_to_correct_name);
1089 Py_DECREF(base_name_obj);
1090 Py_DECREF(prefix_name_obj);
1094#if PYTHON_VERSION < 0x3d0
1095 int res = _PyImport_FixupExtensionObject(module, full_name_obj, filename_obj
1096#
if PYTHON_VERSION >= 0x370
1098 Nuitka_GetSysModules()
1103#if PYTHON_VERSION >= 0x3d0
1104 Nuitka_SetModuleString(full_name, module);
1107 Py_DECREF(full_name_obj);
1108 Py_DECREF(filename_obj);
1110#if PYTHON_VERSION < 0x3d0
1111 if (unlikely(res == -1)) {
1120static void loadTriggeredModule(PyThreadState *tstate,
char const *name,
char const *trigger_name) {
1121 char trigger_module_name[2048];
1123 copyStringSafe(trigger_module_name, name,
sizeof(trigger_module_name));
1124 appendStringSafe(trigger_module_name, trigger_name,
sizeof(trigger_module_name));
1128 if (entry != NULL) {
1130 PySys_WriteStderr(
"Loading %s\n", trigger_module_name);
1133 IMPORT_EMBEDDED_MODULE(tstate, trigger_module_name);
1135 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1136 if ((entry->flags & NUITKA_ABORT_MODULE_FLAG) != 0) {
1137 printf(
"Critical error loading %s.\n", trigger_module_name);
1140 PyObject *trigger_module_name_str = Nuitka_String_FromString(trigger_module_name);
1141 PyErr_WriteUnraisable(trigger_module_name_str);
1142 Py_DECREF(trigger_module_name_str);
1148#if PYTHON_VERSION >= 0x300
1149static void _fixupSpecAttribute(PyThreadState *tstate, PyObject *module) {
1150 PyObject *spec_value = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___spec__);
1152 if (spec_value && spec_value != Py_None) {
1153 if (HAS_ATTR_BOOL(tstate, spec_value, const_str_plain__initializing)) {
1154 SET_ATTRIBUTE(tstate, spec_value, const_str_plain__initializing, Py_False);
1161static char **_bytecode_data = NULL;
1163static PyObject *loadModule(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1165#if _NUITKA_STANDALONE_MODE
1166 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1167 bool is_package = (entry->flags & NUITKA_PACKAGE_FLAG) != 0;
1169 filename_char_t filename[MAXPATHLEN + 1];
1170 _makeModuleCFilenameValue(filename,
sizeof(filename) /
sizeof(filename_char_t), entry->name, module_name,
1173 callIntoExtensionModule(tstate, entry->name, filename, is_package);
1176 if ((entry->flags & NUITKA_BYTECODE_FLAG) != 0) {
1180 PyCodeObject *code_object =
1181 (PyCodeObject *)PyMarshal_ReadObjectFromString(_bytecode_data[entry->bytecode_index], entry->bytecode_size);
1184 if (unlikely(code_object == NULL)) {
1189 return loadModuleFromCodeObject(tstate, module, code_object, entry->name,
1190 (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1192 assert((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) == 0);
1193 assert(entry->python_init_func);
1196 NUITKA_MAY_BE_UNUSED
bool res = Nuitka_SetModule(module_name, module);
1197 assert(res !=
false);
1201#if PYTHON_VERSION < 0x300
1202 NUITKA_MAY_BE_UNUSED
1204 PyObject *result = entry->python_init_func(tstate, module, entry);
1205 CHECK_OBJECT_X(result);
1207#if PYTHON_VERSION >= 0x300
1208 if (likely(result != NULL)) {
1209 _fixupSpecAttribute(tstate, result);
1214 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1219 PySys_WriteStderr(
"Loaded %s\n", entry->name);
1222 return Nuitka_GetModule(tstate, module_name);
1225static PyObject *_EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module, PyObject *module_name,
1228 CHECK_OBJECT_X(module);
1229 CHECK_OBJECT(module_name);
1232 bool frozen_import = entry == NULL && hasFrozenModule(name);
1234 if (entry != NULL || frozen_import) {
1239 loadTriggeredModule(tstate, name,
"-preLoad");
1242 PyObject *result = NULL;
1244 if (entry != NULL) {
1245#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1249 result = loadModule(tstate, module, module_name, entry);
1251#if !defined(_NUITKA_DEPLOYMENT_MODE) && !defined(_NUITKA_NO_DEPLOYMENT_PERFECT_SUPPORT)
1252 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
1253 if ((entry->flags & NUITKA_PERFECT_SUPPORTED_FLAG) != 0) {
1254 PyObject *exception_arg =
1255 PyUnicode_FromFormat(
"import of module '%s' failed unexpectedly despite intended perfect "
1256 "support, please raise a Nuitka issue and compile "
1257 "with an older version of the module in the meantime",
1261 FETCH_ERROR_OCCURRED_STATE(tstate, &saved_exception);
1263#if PYTHON_VERSION < 0x3c0
1264 NORMALIZE_EXCEPTION_STATE(tstate, &saved_exception);
1268 SET_EXCEPTION_PRESERVATION_STATE_FROM_ARGS(tstate, &new_exception_state, PyExc_RuntimeError,
1269 exception_arg, NULL);
1270 Py_INCREF_IMMORTAL(PyExc_RuntimeError);
1272 Nuitka_Exception_SetContext(new_exception_state.exception_value, saved_exception.exception_value);
1274 RESTORE_ERROR_OCCURRED_STATE(tstate, &new_exception_state);
1279#ifdef _NUITKA_EXPERIMENTAL_FORCE_GC_COLLECT_ON_IMPORT
1283 if (unlikely(result == NULL)) {
1288 if (frozen_import) {
1289 PGO_onModuleEntered(name);
1290 int res = PyImport_ImportFrozenModule((
char *)name);
1291 PGO_onModuleExit(name, res == -1);
1293 if (unlikely(res == -1)) {
1298 result = Nuitka_GetModule(tstate, module_name);
1302 if (result != NULL) {
1307 loadTriggeredModule(tstate, name,
"-postLoad");
1312 Py_INCREF_IMMORTAL(Py_None);
1318PyObject *IMPORT_EMBEDDED_MODULE(PyThreadState *tstate,
char const *name) {
1319 PyObject *module_name = Nuitka_String_FromString(name);
1322 PyObject *
module = Nuitka_GetModule(tstate, module_name);
1324 if (module != NULL) {
1325 Py_DECREF(module_name);
1329#if PYTHON_VERSION < 0x300
1330 module = PyModule_New(name);
1332 module = PyModule_NewObject(module_name);
1335 PyObject *result = _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1337#if PYTHON_VERSION < 0x350
1338 if (unlikely(result == NULL)) {
1339 Nuitka_DelModule(tstate, module_name);
1343 Py_DECREF(module_name);
1348PyObject *EXECUTE_EMBEDDED_MODULE(PyThreadState *tstate, PyObject *module) {
1349 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1350 assert(module_name);
1352 char const *name = Nuitka_String_AsString(module_name);
1354 return _EXECUTE_EMBEDDED_MODULE(tstate, module, module_name, name);
1357static PyObject *_nuitka_loader_load_module(PyObject *self, PyObject *args, PyObject *kwds) {
1358 PyObject *module_name;
1361 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:load_module", (
char **)_kw_list_find_module, &module_name,
1364 if (unlikely(res == 0)) {
1368 assert(module_name);
1369 assert(Nuitka_String_Check(module_name));
1371 char const *name = Nuitka_String_AsString(module_name);
1374 PySys_WriteStderr(
"Loading %s\n", name);
1377 PyThreadState *tstate = PyThreadState_GET();
1379#if !_NUITKA_STANDALONE_MODE
1380 if (installed_extension_modules != NULL) {
1381 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1383 if (extension_module_filename != NULL) {
1385 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1390 return IMPORT_EMBEDDED_MODULE(tstate, name);
1393static char const *_kw_list_is_package[] = {
"fullname", NULL};
1395static PyObject *_nuitka_loader_is_package(PyObject *self, PyObject *args, PyObject *kwds) {
1396 PyObject *module_name;
1398 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:is_package", (
char **)_kw_list_is_package, &module_name);
1400 if (unlikely(res == 0)) {
1404 assert(module_name);
1405 assert(Nuitka_String_Check(module_name));
1407 char const *name = Nuitka_String_AsString(module_name);
1414 result = BOOL_FROM((entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1420 Py_INCREF_IMMORTAL(result);
1424static char const *_kw_list_iter_modules[] = {
"package", NULL};
1426static PyObject *_nuitka_loader_iter_modules(
struct Nuitka_LoaderObject *self, PyObject *args, PyObject *kwds) {
1429 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:iter_modules", (
char **)_kw_list_iter_modules, &prefix);
1431 if (unlikely(res == 0)) {
1435 NUITKA_MAY_BE_UNUSED PyThreadState *tstate = PyThreadState_GET();
1437 PyObject *result = MAKE_LIST_EMPTY(tstate, 0);
1444 if (self->m_loader_entry) {
1445 s = self->m_loader_entry->name;
1450 while (current->name != NULL) {
1451 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
1452 current->name = UN_TRANSLATE(current->name);
1453 current->flags -= NUITKA_TRANSLATED_FLAG;
1456 int c = strncmp(s, current->name, strlen(s));
1463 if (strcmp(current->name,
"__main__") == 0) {
1468 if (current->name[strlen(s)] == 0) {
1473 char const *sub = strchr(current->name + strlen(s) + 1,
'.');
1481 if (self->m_loader_entry) {
1482 name = Nuitka_String_FromString(current->name + strlen(s) + 1);
1484 name = Nuitka_String_FromString(current->name);
1487 if (CHECK_IF_TRUE(prefix)) {
1488 PyObject *old = name;
1489 name = PyUnicode_Concat(prefix, name);
1493 PyObject *r = MAKE_TUPLE_EMPTY(tstate, 2);
1494 PyTuple_SET_ITEM(r, 0, name);
1495 PyTuple_SET_ITEM_IMMORTAL(r, 1, BOOL_FROM((current->flags & NUITKA_PACKAGE_FLAG) != 0));
1497 LIST_APPEND1(result, r);
1506#if defined(_NUITKA_FREEZER_HAS_FILE_PATH)
1508 wchar_t buffer[1024];
1511 appendWStringSafeW(buffer, entry->file_path,
sizeof(buffer));
1512 stripFilenameW(buffer);
1513 PyObject *dir_name = NuitkaUnicode_FromWideChar(buffer, -1);
1516 copyStringSafe(buffer, entry->file_path,
sizeof(buffer));
1518 PyObject *dir_name = Nuitka_String_FromString(dirname(buffer));
1521 PyObject *module_name;
1522 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1523 module_name = Nuitka_String_FromString(entry->name);
1526 copyStringSafe(buffer, entry->name,
sizeof(buffer));
1528 char *dot = strrchr(buffer,
'.');
1533 module_name = Nuitka_String_FromString(buffer);
1536#if PYTHON_VERSION < 0x300
1537 PyObject *module_path = STR_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1539 PyObject *module_path = UNICODE_REPLACE3(tstate, module_name, const_str_dot, getPathSeparatorStringObject());
1541 Py_DECREF(module_name);
1543 if (unlikely(module_path == NULL)) {
1547 PyObject *dir_name = MAKE_RELATIVE_PATH(module_path);
1548 Py_DECREF(module_path);
1554#if PYTHON_VERSION >= 0x300
1556PyObject *getImportLibBootstrapModule(
void) {
1557 static PyObject *importlib = NULL;
1558 if (importlib == NULL) {
1559 importlib = PyImport_ImportModule(
"importlib._bootstrap");
1567 PyObject *dir_name = getModuleDirectory(tstate, entry);
1569 char filename_buffer[1024];
1571 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
1572 copyStringSafe(filename_buffer,
"__init__",
sizeof(filename_buffer));
1574 char const *basename = strrchr(entry->name,
'.');
1576 if (basename == NULL) {
1577 basename = entry->name;
1582 copyStringSafe(filename_buffer, basename,
sizeof(filename_buffer));
1585 if ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0) {
1587 appendStringSafe(filename_buffer,
".pyd",
sizeof(filename_buffer));
1589 appendStringSafe(filename_buffer,
".so",
sizeof(filename_buffer));
1592 appendStringSafe(filename_buffer,
".py",
sizeof(filename_buffer));
1595 PyObject *module_filename = Nuitka_String_FromString(filename_buffer);
1597 PyObject *result = JOIN_PATH2(dir_name, module_filename);
1599 Py_DECREF(module_filename);
1604#if PYTHON_VERSION >= 0x300
1606static PyObject *_nuitka_loader_repr_module(PyObject *self, PyObject *args, PyObject *kwds) {
1611 PyArg_ParseTupleAndKeywords(args, kwds,
"O|O:module_repr", (
char **)_kw_list_find_module, &module, &unused);
1613 if (unlikely(res == 0)) {
1617 PyThreadState *tstate = PyThreadState_GET();
1619 return PyUnicode_FromFormat(
"<module '%s' from %R>", PyModule_GetName(module),
1620 Nuitka_GetFilenameObject(tstate, module));
1623static PyObject *getModuleSpecClass(PyObject *importlib_module) {
1624 static PyObject *module_spec_class = NULL;
1626 if (module_spec_class == NULL) {
1627 module_spec_class = PyObject_GetAttrString(importlib_module,
"ModuleSpec");
1630 return module_spec_class;
1633static PyObject *createModuleSpec(PyThreadState *tstate, PyObject *module_name, PyObject *origin,
bool is_package) {
1634 CHECK_OBJECT(module_name);
1635 assert(Nuitka_String_Check(module_name));
1636 CHECK_OBJECT_X(origin);
1638 PyObject *importlib_module = getImportLibBootstrapModule();
1640 if (unlikely(importlib_module == NULL)) {
1644 PyObject *module_spec_class = getModuleSpecClass(importlib_module);
1646 if (unlikely(module_spec_class == NULL)) {
1650 PyObject *args = MAKE_TUPLE2(tstate, module_name, (PyObject *)&Nuitka_Loader_Type);
1652 PyObject *kw_values[] = {is_package ? Py_True : Py_False, origin};
1654 char const *kw_keys[] = {
"is_package",
"origin"};
1656 PyObject *kw_args = MAKE_DICT_X_CSTR(kw_keys, kw_values,
sizeof(kw_values) /
sizeof(PyObject *));
1658 PyObject *result = CALL_FUNCTION(tstate, module_spec_class, args, kw_args);
1666#if !_NUITKA_STANDALONE_MODE
1668static PyObject *createModuleSpecViaPathFinder(PyThreadState *tstate, PyObject *module_name,
1669 char const *parent_module_name) {
1670 if (scanModuleInPackagePath(tstate, module_name, parent_module_name)) {
1671 return createModuleSpec(tstate, module_name, NULL,
false);
1679static char const *_kw_list_find_spec[] = {
"fullname",
"is_package",
"path", NULL};
1681static PyObject *_nuitka_loader_find_spec(PyObject *self, PyObject *args, PyObject *kwds) {
1682 PyObject *module_name;
1686 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O|OO:find_spec", (
char **)_kw_list_find_spec, &module_name,
1687 &unused1, &unused2);
1689 if (unlikely(res == 0)) {
1693 char const *full_name = Nuitka_String_AsString(module_name);
1696 PySys_WriteStderr(
"import %s # considering responsibility (find_spec)\n", full_name);
1701 PyThreadState *tstate = PyThreadState_GET();
1703#if !_NUITKA_STANDALONE_MODE
1707 if (entry == NULL) {
1708 entry = findContainingPackageEntry(full_name);
1710 if (entry != NULL) {
1711 PyObject *result = createModuleSpecViaPathFinder(tstate, module_name, entry->name);
1713 if (result != NULL) {
1715 PySys_WriteStderr(
"import %s # claimed responsibility (%s, contained in compiled package %s)\n",
1716 full_name, getEntryModeString(entry), entry->name);
1722 if (HAS_ERROR_OCCURRED(tstate)) {
1731 if (entry == NULL) {
1733 PySys_WriteStderr(
"import %s # denied responsibility\n", full_name);
1736 Py_INCREF_IMMORTAL(Py_None);
1741 PySys_WriteStderr(
"import %s # claimed responsibility (%s)\n", Nuitka_String_AsString(module_name),
1742 getEntryModeString(entry));
1745 return createModuleSpec(tstate, module_name, getModuleFileValue(tstate, entry),
1746 (entry->flags & NUITKA_PACKAGE_FLAG) != 0);
1749#if PYTHON_VERSION >= 0x350
1750static char const *_kw_list_create_module[] = {
"spec", NULL};
1752static PyObject *_nuitka_loader_create_module(PyObject *self, PyObject *args, PyObject *kwds) {
1755 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:create_module", (
char **)_kw_list_create_module, &spec);
1757 if (unlikely(res == 0)) {
1761 PyThreadState *tstate = PyThreadState_GET();
1763 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, spec, const_str_plain_name);
1765 if (unlikely(module_name == NULL)) {
1770 char const *name = Nuitka_String_AsString(module_name);
1771 if (unlikely(name == NULL)) {
1772 Py_DECREF(module_name);
1777 PySys_WriteStderr(
"import %s # create module\n", name);
1782#if !_NUITKA_STANDALONE_MODE && !_NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1783 if (installed_extension_modules != NULL) {
1784 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1786 if (extension_module_filename != NULL) {
1787 Py_DECREF(module_name);
1788 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1793#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1801 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1802 result = _EXECUTE_EMBEDDED_MODULE(tstate, NULL, module_name, name);
1804 result = PyModule_NewObject(module_name);
1807 Py_DECREF(module_name);
1812static char const *_kw_list_exec_module[] = {
"module", NULL};
1814static PyObject *_nuitka_loader_exec_module(PyObject *self, PyObject *args, PyObject *kwds) {
1817 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:exec_module", (
char **)_kw_list_exec_module, &module);
1819 if (unlikely(res == 0)) {
1823 PyThreadState *tstate = PyThreadState_GET();
1825 PyObject *module_name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
1827 if (unlikely(module_name == NULL)) {
1832 char const *name = Nuitka_String_AsString(module_name);
1833 if (unlikely(name == NULL)) {
1834 Py_DECREF(module_name);
1839 PySys_WriteStderr(
"import %s # execute module\n", name);
1844#if !_NUITKA_STANDALONE_MODE && _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1845 if (installed_extension_modules != NULL) {
1846 PyObject *extension_module_filename = DICT_GET_ITEM0(tstate, installed_extension_modules, module_name);
1848 if (extension_module_filename != NULL) {
1850 bool b_res = SET_ATTRIBUTE(tstate, module, const_str_plain___file__, extension_module_filename);
1852 if (unlikely(b_res ==
false)) {
1854 CLEAR_ERROR_OCCURRED(tstate);
1857 return callIntoInstalledExtensionModule(tstate, module_name, extension_module_filename);
1862#if _NUITKA_EXPERIMENTAL_OLD_EXTENSION_MODULE_LOADING
1868 if ((entry != NULL) && ((entry->flags & NUITKA_EXTENSION_MODULE_FLAG) != 0)) {
1871 if (unlikely(!PyModule_Check(module))) {
1875 PyModuleDef *def = PyModule_GetDef(module);
1880 void *state = PyModule_GetState(module);
1881 if (state != NULL) {
1885 res = PyModule_ExecDef(module, def);
1887 if (unlikely(res == -1)) {
1893 CHECK_OBJECT(module);
1898 Py_DECREF(module_name);
1900 return EXECUTE_EMBEDDED_MODULE(tstate, module);
1903#if PYTHON_VERSION >= 0x370
1906#include "MetaPathBasedLoaderResourceReader.c"
1908static PyObject *_nuitka_loader_get_resource_reader(PyObject *self, PyObject *args, PyObject *kwds) {
1909 PyObject *module_name;
1912 PyArg_ParseTupleAndKeywords(args, kwds,
"O:get_resource_reader", (
char **)_kw_list_exec_module, &module_name);
1914 if (unlikely(res == 0)) {
1918 char const *name = Nuitka_String_AsString(module_name);
1924 PySys_WriteStderr(
"import %s # get_resource_reader (%s)\n", name, getEntryModeString(entry));
1927 return Nuitka_ResourceReader_New(entry);
1930 PyErr_Format(PyExc_RuntimeError,
"Requested resource reader for unhandled module %s", module_name);
1940static char const *_kw_list_find_distributions[] = {
"context", NULL};
1942static PyObject *_nuitka_loader_find_distributions(PyObject *self, PyObject *args, PyObject *kwds) {
1946 PyArg_ParseTupleAndKeywords(args, kwds,
"O:find_distributions", (
char **)_kw_list_find_distributions, &context);
1948 if (unlikely(res == 0)) {
1952 PyObject *name = PyObject_GetAttr(context, const_str_plain_name);
1954 if (unlikely(name == NULL)) {
1958 PyThreadState *tstate = PyThreadState_GET();
1960 PyObject *temp = MAKE_LIST_EMPTY(tstate, 0);
1963 PyObject *distribution_name;
1965 while (Nuitka_DistributionNext(&pos, &distribution_name)) {
1966 bool include =
false;
1967 if (name == Py_None) {
1970 nuitka_bool cmp_res = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(name, distribution_name);
1972 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
1977 include = cmp_res == NUITKA_BOOL_TRUE;
1982 PyObject *distribution = Nuitka_Distribution_New(tstate, distribution_name);
1984 if (distribution == NULL) {
1989 LIST_APPEND1(temp, distribution);
1994 PyObject *result = MAKE_ITERATOR_INFALLIBLE(temp);
2000static char const *_kw_list_sys_path_hook[] = {
"path", NULL};
2002static PyObject *_nuitka_loader_sys_path_hook(PyObject *self, PyObject *args, PyObject *kwds) {
2005 int res = PyArg_ParseTupleAndKeywords(args, kwds,
"O:sys_path_hook", (
char **)_kw_list_sys_path_hook, &path);
2007 if (unlikely(res == 0)) {
2012 PRINT_STRING(
"CONSIDER PATH:");
2020 PyThreadState *tstate = PyThreadState_GET();
2022 while (entry->name != NULL) {
2023 if ((entry->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2024 entry->name = UN_TRANSLATE(entry->name);
2025 entry->flags -= NUITKA_TRANSLATED_FLAG;
2028 if ((entry->flags & NUITKA_PACKAGE_FLAG) != 0) {
2029 PyObject *module_directory = getModuleDirectory(tstate, entry);
2032 PRINT_STRING(entry->name);
2034 PRINT_ITEM(module_directory);
2038 nuitka_bool cmp_res = compareFilePaths(tstate, module_directory, path);
2040 if (unlikely(cmp_res == NUITKA_BOOL_EXCEPTION)) {
2045 if (cmp_res == NUITKA_BOOL_TRUE) {
2046 return Nuitka_Loader_New(entry);
2053 SET_CURRENT_EXCEPTION_TYPE0(tstate, PyExc_ImportError);
2057static PyMethodDef Nuitka_Loader_methods[] = {
2058 {
"iter_modules", (PyCFunction)_nuitka_loader_iter_modules, METH_VARARGS | METH_KEYWORDS, NULL},
2059 {
"get_data", (PyCFunction)_nuitka_loader_get_data, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2060 {
"find_module", (PyCFunction)_nuitka_loader_find_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2061 {
"load_module", (PyCFunction)_nuitka_loader_load_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2062 {
"is_package", (PyCFunction)_nuitka_loader_is_package, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2063#if PYTHON_VERSION >= 0x300
2064 {
"module_repr", (PyCFunction)_nuitka_loader_repr_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2065 {
"find_spec", (PyCFunction)_nuitka_loader_find_spec, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2067#if PYTHON_VERSION >= 0x350
2068 {
"create_module", (PyCFunction)_nuitka_loader_create_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2069 {
"exec_module", (PyCFunction)_nuitka_loader_exec_module, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2071#if PYTHON_VERSION >= 0x370
2072 {
"get_resource_reader", (PyCFunction)_nuitka_loader_get_resource_reader, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2076 {
"find_distributions", (PyCFunction)_nuitka_loader_find_distributions, METH_STATIC | METH_VARARGS | METH_KEYWORDS,
2079 {
"sys_path_hook", (PyCFunction)_nuitka_loader_sys_path_hook, METH_STATIC | METH_VARARGS | METH_KEYWORDS, NULL},
2085 if (loader->m_loader_entry == NULL) {
2087 return Nuitka_String_FromString(
"<nuitka_module_loader>");
2089 return Nuitka_String_FromFormat(
"<nuitka_module_loader for '%s'>", loader->m_loader_entry->name);
2093#include "nuitka/freelists.h"
2100#define MAX_LOADER_FREE_LIST_COUNT 10
2102static int free_list_loaders_count = 0;
2105 Nuitka_GC_UnTrack(loader);
2107 releaseToFreeList(free_list_loaders, loader, MAX_LOADER_FREE_LIST_COUNT);
2110static int Nuitka_Loader_tp_traverse(
struct Nuitka_LoaderObject *loader, visitproc visit,
void *arg) {
return 0; }
2112static PyObject *Nuitka_Loader_get_name(
struct Nuitka_LoaderObject *loader,
void *closure) {
2113 PyObject *result = Nuitka_String_FromString(loader->m_loader_entry->name);
2117static PyObject *Nuitka_Loader_get_path(
struct Nuitka_LoaderObject *loader,
void *closure) {
2118 PyThreadState *tstate = PyThreadState_GET();
2119 PyObject *result = getModuleFileValue(tstate, loader->m_loader_entry);
2124static PyObject *Nuitka_Loader_get__module__(
struct Nuitka_LoaderObject *loader,
void *closure) {
2125 PyObject *result = const_str_plain___nuitka__;
2127 Py_INCREF_IMMORTAL(result);
2131static PyGetSetDef Nuitka_Loader_tp_getset[] = {{(
char *)
"__module__", (getter)Nuitka_Loader_get__module__, NULL, NULL},
2132 {(
char *)
"name", (getter)Nuitka_Loader_get_name, NULL, NULL},
2133 {(
char *)
"path", (getter)Nuitka_Loader_get_path, NULL, NULL},
2136PyTypeObject Nuitka_Loader_Type = {
2137 PyVarObject_HEAD_INIT(NULL, 0)
"nuitka_module_loader",
2140 (destructor)Nuitka_Loader_tp_dealloc,
2145 (reprfunc)Nuitka_Loader_tp_repr,
2155 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
2157 (traverseproc)Nuitka_Loader_tp_traverse,
2163 Nuitka_Loader_methods,
2165 Nuitka_Loader_tp_getset,
2172 allocateFromFreeListFixed(free_list_loaders,
struct Nuitka_LoaderObject, Nuitka_Loader_Type);
2173 Nuitka_GC_Track(result);
2175 result->m_loader_entry = entry;
2177 return (PyObject *)result;
2180#if _NUITKA_MODULE_MODE
2181void updateMetaPathBasedLoaderModuleRoot(
char const *module_root_name) {
2182 assert(module_root_name != NULL);
2183 char const *last_dot = strrchr(module_root_name,
'.');
2185 if (last_dot != NULL) {
2189 while (current->name != NULL) {
2190 if ((current->flags & NUITKA_TRANSLATED_FLAG) != 0) {
2191 current->name = UN_TRANSLATE(current->name);
2192 current->flags -= NUITKA_TRANSLATED_FLAG;
2197 if (strcmp(last_dot + 1, current->name) == 0) {
2198 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2199 appendStringSafe(name, current->name,
sizeof(name));
2201 current->name = strdup(name);
2202 }
else if (strncmp(last_dot + 1, current->name, strlen(last_dot + 1)) == 0 &&
2203 current->name[strlen(last_dot + 1)] ==
'.') {
2204 copyStringSafeN(name, module_root_name, last_dot - module_root_name + 1,
sizeof(name));
2205 appendStringSafe(name, current->name,
sizeof(name));
2207 current->name = strdup(name);
2217 unsigned char **bytecode_data) {
2219 if (loader_entries) {
2220 assert(_loader_entries == loader_entries);
2225 _bytecode_data = (
char **)bytecode_data;
2228 PySys_WriteStderr(
"Setup nuitka compiled module/bytecode/extension importer.\n");
2231 loader_entries = _loader_entries;
2233#if _NUITKA_MODULE_MODE && PYTHON_VERSION < 0x3c0
2234 if (_Py_PackageContext != NULL) {
2235 updateMetaPathBasedLoaderModuleRoot(_Py_PackageContext);
2239 Nuitka_PyType_Ready(&Nuitka_Loader_Type, NULL,
true,
false,
false,
false,
false);
2241#if PYTHON_VERSION >= 0x370
2242 Nuitka_PyType_Ready(&Nuitka_ResourceReader_Type, NULL,
true,
false,
false,
false,
false);
2246 PyObject *global_loader = Nuitka_Loader_New(NULL);
2248 LIST_INSERT_CONST(Nuitka_SysGetObject(
"meta_path"),
2249#
if PYTHON_VERSION < 0x300
2259 PyThreadState *tstate = PyThreadState_GET();
2260 IMPORT_HARD_OS_PATH(tstate);
2263#if _NUITKA_STANDALONE_MODE
2264 LIST_INSERT_CONST(Nuitka_SysGetObject(
"path_hooks"), 0, PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2269 LIST_APPEND1(Nuitka_SysGetObject(
"path_hooks"), PyObject_GetAttrString(global_loader,
"sys_path_hook"));
2273#if _NUITKA_STANDALONE_MODE
2276void setEarlyFrozenModulesFileAttribute(PyThreadState *tstate) {
2277 PyObject *sys_modules = Nuitka_GetSysModules();
2279 PyObject *key, *value;
2281 PyObject *builtin_module_names = Nuitka_SysGetObject(
"builtin_module_names");
2283 while (Nuitka_DictNext(sys_modules, &pos, &key, &value)) {
2284 if (key != NULL && value != NULL && PyModule_Check(value)) {
2285 bool is_package = HAS_ATTR_BOOL(tstate, value, const_str_plain___path__);
2287 if (is_package || HAS_ATTR_BOOL(tstate, value, const_str_plain___file__) ||
2288 PySequence_Contains(builtin_module_names, key) == 0) {
2289 PyObject *file_value = MAKE_RELATIVE_PATH_FROM_NAME(Nuitka_String_AsString(key), is_package,
false);
2290 PyObject_SetAttr(value, const_str_plain___file__, file_value);
2291 Py_DECREF(file_value);
2292 CHECK_OBJECT(file_value);
2297 assert(!HAS_ERROR_OCCURRED(tstate));
2303#include "MetaPathBasedLoaderImportlibMetadataDistribution.c"
Definition exceptions.h:712
Definition MetaPathBasedLoader.c:28
Definition unfreezing.h:31