Skip to content

Commit a933e9c

Browse files
GH-145247: Use _PyTuple_FromPair[Steal] in Objects (#145884)
Co-authored-by: Victor Stinner <vstinner@python.org>
1 parent a5b9d60 commit a933e9c

File tree

11 files changed

+72
-122
lines changed

11 files changed

+72
-122
lines changed

Objects/codeobject.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3052,7 +3052,7 @@ _PyCode_ConstantKey(PyObject *op)
30523052
else if (PyBool_Check(op) || PyBytes_CheckExact(op)) {
30533053
/* Make booleans different from integers 0 and 1.
30543054
* Avoid BytesWarning from comparing bytes with strings. */
3055-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3055+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30563056
}
30573057
else if (PyFloat_CheckExact(op)) {
30583058
double d = PyFloat_AS_DOUBLE(op);
@@ -3062,7 +3062,7 @@ _PyCode_ConstantKey(PyObject *op)
30623062
if (d == 0.0 && copysign(1.0, d) < 0.0)
30633063
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
30643064
else
3065-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3065+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30663066
}
30673067
else if (PyComplex_CheckExact(op)) {
30683068
Py_complex z;
@@ -3086,7 +3086,7 @@ _PyCode_ConstantKey(PyObject *op)
30863086
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
30873087
}
30883088
else {
3089-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3089+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30903090
}
30913091
}
30923092
else if (PyTuple_CheckExact(op)) {
@@ -3111,7 +3111,7 @@ _PyCode_ConstantKey(PyObject *op)
31113111
PyTuple_SET_ITEM(tuple, i, item_key);
31123112
}
31133113

3114-
key = PyTuple_Pack(2, tuple, op);
3114+
key = _PyTuple_FromPair(tuple, op);
31153115
Py_DECREF(tuple);
31163116
}
31173117
else if (PyFrozenSet_CheckExact(op)) {
@@ -3145,7 +3145,7 @@ _PyCode_ConstantKey(PyObject *op)
31453145
if (set == NULL)
31463146
return NULL;
31473147

3148-
key = PyTuple_Pack(2, set, op);
3148+
key = _PyTuple_FromPair(set, op);
31493149
Py_DECREF(set);
31503150
return key;
31513151
}
@@ -3176,7 +3176,7 @@ _PyCode_ConstantKey(PyObject *op)
31763176
goto slice_exit;
31773177
}
31783178

3179-
key = PyTuple_Pack(2, slice_key, op);
3179+
key = _PyTuple_FromPair(slice_key, op);
31803180
Py_DECREF(slice_key);
31813181
slice_exit:
31823182
Py_XDECREF(start_key);
@@ -3190,7 +3190,7 @@ _PyCode_ConstantKey(PyObject *op)
31903190
if (obj_id == NULL)
31913191
return NULL;
31923192

3193-
key = PyTuple_Pack(2, obj_id, op);
3193+
key = _PyTuple_FromPair(obj_id, op);
31943194
Py_DECREF(obj_id);
31953195
}
31963196
return key;

Objects/dictobject.c

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5454,7 +5454,7 @@ dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
54545454
}
54555455
if (itertype == &PyDictIterItem_Type ||
54565456
itertype == &PyDictRevIterItem_Type) {
5457-
di->di_result = PyTuple_Pack(2, Py_None, Py_None);
5457+
di->di_result = _PyTuple_FromPairSteal(Py_None, Py_None);
54585458
if (di->di_result == NULL) {
54595459
Py_DECREF(di);
54605460
return NULL;
@@ -6020,14 +6020,7 @@ dictiter_iternextitem(PyObject *self)
60206020
_PyTuple_Recycle(result);
60216021
}
60226022
else {
6023-
result = PyTuple_New(2);
6024-
if (result == NULL) {
6025-
Py_DECREF(key);
6026-
Py_DECREF(value);
6027-
return NULL;
6028-
}
6029-
PyTuple_SET_ITEM(result, 0, key);
6030-
PyTuple_SET_ITEM(result, 1, value);
6023+
result = _PyTuple_FromPairSteal(key, value);
60316024
}
60326025
return result;
60336026
}
@@ -6146,12 +6139,7 @@ dictreviter_iter_lock_held(PyDictObject *d, PyObject *self)
61466139
_PyTuple_Recycle(result);
61476140
}
61486141
else {
6149-
result = PyTuple_New(2);
6150-
if (result == NULL) {
6151-
return NULL;
6152-
}
6153-
PyTuple_SET_ITEM(result, 0, Py_NewRef(key));
6154-
PyTuple_SET_ITEM(result, 1, Py_NewRef(value));
6142+
result = _PyTuple_FromPair(key, value);
61556143
}
61566144
return result;
61576145
}
@@ -6644,18 +6632,22 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2)
66446632
else {
66456633
Py_INCREF(val1);
66466634
to_delete = PyObject_RichCompareBool(val1, val2, Py_EQ);
6635+
Py_CLEAR(val1);
66476636
if (to_delete < 0) {
66486637
goto error;
66496638
}
66506639
}
66516640

66526641
if (to_delete) {
6642+
Py_CLEAR(val2);
66536643
if (_PyDict_DelItem_KnownHash(temp_dict, key, hash) < 0) {
66546644
goto error;
66556645
}
6646+
Py_CLEAR(key);
66566647
}
66576648
else {
6658-
PyObject *pair = PyTuple_Pack(2, key, val2);
6649+
PyObject *pair = _PyTuple_FromPairSteal(key, val2);
6650+
key = val2 = NULL;
66596651
if (pair == NULL) {
66606652
goto error;
66616653
}
@@ -6665,11 +6657,7 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2)
66656657
}
66666658
Py_DECREF(pair);
66676659
}
6668-
Py_DECREF(key);
6669-
Py_XDECREF(val1);
6670-
Py_DECREF(val2);
66716660
}
6672-
key = val1 = val2 = NULL;
66736661

66746662
PyObject *remaining_pairs = PyObject_CallMethodNoArgs(
66756663
temp_dict, &_Py_ID(items));

Objects/enumobject.c

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ enum_new_impl(PyTypeObject *type, PyObject *iterable, PyObject *start)
7878
Py_DECREF(en);
7979
return NULL;
8080
}
81-
en->en_result = PyTuple_Pack(2, Py_None, Py_None);
81+
en->en_result = _PyTuple_FromPairSteal(Py_None, Py_None);
8282
if (en->en_result == NULL) {
8383
Py_DECREF(en);
8484
return NULL;
@@ -226,15 +226,7 @@ enum_next_long(enumobject *en, PyObject* next_item)
226226
_PyTuple_Recycle(result);
227227
return result;
228228
}
229-
result = PyTuple_New(2);
230-
if (result == NULL) {
231-
Py_DECREF(next_index);
232-
Py_DECREF(next_item);
233-
return NULL;
234-
}
235-
PyTuple_SET_ITEM(result, 0, next_index);
236-
PyTuple_SET_ITEM(result, 1, next_item);
237-
return result;
229+
return _PyTuple_FromPairSteal(next_index, next_item);
238230
}
239231

240232
static PyObject *
@@ -276,15 +268,7 @@ enum_next(PyObject *op)
276268
_PyTuple_Recycle(result);
277269
return result;
278270
}
279-
result = PyTuple_New(2);
280-
if (result == NULL) {
281-
Py_DECREF(next_index);
282-
Py_DECREF(next_item);
283-
return NULL;
284-
}
285-
PyTuple_SET_ITEM(result, 0, next_index);
286-
PyTuple_SET_ITEM(result, 1, next_item);
287-
return result;
271+
return _PyTuple_FromPairSteal(next_index, next_item);
288272
}
289273

290274
static PyObject *

Objects/floatobject.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "pycore_pystate.h" // _PyInterpreterState_GET()
1717
#include "pycore_stackref.h" // PyStackRef_AsPyObjectBorrow()
1818
#include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin()
19+
#include "pycore_tuple.h" // _PyTuple_FromPair
1920

2021
#include <float.h> // DBL_MAX
2122
#include <stdlib.h> // strtol()
@@ -1539,8 +1540,9 @@ float_as_integer_ratio_impl(PyObject *self)
15391540
if (denominator == NULL)
15401541
goto error;
15411542
}
1543+
Py_DECREF(py_exponent);
15421544

1543-
result_pair = PyTuple_Pack(2, numerator, denominator);
1545+
return _PyTuple_FromPairSteal(numerator, denominator);
15441546

15451547
error:
15461548
Py_XDECREF(py_exponent);

Objects/frameobject.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
1414
#include "pycore_opcode_metadata.h" // _PyOpcode_Caches
1515
#include "pycore_optimizer.h" // _Py_Executors_InvalidateDependency()
16+
#include "pycore_tuple.h" // _PyTuple_FromPair
1617
#include "pycore_unicodeobject.h" // _PyUnicode_Equal()
1718

1819
#include "frameobject.h" // PyFrameLocalsProxyObject
@@ -630,22 +631,16 @@ framelocalsproxy_items(PyObject *self, PyObject *Py_UNUSED(ignored))
630631
PyObject *value = framelocalsproxy_getval(frame->f_frame, co, i);
631632

632633
if (value) {
633-
PyObject *pair = PyTuple_Pack(2, name, value);
634+
PyObject *pair = _PyTuple_FromPairSteal(Py_NewRef(name), value);
634635
if (pair == NULL) {
635-
Py_DECREF(items);
636-
Py_DECREF(value);
637-
return NULL;
638-
}
639-
640-
if (PyList_Append(items, pair) < 0) {
641-
Py_DECREF(items);
642-
Py_DECREF(pair);
643-
Py_DECREF(value);
644-
return NULL;
636+
goto error;
645637
}
646638

639+
int rc = PyList_Append(items, pair);
647640
Py_DECREF(pair);
648-
Py_DECREF(value);
641+
if (rc < 0) {
642+
goto error;
643+
}
649644
}
650645
}
651646

@@ -655,23 +650,24 @@ framelocalsproxy_items(PyObject *self, PyObject *Py_UNUSED(ignored))
655650
PyObject *key = NULL;
656651
PyObject *value = NULL;
657652
while (PyDict_Next(frame->f_extra_locals, &j, &key, &value)) {
658-
PyObject *pair = PyTuple_Pack(2, key, value);
653+
PyObject *pair = _PyTuple_FromPair(key, value);
659654
if (pair == NULL) {
660-
Py_DECREF(items);
661-
return NULL;
662-
}
663-
664-
if (PyList_Append(items, pair) < 0) {
665-
Py_DECREF(items);
666-
Py_DECREF(pair);
667-
return NULL;
655+
goto error;
668656
}
669657

658+
int rc = PyList_Append(items, pair);
670659
Py_DECREF(pair);
660+
if (rc < 0) {
661+
goto error;
662+
}
671663
}
672664
}
673665

674666
return items;
667+
668+
error:
669+
Py_DECREF(items);
670+
return NULL;
675671
}
676672

677673
static Py_ssize_t

Objects/listobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,9 +1437,9 @@ list_extend_dictitems(PyListObject *self, PyDictObject *dict)
14371437
PyObject **dest = self->ob_item + m;
14381438
Py_ssize_t pos = 0;
14391439
Py_ssize_t i = 0;
1440-
PyObject *key_value[2];
1441-
while (_PyDict_Next((PyObject *)dict, &pos, &key_value[0], &key_value[1], NULL)) {
1442-
PyObject *item = PyTuple_FromArray(key_value, 2);
1440+
PyObject *key, *value;
1441+
while (_PyDict_Next((PyObject *)dict, &pos, &key, &value, NULL)) {
1442+
PyObject *item = _PyTuple_FromPair(key, value);
14431443
if (item == NULL) {
14441444
Py_SET_SIZE(self, m + i);
14451445
return -1;

Objects/longobject.c

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "pycore_runtime.h" // _PY_NSMALLPOSINTS
1313
#include "pycore_stackref.h"
1414
#include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin()
15+
#include "pycore_tuple.h" // _PyTuple_FromPairSteal
1516
#include "pycore_unicodeobject.h" // _PyUnicode_Equal()
1617

1718
#include <float.h> // DBL_MANT_DIG
@@ -4878,23 +4879,12 @@ static PyObject *
48784879
long_divmod(PyObject *a, PyObject *b)
48794880
{
48804881
PyLongObject *div, *mod;
4881-
PyObject *z;
4882-
48834882
CHECK_BINOP(a, b);
48844883

48854884
if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
48864885
return NULL;
48874886
}
4888-
z = PyTuple_New(2);
4889-
if (z != NULL) {
4890-
PyTuple_SET_ITEM(z, 0, (PyObject *) div);
4891-
PyTuple_SET_ITEM(z, 1, (PyObject *) mod);
4892-
}
4893-
else {
4894-
Py_DECREF(div);
4895-
Py_DECREF(mod);
4896-
}
4897-
return z;
4887+
return _PyTuple_FromPairSteal((PyObject *)div, (PyObject *)mod);
48984888
}
48994889

49004890

@@ -6118,7 +6108,7 @@ PyObject *
61186108
_PyLong_DivmodNear(PyObject *a, PyObject *b)
61196109
{
61206110
PyLongObject *quo = NULL, *rem = NULL;
6121-
PyObject *twice_rem, *result, *temp;
6111+
PyObject *twice_rem, *temp;
61226112
int quo_is_odd, quo_is_neg;
61236113
Py_ssize_t cmp;
61246114

@@ -6184,14 +6174,7 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b)
61846174
goto error;
61856175
}
61866176

6187-
result = PyTuple_New(2);
6188-
if (result == NULL)
6189-
goto error;
6190-
6191-
/* PyTuple_SET_ITEM steals references */
6192-
PyTuple_SET_ITEM(result, 0, (PyObject *)quo);
6193-
PyTuple_SET_ITEM(result, 1, (PyObject *)rem);
6194-
return result;
6177+
return _PyTuple_FromPairSteal((PyObject *)quo, (PyObject *)rem);
61956178

61966179
error:
61976180
Py_XDECREF(quo);
@@ -6368,14 +6351,11 @@ static PyObject *
63686351
int_as_integer_ratio_impl(PyObject *self)
63696352
/*[clinic end generated code: output=e60803ae1cc8621a input=384ff1766634bec2]*/
63706353
{
6371-
PyObject *ratio_tuple;
63726354
PyObject *numerator = long_long(self);
63736355
if (numerator == NULL) {
63746356
return NULL;
63756357
}
6376-
ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_GetOne());
6377-
Py_DECREF(numerator);
6378-
return ratio_tuple;
6358+
return _PyTuple_FromPairSteal(numerator, _PyLong_GetOne());
63796359
}
63806360

63816361
/*[clinic input]

0 commit comments

Comments
 (0)