diff -r 090c3e3a648d Include/object.h --- a/Include/object.h Mon Dec 21 12:57:27 2015 +0200 +++ b/Include/object.h Mon Dec 21 16:52:36 2015 +0200 @@ -846,6 +846,29 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *) Py_DECREF(_py_xdecref_tmp); \ } while (0) +/* Safely decref `op` and set `op` to `op2`. + * + * As in case of Py_CLEAR "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = op2; + * + * The safe way is: + * + * 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. + */ + +#define Py_SETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_XDECREF(_py_tmp); \ + } while (0) + /* These are provided as conveniences to Python runtime embedders, so that they can have object code that is not dependent on Python compilation flags. diff -r 090c3e3a648d Modules/_csv.c --- a/Modules/_csv.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_csv.c Mon Dec 21 16:52:36 2015 +0200 @@ -276,9 +276,8 @@ static int else { if (PyUnicode_READY(src) == -1) return -1; - Py_XDECREF(*target); Py_INCREF(src); - *target = src; + Py_SETREF(*target, src); } } return 0; @@ -784,8 +783,7 @@ parse_process_char(ReaderObj *self, Py_U static int parse_reset(ReaderObj *self) { - Py_XDECREF(self->fields); - self->fields = PyList_New(0); + Py_SETREF(self->fields, PyList_New(0)); if (self->fields == NULL) return -1; self->field_len = 0; diff -r 090c3e3a648d Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_ctypes/_ctypes.c Mon Dec 21 16:52:36 2015 +0200 @@ -391,8 +391,7 @@ StructUnionType_new(PyTypeObject *type, Py_DECREF((PyObject *)dict); return NULL; } - Py_DECREF(result->tp_dict); - 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); @@ -871,8 +870,7 @@ PyCPointerType_SetProto(StgDictObject *s return -1; } Py_INCREF(proto); - Py_XDECREF(stgdict->proto); - stgdict->proto = proto; + Py_SETREF(stgdict->proto, proto); return 0; } @@ -962,8 +960,7 @@ PyCPointerType_new(PyTypeObject *type, P Py_DECREF((PyObject *)stgdict); return NULL; } - Py_DECREF(result->tp_dict); - result->tp_dict = (PyObject *)stgdict; + Py_SETREF(result->tp_dict, (PyObject *)stgdict); return (PyObject *)result; } @@ -1406,8 +1403,7 @@ PyCArrayType_new(PyTypeObject *type, PyO /* replace the class dict by our updated spam dict */ if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) goto error; - Py_DECREF(result->tp_dict); - 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. @@ -1820,8 +1816,7 @@ static PyObject *CreateSwappedType(PyTyp Py_DECREF((PyObject *)stgdict); return NULL; } - Py_DECREF(result->tp_dict); - result->tp_dict = (PyObject *)stgdict; + Py_SETREF(result->tp_dict, (PyObject *)stgdict); return (PyObject *)result; } @@ -1949,8 +1944,7 @@ PyCSimpleType_new(PyTypeObject *type, Py Py_DECREF((PyObject *)stgdict); return NULL; } - Py_DECREF(result->tp_dict); - 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. @@ -2313,8 +2307,7 @@ PyCFuncPtrType_new(PyTypeObject *type, P Py_DECREF((PyObject *)stgdict); return NULL; } - Py_DECREF(result->tp_dict); - result->tp_dict = (PyObject *)stgdict; + Py_SETREF(result->tp_dict, (PyObject *)stgdict); if (-1 == make_funcptrtype_dict(stgdict)) { Py_DECREF(result); @@ -2458,8 +2451,7 @@ KeepRef(CDataObject *target, Py_ssize_t return -1; } if (ob->b_objects == NULL || !PyDict_CheckExact(ob->b_objects)) { - Py_XDECREF(ob->b_objects); - ob->b_objects = keep; /* refcount consumed */ + Py_SETREF(ob->b_objects, keep); /* refcount consumed */ return 0; } key = unique_key(target, index); @@ -2962,9 +2954,8 @@ PyCFuncPtr_set_errcheck(PyCFuncPtrObject "the errcheck attribute must be callable"); return -1; } - Py_XDECREF(self->errcheck); Py_XINCREF(ob); - self->errcheck = ob; + Py_SETREF(self->errcheck, ob); return 0; } @@ -2993,9 +2984,8 @@ PyCFuncPtr_set_restype(PyCFuncPtrObject return -1; } Py_XDECREF(self->checker); - Py_XDECREF(self->restype); Py_INCREF(ob); - self->restype = ob; + Py_SETREF(self->restype, ob); self->checker = PyObject_GetAttrString(ob, "_check_retval_"); if (self->checker == NULL) PyErr_Clear(); @@ -3033,11 +3023,9 @@ PyCFuncPtr_set_argtypes(PyCFuncPtrObject converters = converters_from_argtypes(ob); if (!converters) return -1; - Py_XDECREF(self->converters); - self->converters = converters; - Py_XDECREF(self->argtypes); + Py_SETREF(self->converters, converters); Py_INCREF(ob); - self->argtypes = ob; + Py_SETREF(self->argtypes, ob); } return 0; } @@ -5164,8 +5152,7 @@ comerror_init(PyObject *self, PyObject * return -1; bself = (PyBaseExceptionObject *)self; - Py_DECREF(bself->args); - bself->args = args; + Py_SETREF(bself->args, args); Py_INCREF(bself->args); return 0; diff -r 090c3e3a648d Modules/_curses_panel.c --- a/Modules/_curses_panel.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_curses_panel.c Mon Dec 21 16:52:36 2015 +0200 @@ -312,9 +312,8 @@ PyCursesPanel_replace_panel(PyCursesPane PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR"); return NULL; } - Py_DECREF(po->wo); - po->wo = temp; - Py_INCREF(po->wo); + Py_INCREF(temp); + Py_SETREF(po->wo, temp); Py_INCREF(Py_None); return Py_None; } diff -r 090c3e3a648d Modules/_io/bytesio.c --- a/Modules/_io/bytesio.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_io/bytesio.c Mon Dec 21 16:52:36 2015 +0200 @@ -969,8 +969,7 @@ static int if (initvalue && initvalue != Py_None) { if (PyBytes_CheckExact(initvalue)) { Py_INCREF(initvalue); - Py_XDECREF(self->buf); - self->buf = initvalue; + Py_SETREF(self->buf, initvalue); self->string_size = PyBytes_GET_SIZE(initvalue); } else { diff -r 090c3e3a648d Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_sqlite/connection.c Mon Dec 21 16:52:36 2015 +0200 @@ -204,8 +204,8 @@ void pysqlite_flush_statement_cache(pysq node = node->next; } - Py_DECREF(self->statement_cache); - self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "O", self); + Py_SETREF(self->statement_cache, (pysqlite_Cache *)PyObject_CallFunction( + (PyObject *)&pysqlite_CacheType, "O", self)); Py_DECREF(self); self->statement_cache->decref_factory = 0; } @@ -318,9 +318,9 @@ PyObject* pysqlite_connection_cursor(pys _pysqlite_drop_unused_cursor_references(self); if (cursor && self->row_factory != Py_None) { - Py_XDECREF(((pysqlite_Cursor*)cursor)->row_factory); Py_INCREF(self->row_factory); - ((pysqlite_Cursor*)cursor)->row_factory = self->row_factory; + Py_SETREF(((pysqlite_Cursor *)cursor)->row_factory, + self->row_factory); } return cursor; @@ -795,8 +795,7 @@ static void _pysqlite_drop_unused_statem } } - Py_DECREF(self->statements); - self->statements = new_list; + Py_SETREF(self->statements, new_list); } static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) @@ -827,8 +826,7 @@ static void _pysqlite_drop_unused_cursor } } - Py_DECREF(self->cursors); - self->cursors = new_list; + Py_SETREF(self->cursors, new_list); } PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) diff -r 090c3e3a648d Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_sqlite/cursor.c Mon Dec 21 16:52:36 2015 +0200 @@ -170,8 +170,7 @@ int pysqlite_build_row_cast_map(pysqlite return 0; } - Py_XDECREF(self->row_cast_map); - self->row_cast_map = PyList_New(0); + Py_SETREF(self->row_cast_map, PyList_New(0)); for (i = 0; i < sqlite3_column_count(self->statement->st); i++) { converter = NULL; @@ -510,9 +509,8 @@ PyObject* _pysqlite_query_execute(pysqli goto error; /* reset description and rowcount */ - Py_DECREF(self->description); Py_INCREF(Py_None); - self->description = Py_None; + Py_SETREF(self->description, Py_None); self->rowcount = -1L; func_args = PyTuple_New(1); @@ -537,8 +535,8 @@ PyObject* _pysqlite_query_execute(pysqli } if (self->statement->in_use) { - Py_DECREF(self->statement); - self->statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType); + Py_SETREF(self->statement, + PyObject_New(pysqlite_Statement, &pysqlite_StatementType)); if (!self->statement) { goto error; } @@ -654,8 +652,7 @@ PyObject* _pysqlite_query_execute(pysqli numcols = sqlite3_column_count(self->statement->st); Py_END_ALLOW_THREADS - Py_DECREF(self->description); - self->description = PyTuple_New(numcols); + Py_SETREF(self->description, PyTuple_New(numcols)); if (!self->description) { goto error; } diff -r 090c3e3a648d Modules/_sre.c --- a/Modules/_sre.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_sre.c Mon Dec 21 16:52:36 2015 +0200 @@ -753,8 +753,7 @@ deepcopy(PyObject** object, PyObject* me if (!copy) return 0; - Py_DECREF(*object); - *object = copy; + Py_SETREF(*object, copy); return 1; /* success */ } diff -r 090c3e3a648d Modules/_ssl.c --- a/Modules/_ssl.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/_ssl.c Mon Dec 21 16:52:36 2015 +0200 @@ -1589,8 +1589,7 @@ static int PySSL_set_context(PySSLSocket return -1; #else Py_INCREF(value); - Py_DECREF(self->ctx); - self->ctx = (PySSLContext *) value; + Py_SETREF(self->ctx, (PySSLContext *)value); SSL_set_SSL_CTX(self->ssl, self->ctx->ctx); #endif } else { @@ -1647,8 +1646,7 @@ PySSL_get_owner(PySSLSocket *self, void static int PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c) { - Py_XDECREF(self->owner); - self->owner = PyWeakref_NewRef(value, NULL); + Py_SETREF(self->owner, PyWeakref_NewRef(value, NULL)); if (self->owner == NULL) return -1; return 0; diff -r 090c3e3a648d Modules/faulthandler.c --- a/Modules/faulthandler.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/faulthandler.c Mon Dec 21 16:52:36 2015 +0200 @@ -380,9 +380,8 @@ faulthandler_enable(PyObject *self, PyOb if (tstate == NULL) return NULL; - Py_XDECREF(fatal_error.file); Py_XINCREF(file); - fatal_error.file = file; + Py_SETREF(fatal_error.file, file); fatal_error.fd = fd; fatal_error.all_threads = all_threads; fatal_error.interp = tstate->interp; @@ -599,9 +598,8 @@ faulthandler_dump_traceback_later(PyObje /* Cancel previous thread, if running */ cancel_dump_traceback_later(); - Py_XDECREF(thread.file); Py_XINCREF(file); - thread.file = file; + Py_SETREF(thread.file, file); thread.fd = fd; thread.timeout_us = timeout_us; thread.repeat = repeat; @@ -778,9 +776,8 @@ faulthandler_register_py(PyObject *self, user->previous = previous; } - Py_XDECREF(user->file); Py_XINCREF(file); - user->file = file; + Py_SETREF(user->file, file); user->fd = fd; user->all_threads = all_threads; user->chain = chain; diff -r 090c3e3a648d Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/itertoolsmodule.c Mon Dec 21 16:52:36 2015 +0200 @@ -634,8 +634,7 @@ tee_next(teeobject *to) link = teedataobject_jumplink(to->dataobj); if (link == NULL) return NULL; - Py_DECREF(to->dataobj); - to->dataobj = (teedataobject *)link; + Py_SETREF(to->dataobj, (teedataobject *)link); to->index = 0; } value = teedataobject_getitem(to->dataobj, to->index); diff -r 090c3e3a648d Modules/signalmodule.c --- a/Modules/signalmodule.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/signalmodule.c Mon Dec 21 16:52:36 2015 +0200 @@ -1266,8 +1266,7 @@ PyInit__signal(void) if (Handlers[SIGINT].func == DefaultHandler) { /* Install default int handler */ Py_INCREF(IntHandler); - Py_DECREF(Handlers[SIGINT].func); - Handlers[SIGINT].func = IntHandler; + Py_SETREF(Handlers[SIGINT].func, IntHandler); old_siginthandler = PyOS_setsig(SIGINT, signal_handler); } diff -r 090c3e3a648d Modules/zipimport.c --- a/Modules/zipimport.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/zipimport.c Mon Dec 21 16:52:36 2015 +0200 @@ -155,8 +155,7 @@ zipimporter_init(ZipImporter *self, PyOb tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP); if (tmp == NULL) goto error; - Py_DECREF(self->prefix); - self->prefix = tmp; + Py_SETREF(self->prefix, tmp); } } else diff -r 090c3e3a648d Modules/zlibmodule.c --- a/Modules/zlibmodule.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Modules/zlibmodule.c Mon Dec 21 16:52:36 2015 +0200 @@ -667,8 +667,7 @@ save_unconsumed_input(compobject *self, 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_DECREF(self->unused_data); - self->unused_data = new_data; + Py_SETREF(self->unused_data, new_data); self->zst.avail_in = 0; } } @@ -680,8 +679,7 @@ save_unconsumed_input(compobject *self, (char *)self->zst.next_in, self->zst.avail_in); if (new_data == NULL) return -1; - Py_DECREF(self->unconsumed_tail); - self->unconsumed_tail = new_data; + Py_SETREF(self->unconsumed_tail, new_data); } return 0; } diff -r 090c3e3a648d Objects/bytesobject.c --- a/Objects/bytesobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/bytesobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -3688,8 +3688,7 @@ PyBytes_Concat(PyObject **pv, PyObject * /* Multiple references, need to create new object */ PyObject *v; v = bytes_concat(*pv, w); - Py_DECREF(*pv); - *pv = v; + Py_SETREF(*pv, v); } } diff -r 090c3e3a648d Objects/descrobject.c --- a/Objects/descrobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/descrobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -1509,8 +1509,7 @@ property_init(PyObject *self, PyObject * PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__); if (get_doc) { if (Py_TYPE(self) == &PyProperty_Type) { - Py_XDECREF(prop->prop_doc); - prop->prop_doc = get_doc; + Py_SETREF(prop->prop_doc, get_doc); } else { /* If this is a property subclass, put __doc__ diff -r 090c3e3a648d Objects/exceptions.c --- a/Objects/exceptions.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/exceptions.c Mon Dec 21 16:52:36 2015 +0200 @@ -236,8 +236,7 @@ BaseException_set_tb(PyBaseExceptionObje } Py_XINCREF(tb); - Py_XDECREF(self->traceback); - self->traceback = tb; + Py_SETREF(self->traceback, tb); return 0; } diff -r 090c3e3a648d Objects/frameobject.c --- a/Objects/frameobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/frameobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -857,8 +857,7 @@ dict_to_map(PyObject *map, Py_ssize_t nm } } else if (values[j] != value) { Py_XINCREF(value); - Py_XDECREF(values[j]); - values[j] = value; + Py_SETREF(values[j], value); } Py_XDECREF(value); } diff -r 090c3e3a648d Objects/funcobject.c --- a/Objects/funcobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/funcobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -127,8 +127,7 @@ PyFunction_SetDefaults(PyObject *op, PyO PyErr_SetString(PyExc_SystemError, "non-tuple default args"); return -1; } - Py_XDECREF(((PyFunctionObject *) op) -> func_defaults); - ((PyFunctionObject *) op) -> func_defaults = defaults; + Py_SETREF(((PyFunctionObject *)op)->func_defaults, defaults); return 0; } @@ -159,8 +158,7 @@ PyFunction_SetKwDefaults(PyObject *op, P "non-dict keyword only default args"); return -1; } - Py_XDECREF(((PyFunctionObject *)op) -> func_kwdefaults); - ((PyFunctionObject *) op) -> func_kwdefaults = defaults; + Py_SETREF(((PyFunctionObject *)op)->func_kwdefaults, defaults); return 0; } @@ -192,8 +190,7 @@ PyFunction_SetClosure(PyObject *op, PyOb closure->ob_type->tp_name); return -1; } - Py_XDECREF(((PyFunctionObject *) op) -> func_closure); - ((PyFunctionObject *) op) -> func_closure = closure; + Py_SETREF(((PyFunctionObject *)op)->func_closure, closure); return 0; } @@ -224,8 +221,7 @@ PyFunction_SetAnnotations(PyObject *op, "non-dict annotations"); return -1; } - Py_XDECREF(((PyFunctionObject *)op) -> func_annotations); - ((PyFunctionObject *) op) -> func_annotations = annotations; + Py_SETREF(((PyFunctionObject *)op)->func_annotations, annotations); return 0; } @@ -531,8 +527,7 @@ func_new(PyTypeObject* type, PyObject* a if (name != Py_None) { Py_INCREF(name); - Py_DECREF(newfunc->func_name); - newfunc->func_name = name; + Py_SETREF(newfunc->func_name, name); } if (defaults != Py_None) { Py_INCREF(defaults); diff -r 090c3e3a648d Objects/moduleobject.c --- a/Objects/moduleobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/moduleobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -69,8 +69,7 @@ module_init_dict(PyModuleObject *mod, Py return -1; if (PyUnicode_CheckExact(name)) { Py_INCREF(name); - Py_XDECREF(mod->md_name); - mod->md_name = name; + Py_SETREF(mod->md_name, name); } return 0; diff -r 090c3e3a648d Objects/rangeobject.c --- a/Objects/rangeobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/rangeobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -1066,8 +1066,7 @@ longrangeiter_next(longrangeiterobject * result = PyNumber_Add(r->start, product); Py_DECREF(product); if (result) { - Py_DECREF(r->index); - r->index = new_index; + Py_SETREF(r->index, new_index); } else { Py_DECREF(new_index); diff -r 090c3e3a648d Objects/typeobject.c --- a/Objects/typeobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/typeobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -315,8 +315,7 @@ assign_version_tag(PyTypeObject *type) are borrowed reference */ for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) { method_cache[i].value = NULL; - Py_XDECREF(method_cache[i].name); - method_cache[i].name = Py_None; + Py_SETREF(method_cache[i].name, Py_None); Py_INCREF(Py_None); } /* mark all version tags as invalid */ @@ -462,8 +461,7 @@ type_set_qualname(PyTypeObject *type, Py et = (PyHeapTypeObject*)type; Py_INCREF(value); - Py_DECREF(et->ht_qualname); - et->ht_qualname = value; + Py_SETREF(et->ht_qualname, value); return 0; } @@ -2918,8 +2916,7 @@ PyObject * else method_cache_misses++; #endif - Py_DECREF(method_cache[h].name); - method_cache[h].name = name; + Py_SETREF(method_cache[h].name, name); } return res; } diff -r 090c3e3a648d Objects/unicodeobject.c --- a/Objects/unicodeobject.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Objects/unicodeobject.c Mon Dec 21 16:52:36 2015 +0200 @@ -1828,8 +1828,7 @@ unicode_resize(PyObject **p_unicode, Py_ _Py_INCREF_UNICODE_EMPTY(); if (!unicode_empty) return -1; - Py_DECREF(*p_unicode); - *p_unicode = unicode_empty; + Py_SETREF(*p_unicode, unicode_empty); return 0; } @@ -1837,8 +1836,7 @@ unicode_resize(PyObject **p_unicode, Py_ PyObject *copy = resize_copy(unicode, length); if (copy == NULL) return -1; - Py_DECREF(*p_unicode); - *p_unicode = copy; + Py_SETREF(*p_unicode, copy); return 0; } @@ -13543,8 +13541,7 @@ int return -1; _PyUnicode_FastCopyCharacters(newbuffer, 0, writer->buffer, 0, writer->pos); - Py_DECREF(writer->buffer); - writer->buffer = newbuffer; + Py_SETREF(writer->buffer, newbuffer); } _PyUnicodeWriter_Update(writer); return 0; @@ -15261,8 +15258,7 @@ PyUnicode_InternInPlace(PyObject **p) if (t) { Py_INCREF(t); - Py_DECREF(*p); - *p = t; + Py_SETREF(*p, t); return; } diff -r 090c3e3a648d Parser/tokenizer.c --- a/Parser/tokenizer.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Parser/tokenizer.c Mon Dec 21 16:52:36 2015 +0200 @@ -524,9 +524,8 @@ fp_setreadl(struct tok_state *tok, const if (stream == NULL) goto cleanup; - Py_XDECREF(tok->decoding_readline); readline = _PyObject_GetAttrId(stream, &PyId_readline); - tok->decoding_readline = readline; + Py_SETREF(tok->decoding_readline, readline); if (pos > 0) { if (PyObject_CallObject(readline, NULL) == NULL) { readline = NULL; diff -r 090c3e3a648d Python/_warnings.c --- a/Python/_warnings.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Python/_warnings.c Mon Dec 21 16:52:36 2015 +0200 @@ -680,8 +680,7 @@ setup_context(Py_ssize_t stack_level, Py goto handle_error; } else if (!is_true) { - Py_DECREF(*filename); - *filename = PyUnicode_FromString("__main__"); + Py_SETREF(*filename, PyUnicode_FromString("__main__")); if (*filename == NULL) goto handle_error; } diff -r 090c3e3a648d Python/ast.c --- a/Python/ast.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Python/ast.c Mon Dec 21 16:52:36 2015 +0200 @@ -4692,11 +4692,8 @@ FstringParser_ConcatAndDel(FstringParser state->last_str = str; } else { /* Concatenate this with the previous string. */ - PyObject *temp = PyUnicode_Concat(state->last_str, str); - Py_DECREF(state->last_str); - Py_DECREF(str); - state->last_str = temp; - if (!temp) + PyUnicode_AppendAndDel(&state->last_str, str); + if (!state->last_str) return -1; } FstringParser_check_invariants(state); diff -r 090c3e3a648d Python/ceval.c --- a/Python/ceval.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Python/ceval.c Mon Dec 21 16:52:36 2015 +0200 @@ -3221,8 +3221,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_INCREF(self); func = PyMethod_GET_FUNCTION(func); Py_INCREF(func); - Py_DECREF(*pfunc); - *pfunc = self; + Py_SETREF(*pfunc, self); na++; /* n++; */ } else @@ -4734,8 +4733,7 @@ call_function(PyObject ***pp_stack, int Py_INCREF(self); func = PyMethod_GET_FUNCTION(func); Py_INCREF(func); - Py_DECREF(*pfunc); - *pfunc = self; + Py_SETREF(*pfunc, self); na++; n++; } else diff -r 090c3e3a648d Python/compile.c --- a/Python/compile.c Mon Dec 21 12:57:27 2015 +0200 +++ b/Python/compile.c Mon Dec 21 16:52:36 2015 +0200 @@ -1800,8 +1800,7 @@ compiler_class(struct compiler *c, stmt_ { /* use the class name for name mangling */ Py_INCREF(s->v.ClassDef.name); - Py_XDECREF(c->u->u_private); - c->u->u_private = s->v.ClassDef.name; + Py_SETREF(c->u->u_private, s->v.ClassDef.name); /* load (global) __name__ ... */ str = PyUnicode_InternFromString("__name__"); if (!str || !compiler_nameop(c, str, Load)) {