Issue #26200: Added Py_SETREF and replaced Py_XSETREF with Py_SETREF
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 10 Apr 2016 15:05:40 +0000 (18:05 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 10 Apr 2016 15:05:40 +0000 (18:05 +0300)
in places where Py_DECREF was used.

20 files changed:
Include/object.h
Modules/_ctypes/_ctypes.c
Modules/_curses_panel.c
Modules/_elementtree.c
Modules/_sqlite/connection.c
Modules/_sqlite/cursor.c
Modules/_sre.c
Modules/_ssl.c
Modules/itertoolsmodule.c
Modules/signalmodule.c
Modules/zipimport.c
Modules/zlibmodule.c
Objects/bytesobject.c
Objects/funcobject.c
Objects/rangeobject.c
Objects/typeobject.c
Objects/unicodeobject.c
Python/_warnings.c
Python/ceval.c
Python/errors.c

index 4179651985ea2c0ea859867e3dc34418ad6ce24e..50d9747cf95fdfed932887664b2d4eb2a7f54be7 100644 (file)
@@ -851,18 +851,28 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
  *
  * As in case of Py_CLEAR "the obvious" code can be deadly:
  *
- *     Py_XDECREF(op);
+ *     Py_DECREF(op);
  *     op = op2;
  *
  * The safe way is:
  *
- *      Py_XSETREF(op, op2);
+ *      Py_SETREF(op, op2);
  *
  * That arranges to set `op` to `op2` _before_ decref'ing, so that any code
  * triggered as a side-effect of `op` getting torn down no longer believes
  * `op` points to a valid object.
+ *
+ * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of
+ * Py_DECREF.
  */
 
+#define Py_SETREF(op, op2)                      \
+    do {                                        \
+        PyObject *_py_tmp = (PyObject *)(op);   \
+        (op) = (op2);                           \
+        Py_DECREF(_py_tmp);                     \
+    } while (0)
+
 #define Py_XSETREF(op, op2)                     \
     do {                                        \
         PyObject *_py_tmp = (PyObject *)(op);   \
index 1b804ae1b581727ada0ccf67002feafc393750e7..7e20301ec1b649e58c5861320949b9699a6876bd 100644 (file)
@@ -391,7 +391,7 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt
         Py_DECREF((PyObject *)dict);
         return NULL;
     }
-    Py_XSETREF(result->tp_dict, (PyObject *)dict);
+    Py_SETREF(result->tp_dict, (PyObject *)dict);
     dict->format = _ctypes_alloc_format_string(NULL, "B");
     if (dict->format == NULL) {
         Py_DECREF(result);
@@ -960,7 +960,7 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_DECREF((PyObject *)stgdict);
         return NULL;
     }
-    Py_XSETREF(result->tp_dict, (PyObject *)stgdict);
+    Py_SETREF(result->tp_dict, (PyObject *)stgdict);
 
     return (PyObject *)result;
 }
@@ -1403,7 +1403,7 @@ 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_XSETREF(result->tp_dict, (PyObject *)stgdict);  /* steal the reference */
+    Py_SETREF(result->tp_dict, (PyObject *)stgdict);  /* steal the reference */
     stgdict = NULL;
 
     /* Special case for character arrays.
@@ -1816,7 +1816,7 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
         Py_DECREF((PyObject *)stgdict);
         return NULL;
     }
-    Py_XSETREF(result->tp_dict, (PyObject *)stgdict);
+    Py_SETREF(result->tp_dict, (PyObject *)stgdict);
 
     return (PyObject *)result;
 }
@@ -1944,7 +1944,7 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_DECREF((PyObject *)stgdict);
         return NULL;
     }
-    Py_XSETREF(result->tp_dict, (PyObject *)stgdict);
+    Py_SETREF(result->tp_dict, (PyObject *)stgdict);
 
     /* Install from_param class methods in ctypes base classes.
        Overrides the PyCSimpleType_from_param generic method.
@@ -2307,7 +2307,7 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_DECREF((PyObject *)stgdict);
         return NULL;
     }
-    Py_XSETREF(result->tp_dict, (PyObject *)stgdict);
+    Py_SETREF(result->tp_dict, (PyObject *)stgdict);
 
     if (-1 == make_funcptrtype_dict(stgdict)) {
         Py_DECREF(result);
@@ -5152,7 +5152,7 @@ comerror_init(PyObject *self, PyObject *args, PyObject *kwds)
 
     bself = (PyBaseExceptionObject *)self;
     Py_INCREF(args);
-    Py_XSETREF(bself->args, args);
+    Py_SETREF(bself->args, args);
 
     return 0;
 }
index 75bbb173d0c22d660cf275821261de84bdcbfe63..759b73109d25c16028678dc985117e6848bae23e 100644 (file)
@@ -313,7 +313,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
         return NULL;
     }
     Py_INCREF(temp);
-    Py_XSETREF(po->wo, temp);
+    Py_SETREF(po->wo, temp);
     Py_INCREF(Py_None);
     return Py_None;
 }
index 6619048e27896269f68623d1372adc230b489d83..0f1d6a1faa40c89e607c5c3dac0b44158677f0f0 100644 (file)
@@ -1943,7 +1943,7 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
 
     if (strcmp(name, "tag") == 0) {
         Py_INCREF(value);
-        Py_XSETREF(self->tag, value);
+        Py_SETREF(self->tag, value);
     } else if (strcmp(name, "text") == 0) {
         Py_DECREF(JOIN_OBJ(self->text));
         self->text = value;
@@ -1958,7 +1958,7 @@ element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
                 return -1;
         }
         Py_INCREF(value);
-        Py_XSETREF(self->extra->attrib, value);
+        Py_SETREF(self->extra->attrib, value);
     } else {
         PyErr_SetString(PyExc_AttributeError,
             "Can't set arbitrary attributes on Element");
@@ -2551,9 +2551,9 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
     self->index++;
 
     Py_INCREF(node);
-    Py_XSETREF(self->this, node);
+    Py_SETREF(self->this, node);
     Py_INCREF(node);
-    Py_XSETREF(self->last, node);
+    Py_SETREF(self->last, node);
 
     if (treebuilder_append_event(self, self->start_event_obj, node) < 0)
         goto error;
index 42e41582a4aabf3d6d707fa3dc506b6f1233296d..7570624e04e704419ee366d94b042d25bfa7cdbe 100644 (file)
@@ -204,7 +204,7 @@ void pysqlite_flush_statement_cache(pysqlite_Connection* self)
         node = node->next;
     }
 
-    Py_XSETREF(self->statement_cache,
+    Py_SETREF(self->statement_cache,
               (pysqlite_Cache *)PyObject_CallFunction((PyObject *)&pysqlite_CacheType, "O", self));
     Py_DECREF(self);
     self->statement_cache->decref_factory = 0;
@@ -794,7 +794,7 @@ 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)
@@ -825,7 +825,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)
index 0931c84a45a58c47fc801a769d4baa8db2e7dafa..300da2878e482297f8c71ff14e00bbddef4ebf25 100644 (file)
@@ -510,7 +510,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
 
     /* reset description and rowcount */
     Py_INCREF(Py_None);
-    Py_XSETREF(self->description, Py_None);
+    Py_SETREF(self->description, Py_None);
     self->rowcount = -1L;
 
     func_args = PyTuple_New(1);
@@ -535,7 +535,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
     }
 
     if (self->statement->in_use) {
-        Py_XSETREF(self->statement,
+        Py_SETREF(self->statement,
                   PyObject_New(pysqlite_Statement, &pysqlite_StatementType));
         if (!self->statement) {
             goto error;
@@ -652,7 +652,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
                 numcols = sqlite3_column_count(self->statement->st);
                 Py_END_ALLOW_THREADS
 
-                Py_XSETREF(self->description, PyTuple_New(numcols));
+                Py_SETREF(self->description, PyTuple_New(numcols));
                 if (!self->description) {
                     goto error;
                 }
index 6b58560e8c3e6bdc63e54e532c650d20257de93b..150229dfbb6c8fb95a959869c84f499eeafa2f5f 100644 (file)
@@ -756,7 +756,7 @@ deepcopy(PyObject** object, PyObject* memo)
     if (!copy)
         return 0;
 
-    Py_XSETREF(*object, copy);
+    Py_SETREF(*object, copy);
 
     return 1; /* success */
 }
index 8b5b8f7df93cb4352a6de0beaca41d9e7243c3e1..d2b65001b9b9f05ca04b83446646a7bd2b10a5f2 100644 (file)
@@ -1589,7 +1589,7 @@ static int PySSL_set_context(PySSLSocket *self, PyObject *value,
         return -1;
 #else
         Py_INCREF(value);
-        Py_XSETREF(self->ctx, (PySSLContext *)value);
+        Py_SETREF(self->ctx, (PySSLContext *)value);
         SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
 #endif
     } else {
index a7f1111777ca1ae49eee8f64722b91deeee323ab..781fbcdf1a5f6191c8110f05a5ef3b0eb33a2646 100644 (file)
@@ -631,7 +631,7 @@ tee_next(teeobject *to)
         link = teedataobject_jumplink(to->dataobj);
         if (link == NULL)
             return NULL;
-        Py_XSETREF(to->dataobj, (teedataobject *)link);
+        Py_SETREF(to->dataobj, (teedataobject *)link);
         to->index = 0;
     }
     value = teedataobject_getitem(to->dataobj, to->index);
index 3edf1587149263c5dc7ee73d0c86d9c68b46f175..da454de8d9ae428a36f5d2f8210f601b54ec1885 100644 (file)
@@ -1266,7 +1266,7 @@ PyInit__signal(void)
     if (Handlers[SIGINT].func == DefaultHandler) {
         /* Install default int handler */
         Py_INCREF(IntHandler);
-        Py_XSETREF(Handlers[SIGINT].func, IntHandler);
+        Py_SETREF(Handlers[SIGINT].func, IntHandler);
         old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
     }
 
index 3abb9f06a9073cfdd7e8067b30982ac84914860a..e840271bfd67c6be3f6478c3b26c03eb8f3b22b7 100644 (file)
@@ -155,7 +155,7 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)
             tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP);
             if (tmp == NULL)
                 goto error;
-            Py_XSETREF(self->prefix, tmp);
+            Py_SETREF(self->prefix, tmp);
         }
     }
     else
index 802e7dbe748b69d9276a243e03816110bb9fa229..eb627287826092966ec949d9988f3d643003c178 100644 (file)
@@ -668,7 +668,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_XSETREF(self->unused_data, new_data);
+            Py_SETREF(self->unused_data, new_data);
             self->zst.avail_in = 0;
         }
     }
@@ -680,7 +680,7 @@ save_unconsumed_input(compobject *self, int err)
                 (char *)self->zst.next_in, self->zst.avail_in);
         if (new_data == NULL)
             return -1;
-        Py_XSETREF(self->unconsumed_tail, new_data);
+        Py_SETREF(self->unconsumed_tail, new_data);
     }
     return 0;
 }
index 11a4408662461a81c36ef509404a052b65d57eb4..495c3ebc23696d508f8c7cff670317296d73529d 100644 (file)
@@ -3520,7 +3520,7 @@ PyBytes_Concat(PyObject **pv, PyObject *w)
         /* Multiple references, need to create new object */
         PyObject *v;
         v = bytes_concat(*pv, w);
-        Py_XSETREF(*pv, v);
+        Py_SETREF(*pv, v);
     }
 }
 
index 4252e930bd516372d40078eacf82d3b18ef62c36..e6c327d22f85df9921df8856c01389c347de04d4 100644 (file)
@@ -527,7 +527,7 @@ func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
 
     if (name != Py_None) {
         Py_INCREF(name);
-        Py_XSETREF(newfunc->func_name, name);
+        Py_SETREF(newfunc->func_name, name);
     }
     if (defaults != Py_None) {
         Py_INCREF(defaults);
index 7a114e0e7b854f9504a7d1d502382fb42fe3bfca..2be32e01b832398358fcf7d13eeb8394420bd320 100644 (file)
@@ -1064,7 +1064,7 @@ longrangeiter_next(longrangeiterobject *r)
     result = PyNumber_Add(r->start, product);
     Py_DECREF(product);
     if (result) {
-        Py_XSETREF(r->index, new_index);
+        Py_SETREF(r->index, new_index);
     }
     else {
         Py_DECREF(new_index);
index 7628ce7413b482c910e15f422d597dd50df6d3f4..f88a5fbe5166c7fe8116e90c9037c21912c0bacc 100644 (file)
@@ -424,7 +424,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
 
     type->tp_name = tp_name;
     Py_INCREF(value);
-    Py_XSETREF(((PyHeapTypeObject*)type)->ht_name, value);
+    Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value);
 
     return 0;
 }
@@ -445,7 +445,7 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
 
     et = (PyHeapTypeObject*)type;
     Py_INCREF(value);
-    Py_XSETREF(et->ht_qualname, value);
+    Py_SETREF(et->ht_qualname, value);
     return 0;
 }
 
@@ -2897,7 +2897,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
         else
             method_cache_misses++;
 #endif
-        Py_XSETREF(method_cache[h].name, name);
+        Py_SETREF(method_cache[h].name, name);
     }
     return res;
 }
index e2813fd444d3622058cce83afea42bf08da487d5..230125b62ba2657883c78feed206b43b59dc9e29 100644 (file)
@@ -1667,7 +1667,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)
         _Py_INCREF_UNICODE_EMPTY();
         if (!unicode_empty)
             return -1;
-        Py_XSETREF(*p_unicode, unicode_empty);
+        Py_SETREF(*p_unicode, unicode_empty);
         return 0;
     }
 
@@ -1675,7 +1675,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)
         PyObject *copy = resize_copy(unicode, length);
         if (copy == NULL)
             return -1;
-        Py_XSETREF(*p_unicode, copy);
+        Py_SETREF(*p_unicode, copy);
         return 0;
     }
 
@@ -13326,7 +13326,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer,
             return -1;
         _PyUnicode_FastCopyCharacters(newbuffer, 0,
                                       writer->buffer, 0, writer->pos);
-        Py_XSETREF(writer->buffer, newbuffer);
+        Py_SETREF(writer->buffer, newbuffer);
     }
     _PyUnicodeWriter_Update(writer);
     return 0;
@@ -15012,7 +15012,7 @@ PyUnicode_InternInPlace(PyObject **p)
 
     if (t) {
         Py_INCREF(t);
-        Py_XSETREF(*p, t);
+        Py_SETREF(*p, t);
         return;
     }
 
index 78f532ecb494693043accf5701586d112b67ec9e..978bad135c146bb52044bd24a54f7050729bdbd0 100644 (file)
@@ -680,7 +680,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
                     goto handle_error;
                 }
                 else if (!is_true) {
-                    Py_XSETREF(*filename, PyUnicode_FromString("__main__"));
+                    Py_SETREF(*filename, PyUnicode_FromString("__main__"));
                     if (*filename == NULL)
                         goto handle_error;
                 }
index 1811210931690769b6ab3d51746eef63ed3df137..ee79c219555a065637eb917ca860735447dc940a 100644 (file)
@@ -3229,7 +3229,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
                 Py_INCREF(self);
                 func = PyMethod_GET_FUNCTION(func);
                 Py_INCREF(func);
-                Py_XSETREF(*pfunc, self);
+                Py_SETREF(*pfunc, self);
                 na++;
                 /* n++; */
             } else
@@ -4682,7 +4682,7 @@ call_function(PyObject ***pp_stack, int oparg
             Py_INCREF(self);
             func = PyMethod_GET_FUNCTION(func);
             Py_INCREF(func);
-            Py_XSETREF(*pfunc, self);
+            Py_SETREF(*pfunc, self);
             na++;
             n++;
         } else
index 1d6e432d6b2aaa20a760365fe9f02652c1975d67..47d7c4b9924164796a5e69c2bb462e177c59639b 100644 (file)
@@ -311,9 +311,9 @@ finally:
         --tstate->recursion_depth;
         /* throw away the old exception and use the recursion error instead */
         Py_INCREF(PyExc_RecursionError);
-        Py_XSETREF(*exc, PyExc_RecursionError);
+        Py_SETREF(*exc, PyExc_RecursionError);
         Py_INCREF(PyExc_RecursionErrorInst);
-        Py_XSETREF(*val, PyExc_RecursionErrorInst);
+        Py_SETREF(*val, PyExc_RecursionErrorInst);
         /* just keeping the old traceback */
         return;
     }