diff options
| -rw-r--r-- | Include/object.h | 26 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Modules/_csv.c | 6 | ||||
| -rw-r--r-- | Modules/_ctypes/_ctypes.c | 41 | ||||
| -rw-r--r-- | Modules/_curses_panel.c | 5 | ||||
| -rw-r--r-- | Modules/_io/bytesio.c | 3 | ||||
| -rw-r--r-- | Modules/_sqlite/connection.c | 13 | ||||
| -rw-r--r-- | Modules/_sqlite/cursor.c | 13 | ||||
| -rw-r--r-- | Modules/_sre.c | 3 | ||||
| -rw-r--r-- | Modules/_ssl.c | 6 | ||||
| -rw-r--r-- | Modules/faulthandler.c | 9 | ||||
| -rw-r--r-- | Modules/itertoolsmodule.c | 3 | ||||
| -rw-r--r-- | Modules/signalmodule.c | 3 | ||||
| -rw-r--r-- | Modules/zipimport.c | 3 | ||||
| -rw-r--r-- | Modules/zlibmodule.c | 6 | ||||
| -rw-r--r-- | Objects/bytesobject.c | 3 | ||||
| -rw-r--r-- | Objects/descrobject.c | 3 | ||||
| -rw-r--r-- | Objects/exceptions.c | 3 | ||||
| -rw-r--r-- | Objects/frameobject.c | 3 | ||||
| -rw-r--r-- | Objects/funcobject.c | 15 | ||||
| -rw-r--r-- | Objects/moduleobject.c | 3 | ||||
| -rw-r--r-- | Objects/rangeobject.c | 3 | ||||
| -rw-r--r-- | Objects/typeobject.c | 9 | ||||
| -rw-r--r-- | Objects/unicodeobject.c | 12 | ||||
| -rw-r--r-- | Parser/tokenizer.c | 3 | ||||
| -rw-r--r-- | Python/_warnings.c | 3 | ||||
| -rw-r--r-- | Python/ceval.c | 6 | ||||
| -rw-r--r-- | Python/compile.c | 3 | 
28 files changed, 92 insertions, 120 deletions
diff --git a/Include/object.h b/Include/object.h index 4d286efe34..eac9541b17 100644 --- a/Include/object.h +++ b/Include/object.h @@ -846,6 +846,32 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);              Py_DECREF(_py_xdecref_tmp);               \      } 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  they can have object code that is not dependent on Python compilation flags. @@ -10,6 +10,9 @@ Release date: tba  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 #25421: __sizeof__ methods of builtin types now use dynamic basic size. diff --git a/Modules/_csv.c b/Modules/_csv.c index af901e2d3e..fe85069435 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -276,9 +276,8 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)          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_UCS4 c)  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 --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index bca402daf4..34a10994be 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -391,8 +391,7 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt          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 *stgdict, PyObject *proto)          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, PyObject *args, PyObject *kwds)          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, 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_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(PyTypeObject *type, PyObject *args, PyObject          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, PyObject *args, PyObject *kwds)          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, PyObject *args, PyObject *kwds)          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 index, PyObject *keep)          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 *self, PyObject *ob)                          "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 *self, PyObject *ob)          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 *self, PyObject *ob)          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,9 +5152,8 @@ comerror_init(PyObject *self, PyObject *args, PyObject *kwds)          return -1;      bself = (PyBaseExceptionObject *)self; -    Py_DECREF(bself->args); -    bself->args = args; -    Py_INCREF(bself->args); +    Py_INCREF(args); +    Py_SETREF(bself->args, args);      return 0;  } diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 87b9c0516f..759b73109d 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -312,9 +312,8 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)          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 --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index eef3b3de72..99e71bcc7f 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -969,8 +969,7 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)      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 --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index a08ebfe8c4..7018f9f3dc 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -204,8 +204,8 @@ void pysqlite_flush_statement_cache(pysqlite_Connection* self)          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,8 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,      _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 +794,7 @@ static void _pysqlite_drop_unused_statement_references(pysqlite_Connection* self          }      } -    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 +825,7 @@ static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self)          }      } -    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 --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index c1599c02df..d909738fd6 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -170,8 +170,7 @@ int pysqlite_build_row_cast_map(pysqlite_Cursor* self)          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(pysqlite_Cursor* self, int multiple, PyObject*          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(pysqlite_Cursor* self, int multiple, PyObject*      }      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(pysqlite_Cursor* self, int multiple, PyObject*                  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 --git a/Modules/_sre.c b/Modules/_sre.c index 6a3d811226..919a0693ef 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -753,8 +753,7 @@ deepcopy(PyObject** object, PyObject* memo)      if (!copy)          return 0; -    Py_DECREF(*object); -    *object = copy; +    Py_SETREF(*object, copy);      return 1; /* success */  } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 67402fe0a4..8818d26e09 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1589,8 +1589,7 @@ static int PySSL_set_context(PySSLSocket *self, PyObject *value,          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 *c)  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 --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 530ddc7efd..1ed22bf8bc 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -380,9 +380,8 @@ faulthandler_enable(PyObject *self, PyObject *args, PyObject *kwargs)      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(PyObject *self,      /* 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 --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 0c6daa1d52..29c62e7473 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -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 --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 70f3052149..da454de8d9 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -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 --git a/Modules/zipimport.c b/Modules/zipimport.c index 06abb312b3..7220faf08d 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -155,8 +155,7 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)              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 --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 37307be39d..a15fdb2a07 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -667,8 +667,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_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, int err)                  (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 --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 3cc7ce34d0..f9805162fe 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3688,8 +3688,7 @@ PyBytes_Concat(PyObject **pv, PyObject *w)          /* Multiple references, need to create new object */          PyObject *v;          v = bytes_concat(*pv, w); -        Py_DECREF(*pv); -        *pv = v; +        Py_SETREF(*pv, v);      }  } diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 9ffbca72ed..da11f6b0dc 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1509,8 +1509,7 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds)          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 --git a/Objects/exceptions.c b/Objects/exceptions.c index f5a1a2b278..62ea3789f7 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -236,8 +236,7 @@ BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)      }      Py_XINCREF(tb); -    Py_XDECREF(self->traceback); -    self->traceback = tb; +    Py_SETREF(self->traceback, tb);      return 0;  } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 172f2cb61b..37e626d30a 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -857,8 +857,7 @@ dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,              }          } else if (values[j] != value) {              Py_XINCREF(value); -            Py_XDECREF(values[j]); -            values[j] = value; +            Py_SETREF(values[j], value);          }          Py_XDECREF(value);      } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index b04393415a..13daaba6c3 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -127,8 +127,7 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)          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, PyObject *defaults)                          "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, PyObject *closure)                       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, PyObject *annotations)                          "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* args, PyObject* kw)      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 --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 7b41b0b6c4..24c5f4c282 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -69,8 +69,7 @@ module_init_dict(PyModuleObject *mod, PyObject *md_dict,          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 --git a/Objects/rangeobject.c b/Objects/rangeobject.c index da1d703b3a..f858cd25df 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -1066,8 +1066,7 @@ longrangeiter_next(longrangeiterobject *r)      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 --git a/Objects/typeobject.c b/Objects/typeobject.c index 934933026e..341e18c455 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -315,9 +315,8 @@ 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_INCREF(Py_None); +            Py_SETREF(method_cache[i].name, Py_None);          }          /* mark all version tags as invalid */          PyType_Modified(&PyBaseObject_Type); @@ -462,8 +461,7 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)      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 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)          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 --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ad8f505403..a985d6fb42 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1828,8 +1828,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)          _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_ssize_t length)          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 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,              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 --git a/Parser/tokenizer.c b/Parser/tokenizer.c index cdb5103da5..9ca3cb4568 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -524,9 +524,8 @@ fp_setreadl(struct tok_state *tok, const char* enc)      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 --git a/Python/_warnings.c b/Python/_warnings.c index 9ca83145c9..978bad135c 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -680,8 +680,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,                      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 --git a/Python/ceval.c b/Python/ceval.c index 1d656495f5..dd9360c34f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3221,8 +3221,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)                  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 oparg              Py_INCREF(self);              func = PyMethod_GET_FUNCTION(func);              Py_INCREF(func); -            Py_DECREF(*pfunc); -            *pfunc = self; +            Py_SETREF(*pfunc, self);              na++;              n++;          } else diff --git a/Python/compile.c b/Python/compile.c index 030afedd29..0f619c4535 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1800,8 +1800,7 @@ compiler_class(struct compiler *c, stmt_ty s)      {          /* 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)) {  | 
