]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-145247: Use _PyTuple_FromPair in Modules (part 1) (#148000)
authorSergey Miryanov <sergey.miryanov@gmail.com>
Thu, 2 Apr 2026 21:20:13 +0000 (02:20 +0500)
committerGitHub <noreply@github.com>
Thu, 2 Apr 2026 21:20:13 +0000 (23:20 +0200)
Modules/_asynciomodule.c
Modules/_decimal/_decimal.c
Modules/_elementtree.c
Modules/_json.c
Modules/_operator.c
Modules/_pickle.c
Modules/_sre/sre.c
Modules/_threadmodule.c
Modules/arraymodule.c
Modules/itertoolsmodule.c
Modules/main.c

index bd294648ca222fbca0fa85f794d98eb0d97e4776..fda7d1ef934da0e65ade178772666f08215e2307 100644 (file)
@@ -13,6 +13,7 @@
 #include "pycore_pylifecycle.h"   // _Py_IsInterpreterFinalizing()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
 #include "pycore_runtime_init.h"  // _Py_ID()
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 
 #include <stddef.h>               // offsetof()
 
@@ -829,14 +830,10 @@ future_add_done_callback(asyncio_state *state, FutureObj *fut, PyObject *arg,
             fut->fut_context0 = Py_NewRef(ctx);
         }
         else {
-            PyObject *tup = PyTuple_New(2);
+            PyObject *tup = _PyTuple_FromPair(arg, (PyObject *)ctx);
             if (tup == NULL) {
                 return NULL;
             }
-            Py_INCREF(arg);
-            PyTuple_SET_ITEM(tup, 0, arg);
-            Py_INCREF(ctx);
-            PyTuple_SET_ITEM(tup, 1, (PyObject *)ctx);
 
             if (fut->fut_callbacks != NULL) {
                 int err = PyList_Append(fut->fut_callbacks, tup);
@@ -1503,14 +1500,12 @@ _asyncio_Future__callbacks_get_impl(FutureObj *self)
 
     Py_ssize_t i = 0;
     if (self->fut_callback0 != NULL) {
-        PyObject *tup0 = PyTuple_New(2);
+        assert(self->fut_context0 != NULL);
+        PyObject *tup0 = _PyTuple_FromPair(self->fut_callback0, self->fut_context0);
         if (tup0 == NULL) {
             Py_DECREF(callbacks);
             return NULL;
         }
-        PyTuple_SET_ITEM(tup0, 0, Py_NewRef(self->fut_callback0));
-        assert(self->fut_context0 != NULL);
-        PyTuple_SET_ITEM(tup0, 1, Py_NewRef(self->fut_context0));
         PyList_SET_ITEM(callbacks, i, tup0);
         i++;
     }
index b47014c4e7466dd1a3d77a82bb354b5b8176f804..0a8308d9ebce7a789e8b7c8c9d2b3ba526152ab3 100644 (file)
@@ -32,6 +32,7 @@
 #include <Python.h>
 #include "pycore_object.h"        // _PyObject_VisitType()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 #include "pycore_typeobject.h"
 
 #include <mpdecimal.h>
@@ -3975,7 +3976,6 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
     PyObject *numerator = NULL;
     PyObject *denominator = NULL;
     PyObject *exponent = NULL;
-    PyObject *result = NULL;
     PyObject *tmp;
     mpd_ssize_t exp;
     PyObject *context;
@@ -4035,6 +4035,7 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
 
     if (exp >= 0) {
         Py_SETREF(numerator, state->_py_long_multiply(numerator, exponent));
+        Py_CLEAR(exponent);
         if (numerator == NULL) {
             goto error;
         }
@@ -4061,15 +4062,13 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
             goto error;
         }
     }
-
-    result = PyTuple_Pack(2, numerator, denominator);
-
+    return _PyTuple_FromPairSteal(numerator, denominator);
 
 error:
     Py_XDECREF(exponent);
     Py_XDECREF(denominator);
     Py_XDECREF(numerator);
-    return result;
+    return NULL;
 }
 
 /*[clinic input]
@@ -4613,7 +4612,6 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
     PyObject *q, *r;
     PyObject *context;
     uint32_t status = 0;
-    PyObject *ret;
 
     decimal_state *state = find_state_left_or_right(v, w);
     CURRENT_CONTEXT(state, context);
@@ -4642,10 +4640,7 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
         return NULL;
     }
 
-    ret = PyTuple_Pack(2, q, r);
-    Py_DECREF(r);
-    Py_DECREF(q);
-    return ret;
+    return _PyTuple_FromPairSteal(q, r);
 }
 
 static PyObject *
@@ -6674,7 +6669,6 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
     PyObject *a, *b;
     PyObject *q, *r;
     uint32_t status = 0;
-    PyObject *ret;
 
     CONVERT_BINOP_RAISE(&a, &b, x, y, context);
     decimal_state *state = get_module_state_from_ctx(context);
@@ -6701,10 +6695,7 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
         return NULL;
     }
 
-    ret = PyTuple_Pack(2, q, r);
-    Py_DECREF(r);
-    Py_DECREF(q);
-    return ret;
+    return _PyTuple_FromPairSteal(q, r);
 }
 
 /* Binary or ternary arithmetic functions */
@@ -7810,15 +7801,15 @@ _decimal_exec(PyObject *m)
 
         switch (cm->flag) {
         case MPD_Float_operation:
-            base = PyTuple_Pack(2, state->DecimalException, PyExc_TypeError);
+            base = _PyTuple_FromPair(state->DecimalException, PyExc_TypeError);
             break;
         case MPD_Division_by_zero:
-            base = PyTuple_Pack(2, state->DecimalException,
-                                PyExc_ZeroDivisionError);
+            base = _PyTuple_FromPair(state->DecimalException,
+                                     PyExc_ZeroDivisionError);
             break;
         case MPD_Overflow:
-            base = PyTuple_Pack(2, state->signal_map[INEXACT].ex,
-                                   state->signal_map[ROUNDED].ex);
+            base = _PyTuple_FromPair(state->signal_map[INEXACT].ex,
+                                     state->signal_map[ROUNDED].ex);
             break;
         case MPD_Underflow:
             base = PyTuple_Pack(3, state->signal_map[INEXACT].ex,
@@ -7857,7 +7848,7 @@ _decimal_exec(PyObject *m)
     for (cm = state->cond_map+1; cm->name != NULL; cm++) {
         PyObject *base;
         if (cm->flag == MPD_Division_undefined) {
-            base = PyTuple_Pack(2, state->signal_map[0].ex, PyExc_ZeroDivisionError);
+            base = _PyTuple_FromPair(state->signal_map[0].ex, PyExc_ZeroDivisionError);
         }
         else {
             base = PyTuple_Pack(1, state->signal_map[0].ex);
index ba909d15c2effd0d37334f6efc3e82d4ce06505f..e2185c4bd03aad3c18d26e240410fd87ff6f315f 100644 (file)
@@ -18,6 +18,7 @@
 #include "Python.h"
 #include "pycore_dict.h"          // _PyDict_CopyAsDict()
 #include "pycore_pyhash.h"        // _Py_HashSecret
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 #include "pycore_weakref.h"       // FT_CLEAR_WEAKREFS()
 
 #include <stddef.h>               // offsetof()
@@ -2594,7 +2595,7 @@ _elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory,
         return NULL;
     }
 
-    old = PyTuple_Pack(2,
+    old = _PyTuple_FromPair(
         st->comment_factory ? st->comment_factory : Py_None,
         st->pi_factory ? st->pi_factory : Py_None);
 
@@ -2712,7 +2713,7 @@ treebuilder_append_event(TreeBuilderObject *self, PyObject *action,
 {
     if (action != NULL) {
         PyObject *res;
-        PyObject *event = PyTuple_Pack(2, action, node);
+        PyObject *event = _PyTuple_FromPair(action, node);
         if (event == NULL)
             return -1;
         res = PyObject_CallOneArg(self->events_append, event);
@@ -2933,7 +2934,7 @@ treebuilder_handle_pi(TreeBuilderObject* self, PyObject* target, PyObject* text)
             Py_XSETREF(self->last_for_tail, Py_NewRef(pi));
         }
     } else {
-        pi = PyTuple_Pack(2, target, text);
+        pi = _PyTuple_FromPair(target, text);
         if (!pi) {
             return NULL;
         }
@@ -2957,7 +2958,7 @@ treebuilder_handle_start_ns(TreeBuilderObject* self, PyObject* prefix, PyObject*
     PyObject* parcel;
 
     if (self->events_append && self->start_ns_event_obj) {
-        parcel = PyTuple_Pack(2, prefix, uri);
+        parcel = _PyTuple_FromPair(prefix, uri);
         if (!parcel) {
             return NULL;
         }
index f70c36125081d16cfea3e5a6aed1b1dd58707dc5..36614138501e791d68b54f184173462fbf617420 100644 (file)
@@ -14,6 +14,7 @@
 #include "pycore_global_strings.h" // _Py_ID()
 #include "pycore_pyerrors.h"      // _PyErr_FormatNote
 #include "pycore_runtime.h"       // _PyRuntime
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 #include "pycore_unicodeobject.h" // _PyUnicode_CheckConsistency()
 
 #include <stdbool.h>              // bool
@@ -446,7 +447,6 @@ raise_stop_iteration(Py_ssize_t idx)
 static PyObject *
 _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
     /* return (rval, idx) tuple, stealing reference to rval */
-    PyObject *tpl;
     PyObject *pyidx;
     /*
     steal a reference to rval, returns (rval, idx)
@@ -459,15 +459,7 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
         Py_DECREF(rval);
         return NULL;
     }
-    tpl = PyTuple_New(2);
-    if (tpl == NULL) {
-        Py_DECREF(pyidx);
-        Py_DECREF(rval);
-        return NULL;
-    }
-    PyTuple_SET_ITEM(tpl, 0, rval);
-    PyTuple_SET_ITEM(tpl, 1, pyidx);
-    return tpl;
+    return _PyTuple_FromPairSteal(rval, pyidx);
 }
 
 static PyObject *
@@ -810,11 +802,10 @@ _parse_object_unicode(PyScannerObject *s, PyObject *memo, PyObject *pystr, Py_ss
                 goto bail;
 
             if (has_pairs_hook) {
-                PyObject *item = PyTuple_Pack(2, key, val);
+                PyObject *item = _PyTuple_FromPairSteal(key, val);
+                key = val = NULL;
                 if (item == NULL)
                     goto bail;
-                Py_CLEAR(key);
-                Py_CLEAR(val);
                 if (PyList_Append(rval, item) == -1) {
                     Py_DECREF(item);
                     goto bail;
index d04732dc314f11027c3b7d93ff5989f3b15b8e38..417403dc4c10c11e50d9043f87c46d463f412508 100644 (file)
@@ -1194,7 +1194,7 @@ itemgetter_reduce(PyObject *op, PyObject *Py_UNUSED(dummy))
     itemgetterobject *ig = itemgetterobject_CAST(op);
     if (ig->nitems == 1)
         return Py_BuildValue("O(O)", Py_TYPE(ig), ig->item);
-    return PyTuple_Pack(2, Py_TYPE(ig), ig->item);
+    return _PyTuple_FromPair((PyObject *)Py_TYPE(ig), ig->item);
 }
 
 PyDoc_STRVAR(reduce_doc, "Return state information for pickling");
index a28e5feebc1ed8c52623c28c10a90920c3d2312b..9874f9475ac0296c217cad9dbd40b498b2d374a5 100644 (file)
@@ -21,6 +21,7 @@
 #include "pycore_setobject.h"     // _PySet_NextEntry()
 #include "pycore_symtable.h"      // _Py_Mangle()
 #include "pycore_sysmodule.h"     // _PySys_GetSizeOf()
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
 
 #include <stdlib.h>               // strtol()
@@ -3767,7 +3768,7 @@ fix_imports(PickleState *st, PyObject **module_name, PyObject **global_name)
     PyObject *key;
     PyObject *item;
 
-    key = PyTuple_Pack(2, *module_name, *global_name);
+    key = _PyTuple_FromPair(*module_name, *global_name);
     if (key == NULL)
         return -1;
     item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
@@ -3873,7 +3874,7 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj,
         char pdata[5];
         Py_ssize_t n;
 
-        extension_key = PyTuple_Pack(2, module_name, global_name);
+        extension_key = _PyTuple_FromPair(module_name, global_name);
         if (extension_key == NULL) {
             goto error;
         }
@@ -5133,26 +5134,19 @@ static PyObject *
 _pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
 /*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
 {
-    PyObject *reduce_value, *dict_args;
+    PyObject *dict_args;
     PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
     if (contents == NULL)
         return NULL;
 
-    reduce_value = PyTuple_New(2);
-    if (reduce_value == NULL) {
-        Py_DECREF(contents);
-        return NULL;
-    }
     dict_args = PyTuple_New(1);
     if (dict_args == NULL) {
         Py_DECREF(contents);
-        Py_DECREF(reduce_value);
         return NULL;
     }
     PyTuple_SET_ITEM(dict_args, 0, contents);
-    PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
-    PyTuple_SET_ITEM(reduce_value, 1, dict_args);
-    return reduce_value;
+
+    return _PyTuple_FromPairSteal(Py_NewRef(&PyDict_Type), dict_args);
 }
 
 static PyMethodDef picklerproxy_methods[] = {
@@ -7310,7 +7304,7 @@ _pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyTypeObject *cls,
 
         /* Check if the global (i.e., a function or a class) was renamed
            or moved to another module. */
-        key = PyTuple_Pack(2, module_name, global_name);
+        key = _PyTuple_FromPair(module_name, global_name);
         if (key == NULL)
             return NULL;
         item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
@@ -7640,27 +7634,19 @@ static PyObject *
 _pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
 /*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
 {
-    PyObject *reduce_value;
     PyObject *constructor_args;
     PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
     if (contents == NULL)
         return NULL;
 
-    reduce_value = PyTuple_New(2);
-    if (reduce_value == NULL) {
-        Py_DECREF(contents);
-        return NULL;
-    }
     constructor_args = PyTuple_New(1);
     if (constructor_args == NULL) {
         Py_DECREF(contents);
-        Py_DECREF(reduce_value);
         return NULL;
     }
     PyTuple_SET_ITEM(constructor_args, 0, contents);
-    PyTuple_SET_ITEM(reduce_value, 0, Py_NewRef(&PyDict_Type));
-    PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
-    return reduce_value;
+
+    return _PyTuple_FromPairSteal(Py_NewRef(&PyDict_Type), constructor_args);
 }
 
 static PyMethodDef unpicklerproxy_methods[] = {
index 54de09a7d773dc3e584e2c2ac75c9bb6dbd278a0..044eb6e5f1fb662ab78967ec9776d4bcd8fc3d8b 100644 (file)
@@ -43,6 +43,7 @@ static const char copyright[] =
 #include "pycore_dict.h"             // _PyDict_Next()
 #include "pycore_long.h"             // _PyLong_GetZero()
 #include "pycore_moduleobject.h"     // _PyModule_GetState()
+#include "pycore_tuple.h"            // _PyTuple_FromPairSteal
 #include "pycore_unicodeobject.h"    // _PyUnicode_Copy
 #include "pycore_weakref.h"          // FT_CLEAR_WEAKREFS()
 
@@ -2572,28 +2573,17 @@ _sre_SRE_Match_end_impl(MatchObject *self, PyObject *group)
 LOCAL(PyObject*)
 _pair(Py_ssize_t i1, Py_ssize_t i2)
 {
-    PyObject* pair;
-    PyObject* item;
-
-    pair = PyTuple_New(2);
-    if (!pair)
+    PyObject* item1 = PyLong_FromSsize_t(i1);
+    if (!item1) {
         return NULL;
+    }
+    PyObject* item2 = PyLong_FromSsize_t(i2);
+    if(!item2) {
+        Py_DECREF(item1);
+        return NULL;
+    }
 
-    item = PyLong_FromSsize_t(i1);
-    if (!item)
-        goto error;
-    PyTuple_SET_ITEM(pair, 0, item);
-
-    item = PyLong_FromSsize_t(i2);
-    if (!item)
-        goto error;
-    PyTuple_SET_ITEM(pair, 1, item);
-
-    return pair;
-
-  error:
-    Py_DECREF(pair);
-    return NULL;
+    return _PyTuple_FromPairSteal(item1, item2);
 }
 
 /*[clinic input]
index 529257c2aa78aa152992252bdf28af9296cb616c..135b53111014d1c49f3003a15558057f971a66b0 100644 (file)
@@ -11,6 +11,7 @@
 #include "pycore_pylifecycle.h"
 #include "pycore_pystate.h"       // _PyThreadState_SetCurrent()
 #include "pycore_time.h"          // _PyTime_FromSeconds()
+#include "pycore_tuple.h"         // _PyTuple_FromPairSteal
 #include "pycore_weakref.h"       // _PyWeakref_GET_REF()
 
 #include <stddef.h>               // offsetof()
@@ -1480,13 +1481,11 @@ create_sentinel_wr(localobject *self)
         return NULL;
     }
 
-    PyObject *args = PyTuple_New(2);
+    PyObject *args = _PyTuple_FromPairSteal(self_wr,
+                                            Py_NewRef(tstate->threading_local_key));
     if (args == NULL) {
-        Py_DECREF(self_wr);
         return NULL;
     }
-    PyTuple_SET_ITEM(args, 0, self_wr);
-    PyTuple_SET_ITEM(args, 1, Py_NewRef(tstate->threading_local_key));
 
     PyObject *cb = PyCFunction_New(&wr_callback_def, args);
     Py_DECREF(args);
index 555a35b3fc92ab0a2b59c07d38d01a14e732fbe8..a86a7561271b8771977d1a443f7b97a46ed2ad95 100644 (file)
@@ -14,6 +14,7 @@
 #include "pycore_floatobject.h"   // _PY_FLOAT_BIG_ENDIAN
 #include "pycore_modsupport.h"    // _PyArg_NoKeywords()
 #include "pycore_moduleobject.h"  // _PyModule_GetState()
+#include "pycore_tuple.h"         // _PyTuple_FromPairSteal
 #include "pycore_weakref.h"       // FT_CLEAR_WEAKREFS()
 
 #include <stddef.h>               // offsetof()
@@ -1542,27 +1543,17 @@ static PyObject *
 array_array_buffer_info_impl(arrayobject *self)
 /*[clinic end generated code: output=9b2a4ec3ae7e98e7 input=63d9ad83ba60cda8]*/
 {
-    PyObject *retval = NULL, *v;
-
-    retval = PyTuple_New(2);
-    if (!retval)
-        return NULL;
-
-    v = PyLong_FromVoidPtr(self->ob_item);
-    if (v == NULL) {
-        Py_DECREF(retval);
+    PyObject* item1 = PyLong_FromVoidPtr(self->ob_item);
+    if (item1 == NULL) {
         return NULL;
     }
-    PyTuple_SET_ITEM(retval, 0, v);
-
-    v = PyLong_FromSsize_t(Py_SIZE(self));
-    if (v == NULL) {
-        Py_DECREF(retval);
+    PyObject* item2 = PyLong_FromSsize_t(Py_SIZE(self));
+    if (item2 == NULL) {
+        Py_DECREF(item1);
         return NULL;
     }
-    PyTuple_SET_ITEM(retval, 1, v);
 
-    return retval;
+    return _PyTuple_FromPairSteal(item1, item2);
 }
 
 /*[clinic input]
@@ -2248,13 +2239,10 @@ make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
     if (typecode_obj == NULL)
         return NULL;
 
-    new_args = PyTuple_New(2);
+    new_args = _PyTuple_FromPairSteal(typecode_obj, Py_NewRef(items));
     if (new_args == NULL) {
-        Py_DECREF(typecode_obj);
         return NULL;
     }
-    PyTuple_SET_ITEM(new_args, 0, typecode_obj);
-    PyTuple_SET_ITEM(new_args, 1, Py_NewRef(items));
 
     array_obj = array_new(arraytype, new_args, NULL);
     Py_DECREF(new_args);
index 0453a166c843ad08e92ca5461a1efda03b26dc0c..a6bfa78a461bb05c76bba6c5b471234b31742013 100644 (file)
@@ -310,7 +310,7 @@ pairwise_new_impl(PyTypeObject *type, PyObject *iterable)
     }
     po->it = it;
     po->old = NULL;
-    po->result = PyTuple_Pack(2, Py_None, Py_None);
+    po->result = _PyTuple_FromPairSteal(Py_None, Py_None);
     if (po->result == NULL) {
         Py_DECREF(po);
         return NULL;
@@ -389,11 +389,7 @@ pairwise_next(PyObject *op)
         _PyTuple_Recycle(result);
     }
     else {
-        result = PyTuple_New(2);
-        if (result != NULL) {
-            PyTuple_SET_ITEM(result, 0, Py_NewRef(old));
-            PyTuple_SET_ITEM(result, 1, Py_NewRef(new));
-        }
+        result = _PyTuple_FromPair(old, new);
     }
 
     Py_XSETREF(po->old, new);
@@ -533,7 +529,7 @@ groupby_step(groupbyobject *gbo)
 static PyObject *
 groupby_next(PyObject *op)
 {
-    PyObject *r, *grouper;
+    PyObject *grouper;
     groupbyobject *gbo = groupbyobject_CAST(op);
 
     gbo->currgrouper = NULL;
@@ -573,9 +569,7 @@ groupby_next(PyObject *op)
     if (grouper == NULL)
         return NULL;
 
-    r = PyTuple_Pack(2, gbo->currkey, grouper);
-    Py_DECREF(grouper);
-    return r;
+    return _PyTuple_FromPairSteal(Py_NewRef(gbo->currkey), grouper);
 }
 
 static PyType_Slot groupby_slots[] = {
index 7731fa0c7c67178218492b7dacbdf9d28997d3f5..a4dfddd98e257e2517ed70c3cddb89ff0e28da9a 100644 (file)
@@ -11,6 +11,7 @@
 #include "pycore_pylifecycle.h"   // _Py_PreInitializeFromPyArgv()
 #include "pycore_pystate.h"       // _PyInterpreterState_GET()
 #include "pycore_pythonrun.h"     // _PyRun_AnyFileObject()
+#include "pycore_tuple.h"         // _PyTuple_FromPair
 #include "pycore_unicodeobject.h" // _PyUnicode_Dedent()
 
 /* Includes for exit_sigint() */
@@ -342,7 +343,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0)
         Py_DECREF(runmodule);
         return pymain_exit_err_print();
     }
-    runargs = PyTuple_Pack(2, module, set_argv0 ? Py_True : Py_False);
+    runargs = _PyTuple_FromPair(module, set_argv0 ? Py_True : Py_False);
     if (runargs == NULL) {
         fprintf(stderr,
             "Could not create arguments for runpy._run_module_as_main\n");