Issue #26200: Added Py_SETREF and replaced Py_XSETREF with Py_SETREF

in places where Py_DECREF was used.
This commit is contained in:
Serhiy Storchaka 2016-04-10 18:12:01 +03:00
commit f01e408c16
23 changed files with 58 additions and 48 deletions

View File

@ -851,18 +851,28 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
* *
* As in case of Py_CLEAR "the obvious" code can be deadly: * As in case of Py_CLEAR "the obvious" code can be deadly:
* *
* Py_XDECREF(op); * Py_DECREF(op);
* op = op2; * op = op2;
* *
* The safe way is: * 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 * 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 * triggered as a side-effect of `op` getting torn down no longer believes
* `op` points to a valid object. * `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) \ #define Py_XSETREF(op, op2) \
do { \ do { \
PyObject *_py_tmp = (PyObject *)(op); \ PyObject *_py_tmp = (PyObject *)(op); \

View File

@ -391,7 +391,7 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt
Py_DECREF((PyObject *)dict); Py_DECREF((PyObject *)dict);
return NULL; return NULL;
} }
Py_XSETREF(result->tp_dict, (PyObject *)dict); Py_SETREF(result->tp_dict, (PyObject *)dict);
dict->format = _ctypes_alloc_format_string(NULL, "B"); dict->format = _ctypes_alloc_format_string(NULL, "B");
if (dict->format == NULL) { if (dict->format == NULL) {
Py_DECREF(result); Py_DECREF(result);
@ -960,7 +960,7 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_XSETREF(result->tp_dict, (PyObject *)stgdict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
return (PyObject *)result; return (PyObject *)result;
} }
@ -1403,7 +1403,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
/* replace the class dict by our updated spam dict */ /* replace the class dict by our updated spam dict */
if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict))
goto error; goto error;
Py_XSETREF(result->tp_dict, (PyObject *)stgdict); /* steal the reference */ Py_SETREF(result->tp_dict, (PyObject *)stgdict); /* steal the reference */
stgdict = NULL; stgdict = NULL;
/* Special case for character arrays. /* Special case for character arrays.
@ -1816,7 +1816,7 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_XSETREF(result->tp_dict, (PyObject *)stgdict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
return (PyObject *)result; return (PyObject *)result;
} }
@ -1944,7 +1944,7 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; 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. /* Install from_param class methods in ctypes base classes.
Overrides the PyCSimpleType_from_param generic method. Overrides the PyCSimpleType_from_param generic method.
@ -2307,7 +2307,7 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_XSETREF(result->tp_dict, (PyObject *)stgdict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
if (-1 == make_funcptrtype_dict(stgdict)) { if (-1 == make_funcptrtype_dict(stgdict)) {
Py_DECREF(result); Py_DECREF(result);
@ -5150,7 +5150,7 @@ comerror_init(PyObject *self, PyObject *args, PyObject *kwds)
return -1; return -1;
Py_INCREF(args); Py_INCREF(args);
Py_XSETREF(((PyBaseExceptionObject *)self)->args, args); Py_SETREF(((PyBaseExceptionObject *)self)->args, args);
return 0; return 0;
} }

View File

@ -313,7 +313,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
return NULL; return NULL;
} }
Py_INCREF(temp); Py_INCREF(temp);
Py_XSETREF(po->wo, temp); Py_SETREF(po->wo, temp);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }

View File

@ -1058,7 +1058,7 @@ format_utcoffset(char *buf, size_t buflen, const char *sep,
/* Offset is normalized, so it is negative if days < 0 */ /* Offset is normalized, so it is negative if days < 0 */
if (GET_TD_DAYS(offset) < 0) { if (GET_TD_DAYS(offset) < 0) {
sign = '-'; sign = '-';
Py_XSETREF(offset, delta_negative((PyDateTime_Delta *)offset)); Py_SETREF(offset, delta_negative((PyDateTime_Delta *)offset));
if (offset == NULL) if (offset == NULL)
return -1; return -1;
} }
@ -3045,7 +3045,7 @@ tzinfo_fromutc(PyDateTime_TZInfo *self, PyObject *dt)
if (dst == Py_None) if (dst == Py_None)
goto Inconsistent; goto Inconsistent;
if (delta_bool((PyDateTime_Delta *)dst) != 0) { if (delta_bool((PyDateTime_Delta *)dst) != 0) {
Py_XSETREF(result, add_datetime_timedelta((PyDateTime_DateTime *)result, Py_SETREF(result, add_datetime_timedelta((PyDateTime_DateTime *)result,
(PyDateTime_Delta *)dst, 1)); (PyDateTime_Delta *)dst, 1));
if (result == NULL) if (result == NULL)
goto Fail; goto Fail;
@ -4445,7 +4445,7 @@ datetime_subtract(PyObject *left, PyObject *right)
return NULL; return NULL;
if (offdiff != NULL) { if (offdiff != NULL) {
Py_XSETREF(result, delta_subtract(result, offdiff)); Py_SETREF(result, delta_subtract(result, offdiff));
Py_DECREF(offdiff); Py_DECREF(offdiff);
} }
} }

View File

@ -1957,7 +1957,7 @@ element_tag_setter(ElementObject *self, PyObject *value, void *closure)
{ {
_VALIDATE_ATTR_VALUE(value); _VALIDATE_ATTR_VALUE(value);
Py_INCREF(value); Py_INCREF(value);
Py_XSETREF(self->tag, value); Py_SETREF(self->tag, value);
return 0; return 0;
} }
@ -1990,7 +1990,7 @@ element_attrib_setter(ElementObject *self, PyObject *value, void *closure)
return -1; return -1;
} }
Py_INCREF(value); Py_INCREF(value);
Py_XSETREF(self->extra->attrib, value); Py_SETREF(self->extra->attrib, value);
return 0; return 0;
} }
@ -2524,9 +2524,9 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
self->index++; self->index++;
Py_INCREF(node); Py_INCREF(node);
Py_XSETREF(self->this, node); Py_SETREF(self->this, node);
Py_INCREF(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) if (treebuilder_append_event(self, self->start_event_obj, node) < 0)
goto error; goto error;

View File

@ -96,7 +96,7 @@ unshare_buffer(bytesio *self, size_t size)
return -1; return -1;
memcpy(PyBytes_AS_STRING(new_buf), PyBytes_AS_STRING(self->buf), memcpy(PyBytes_AS_STRING(new_buf), PyBytes_AS_STRING(self->buf),
self->string_size); self->string_size);
Py_XSETREF(self->buf, new_buf); Py_SETREF(self->buf, new_buf);
return 0; return 0;
} }

View File

@ -204,7 +204,7 @@ void pysqlite_flush_statement_cache(pysqlite_Connection* self)
node = node->next; node = node->next;
} }
Py_XSETREF(self->statement_cache, Py_SETREF(self->statement_cache,
(pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self)); (pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self));
Py_DECREF(self); Py_DECREF(self);
self->statement_cache->decref_factory = 0; self->statement_cache->decref_factory = 0;
@ -793,7 +793,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) static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
@ -824,7 +824,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) PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)

View File

@ -509,7 +509,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
/* reset description and rowcount */ /* reset description and rowcount */
Py_INCREF(Py_None); Py_INCREF(Py_None);
Py_XSETREF(self->description, Py_None); Py_SETREF(self->description, Py_None);
self->rowcount = -1L; self->rowcount = -1L;
func_args = PyTuple_New(1); func_args = PyTuple_New(1);
@ -534,7 +534,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
} }
if (self->statement->in_use) { if (self->statement->in_use) {
Py_XSETREF(self->statement, Py_SETREF(self->statement,
PyObject_New(pysqlite_Statement, &pysqlite_StatementType)); PyObject_New(pysqlite_Statement, &pysqlite_StatementType));
if (!self->statement) { if (!self->statement) {
goto error; goto error;
@ -651,7 +651,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
numcols = sqlite3_column_count(self->statement->st); numcols = sqlite3_column_count(self->statement->st);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
Py_XSETREF(self->description, PyTuple_New(numcols)); Py_SETREF(self->description, PyTuple_New(numcols));
if (!self->description) { if (!self->description) {
goto error; goto error;
} }

View File

@ -753,7 +753,7 @@ deepcopy(PyObject** object, PyObject* memo)
if (!copy) if (!copy)
return 0; return 0;
Py_XSETREF(*object, copy); Py_SETREF(*object, copy);
return 1; /* success */ return 1; /* success */
} }

View File

@ -1589,7 +1589,7 @@ static int PySSL_set_context(PySSLSocket *self, PyObject *value,
return -1; return -1;
#else #else
Py_INCREF(value); Py_INCREF(value);
Py_XSETREF(self->ctx, (PySSLContext *)value); Py_SETREF(self->ctx, (PySSLContext *)value);
SSL_set_SSL_CTX(self->ssl, self->ctx->ctx); SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
#endif #endif
} else { } else {

View File

@ -622,7 +622,7 @@ tee_next(teeobject *to)
link = teedataobject_jumplink(to->dataobj); link = teedataobject_jumplink(to->dataobj);
if (link == NULL) if (link == NULL)
return NULL; return NULL;
Py_XSETREF(to->dataobj, (teedataobject *)link); Py_SETREF(to->dataobj, (teedataobject *)link);
to->index = 0; to->index = 0;
} }
value = teedataobject_getitem(to->dataobj, to->index); value = teedataobject_getitem(to->dataobj, to->index);
@ -3457,7 +3457,7 @@ accumulate_next(accumulateobject *lz)
return NULL; return NULL;
Py_INCREF(newtotal); Py_INCREF(newtotal);
Py_XSETREF(lz->total, newtotal); Py_SETREF(lz->total, newtotal);
return newtotal; return newtotal;
} }

View File

@ -1266,7 +1266,7 @@ PyInit__signal(void)
if (Handlers[SIGINT].func == DefaultHandler) { if (Handlers[SIGINT].func == DefaultHandler) {
/* Install default int handler */ /* Install default int handler */
Py_INCREF(IntHandler); Py_INCREF(IntHandler);
Py_XSETREF(Handlers[SIGINT].func, IntHandler); Py_SETREF(Handlers[SIGINT].func, IntHandler);
old_siginthandler = PyOS_setsig(SIGINT, signal_handler); old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
} }

View File

@ -155,7 +155,7 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)
tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP); tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP);
if (tmp == NULL) if (tmp == NULL)
goto error; goto error;
Py_XSETREF(self->prefix, tmp); Py_SETREF(self->prefix, tmp);
} }
} }
else else

View File

@ -667,7 +667,7 @@ save_unconsumed_input(compobject *self, int err)
PyBytes_AS_STRING(self->unused_data), old_size); PyBytes_AS_STRING(self->unused_data), old_size);
Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size, Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size,
self->zst.next_in, self->zst.avail_in); 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; self->zst.avail_in = 0;
} }
} }
@ -679,7 +679,7 @@ save_unconsumed_input(compobject *self, int err)
(char *)self->zst.next_in, self->zst.avail_in); (char *)self->zst.next_in, self->zst.avail_in);
if (new_data == NULL) if (new_data == NULL)
return -1; return -1;
Py_XSETREF(self->unconsumed_tail, new_data); Py_SETREF(self->unconsumed_tail, new_data);
} }
return 0; return 0;
} }

View File

@ -3697,7 +3697,7 @@ PyBytes_Concat(PyObject **pv, PyObject *w)
/* Multiple references, need to create new object */ /* Multiple references, need to create new object */
PyObject *v; PyObject *v;
v = bytes_concat(*pv, w); v = bytes_concat(*pv, w);
Py_XSETREF(*pv, v); Py_SETREF(*pv, v);
} }
} }

View File

@ -504,7 +504,7 @@ func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
if (name != Py_None) { if (name != Py_None) {
Py_INCREF(name); Py_INCREF(name);
Py_XSETREF(newfunc->func_name, name); Py_SETREF(newfunc->func_name, name);
} }
if (defaults != Py_None) { if (defaults != Py_None) {
Py_INCREF(defaults); Py_INCREF(defaults);

View File

@ -735,7 +735,7 @@ list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
if (v == NULL) if (v == NULL)
return list_ass_slice(a, i, i+1, v); return list_ass_slice(a, i, i+1, v);
Py_INCREF(v); Py_INCREF(v);
Py_XSETREF(a->ob_item[i], v); Py_SETREF(a->ob_item[i], v);
return 0; return 0;
} }

View File

@ -1064,7 +1064,7 @@ longrangeiter_next(longrangeiterobject *r)
result = PyNumber_Add(r->start, product); result = PyNumber_Add(r->start, product);
Py_DECREF(product); Py_DECREF(product);
if (result) { if (result) {
Py_XSETREF(r->index, new_index); Py_SETREF(r->index, new_index);
} }
else { else {
Py_DECREF(new_index); Py_DECREF(new_index);

View File

@ -424,7 +424,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
type->tp_name = tp_name; type->tp_name = tp_name;
Py_INCREF(value); Py_INCREF(value);
Py_XSETREF(((PyHeapTypeObject*)type)->ht_name, value); Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value);
return 0; return 0;
} }
@ -445,7 +445,7 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
et = (PyHeapTypeObject*)type; et = (PyHeapTypeObject*)type;
Py_INCREF(value); Py_INCREF(value);
Py_XSETREF(et->ht_qualname, value); Py_SETREF(et->ht_qualname, value);
return 0; return 0;
} }
@ -2903,7 +2903,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
else else
method_cache_misses++; method_cache_misses++;
#endif #endif
Py_XSETREF(method_cache[h].name, name); Py_SETREF(method_cache[h].name, name);
} }
return res; return res;
} }

View File

@ -1830,7 +1830,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)
_Py_INCREF_UNICODE_EMPTY(); _Py_INCREF_UNICODE_EMPTY();
if (!unicode_empty) if (!unicode_empty)
return -1; return -1;
Py_XSETREF(*p_unicode, unicode_empty); Py_SETREF(*p_unicode, unicode_empty);
return 0; return 0;
} }
@ -1838,7 +1838,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)
PyObject *copy = resize_copy(unicode, length); PyObject *copy = resize_copy(unicode, length);
if (copy == NULL) if (copy == NULL)
return -1; return -1;
Py_XSETREF(*p_unicode, copy); Py_SETREF(*p_unicode, copy);
return 0; return 0;
} }
@ -13547,7 +13547,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
return -1; return -1;
_PyUnicode_FastCopyCharacters(newbuffer, 0, _PyUnicode_FastCopyCharacters(newbuffer, 0,
writer->buffer, 0, writer->pos); writer->buffer, 0, writer->pos);
Py_XSETREF(writer->buffer, newbuffer); Py_SETREF(writer->buffer, newbuffer);
} }
_PyUnicodeWriter_Update(writer); _PyUnicodeWriter_Update(writer);
return 0; return 0;
@ -15264,7 +15264,7 @@ PyUnicode_InternInPlace(PyObject **p)
if (t) { if (t) {
Py_INCREF(t); Py_INCREF(t);
Py_XSETREF(*p, t); Py_SETREF(*p, t);
return; return;
} }

View File

@ -730,7 +730,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
goto handle_error; goto handle_error;
} }
else if (!is_true) { else if (!is_true) {
Py_XSETREF(*filename, PyUnicode_FromString("__main__")); Py_SETREF(*filename, PyUnicode_FromString("__main__"));
if (*filename == NULL) if (*filename == NULL)
goto handle_error; goto handle_error;
} }

View File

@ -3236,7 +3236,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Py_INCREF(self); Py_INCREF(self);
func = PyMethod_GET_FUNCTION(func); func = PyMethod_GET_FUNCTION(func);
Py_INCREF(func); Py_INCREF(func);
Py_XSETREF(*pfunc, self); Py_SETREF(*pfunc, self);
na++; na++;
/* n++; */ /* n++; */
} else } else
@ -4747,7 +4747,7 @@ call_function(PyObject ***pp_stack, int oparg
Py_INCREF(self); Py_INCREF(self);
func = PyMethod_GET_FUNCTION(func); func = PyMethod_GET_FUNCTION(func);
Py_INCREF(func); Py_INCREF(func);
Py_XSETREF(*pfunc, self); Py_SETREF(*pfunc, self);
na++; na++;
n++; n++;
} else } else

View File

@ -311,9 +311,9 @@ finally:
--tstate->recursion_depth; --tstate->recursion_depth;
/* throw away the old exception and use the recursion error instead */ /* throw away the old exception and use the recursion error instead */
Py_INCREF(PyExc_RecursionError); Py_INCREF(PyExc_RecursionError);
Py_XSETREF(*exc, PyExc_RecursionError); Py_SETREF(*exc, PyExc_RecursionError);
Py_INCREF(PyExc_RecursionErrorInst); Py_INCREF(PyExc_RecursionErrorInst);
Py_XSETREF(*val, PyExc_RecursionErrorInst); Py_SETREF(*val, PyExc_RecursionErrorInst);
/* just keeping the old traceback */ /* just keeping the old traceback */
return; return;
} }