14#include "nuitka/prelude.h"
17NUITKA_DEFINE_BUILTIN(__import__);
19PyObject *IMPORT_MODULE_KW(PyThreadState *tstate, PyObject *module_name, PyObject *globals, PyObject *locals,
20 PyObject *import_items, PyObject *level) {
21 CHECK_OBJECT_X(module_name);
22 CHECK_OBJECT_X(globals);
23 CHECK_OBJECT_X(locals);
24 CHECK_OBJECT_X(import_items);
25 CHECK_OBJECT_X(level);
27 PyObject *kw_pairs[5 * 2] = {const_str_plain_name, module_name, const_str_plain_globals, globals,
28 const_str_plain_locals, locals, const_str_plain_fromlist, import_items,
29 const_str_plain_level, level};
30 PyObject *kw_args = MAKE_DICT_X(kw_pairs, 5);
32 NUITKA_ASSIGN_BUILTIN(__import__);
34 PyObject *import_result = CALL_FUNCTION_WITH_KW_ARGS(tstate, NUITKA_ACCESS_BUILTIN(__import__), kw_args);
41PyObject *IMPORT_MODULE1(PyThreadState *tstate, PyObject *module_name) {
42 CHECK_OBJECT(module_name);
44 NUITKA_ASSIGN_BUILTIN(__import__);
46 PyObject *import_result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, NUITKA_ACCESS_BUILTIN(__import__), module_name);
51PyObject *IMPORT_MODULE2(PyThreadState *tstate, PyObject *module_name, PyObject *globals) {
52 CHECK_OBJECT(module_name);
53 CHECK_OBJECT(globals);
55 PyObject *pos_args[] = {module_name, globals};
57 NUITKA_ASSIGN_BUILTIN(__import__);
59 PyObject *import_result = CALL_FUNCTION_WITH_ARGS2(tstate, NUITKA_ACCESS_BUILTIN(__import__), pos_args);
64PyObject *IMPORT_MODULE3(PyThreadState *tstate, PyObject *module_name, PyObject *globals, PyObject *locals) {
65 CHECK_OBJECT(module_name);
66 CHECK_OBJECT(globals);
69 PyObject *pos_args[] = {module_name, globals, locals};
71 NUITKA_ASSIGN_BUILTIN(__import__);
73 PyObject *import_result = CALL_FUNCTION_WITH_ARGS3(tstate, NUITKA_ACCESS_BUILTIN(__import__), pos_args);
78PyObject *IMPORT_MODULE4(PyThreadState *tstate, PyObject *module_name, PyObject *globals, PyObject *locals,
79 PyObject *import_items) {
80 CHECK_OBJECT(module_name);
81 CHECK_OBJECT(globals);
83 CHECK_OBJECT(import_items);
85 PyObject *pos_args[] = {module_name, globals, locals, import_items};
87 NUITKA_ASSIGN_BUILTIN(__import__);
89 PyObject *import_result = CALL_FUNCTION_WITH_ARGS4(tstate, NUITKA_ACCESS_BUILTIN(__import__), pos_args);
94PyObject *IMPORT_MODULE5(PyThreadState *tstate, PyObject *module_name, PyObject *globals, PyObject *locals,
95 PyObject *import_items, PyObject *level) {
96 CHECK_OBJECT(module_name);
97 CHECK_OBJECT(globals);
99 CHECK_OBJECT(import_items);
102 PyObject *pos_args[] = {module_name, globals, locals, import_items, level};
104 NUITKA_ASSIGN_BUILTIN(__import__);
105 PyObject *import_function = NUITKA_ACCESS_BUILTIN(__import__);
110#if PYTHON_VERSION >= 0x3a0 && 0
112 if (import_function == tstate->interp->import_func) {
113 int level_int = _PyLong_AsInt(level);
115 if (level_int == -1 && HAS_ERROR_OCCURRED(tstate)) {
119 return PyImport_ImportModuleLevelObject(module_name, globals, locals, import_items, level_int);
123 PyObject *import_result = CALL_FUNCTION_WITH_ARGS5(tstate, import_function, pos_args);
125 return import_result;
128bool IMPORT_MODULE_STAR(PyThreadState *tstate, PyObject *target,
bool is_module, PyObject *module) {
130 CHECK_OBJECT(module);
131 CHECK_OBJECT(target);
136 PyObject *all = PyObject_GetAttr(module, const_str_plain___all__);
138 iter = MAKE_ITERATOR(tstate, all);
141 if (unlikely(iter == NULL)) {
147 assert(HAS_ERROR_OCCURRED(tstate));
149 if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
150 CLEAR_ERROR_OCCURRED(tstate);
152 iter = MAKE_ITERATOR(tstate, PyModule_GetDict(module));
162 PyObject *item = ITERATOR_NEXT_ITERATOR(iter);
167#if PYTHON_VERSION < 0x300
168 if (unlikely(PyString_Check(item) ==
false && PyUnicode_Check(item) ==
false))
170 if (unlikely(PyUnicode_Check(item) ==
false))
173 PyErr_Format(PyExc_TypeError,
"attribute name must be string, not '%s'", Py_TYPE(item)->tp_name);
178 if (all_case ==
false) {
179 PyObject *startswith_value;
180#if PYTHON_VERSION < 0x300
181 if (PyString_Check(item)) {
182 startswith_value = STR_STARTSWITH2(tstate, item, const_str_underscore);
184 startswith_value = UNICODE_STARTSWITH2(tstate, item, const_str_underscore);
187 startswith_value = UNICODE_STARTSWITH2(tstate, item, const_str_underscore);
190 CHECK_OBJECT(startswith_value);
191 Py_DECREF(startswith_value);
193 if (startswith_value == Py_True) {
198 PyObject *value = LOOKUP_ATTRIBUTE(tstate, module, item);
201 if (unlikely(value == NULL)) {
208 SET_ATTRIBUTE(tstate, target, item, value);
210 SET_SUBSCRIPT(tstate, target, item, value);
219 return !HAS_ERROR_OCCURRED(tstate);
222PyObject *IMPORT_NAME_FROM_MODULE(PyThreadState *tstate, PyObject *module, PyObject *import_name) {
223 CHECK_OBJECT(module);
224 CHECK_OBJECT(import_name);
226 PyObject *result = PyObject_GetAttr(module, import_name);
228 if (unlikely(result == NULL)) {
229 if (CHECK_AND_CLEAR_ATTRIBUTE_ERROR_OCCURRED(tstate)) {
230#if PYTHON_VERSION >= 0x370
231 PyObject *filename = Nuitka_GetFilenameObject(tstate, module);
233 PyObject *name = LOOKUP_ATTRIBUTE(tstate, module, const_str_plain___name__);
235 name = PyUnicode_FromString(
"<unknown module name>");
238 PyErr_Format(PyExc_ImportError,
"cannot import name %R from %R (%S)", import_name, name, filename);
243#elif PYTHON_VERSION >= 0x300 || !defined(_NUITKA_FULL_COMPAT)
244 PyErr_Format(PyExc_ImportError,
"cannot import name '%s'", Nuitka_String_AsString(import_name));
246 PyErr_Format(PyExc_ImportError,
"cannot import name %s", Nuitka_String_AsString(import_name));
256#if PYTHON_VERSION >= 0x350
258static PyObject *resolveParentModuleName(PyThreadState *tstate, PyObject *module, PyObject *name,
int level) {
259 PyObject *globals = PyModule_GetDict(module);
261 CHECK_OBJECT(globals);
263 if (unlikely(!PyDict_Check(globals))) {
264 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"globals must be a dict");
268 PyObject *
package = DICT_GET_ITEM0(tstate, globals, const_str_plain___package__);
270 if (unlikely(package == NULL && HAS_ERROR_OCCURRED(tstate))) {
274 if (package == Py_None) {
278 PyObject *spec = DICT_GET_ITEM0(tstate, globals, const_str_plain___spec__);
280 if (unlikely(spec == NULL && HAS_ERROR_OCCURRED(tstate))) {
284 if (package != NULL) {
285 if (!PyUnicode_Check(package)) {
286 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"package must be a string");
291 if (spec != NULL && spec != Py_None) {
292 PyObject *parent = PyObject_GetAttr(spec, const_str_plain_parent);
294 if (unlikely(parent == NULL)) {
298 nuitka_bool nbool_equal = RICH_COMPARE_EQ_NBOOL_OBJECT_OBJECT(package, parent);
302 if (unlikely(nbool_equal == NUITKA_BOOL_EXCEPTION)) {
306 if (unlikely(nbool_equal == NUITKA_BOOL_FALSE)) {
307 if (PyErr_WarnEx(PyExc_ImportWarning,
"__package__ != __spec__.parent", 1) < 0) {
314 }
else if (spec != NULL && spec != Py_None) {
315 package = PyObject_GetAttr(spec, const_str_plain_parent);
317 if (unlikely(package == NULL)) {
321 if (unlikely(!PyUnicode_Check(package))) {
322 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__spec__.parent must be a string");
326 if (PyErr_WarnEx(PyExc_ImportWarning,
327 "can't resolve package from __spec__ or __package__, "
328 "falling back on __name__ and __path__",
333 package = DICT_GET_ITEM0(tstate, globals, const_str_plain___name__);
335 if (unlikely(package == NULL && !HAS_ERROR_OCCURRED(tstate))) {
336 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_KeyError,
"'__name__' not in globals");
340 if (!PyUnicode_Check(package)) {
341 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_TypeError,
"__name__ must be a string");
346 if (DICT_HAS_ITEM(tstate, globals, const_str_plain___path__) == 1) {
347 Py_ssize_t dot = PyUnicode_FindChar(package,
'.', 0, PyUnicode_GET_LENGTH(package), -1);
349 if (unlikely(dot == -2)) {
353 if (unlikely(dot == -1)) {
358 PyObject *substr = PyUnicode_Substring(package, 0, dot);
359 if (unlikely(substr == NULL)) {
369 Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package);
371 if (unlikely(last_dot == 0)) {
378 for (
int level_up = 1; level_up < level; level_up += 1) {
379 last_dot = PyUnicode_FindChar(package,
'.', 0, last_dot, -1);
380 if (last_dot == -2) {
383 }
else if (last_dot == -1) {
385 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
386 "attempted relative import beyond top-level package");
391 PyObject *base = PyUnicode_Substring(package, 0, last_dot);
395 if (unlikely(base == NULL || PyUnicode_GET_LENGTH(name) == 0)) {
399 PyObject *abs_name = PyUnicode_FromFormat(
"%U.%U", base, name);
405PyObject *IMPORT_NAME_OR_MODULE(PyThreadState *tstate, PyObject *module, PyObject *globals, PyObject *import_name,
407 CHECK_OBJECT(module);
408 CHECK_OBJECT(import_name);
410 PyObject *result = PyObject_GetAttr(module, import_name);
412 if (unlikely(result == NULL)) {
413 if (EXCEPTION_MATCH_BOOL_SINGLE(tstate, GET_ERROR_OCCURRED(tstate), PyExc_AttributeError)) {
414 CLEAR_ERROR_OCCURRED(tstate);
416 long level_int = PyLong_AsLong(level);
418 if (unlikely(level_int == -1 && HAS_ERROR_OCCURRED(tstate))) {
422 if (unlikely(level_int < 0)) {
423 SET_CURRENT_EXCEPTION_TYPE0_STR(tstate, PyExc_ValueError,
"level must be >= 0");
428 PyObject *fromlist = MAKE_TUPLE1(tstate, import_name);
430 result = IMPORT_MODULE5(tstate, const_str_empty, globals, globals, fromlist, level);
436 PyObject *name = PyUnicode_FromFormat(
"%s.%S", PyModule_GetName(result), import_name);
438 if (result != NULL) {
441 result = Nuitka_GetModule(tstate, name);
446 PyObject *name = resolveParentModuleName(tstate, module, import_name, level_int);
449 if (unlikely(HAS_ERROR_OCCURRED(tstate))) {
453 result = IMPORT_MODULE5(tstate, name, globals, globals, const_tuple_empty, level);
455 if (result != NULL) {
459 result = Nuitka_GetModule(tstate, name);
465 if (result == NULL) {
466 CLEAR_ERROR_OCCURRED(tstate);
468 result = IMPORT_NAME_FROM_MODULE(tstate, module, import_name);
473 CHECK_OBJECT(import_name);
479PyObject *IMPORT_MODULE_FIXED(PyThreadState *tstate, PyObject *module_name, PyObject *value_name) {
480 PyObject *import_result = IMPORT_MODULE1(tstate, module_name);
482 if (unlikely(import_result == NULL)) {
483 return import_result;
486 PyObject *result = Nuitka_GetModule(tstate, value_name);
488 Py_DECREF(import_result);