mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	[3.14] gh-135228: When @dataclass(slots=True) replaces a dataclass, make the original class collectible (take 2) (GH-137047) (#137666)
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Alyssa Coghlan <ncoghlan@gmail.com> Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
		
							parent
							
								
									daed07a1f9
								
							
						
					
					
						commit
						4dda1768be
					
				
					 5 changed files with 117 additions and 7 deletions
				
			
		
							
								
								
									
										33
									
								
								Python/clinic/sysmodule.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										33
									
								
								Python/clinic/sysmodule.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -1793,6 +1793,37 @@ sys__baserepl(PyObject *module, PyObject *Py_UNUSED(ignored)) | |||
|     return sys__baserepl_impl(module); | ||||
| } | ||||
| 
 | ||||
| PyDoc_STRVAR(sys__clear_type_descriptors__doc__, | ||||
| "_clear_type_descriptors($module, type, /)\n" | ||||
| "--\n" | ||||
| "\n" | ||||
| "Private function for clearing certain descriptors from a type\'s dictionary.\n" | ||||
| "\n" | ||||
| "See gh-135228 for context."); | ||||
| 
 | ||||
| #define SYS__CLEAR_TYPE_DESCRIPTORS_METHODDEF    \ | ||||
|     {"_clear_type_descriptors", (PyCFunction)sys__clear_type_descriptors, METH_O, sys__clear_type_descriptors__doc__}, | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__clear_type_descriptors_impl(PyObject *module, PyObject *type); | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__clear_type_descriptors(PyObject *module, PyObject *arg) | ||||
| { | ||||
|     PyObject *return_value = NULL; | ||||
|     PyObject *type; | ||||
| 
 | ||||
|     if (!PyObject_TypeCheck(arg, &PyType_Type)) { | ||||
|         _PyArg_BadArgument("_clear_type_descriptors", "argument", (&PyType_Type)->tp_name, arg); | ||||
|         goto exit; | ||||
|     } | ||||
|     type = arg; | ||||
|     return_value = sys__clear_type_descriptors_impl(module, type); | ||||
| 
 | ||||
| exit: | ||||
|     return return_value; | ||||
| } | ||||
| 
 | ||||
| PyDoc_STRVAR(sys__is_gil_enabled__doc__, | ||||
| "_is_gil_enabled($module, /)\n" | ||||
| "--\n" | ||||
|  | @ -1948,4 +1979,4 @@ exit: | |||
| #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF | ||||
|     #define SYS_GETANDROIDAPILEVEL_METHODDEF | ||||
| #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ | ||||
| /*[clinic end generated code: output=449d16326e69dcf6 input=a9049054013a1b77]*/ | ||||
| /*[clinic end generated code: output=9052f399f40ca32d input=a9049054013a1b77]*/ | ||||
|  |  | |||
|  | @ -2640,6 +2640,47 @@ sys__baserepl_impl(PyObject *module) | |||
|     Py_RETURN_NONE; | ||||
| } | ||||
| 
 | ||||
| /*[clinic input]
 | ||||
| sys._clear_type_descriptors | ||||
| 
 | ||||
|     type: object(subclass_of='&PyType_Type') | ||||
|     / | ||||
| 
 | ||||
| Private function for clearing certain descriptors from a type's dictionary. | ||||
| 
 | ||||
| See gh-135228 for context. | ||||
| [clinic start generated code]*/ | ||||
| 
 | ||||
| static PyObject * | ||||
| sys__clear_type_descriptors_impl(PyObject *module, PyObject *type) | ||||
| /*[clinic end generated code: output=5ad17851b762b6d9 input=dc536c97fde07251]*/ | ||||
| { | ||||
|     PyTypeObject *typeobj = (PyTypeObject *)type; | ||||
|     if (_PyType_HasFeature(typeobj, Py_TPFLAGS_IMMUTABLETYPE)) { | ||||
|         PyErr_SetString(PyExc_TypeError, "argument is immutable"); | ||||
|         return NULL; | ||||
|     } | ||||
|     PyObject *dict = _PyType_GetDict(typeobj); | ||||
|     PyObject *dunder_dict = NULL; | ||||
|     if (PyDict_Pop(dict, &_Py_ID(__dict__), &dunder_dict) < 0) { | ||||
|         return NULL; | ||||
|     } | ||||
|     PyObject *dunder_weakref = NULL; | ||||
|     if (PyDict_Pop(dict, &_Py_ID(__weakref__), &dunder_weakref) < 0) { | ||||
|         PyType_Modified(typeobj); | ||||
|         Py_XDECREF(dunder_dict); | ||||
|         return NULL; | ||||
|     } | ||||
|     PyType_Modified(typeobj); | ||||
|     // We try to hold onto a reference to these until after we call
 | ||||
|     // PyType_Modified(), in case their deallocation triggers somer user code
 | ||||
|     // that tries to do something to the type.
 | ||||
|     Py_XDECREF(dunder_dict); | ||||
|     Py_XDECREF(dunder_weakref); | ||||
|     Py_RETURN_NONE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*[clinic input]
 | ||||
| sys._is_gil_enabled -> bool | ||||
| 
 | ||||
|  | @ -2836,6 +2877,7 @@ static PyMethodDef sys_methods[] = { | |||
|     SYS__STATS_DUMP_METHODDEF | ||||
| #endif | ||||
|     SYS__GET_CPU_COUNT_CONFIG_METHODDEF | ||||
|     SYS__CLEAR_TYPE_DESCRIPTORS_METHODDEF | ||||
|     SYS__IS_GIL_ENABLED_METHODDEF | ||||
|     SYS__DUMP_TRACELETS_METHODDEF | ||||
|     {NULL, NULL}  // sentinel
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)