mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	Issue #26200: Added Py_SETREF and replaced Py_XSETREF with Py_SETREF
in places where Py_DECREF was used.
This commit is contained in:
		
							parent
							
								
									e0805cf10e
								
							
						
					
					
						commit
						57a01d3a0e
					
				
					 20 changed files with 52 additions and 42 deletions
				
			
		|  | @ -851,18 +851,28 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *); | |||
|  * | ||||
|  * As in case of Py_CLEAR "the obvious" code can be deadly: | ||||
|  * | ||||
|  *     Py_XDECREF(op); | ||||
|  *     Py_DECREF(op); | ||||
|  *     op = op2; | ||||
|  * | ||||
|  * The safe way is: | ||||
|  * | ||||
|  *      Py_XSETREF(op, op2); | ||||
|  *      Py_SETREF(op, op2); | ||||
|  * | ||||
|  * That arranges to set `op` to `op2` _before_ decref'ing, so that any code | ||||
|  * triggered as a side-effect of `op` getting torn down no longer believes | ||||
|  * `op` points to a valid object. | ||||
|  * | ||||
|  * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of | ||||
|  * Py_DECREF. | ||||
|  */ | ||||
| 
 | ||||
| #define Py_SETREF(op, op2)                      \ | ||||
|     do {                                        \ | ||||
|         PyObject *_py_tmp = (PyObject *)(op);   \ | ||||
|         (op) = (op2);                           \ | ||||
|         Py_DECREF(_py_tmp);                     \ | ||||
|     } while (0) | ||||
| 
 | ||||
| #define Py_XSETREF(op, op2)                     \ | ||||
|     do {                                        \ | ||||
|         PyObject *_py_tmp = (PyObject *)(op);   \ | ||||
|  |  | |||
|  | @ -391,7 +391,7 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt | |||
|         Py_DECREF((PyObject *)dict); | ||||
|         return NULL; | ||||
|     } | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)dict); | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)dict); | ||||
|     dict->format = _ctypes_alloc_format_string(NULL, "B"); | ||||
|     if (dict->format == NULL) { | ||||
|         Py_DECREF(result); | ||||
|  | @ -960,7 +960,7 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |||
|         Py_DECREF((PyObject *)stgdict); | ||||
|         return NULL; | ||||
|     } | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)stgdict); | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)stgdict); | ||||
| 
 | ||||
|     return (PyObject *)result; | ||||
| } | ||||
|  | @ -1403,7 +1403,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |||
|     /* replace the class dict by our updated spam dict */ | ||||
|     if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) | ||||
|         goto error; | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)stgdict);  /* steal the reference */ | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)stgdict);  /* steal the reference */ | ||||
|     stgdict = NULL; | ||||
| 
 | ||||
|     /* Special case for character arrays.
 | ||||
|  | @ -1816,7 +1816,7 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject | |||
|         Py_DECREF((PyObject *)stgdict); | ||||
|         return NULL; | ||||
|     } | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)stgdict); | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)stgdict); | ||||
| 
 | ||||
|     return (PyObject *)result; | ||||
| } | ||||
|  | @ -1944,7 +1944,7 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |||
|         Py_DECREF((PyObject *)stgdict); | ||||
|         return NULL; | ||||
|     } | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)stgdict); | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)stgdict); | ||||
| 
 | ||||
|     /* Install from_param class methods in ctypes base classes.
 | ||||
|        Overrides the PyCSimpleType_from_param generic method. | ||||
|  | @ -2307,7 +2307,7 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | |||
|         Py_DECREF((PyObject *)stgdict); | ||||
|         return NULL; | ||||
|     } | ||||
|     Py_XSETREF(result->tp_dict, (PyObject *)stgdict); | ||||
|     Py_SETREF(result->tp_dict, (PyObject *)stgdict); | ||||
| 
 | ||||
|     if (-1 == make_funcptrtype_dict(stgdict)) { | ||||
|         Py_DECREF(result); | ||||
|  | @ -5152,7 +5152,7 @@ comerror_init(PyObject *self, PyObject *args, PyObject *kwds) | |||
| 
 | ||||
|     bself = (PyBaseExceptionObject *)self; | ||||
|     Py_INCREF(args); | ||||
|     Py_XSETREF(bself->args, args); | ||||
|     Py_SETREF(bself->args, args); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -313,7 +313,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args) | |||
|         return NULL; | ||||
|     } | ||||
|     Py_INCREF(temp); | ||||
|     Py_XSETREF(po->wo, temp); | ||||
|     Py_SETREF(po->wo, temp); | ||||
|     Py_INCREF(Py_None); | ||||
|     return Py_None; | ||||
| } | ||||
|  |  | |||
|  | @ -1943,7 +1943,7 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value) | |||
| 
 | ||||
|     if (strcmp(name, "tag") == 0) { | ||||
|         Py_INCREF(value); | ||||
|         Py_XSETREF(self->tag, value); | ||||
|         Py_SETREF(self->tag, value); | ||||
|     } else if (strcmp(name, "text") == 0) { | ||||
|         Py_DECREF(JOIN_OBJ(self->text)); | ||||
|         self->text = value; | ||||
|  | @ -1958,7 +1958,7 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value) | |||
|                 return -1; | ||||
|         } | ||||
|         Py_INCREF(value); | ||||
|         Py_XSETREF(self->extra->attrib, value); | ||||
|         Py_SETREF(self->extra->attrib, value); | ||||
|     } else { | ||||
|         PyErr_SetString(PyExc_AttributeError, | ||||
|             "Can't set arbitrary attributes on Element"); | ||||
|  | @ -2551,9 +2551,9 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, | |||
|     self->index++; | ||||
| 
 | ||||
|     Py_INCREF(node); | ||||
|     Py_XSETREF(self->this, node); | ||||
|     Py_SETREF(self->this, node); | ||||
|     Py_INCREF(node); | ||||
|     Py_XSETREF(self->last, node); | ||||
|     Py_SETREF(self->last, node); | ||||
| 
 | ||||
|     if (treebuilder_append_event(self, self->start_event_obj, node) < 0) | ||||
|         goto error; | ||||
|  |  | |||
|  | @ -204,7 +204,7 @@ void pysqlite_flush_statement_cache(pysqlite_Connection* self) | |||
|         node = node->next; | ||||
|     } | ||||
| 
 | ||||
|     Py_XSETREF(self->statement_cache, | ||||
|     Py_SETREF(self->statement_cache, | ||||
|               (pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self)); | ||||
|     Py_DECREF(self); | ||||
|     self->statement_cache->decref_factory = 0; | ||||
|  | @ -794,7 +794,7 @@ static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Py_XSETREF(self->statements, new_list); | ||||
|     Py_SETREF(self->statements, new_list); | ||||
| } | ||||
| 
 | ||||
| static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) | ||||
|  | @ -825,7 +825,7 @@ static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Py_XSETREF(self->cursors, new_list); | ||||
|     Py_SETREF(self->cursors, new_list); | ||||
| } | ||||
| 
 | ||||
| PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) | ||||
|  |  | |||
|  | @ -510,7 +510,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* | |||
| 
 | ||||
|     /* reset description and rowcount */ | ||||
|     Py_INCREF(Py_None); | ||||
|     Py_XSETREF(self->description, Py_None); | ||||
|     Py_SETREF(self->description, Py_None); | ||||
|     self->rowcount = -1L; | ||||
| 
 | ||||
|     func_args = PyTuple_New(1); | ||||
|  | @ -535,7 +535,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* | |||
|     } | ||||
| 
 | ||||
|     if (self->statement->in_use) { | ||||
|         Py_XSETREF(self->statement, | ||||
|         Py_SETREF(self->statement, | ||||
|                   PyObject_New(pysqlite_Statement, &pysqlite_StatementType)); | ||||
|         if (!self->statement) { | ||||
|             goto error; | ||||
|  | @ -652,7 +652,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* | |||
|                 numcols = sqlite3_column_count(self->statement->st); | ||||
|                 Py_END_ALLOW_THREADS | ||||
| 
 | ||||
|                 Py_XSETREF(self->description, PyTuple_New(numcols)); | ||||
|                 Py_SETREF(self->description, PyTuple_New(numcols)); | ||||
|                 if (!self->description) { | ||||
|                     goto error; | ||||
|                 } | ||||
|  |  | |||
|  | @ -756,7 +756,7 @@ deepcopy(PyObject** object, PyObject* memo) | |||
|     if (!copy) | ||||
|         return 0; | ||||
| 
 | ||||
|     Py_XSETREF(*object, copy); | ||||
|     Py_SETREF(*object, copy); | ||||
| 
 | ||||
|     return 1; /* success */ | ||||
| } | ||||
|  |  | |||
|  | @ -1589,7 +1589,7 @@ static int PySSL_set_context(PySSLSocket *self, PyObject *value, | |||
|         return -1; | ||||
| #else | ||||
|         Py_INCREF(value); | ||||
|         Py_XSETREF(self->ctx, (PySSLContext *)value); | ||||
|         Py_SETREF(self->ctx, (PySSLContext *)value); | ||||
|         SSL_set_SSL_CTX(self->ssl, self->ctx->ctx); | ||||
| #endif | ||||
|     } else { | ||||
|  |  | |||
|  | @ -631,7 +631,7 @@ tee_next(teeobject *to) | |||
|         link = teedataobject_jumplink(to->dataobj); | ||||
|         if (link == NULL) | ||||
|             return NULL; | ||||
|         Py_XSETREF(to->dataobj, (teedataobject *)link); | ||||
|         Py_SETREF(to->dataobj, (teedataobject *)link); | ||||
|         to->index = 0; | ||||
|     } | ||||
|     value = teedataobject_getitem(to->dataobj, to->index); | ||||
|  |  | |||
|  | @ -1266,7 +1266,7 @@ PyInit__signal(void) | |||
|     if (Handlers[SIGINT].func == DefaultHandler) { | ||||
|         /* Install default int handler */ | ||||
|         Py_INCREF(IntHandler); | ||||
|         Py_XSETREF(Handlers[SIGINT].func, IntHandler); | ||||
|         Py_SETREF(Handlers[SIGINT].func, IntHandler); | ||||
|         old_siginthandler = PyOS_setsig(SIGINT, signal_handler); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -155,7 +155,7 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) | |||
|             tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP); | ||||
|             if (tmp == NULL) | ||||
|                 goto error; | ||||
|             Py_XSETREF(self->prefix, tmp); | ||||
|             Py_SETREF(self->prefix, tmp); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|  |  | |||
|  | @ -668,7 +668,7 @@ save_unconsumed_input(compobject *self, int err) | |||
|                       PyBytes_AS_STRING(self->unused_data), old_size); | ||||
|             Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size, | ||||
|                       self->zst.next_in, self->zst.avail_in); | ||||
|             Py_XSETREF(self->unused_data, new_data); | ||||
|             Py_SETREF(self->unused_data, new_data); | ||||
|             self->zst.avail_in = 0; | ||||
|         } | ||||
|     } | ||||
|  | @ -680,7 +680,7 @@ save_unconsumed_input(compobject *self, int err) | |||
|                 (char *)self->zst.next_in, self->zst.avail_in); | ||||
|         if (new_data == NULL) | ||||
|             return -1; | ||||
|         Py_XSETREF(self->unconsumed_tail, new_data); | ||||
|         Py_SETREF(self->unconsumed_tail, new_data); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -3520,7 +3520,7 @@ PyBytes_Concat(PyObject **pv, PyObject *w) | |||
|         /* Multiple references, need to create new object */ | ||||
|         PyObject *v; | ||||
|         v = bytes_concat(*pv, w); | ||||
|         Py_XSETREF(*pv, v); | ||||
|         Py_SETREF(*pv, v); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -527,7 +527,7 @@ func_new(PyTypeObject* type, PyObject* args, PyObject* kw) | |||
| 
 | ||||
|     if (name != Py_None) { | ||||
|         Py_INCREF(name); | ||||
|         Py_XSETREF(newfunc->func_name, name); | ||||
|         Py_SETREF(newfunc->func_name, name); | ||||
|     } | ||||
|     if (defaults != Py_None) { | ||||
|         Py_INCREF(defaults); | ||||
|  |  | |||
|  | @ -1064,7 +1064,7 @@ longrangeiter_next(longrangeiterobject *r) | |||
|     result = PyNumber_Add(r->start, product); | ||||
|     Py_DECREF(product); | ||||
|     if (result) { | ||||
|         Py_XSETREF(r->index, new_index); | ||||
|         Py_SETREF(r->index, new_index); | ||||
|     } | ||||
|     else { | ||||
|         Py_DECREF(new_index); | ||||
|  |  | |||
|  | @ -424,7 +424,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) | |||
| 
 | ||||
|     type->tp_name = tp_name; | ||||
|     Py_INCREF(value); | ||||
|     Py_XSETREF(((PyHeapTypeObject*)type)->ht_name, value); | ||||
|     Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
|  | @ -445,7 +445,7 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context) | |||
| 
 | ||||
|     et = (PyHeapTypeObject*)type; | ||||
|     Py_INCREF(value); | ||||
|     Py_XSETREF(et->ht_qualname, value); | ||||
|     Py_SETREF(et->ht_qualname, value); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -2897,7 +2897,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) | |||
|         else | ||||
|             method_cache_misses++; | ||||
| #endif | ||||
|         Py_XSETREF(method_cache[h].name, name); | ||||
|         Py_SETREF(method_cache[h].name, name); | ||||
|     } | ||||
|     return res; | ||||
| } | ||||
|  |  | |||
|  | @ -1667,7 +1667,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length) | |||
|         _Py_INCREF_UNICODE_EMPTY(); | ||||
|         if (!unicode_empty) | ||||
|             return -1; | ||||
|         Py_XSETREF(*p_unicode, unicode_empty); | ||||
|         Py_SETREF(*p_unicode, unicode_empty); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|  | @ -1675,7 +1675,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length) | |||
|         PyObject *copy = resize_copy(unicode, length); | ||||
|         if (copy == NULL) | ||||
|             return -1; | ||||
|         Py_XSETREF(*p_unicode, copy); | ||||
|         Py_SETREF(*p_unicode, copy); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|  | @ -13326,7 +13326,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, | |||
|             return -1; | ||||
|         _PyUnicode_FastCopyCharacters(newbuffer, 0, | ||||
|                                       writer->buffer, 0, writer->pos); | ||||
|         Py_XSETREF(writer->buffer, newbuffer); | ||||
|         Py_SETREF(writer->buffer, newbuffer); | ||||
|     } | ||||
|     _PyUnicodeWriter_Update(writer); | ||||
|     return 0; | ||||
|  | @ -15012,7 +15012,7 @@ PyUnicode_InternInPlace(PyObject **p) | |||
| 
 | ||||
|     if (t) { | ||||
|         Py_INCREF(t); | ||||
|         Py_XSETREF(*p, t); | ||||
|         Py_SETREF(*p, t); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -680,7 +680,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, | |||
|                     goto handle_error; | ||||
|                 } | ||||
|                 else if (!is_true) { | ||||
|                     Py_XSETREF(*filename, PyUnicode_FromString("__main__")); | ||||
|                     Py_SETREF(*filename, PyUnicode_FromString("__main__")); | ||||
|                     if (*filename == NULL) | ||||
|                         goto handle_error; | ||||
|                 } | ||||
|  |  | |||
|  | @ -3229,7 +3229,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | |||
|                 Py_INCREF(self); | ||||
|                 func = PyMethod_GET_FUNCTION(func); | ||||
|                 Py_INCREF(func); | ||||
|                 Py_XSETREF(*pfunc, self); | ||||
|                 Py_SETREF(*pfunc, self); | ||||
|                 na++; | ||||
|                 /* n++; */ | ||||
|             } else | ||||
|  | @ -4682,7 +4682,7 @@ call_function(PyObject ***pp_stack, int oparg | |||
|             Py_INCREF(self); | ||||
|             func = PyMethod_GET_FUNCTION(func); | ||||
|             Py_INCREF(func); | ||||
|             Py_XSETREF(*pfunc, self); | ||||
|             Py_SETREF(*pfunc, self); | ||||
|             na++; | ||||
|             n++; | ||||
|         } else | ||||
|  |  | |||
|  | @ -311,9 +311,9 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) | |||
|         --tstate->recursion_depth; | ||||
|         /* throw away the old exception and use the recursion error instead */ | ||||
|         Py_INCREF(PyExc_RecursionError); | ||||
|         Py_XSETREF(*exc, PyExc_RecursionError); | ||||
|         Py_SETREF(*exc, PyExc_RecursionError); | ||||
|         Py_INCREF(PyExc_RecursionErrorInst); | ||||
|         Py_XSETREF(*val, PyExc_RecursionErrorInst); | ||||
|         Py_SETREF(*val, PyExc_RecursionErrorInst); | ||||
|         /* just keeping the old traceback */ | ||||
|         return; | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka