@@ -1359,6 +1359,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
13591359 PyObject * final_mod = NULL ;
13601360 PyObject * mod = NULL ;
13611361 PyObject * package = NULL ;
1362+ PyObject * spec = NULL ;
13621363 PyObject * globals = NULL ;
13631364 PyObject * fromlist = NULL ;
13641365 PyInterpreterState * interp = PyThreadState_GET ()-> interp ;
@@ -1414,39 +1415,60 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
14141415 goto error ;
14151416 }
14161417 else if (level > 0 ) {
1417- package = _PyDict_GetItemId (globals , & PyId___package__ );
1418+ spec = _PyDict_GetItemId (globals , & PyId___spec__ );
1419+ if (spec != NULL ) {
1420+ package = PyObject_GetAttrString (spec , "parent" );
1421+ }
14181422 if (package != NULL && package != Py_None ) {
1419- Py_INCREF (package );
14201423 if (!PyUnicode_Check (package )) {
1421- PyErr_SetString (PyExc_TypeError , "package must be a string" );
1424+ PyErr_SetString (PyExc_TypeError ,
1425+ "__spec__.parent must be a string" );
14221426 goto error ;
14231427 }
14241428 }
14251429 else {
1426- package = _PyDict_GetItemId (globals , & PyId___name__ );
1427- if (package == NULL ) {
1428- PyErr_SetString ( PyExc_KeyError , "'__name__' not in globals" );
1429- goto error ;
1430- }
1431- else if (! PyUnicode_Check ( package )) {
1432- PyErr_SetString ( PyExc_TypeError , "__name__ must be a string" );
1430+ package = _PyDict_GetItemId (globals , & PyId___package__ );
1431+ if (package != NULL && package != Py_None ) {
1432+ Py_INCREF ( package );
1433+ if (! PyUnicode_Check ( package )) {
1434+ PyErr_SetString ( PyExc_TypeError , "package must be a string" );
1435+ goto error ;
1436+ }
14331437 }
1434- Py_INCREF (package );
1435-
1436- if (_PyDict_GetItemId (globals , & PyId___path__ ) == NULL ) {
1437- PyObject * partition = NULL ;
1438- PyObject * borrowed_dot = _PyUnicode_FromId (& single_dot );
1439- if (borrowed_dot == NULL ) {
1438+ else {
1439+ if (PyErr_WarnEx (PyExc_ImportWarning ,
1440+ "can't resolve package from __spec__ or __package__, "
1441+ "falling back on __name__ and __path__" , 1 ) < 0 ) {
14401442 goto error ;
14411443 }
1442- partition = PyUnicode_RPartition (package , borrowed_dot );
1443- Py_DECREF (package );
1444- if (partition == NULL ) {
1444+
1445+ package = _PyDict_GetItemId (globals , & PyId___name__ );
1446+ if (package == NULL ) {
1447+ PyErr_SetString (PyExc_KeyError , "'__name__' not in globals" );
14451448 goto error ;
14461449 }
1447- package = PyTuple_GET_ITEM ( partition , 0 );
1450+
14481451 Py_INCREF (package );
1449- Py_DECREF (partition );
1452+ if (!PyUnicode_Check (package )) {
1453+ PyErr_SetString (PyExc_TypeError , "__name__ must be a string" );
1454+ goto error ;
1455+ }
1456+
1457+ if (_PyDict_GetItemId (globals , & PyId___path__ ) == NULL ) {
1458+ PyObject * partition = NULL ;
1459+ PyObject * borrowed_dot = _PyUnicode_FromId (& single_dot );
1460+ if (borrowed_dot == NULL ) {
1461+ goto error ;
1462+ }
1463+ partition = PyUnicode_RPartition (package , borrowed_dot );
1464+ Py_DECREF (package );
1465+ if (partition == NULL ) {
1466+ goto error ;
1467+ }
1468+ package = PyTuple_GET_ITEM (partition , 0 );
1469+ Py_INCREF (package );
1470+ Py_DECREF (partition );
1471+ }
14501472 }
14511473 }
14521474
0 commit comments