Issue #20440: Massive replacing unsafe attribute setting code with special

macro Py_SETREF.
This commit is contained in:
Serhiy Storchaka 2015-12-24 10:39:57 +02:00
commit f006940351
28 changed files with 92 additions and 120 deletions

View File

@ -846,6 +846,32 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
Py_DECREF(_py_xdecref_tmp); \ Py_DECREF(_py_xdecref_tmp); \
} while (0) } while (0)
#ifndef Py_LIMITED_API
/* 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)
#endif /* ifndef Py_LIMITED_API */
/* /*
These are provided as conveniences to Python runtime embedders, so that These are provided as conveniences to Python runtime embedders, so that
they can have object code that is not dependent on Python compilation flags. they can have object code that is not dependent on Python compilation flags.

View File

@ -10,6 +10,9 @@ Release date: tba
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #20440: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.
- Issue #25766: Special method __bytes__() now works in str subclasses. - Issue #25766: Special method __bytes__() now works in str subclasses.
- Issue #25421: __sizeof__ methods of builtin types now use dynamic basic size. - Issue #25421: __sizeof__ methods of builtin types now use dynamic basic size.

View File

@ -276,9 +276,8 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
else { else {
if (PyUnicode_READY(src) == -1) if (PyUnicode_READY(src) == -1)
return -1; return -1;
Py_XDECREF(*target);
Py_INCREF(src); Py_INCREF(src);
*target = src; Py_SETREF(*target, src);
} }
} }
return 0; return 0;
@ -784,8 +783,7 @@ parse_process_char(ReaderObj *self, Py_UCS4 c)
static int static int
parse_reset(ReaderObj *self) parse_reset(ReaderObj *self)
{ {
Py_XDECREF(self->fields); Py_SETREF(self->fields, PyList_New(0));
self->fields = PyList_New(0);
if (self->fields == NULL) if (self->fields == NULL)
return -1; return -1;
self->field_len = 0; self->field_len = 0;

View File

@ -391,8 +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_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)dict);
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);
@ -871,8 +870,7 @@ PyCPointerType_SetProto(StgDictObject *stgdict, PyObject *proto)
return -1; return -1;
} }
Py_INCREF(proto); Py_INCREF(proto);
Py_XDECREF(stgdict->proto); Py_SETREF(stgdict->proto, proto);
stgdict->proto = proto;
return 0; return 0;
} }
@ -962,8 +960,7 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
result->tp_dict = (PyObject *)stgdict;
return (PyObject *)result; return (PyObject *)result;
} }
@ -1406,8 +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_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)stgdict); /* steal the reference */
result->tp_dict = (PyObject *)stgdict; /* steal the reference */
stgdict = NULL; stgdict = NULL;
/* Special case for character arrays. /* Special case for character arrays.
@ -1820,8 +1816,7 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
result->tp_dict = (PyObject *)stgdict;
return (PyObject *)result; return (PyObject *)result;
} }
@ -1949,8 +1944,7 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
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.
@ -2313,8 +2307,7 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF((PyObject *)stgdict); Py_DECREF((PyObject *)stgdict);
return NULL; return NULL;
} }
Py_DECREF(result->tp_dict); Py_SETREF(result->tp_dict, (PyObject *)stgdict);
result->tp_dict = (PyObject *)stgdict;
if (-1 == make_funcptrtype_dict(stgdict)) { if (-1 == make_funcptrtype_dict(stgdict)) {
Py_DECREF(result); Py_DECREF(result);
@ -2458,8 +2451,7 @@ KeepRef(CDataObject *target, Py_ssize_t index, PyObject *keep)
return -1; return -1;
} }
if (ob->b_objects == NULL || !PyDict_CheckExact(ob->b_objects)) { if (ob->b_objects == NULL || !PyDict_CheckExact(ob->b_objects)) {
Py_XDECREF(ob->b_objects); Py_SETREF(ob->b_objects, keep); /* refcount consumed */
ob->b_objects = keep; /* refcount consumed */
return 0; return 0;
} }
key = unique_key(target, index); key = unique_key(target, index);
@ -2962,9 +2954,8 @@ PyCFuncPtr_set_errcheck(PyCFuncPtrObject *self, PyObject *ob)
"the errcheck attribute must be callable"); "the errcheck attribute must be callable");
return -1; return -1;
} }
Py_XDECREF(self->errcheck);
Py_XINCREF(ob); Py_XINCREF(ob);
self->errcheck = ob; Py_SETREF(self->errcheck, ob);
return 0; return 0;
} }
@ -2993,9 +2984,8 @@ PyCFuncPtr_set_restype(PyCFuncPtrObject *self, PyObject *ob)
return -1; return -1;
} }
Py_XDECREF(self->checker); Py_XDECREF(self->checker);
Py_XDECREF(self->restype);
Py_INCREF(ob); Py_INCREF(ob);
self->restype = ob; Py_SETREF(self->restype, ob);
self->checker = PyObject_GetAttrString(ob, "_check_retval_"); self->checker = PyObject_GetAttrString(ob, "_check_retval_");
if (self->checker == NULL) if (self->checker == NULL)
PyErr_Clear(); PyErr_Clear();
@ -3033,11 +3023,9 @@ PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob)
converters = converters_from_argtypes(ob); converters = converters_from_argtypes(ob);
if (!converters) if (!converters)
return -1; return -1;
Py_XDECREF(self->converters); Py_SETREF(self->converters, converters);
self->converters = converters;
Py_XDECREF(self->argtypes);
Py_INCREF(ob); Py_INCREF(ob);
self->argtypes = ob; Py_SETREF(self->argtypes, ob);
} }
return 0; return 0;
} }
@ -5164,9 +5152,8 @@ comerror_init(PyObject *self, PyObject *args, PyObject *kwds)
return -1; return -1;
bself = (PyBaseExceptionObject *)self; bself = (PyBaseExceptionObject *)self;
Py_DECREF(bself->args); Py_INCREF(args);
bself->args = args; Py_SETREF(bself->args, args);
Py_INCREF(bself->args);
return 0; return 0;
} }

View File

@ -312,9 +312,8 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR"); PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR");
return NULL; return NULL;
} }
Py_DECREF(po->wo); Py_INCREF(temp);
po->wo = temp; Py_SETREF(po->wo, temp);
Py_INCREF(po->wo);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }

View File

@ -969,8 +969,7 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)
if (initvalue && initvalue != Py_None) { if (initvalue && initvalue != Py_None) {
if (PyBytes_CheckExact(initvalue)) { if (PyBytes_CheckExact(initvalue)) {
Py_INCREF(initvalue); Py_INCREF(initvalue);
Py_XDECREF(self->buf); Py_SETREF(self->buf, initvalue);
self->buf = initvalue;
self->string_size = PyBytes_GET_SIZE(initvalue); self->string_size = PyBytes_GET_SIZE(initvalue);
} }
else { else {

View File

@ -204,8 +204,8 @@ void pysqlite_flush_statement_cache(pysqlite_Connection* self)
node = node->next; node = node->next;
} }
Py_DECREF(self->statement_cache); Py_SETREF(self->statement_cache,
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;
} }
@ -318,9 +318,8 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,
_pysqlite_drop_unused_cursor_references(self); _pysqlite_drop_unused_cursor_references(self);
if (cursor && self->row_factory != Py_None) { if (cursor && self->row_factory != Py_None) {
Py_XDECREF(((pysqlite_Cursor*)cursor)->row_factory);
Py_INCREF(self->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; return cursor;
@ -795,8 +794,7 @@ static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self
} }
} }
Py_DECREF(self->statements); Py_SETREF(self->statements, new_list);
self->statements = new_list;
} }
static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self) static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
@ -827,8 +825,7 @@ static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)
} }
} }
Py_DECREF(self->cursors); Py_SETREF(self->cursors, new_list);
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

@ -170,8 +170,7 @@ int pysqlite_build_row_cast_map(pysqlite_Cursor* self)
return 0; return 0;
} }
Py_XDECREF(self->row_cast_map); Py_SETREF(self->row_cast_map, PyList_New(0));
self->row_cast_map = PyList_New(0);
for (i = 0; i < sqlite3_column_count(self->statement->st); i++) { for (i = 0; i < sqlite3_column_count(self->statement->st); i++) {
converter = NULL; converter = NULL;
@ -510,9 +509,8 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
goto error; goto error;
/* reset description and rowcount */ /* reset description and rowcount */
Py_DECREF(self->description);
Py_INCREF(Py_None); Py_INCREF(Py_None);
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);
@ -537,8 +535,8 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
} }
if (self->statement->in_use) { if (self->statement->in_use) {
Py_DECREF(self->statement); Py_SETREF(self->statement,
self->statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType); PyObject_New(pysqlite_Statement, &pysqlite_StatementType));
if (!self->statement) { if (!self->statement) {
goto error; goto error;
} }
@ -654,8 +652,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_DECREF(self->description); Py_SETREF(self->description, PyTuple_New(numcols));
self->description = PyTuple_New(numcols);
if (!self->description) { if (!self->description) {
goto error; goto error;
} }

View File

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

View File

@ -1589,8 +1589,7 @@ static int PySSL_set_context(PySSLSocket *self, PyObject *value,
return -1; return -1;
#else #else
Py_INCREF(value); Py_INCREF(value);
Py_DECREF(self->ctx); Py_SETREF(self->ctx, (PySSLContext *)value);
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 {
@ -1647,8 +1646,7 @@ PySSL_get_owner(PySSLSocket *self, void *c)
static int static int
PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c) PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c)
{ {
Py_XDECREF(self->owner); Py_SETREF(self->owner, PyWeakref_NewRef(value, NULL));
self->owner = PyWeakref_NewRef(value, NULL);
if (self->owner == NULL) if (self->owner == NULL)
return -1; return -1;
return 0; return 0;

View File

@ -380,9 +380,8 @@ faulthandler_enable(PyObject *self, PyObject *args, PyObject *kwargs)
if (tstate == NULL) if (tstate == NULL)
return NULL; return NULL;
Py_XDECREF(fatal_error.file);
Py_XINCREF(file); Py_XINCREF(file);
fatal_error.file = file; Py_SETREF(fatal_error.file, file);
fatal_error.fd = fd; fatal_error.fd = fd;
fatal_error.all_threads = all_threads; fatal_error.all_threads = all_threads;
fatal_error.interp = tstate->interp; fatal_error.interp = tstate->interp;
@ -599,9 +598,8 @@ faulthandler_dump_traceback_later(PyObject *self,
/* Cancel previous thread, if running */ /* Cancel previous thread, if running */
cancel_dump_traceback_later(); cancel_dump_traceback_later();
Py_XDECREF(thread.file);
Py_XINCREF(file); Py_XINCREF(file);
thread.file = file; Py_SETREF(thread.file, file);
thread.fd = fd; thread.fd = fd;
thread.timeout_us = timeout_us; thread.timeout_us = timeout_us;
thread.repeat = repeat; thread.repeat = repeat;
@ -778,9 +776,8 @@ faulthandler_register_py(PyObject *self,
user->previous = previous; user->previous = previous;
} }
Py_XDECREF(user->file);
Py_XINCREF(file); Py_XINCREF(file);
user->file = file; Py_SETREF(user->file, file);
user->fd = fd; user->fd = fd;
user->all_threads = all_threads; user->all_threads = all_threads;
user->chain = chain; user->chain = chain;

View File

@ -634,8 +634,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_DECREF(to->dataobj); Py_SETREF(to->dataobj, (teedataobject *)link);
to->dataobj = (teedataobject *)link;
to->index = 0; to->index = 0;
} }
value = teedataobject_getitem(to->dataobj, to->index); value = teedataobject_getitem(to->dataobj, to->index);

View File

@ -1266,8 +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_DECREF(Handlers[SIGINT].func); Py_SETREF(Handlers[SIGINT].func, IntHandler);
Handlers[SIGINT].func = IntHandler;
old_siginthandler = PyOS_setsig(SIGINT, signal_handler); old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
} }

View File

@ -155,8 +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_DECREF(self->prefix); Py_SETREF(self->prefix, tmp);
self->prefix = tmp;
} }
} }
else else

View File

@ -667,8 +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_DECREF(self->unused_data); Py_SETREF(self->unused_data, new_data);
self->unused_data = new_data;
self->zst.avail_in = 0; self->zst.avail_in = 0;
} }
} }
@ -680,8 +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_DECREF(self->unconsumed_tail); Py_SETREF(self->unconsumed_tail, new_data);
self->unconsumed_tail = new_data;
} }
return 0; return 0;
} }

View File

@ -3688,8 +3688,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_DECREF(*pv); Py_SETREF(*pv, v);
*pv = v;
} }
} }

View File

@ -1509,8 +1509,7 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__); PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__);
if (get_doc) { if (get_doc) {
if (Py_TYPE(self) == &PyProperty_Type) { if (Py_TYPE(self) == &PyProperty_Type) {
Py_XDECREF(prop->prop_doc); Py_SETREF(prop->prop_doc, get_doc);
prop->prop_doc = get_doc;
} }
else { else {
/* If this is a property subclass, put __doc__ /* If this is a property subclass, put __doc__

View File

@ -236,8 +236,7 @@ BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
} }
Py_XINCREF(tb); Py_XINCREF(tb);
Py_XDECREF(self->traceback); Py_SETREF(self->traceback, tb);
self->traceback = tb;
return 0; return 0;
} }

View File

@ -857,8 +857,7 @@ dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
} }
} else if (values[j] != value) { } else if (values[j] != value) {
Py_XINCREF(value); Py_XINCREF(value);
Py_XDECREF(values[j]); Py_SETREF(values[j], value);
values[j] = value;
} }
Py_XDECREF(value); Py_XDECREF(value);
} }

View File

@ -127,8 +127,7 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
PyErr_SetString(PyExc_SystemError, "non-tuple default args"); PyErr_SetString(PyExc_SystemError, "non-tuple default args");
return -1; return -1;
} }
Py_XDECREF(((PyFunctionObject *) op) -> func_defaults); Py_SETREF(((PyFunctionObject *)op)->func_defaults, defaults);
((PyFunctionObject *) op) -> func_defaults = defaults;
return 0; return 0;
} }
@ -159,8 +158,7 @@ PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
"non-dict keyword only default args"); "non-dict keyword only default args");
return -1; return -1;
} }
Py_XDECREF(((PyFunctionObject *)op) -> func_kwdefaults); Py_SETREF(((PyFunctionObject *)op)->func_kwdefaults, defaults);
((PyFunctionObject *) op) -> func_kwdefaults = defaults;
return 0; return 0;
} }
@ -192,8 +190,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
closure->ob_type->tp_name); closure->ob_type->tp_name);
return -1; return -1;
} }
Py_XDECREF(((PyFunctionObject *) op) -> func_closure); Py_SETREF(((PyFunctionObject *)op)->func_closure, closure);
((PyFunctionObject *) op) -> func_closure = closure;
return 0; return 0;
} }
@ -224,8 +221,7 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
"non-dict annotations"); "non-dict annotations");
return -1; return -1;
} }
Py_XDECREF(((PyFunctionObject *)op) -> func_annotations); Py_SETREF(((PyFunctionObject *)op)->func_annotations, annotations);
((PyFunctionObject *) op) -> func_annotations = annotations;
return 0; return 0;
} }
@ -531,8 +527,7 @@ func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
if (name != Py_None) { if (name != Py_None) {
Py_INCREF(name); Py_INCREF(name);
Py_DECREF(newfunc->func_name); Py_SETREF(newfunc->func_name, name);
newfunc->func_name = name;
} }
if (defaults != Py_None) { if (defaults != Py_None) {
Py_INCREF(defaults); Py_INCREF(defaults);

View File

@ -69,8 +69,7 @@ module_init_dict(PyModuleObject *mod, PyObject *md_dict,
return -1; return -1;
if (PyUnicode_CheckExact(name)) { if (PyUnicode_CheckExact(name)) {
Py_INCREF(name); Py_INCREF(name);
Py_XDECREF(mod->md_name); Py_SETREF(mod->md_name, name);
mod->md_name = name;
} }
return 0; return 0;

View File

@ -1066,8 +1066,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_DECREF(r->index); Py_SETREF(r->index, new_index);
r->index = new_index;
} }
else { else {
Py_DECREF(new_index); Py_DECREF(new_index);

View File

@ -315,9 +315,8 @@ assign_version_tag(PyTypeObject *type)
are borrowed reference */ are borrowed reference */
for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) { for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
method_cache[i].value = NULL; method_cache[i].value = NULL;
Py_XDECREF(method_cache[i].name);
method_cache[i].name = Py_None;
Py_INCREF(Py_None); Py_INCREF(Py_None);
Py_SETREF(method_cache[i].name, Py_None);
} }
/* mark all version tags as invalid */ /* mark all version tags as invalid */
PyType_Modified(&PyBaseObject_Type); PyType_Modified(&PyBaseObject_Type);
@ -462,8 +461,7 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
et = (PyHeapTypeObject*)type; et = (PyHeapTypeObject*)type;
Py_INCREF(value); Py_INCREF(value);
Py_DECREF(et->ht_qualname); Py_SETREF(et->ht_qualname, value);
et->ht_qualname = value;
return 0; return 0;
} }
@ -2918,8 +2916,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
else else
method_cache_misses++; method_cache_misses++;
#endif #endif
Py_DECREF(method_cache[h].name); Py_SETREF(method_cache[h].name, name);
method_cache[h].name = name;
} }
return res; return res;
} }

View File

@ -1828,8 +1828,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_DECREF(*p_unicode); Py_SETREF(*p_unicode, unicode_empty);
*p_unicode = unicode_empty;
return 0; return 0;
} }
@ -1837,8 +1836,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_DECREF(*p_unicode); Py_SETREF(*p_unicode, copy);
*p_unicode = copy;
return 0; return 0;
} }
@ -13543,8 +13541,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_DECREF(writer->buffer); Py_SETREF(writer->buffer, newbuffer);
writer->buffer = newbuffer;
} }
_PyUnicodeWriter_Update(writer); _PyUnicodeWriter_Update(writer);
return 0; return 0;
@ -15261,8 +15258,7 @@ PyUnicode_InternInPlace(PyObject **p)
if (t) { if (t) {
Py_INCREF(t); Py_INCREF(t);
Py_DECREF(*p); Py_SETREF(*p, t);
*p = t;
return; return;
} }

View File

@ -524,9 +524,8 @@ fp_setreadl(struct tok_state *tok, const char* enc)
if (stream == NULL) if (stream == NULL)
goto cleanup; goto cleanup;
Py_XDECREF(tok->decoding_readline);
readline = _PyObject_GetAttrId(stream, &PyId_readline); readline = _PyObject_GetAttrId(stream, &PyId_readline);
tok->decoding_readline = readline; Py_SETREF(tok->decoding_readline, readline);
if (pos > 0) { if (pos > 0) {
if (PyObject_CallObject(readline, NULL) == NULL) { if (PyObject_CallObject(readline, NULL) == NULL) {
readline = NULL; readline = NULL;

View File

@ -680,8 +680,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_DECREF(*filename); Py_SETREF(*filename, PyUnicode_FromString("__main__"));
*filename = PyUnicode_FromString("__main__");
if (*filename == NULL) if (*filename == NULL)
goto handle_error; goto handle_error;
} }

View File

@ -3221,8 +3221,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_DECREF(*pfunc); Py_SETREF(*pfunc, self);
*pfunc = self;
na++; na++;
/* n++; */ /* n++; */
} else } else
@ -4734,8 +4733,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_DECREF(*pfunc); Py_SETREF(*pfunc, self);
*pfunc = self;
na++; na++;
n++; n++;
} else } else

View File

@ -1800,8 +1800,7 @@ compiler_class(struct compiler *c, stmt_ty s)
{ {
/* use the class name for name mangling */ /* use the class name for name mangling */
Py_INCREF(s->v.ClassDef.name); Py_INCREF(s->v.ClassDef.name);
Py_XDECREF(c->u->u_private); Py_SETREF(c->u->u_private, s->v.ClassDef.name);
c->u->u_private = s->v.ClassDef.name;
/* load (global) __name__ ... */ /* load (global) __name__ ... */
str = PyUnicode_InternFromString("__name__"); str = PyUnicode_InternFromString("__name__");
if (!str || !compiler_nameop(c, str, Load)) { if (!str || !compiler_nameop(c, str, Load)) {