mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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.__name__, 'pkg.' + self.name) | ||||||
|         self.assertEqual(module.str_const, 'something different') |         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): |     def test_load_twice(self): | ||||||
|         '''Test that 2 loads result in 2 module objects''' |         '''Test that 2 loads result in 2 module objects''' | ||||||
|         module1 = self.load_module_by_name(self.name) |         module1 = self.load_module_by_name(self.name) | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ Release date: 2015-07-05 | ||||||
| Core and Builtins | Core and Builtins | ||||||
| ----------------- | ----------------- | ||||||
| 
 | 
 | ||||||
|  | - Issue #24328: Fix importing one character extension modules. | ||||||
|  | 
 | ||||||
| - Issue #11205: In dictionary displays, evaluate the key before the value. | - Issue #11205: In dictionary displays, evaluate the key before the value. | ||||||
| 
 | 
 | ||||||
| - Issue #24285: Fixed regression that prevented importing extension modules | - Issue #24285: Fixed regression that prevented importing extension modules | ||||||
|  |  | ||||||
|  | @ -321,6 +321,14 @@ PyInitU_eckzbwbhc6jpgzcx415x(PyObject *spec) | ||||||
|     return PyModuleDef_Init(&def_nonascii_kana); |     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 ****/ | /**** Testing NULL slots ****/ | ||||||
| 
 | 
 | ||||||
| static PyModuleDef null_slots_def = TEST_MODULE_DEF( | static PyModuleDef null_slots_def = TEST_MODULE_DEF( | ||||||
|  |  | ||||||
|  | @ -34,10 +34,11 @@ static const char *nonascii_prefix = "PyInitU"; | ||||||
|  */ |  */ | ||||||
| static PyObject * | static PyObject * | ||||||
| get_encoded_name(PyObject *name, const char **hook_prefix) { | get_encoded_name(PyObject *name, const char **hook_prefix) { | ||||||
|     char *buf; |  | ||||||
|     PyObject *tmp; |     PyObject *tmp; | ||||||
|     PyObject *encoded = NULL; |     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) */ |     /* Get the short name (substring after last dot) */ | ||||||
|     name_len = PyUnicode_GetLength(name); |     name_len = PyUnicode_GetLength(name); | ||||||
|  | @ -71,16 +72,14 @@ get_encoded_name(PyObject *name, const char **hook_prefix) { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     buf = PyBytes_AS_STRING(encoded); |     /* Replace '-' by '_' */ | ||||||
|     assert(Py_REFCNT(encoded) == 1); |     modname = _PyObject_CallMethodId(encoded, &PyId_replace, "cc", '-', '_'); | ||||||
|     for (i = 0; i < PyBytes_GET_SIZE(encoded) + 1; i++) { |     if (modname == NULL) | ||||||
|         if (buf[i] == '-') { |         goto error; | ||||||
|             buf[i] = '_'; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     Py_DECREF(name); |     Py_DECREF(name); | ||||||
|     return encoded; |     Py_DECREF(encoded); | ||||||
|  |     return modname; | ||||||
| error: | error: | ||||||
|     Py_DECREF(name); |     Py_DECREF(name); | ||||||
|     Py_XDECREF(encoded); |     Py_XDECREF(encoded); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Peterson
						Benjamin Peterson