Issue #20440: Massive replacing unsafe attribute setting code with special
macro Py_SETREF.
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 92d6547..8e8c0cc 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -528,8 +528,7 @@
                     goto handle_error;
                 }
                 else if (!is_true) {
-                    Py_DECREF(*filename);
-                    *filename = PyString_FromString("__main__");
+                    Py_SETREF(*filename, PyString_FromString("__main__"));
                     if (*filename == NULL)
                         goto handle_error;
                 }
diff --git a/Python/ceval.c b/Python/ceval.c
index 4fcf25e..6e5e272 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4360,8 +4360,7 @@
             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 2900757..01b9fe0 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1455,9 +1455,8 @@
     if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
                               s->lineno))
         return 0;
-    Py_XDECREF(c->u->u_private);
-    c->u->u_private = s->v.ClassDef.name;
-    Py_INCREF(c->u->u_private);
+    Py_INCREF(s->v.ClassDef.name);
+    Py_SETREF(c->u->u_private, s->v.ClassDef.name);
     str = PyString_InternFromString("__name__");
     if (!str || !compiler_nameop(c, str, Load)) {
         Py_XDECREF(str);