changeset: 100909:66fafa13a711 branch: 3.5 parent: 100903:4d4febb76864 user: Serhiy Storchaka date: Sun Apr 10 18:05:40 2016 +0300 files: Include/object.h Modules/_ctypes/_ctypes.c Modules/_curses_panel.c Modules/_elementtree.c Modules/_sqlite/connection.c Modules/_sqlite/cursor.c Modules/_sre.c Modules/_ssl.c Modules/itertoolsmodule.c Modules/signalmodule.c Modules/zipimport.c Modules/zlibmodule.c Objects/bytesobject.c Objects/funcobject.c Objects/rangeobject.c Objects/typeobject.c Objects/unicodeobject.c Python/_warnings.c Python/ceval.c Python/errors.c description: Issue #26200: Added Py_SETREF and replaced Py_XSETREF with Py_SETREF in places where Py_DECREF was used. diff -r 4d4febb76864 -r 66fafa13a711 Include/object.h --- a/Include/object.h Sun Apr 10 14:41:19 2016 +0300 +++ b/Include/object.h Sun Apr 10 18:05:40 2016 +0300 @@ -851,18 +851,28 @@ * * 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); \ diff -r 4d4febb76864 -r 66fafa13a711 Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_ctypes/_ctypes.c Sun Apr 10 18:05:40 2016 +0300 @@ -391,7 +391,7 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ bself = (PyBaseExceptionObject *)self; Py_INCREF(args); - Py_XSETREF(bself->args, args); + Py_SETREF(bself->args, args); return 0; } diff -r 4d4febb76864 -r 66fafa13a711 Modules/_curses_panel.c --- a/Modules/_curses_panel.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_curses_panel.c Sun Apr 10 18:05:40 2016 +0300 @@ -313,7 +313,7 @@ return NULL; } Py_INCREF(temp); - Py_XSETREF(po->wo, temp); + Py_SETREF(po->wo, temp); Py_INCREF(Py_None); return Py_None; } diff -r 4d4febb76864 -r 66fafa13a711 Modules/_elementtree.c --- a/Modules/_elementtree.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_elementtree.c Sun Apr 10 18:05:40 2016 +0300 @@ -1943,7 +1943,7 @@ 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 @@ 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 @@ 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; diff -r 4d4febb76864 -r 66fafa13a711 Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_sqlite/connection.c Sun Apr 10 18:05:40 2016 +0300 @@ -204,7 +204,7 @@ 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 @@ } } - 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 @@ } } - Py_XSETREF(self->cursors, new_list); + Py_SETREF(self->cursors, new_list); } PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) diff -r 4d4febb76864 -r 66fafa13a711 Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_sqlite/cursor.c Sun Apr 10 18:05:40 2016 +0300 @@ -510,7 +510,7 @@ /* 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 @@ } 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 @@ 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; } diff -r 4d4febb76864 -r 66fafa13a711 Modules/_sre.c --- a/Modules/_sre.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_sre.c Sun Apr 10 18:05:40 2016 +0300 @@ -756,7 +756,7 @@ if (!copy) return 0; - Py_XSETREF(*object, copy); + Py_SETREF(*object, copy); return 1; /* success */ } diff -r 4d4febb76864 -r 66fafa13a711 Modules/_ssl.c --- a/Modules/_ssl.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/_ssl.c Sun Apr 10 18:05:40 2016 +0300 @@ -1589,7 +1589,7 @@ 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 { diff -r 4d4febb76864 -r 66fafa13a711 Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/itertoolsmodule.c Sun Apr 10 18:05:40 2016 +0300 @@ -631,7 +631,7 @@ 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); diff -r 4d4febb76864 -r 66fafa13a711 Modules/signalmodule.c --- a/Modules/signalmodule.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/signalmodule.c Sun Apr 10 18:05:40 2016 +0300 @@ -1266,7 +1266,7 @@ 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); } diff -r 4d4febb76864 -r 66fafa13a711 Modules/zipimport.c --- a/Modules/zipimport.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/zipimport.c Sun Apr 10 18:05:40 2016 +0300 @@ -155,7 +155,7 @@ tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP); if (tmp == NULL) goto error; - Py_XSETREF(self->prefix, tmp); + Py_SETREF(self->prefix, tmp); } } else diff -r 4d4febb76864 -r 66fafa13a711 Modules/zlibmodule.c --- a/Modules/zlibmodule.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Modules/zlibmodule.c Sun Apr 10 18:05:40 2016 +0300 @@ -668,7 +668,7 @@ 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 @@ (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; } diff -r 4d4febb76864 -r 66fafa13a711 Objects/bytesobject.c --- a/Objects/bytesobject.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Objects/bytesobject.c Sun Apr 10 18:05:40 2016 +0300 @@ -3520,7 +3520,7 @@ /* Multiple references, need to create new object */ PyObject *v; v = bytes_concat(*pv, w); - Py_XSETREF(*pv, v); + Py_SETREF(*pv, v); } } diff -r 4d4febb76864 -r 66fafa13a711 Objects/funcobject.c --- a/Objects/funcobject.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Objects/funcobject.c Sun Apr 10 18:05:40 2016 +0300 @@ -527,7 +527,7 @@ 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); diff -r 4d4febb76864 -r 66fafa13a711 Objects/rangeobject.c --- a/Objects/rangeobject.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Objects/rangeobject.c Sun Apr 10 18:05:40 2016 +0300 @@ -1064,7 +1064,7 @@ 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); diff -r 4d4febb76864 -r 66fafa13a711 Objects/typeobject.c --- a/Objects/typeobject.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Objects/typeobject.c Sun Apr 10 18:05:40 2016 +0300 @@ -424,7 +424,7 @@ 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 @@ et = (PyHeapTypeObject*)type; Py_INCREF(value); - Py_XSETREF(et->ht_qualname, value); + Py_SETREF(et->ht_qualname, value); return 0; } @@ -2897,7 +2897,7 @@ else method_cache_misses++; #endif - Py_XSETREF(method_cache[h].name, name); + Py_SETREF(method_cache[h].name, name); } return res; } diff -r 4d4febb76864 -r 66fafa13a711 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Objects/unicodeobject.c Sun Apr 10 18:05:40 2016 +0300 @@ -1667,7 +1667,7 @@ _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 @@ 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 @@ 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 @@ if (t) { Py_INCREF(t); - Py_XSETREF(*p, t); + Py_SETREF(*p, t); return; } diff -r 4d4febb76864 -r 66fafa13a711 Python/_warnings.c --- a/Python/_warnings.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Python/_warnings.c Sun Apr 10 18:05:40 2016 +0300 @@ -680,7 +680,7 @@ 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; } diff -r 4d4febb76864 -r 66fafa13a711 Python/ceval.c --- a/Python/ceval.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Python/ceval.c Sun Apr 10 18:05:40 2016 +0300 @@ -3229,7 +3229,7 @@ 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 @@ Py_INCREF(self); func = PyMethod_GET_FUNCTION(func); Py_INCREF(func); - Py_XSETREF(*pfunc, self); + Py_SETREF(*pfunc, self); na++; n++; } else diff -r 4d4febb76864 -r 66fafa13a711 Python/errors.c --- a/Python/errors.c Sun Apr 10 14:41:19 2016 +0300 +++ b/Python/errors.c Sun Apr 10 18:05:40 2016 +0300 @@ -311,9 +311,9 @@ --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; }