mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	fix importing one char extension modules (closes #24328)
This commit is contained in:
		
							parent
							
								
									a663121e10
								
							
						
					
					
						commit
						e20056c8f7
					
				
					 4 changed files with 27 additions and 10 deletions
				
			
		|  | @ -177,6 +177,14 @@ def test_load_submodule(self): | |||
|         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) | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ Release date: 2015-07-05 | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #24328: Fix importing one character extension modules. | ||||
| 
 | ||||
| - Issue #11205: In dictionary displays, evaluate the key before the value. | ||||
| 
 | ||||
| - Issue #24285: Fixed regression that prevented importing extension modules | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -34,10 +34,11 @@ static const char *nonascii_prefix = "PyInitU"; | |||
|  */ | ||||
| static PyObject * | ||||
| get_encoded_name(PyObject *name, const char **hook_prefix) { | ||||
|     char *buf; | ||||
|     PyObject *tmp; | ||||
|     PyObject *encoded = NULL; | ||||
|     Py_ssize_t name_len, lastdot, i; | ||||
|     PyObject *modname = NULL; | ||||
|     Py_ssize_t name_len, lastdot; | ||||
|     _Py_IDENTIFIER(replace); | ||||
| 
 | ||||
|     /* Get the short name (substring after last dot) */ | ||||
|     name_len = PyUnicode_GetLength(name); | ||||
|  | @ -71,16 +72,14 @@ get_encoded_name(PyObject *name, const char **hook_prefix) { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     buf = PyBytes_AS_STRING(encoded); | ||||
|     assert(Py_REFCNT(encoded) == 1); | ||||
|     for (i = 0; i < PyBytes_GET_SIZE(encoded) + 1; i++) { | ||||
|         if (buf[i] == '-') { | ||||
|             buf[i] = '_'; | ||||
|         } | ||||
|     } | ||||
|     /* Replace '-' by '_' */ | ||||
|     modname = _PyObject_CallMethodId(encoded, &PyId_replace, "cc", '-', '_'); | ||||
|     if (modname == NULL) | ||||
|         goto error; | ||||
| 
 | ||||
|     Py_DECREF(name); | ||||
|     return encoded; | ||||
|     Py_DECREF(encoded); | ||||
|     return modname; | ||||
| error: | ||||
|     Py_DECREF(name); | ||||
|     Py_XDECREF(encoded); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Peterson
						Benjamin Peterson