diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py index 5813ade..d82c805 100644 --- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -177,6 +177,14 @@ class MultiPhaseExtensionModuleTests(abc.LoaderTests): self.assertEqual(module.__name__, 'pkg.' + self.name) self.assertEqual(module.str_const, 'something different') + def test_load_short_name(self): + '''Test loading module with a one-character name''' + module = self.load_module_by_name('x') + self.assertIsInstance(module, types.ModuleType) + self.assertEqual(module.__name__, 'x') + self.assertEqual(module.str_const, 'something different') + assert 'x' not in sys.modules + def test_load_twice(self): '''Test that 2 loads result in 2 module objects''' module1 = self.load_module_by_name(self.name) diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 0d50db2..7b98be2 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -321,6 +321,14 @@ PyInitU_eckzbwbhc6jpgzcx415x(PyObject *spec) return PyModuleDef_Init(&def_nonascii_kana); } +/*** Module with a single-character name ***/ + +PyMODINIT_FUNC +PyInit_x(PyObject *spec) +{ + return PyModuleDef_Init(&main_def); +} + /**** Testing NULL slots ****/ static PyModuleDef null_slots_def = TEST_MODULE_DEF( diff --git a/Python/importdl.c b/Python/importdl.c index 579d2c5..9e354dc 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -35,8 +35,10 @@ static const char *nonascii_prefix = "PyInitU"; static PyObject * get_encoded_name(PyObject *name, const char **hook_prefix) { char *buf; + char c; PyObject *tmp; PyObject *encoded = NULL; + PyObject *modname = NULL; Py_ssize_t name_len, lastdot, i; /* Get the short name (substring after last dot) */ @@ -71,19 +73,25 @@ get_encoded_name(PyObject *name, const char **hook_prefix) { } } - buf = PyBytes_AS_STRING(encoded); - assert(Py_REFCNT(encoded) == 1); + /* Replace '-' by '_' */ + modname = PyBytes_FromStringAndSize(NULL, PyBytes_GET_SIZE(encoded)); + if (modname == NULL) + goto error; for (i = 0; i < PyBytes_GET_SIZE(encoded) + 1; i++) { - if (buf[i] == '-') { - buf[i] = '_'; + c = PyBytes_AS_STRING(encoded)[i]; + if (c == '-') { + c = '_'; } + PyBytes_AS_STRING(modname)[i] = c; } Py_DECREF(name); - return encoded; + Py_DECREF(encoded); + return modname; error: Py_DECREF(name); Py_XDECREF(encoded); + Py_XDECREF(modname); return NULL; }