Skip to content

Commit 99eaa16

Browse files
committed
gh-140009: Replace PyTuple_Pack with PyTuple_FromArray in codeobject.c and _pickle.c
1 parent 645f5c4 commit 99eaa16

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Replace :c:func:`PyTuple_Pack` calls with :c:func:`PyTuple_FromArray` in
2+
:file:`Objects/codeobject.c` and :file:`Modules/_pickle.c` to avoid
3+
variadic argument overhead.

Modules/_pickle.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3758,7 +3758,8 @@ fix_imports(PickleState *st, PyObject **module_name, PyObject **global_name)
37583758
PyObject *key;
37593759
PyObject *item;
37603760

3761-
key = PyTuple_Pack(2, *module_name, *global_name);
3761+
PyObject *key_items[] = {*module_name, *global_name};
3762+
key = PyTuple_FromArray(key_items, 2);
37623763
if (key == NULL)
37633764
return -1;
37643765
item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
@@ -3864,7 +3865,8 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj,
38643865
char pdata[5];
38653866
Py_ssize_t n;
38663867

3867-
extension_key = PyTuple_Pack(2, module_name, global_name);
3868+
PyObject *ext_key_items[] = {module_name, global_name};
3869+
extension_key = PyTuple_FromArray(ext_key_items, 2);
38683870
if (extension_key == NULL) {
38693871
goto error;
38703872
}
@@ -7307,7 +7309,8 @@ _pickle_Unpickler_find_class_impl(UnpicklerObject *self, PyTypeObject *cls,
73077309

73087310
/* Check if the global (i.e., a function or a class) was renamed
73097311
or moved to another module. */
7310-
key = PyTuple_Pack(2, module_name, global_name);
7312+
PyObject *find_key_items[] = {module_name, global_name};
7313+
key = PyTuple_FromArray(find_key_items, 2);
73117314
if (key == NULL)
73127315
return NULL;
73137316
item = PyDict_GetItemWithError(st->name_mapping_2to3, key);

Objects/codeobject.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,17 +2967,22 @@ _PyCode_ConstantKey(PyObject *op)
29672967
else if (PyBool_Check(op) || PyBytes_CheckExact(op)) {
29682968
/* Make booleans different from integers 0 and 1.
29692969
* Avoid BytesWarning from comparing bytes with strings. */
2970-
key = PyTuple_Pack(2, Py_TYPE(op), op);
2970+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op};
2971+
key = PyTuple_FromArray(items, 2);
29712972
}
29722973
else if (PyFloat_CheckExact(op)) {
29732974
double d = PyFloat_AS_DOUBLE(op);
29742975
/* all we need is to make the tuple different in either the 0.0
29752976
* or -0.0 case from all others, just to avoid the "coercion".
29762977
*/
2977-
if (d == 0.0 && copysign(1.0, d) < 0.0)
2978-
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
2979-
else
2980-
key = PyTuple_Pack(2, Py_TYPE(op), op);
2978+
if (d == 0.0 && copysign(1.0, d) < 0.0) {
2979+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op, Py_None};
2980+
key = PyTuple_FromArray(items, 3);
2981+
}
2982+
else {
2983+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op};
2984+
key = PyTuple_FromArray(items, 2);
2985+
}
29812986
}
29822987
else if (PyComplex_CheckExact(op)) {
29832988
Py_complex z;
@@ -2992,16 +2997,20 @@ _PyCode_ConstantKey(PyObject *op)
29922997
/* use True, False and None singleton as tags for the real and imag
29932998
* sign, to make tuples different */
29942999
if (real_negzero && imag_negzero) {
2995-
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_True);
3000+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op, Py_True};
3001+
key = PyTuple_FromArray(items, 3);
29963002
}
29973003
else if (imag_negzero) {
2998-
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_False);
3004+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op, Py_False};
3005+
key = PyTuple_FromArray(items, 3);
29993006
}
30003007
else if (real_negzero) {
3001-
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
3008+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op, Py_None};
3009+
key = PyTuple_FromArray(items, 3);
30023010
}
30033011
else {
3004-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3012+
PyObject *items[] = {(PyObject *)Py_TYPE(op), op};
3013+
key = PyTuple_FromArray(items, 2);
30053014
}
30063015
}
30073016
else if (PyTuple_CheckExact(op)) {
@@ -3026,7 +3035,8 @@ _PyCode_ConstantKey(PyObject *op)
30263035
PyTuple_SET_ITEM(tuple, i, item_key);
30273036
}
30283037

3029-
key = PyTuple_Pack(2, tuple, op);
3038+
PyObject *tuple_items[] = {tuple, op};
3039+
key = PyTuple_FromArray(tuple_items, 2);
30303040
Py_DECREF(tuple);
30313041
}
30323042
else if (PyFrozenSet_CheckExact(op)) {
@@ -3060,7 +3070,8 @@ _PyCode_ConstantKey(PyObject *op)
30603070
if (set == NULL)
30613071
return NULL;
30623072

3063-
key = PyTuple_Pack(2, set, op);
3073+
PyObject *set_items[] = {set, op};
3074+
key = PyTuple_FromArray(set_items, 2);
30643075
Py_DECREF(set);
30653076
return key;
30663077
}
@@ -3091,7 +3102,8 @@ _PyCode_ConstantKey(PyObject *op)
30913102
goto slice_exit;
30923103
}
30933104

3094-
key = PyTuple_Pack(2, slice_key, op);
3105+
PyObject *slice_items[] = {slice_key, op};
3106+
key = PyTuple_FromArray(slice_items, 2);
30953107
Py_DECREF(slice_key);
30963108
slice_exit:
30973109
Py_XDECREF(start_key);
@@ -3105,7 +3117,8 @@ _PyCode_ConstantKey(PyObject *op)
31053117
if (obj_id == NULL)
31063118
return NULL;
31073119

3108-
key = PyTuple_Pack(2, obj_id, op);
3120+
PyObject *id_items[] = {obj_id, op};
3121+
key = PyTuple_FromArray(id_items, 2);
31093122
Py_DECREF(obj_id);
31103123
}
31113124
return key;

0 commit comments

Comments
 (0)