Skip to content

Commit eb71cca

Browse files
Use _PyTuple_FromPair[Steal] in Objects
1 parent cd52172 commit eb71cca

11 files changed

Lines changed: 42 additions & 82 deletions

File tree

Objects/codeobject.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3050,7 +3050,7 @@ _PyCode_ConstantKey(PyObject *op)
30503050
else if (PyBool_Check(op) || PyBytes_CheckExact(op)) {
30513051
/* Make booleans different from integers 0 and 1.
30523052
* Avoid BytesWarning from comparing bytes with strings. */
3053-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3053+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30543054
}
30553055
else if (PyFloat_CheckExact(op)) {
30563056
double d = PyFloat_AS_DOUBLE(op);
@@ -3060,7 +3060,7 @@ _PyCode_ConstantKey(PyObject *op)
30603060
if (d == 0.0 && copysign(1.0, d) < 0.0)
30613061
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
30623062
else
3063-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3063+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30643064
}
30653065
else if (PyComplex_CheckExact(op)) {
30663066
Py_complex z;
@@ -3084,7 +3084,7 @@ _PyCode_ConstantKey(PyObject *op)
30843084
key = PyTuple_Pack(3, Py_TYPE(op), op, Py_None);
30853085
}
30863086
else {
3087-
key = PyTuple_Pack(2, Py_TYPE(op), op);
3087+
key = _PyTuple_FromPair((PyObject *)Py_TYPE(op), op);
30883088
}
30893089
}
30903090
else if (PyTuple_CheckExact(op)) {
@@ -3109,7 +3109,7 @@ _PyCode_ConstantKey(PyObject *op)
31093109
PyTuple_SET_ITEM(tuple, i, item_key);
31103110
}
31113111

3112-
key = PyTuple_Pack(2, tuple, op);
3112+
key = _PyTuple_FromPair(tuple, op);
31133113
Py_DECREF(tuple);
31143114
}
31153115
else if (PyFrozenSet_CheckExact(op)) {
@@ -3143,7 +3143,7 @@ _PyCode_ConstantKey(PyObject *op)
31433143
if (set == NULL)
31443144
return NULL;
31453145

3146-
key = PyTuple_Pack(2, set, op);
3146+
key = _PyTuple_FromPair(set, op);
31473147
Py_DECREF(set);
31483148
return key;
31493149
}
@@ -3174,7 +3174,7 @@ _PyCode_ConstantKey(PyObject *op)
31743174
goto slice_exit;
31753175
}
31763176

3177-
key = PyTuple_Pack(2, slice_key, op);
3177+
key = _PyTuple_FromPair(slice_key, op);
31783178
Py_DECREF(slice_key);
31793179
slice_exit:
31803180
Py_XDECREF(start_key);
@@ -3188,7 +3188,7 @@ _PyCode_ConstantKey(PyObject *op)
31883188
if (obj_id == NULL)
31893189
return NULL;
31903190

3191-
key = PyTuple_Pack(2, obj_id, op);
3191+
key = _PyTuple_FromPair(obj_id, op);
31923192
Py_DECREF(obj_id);
31933193
}
31943194
return key;

Objects/dictobject.c

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5439,7 +5439,7 @@ dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
54395439
}
54405440
if (itertype == &PyDictIterItem_Type ||
54415441
itertype == &PyDictRevIterItem_Type) {
5442-
di->di_result = PyTuple_Pack(2, Py_None, Py_None);
5442+
di->di_result = _PyTuple_FromPairSteal(Py_None, Py_None);
54435443
if (di->di_result == NULL) {
54445444
Py_DECREF(di);
54455445
return NULL;
@@ -6005,14 +6005,7 @@ dictiter_iternextitem(PyObject *self)
60056005
_PyTuple_Recycle(result);
60066006
}
60076007
else {
6008-
result = PyTuple_New(2);
6009-
if (result == NULL) {
6010-
Py_DECREF(key);
6011-
Py_DECREF(value);
6012-
return NULL;
6013-
}
6014-
PyTuple_SET_ITEM(result, 0, key);
6015-
PyTuple_SET_ITEM(result, 1, value);
6008+
result = _PyTuple_FromPairSteal(key, value);
60166009
}
60176010
return result;
60186011
}
@@ -6131,12 +6124,7 @@ dictreviter_iter_lock_held(PyDictObject *d, PyObject *self)
61316124
_PyTuple_Recycle(result);
61326125
}
61336126
else {
6134-
result = PyTuple_New(2);
6135-
if (result == NULL) {
6136-
return NULL;
6137-
}
6138-
PyTuple_SET_ITEM(result, 0, Py_NewRef(key));
6139-
PyTuple_SET_ITEM(result, 1, Py_NewRef(value));
6127+
result = _PyTuple_FromPair(key, value);
61406128
}
61416129
return result;
61426130
}
@@ -6629,6 +6617,7 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2)
66296617
else {
66306618
Py_INCREF(val1);
66316619
to_delete = PyObject_RichCompareBool(val1, val2, Py_EQ);
6620+
Py_DECREF(val1);
66326621
if (to_delete < 0) {
66336622
goto error;
66346623
}
@@ -6640,7 +6629,8 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2)
66406629
}
66416630
}
66426631
else {
6643-
PyObject *pair = PyTuple_Pack(2, key, val2);
6632+
PyObject *pair = _PyTuple_FromPairSteal(key, val2);
6633+
key = val2 = NULL;
66446634
if (pair == NULL) {
66456635
goto error;
66466636
}
@@ -6650,9 +6640,6 @@ dictitems_xor_lock_held(PyObject *d1, PyObject *d2)
66506640
}
66516641
Py_DECREF(pair);
66526642
}
6653-
Py_DECREF(key);
6654-
Py_XDECREF(val1);
6655-
Py_DECREF(val2);
66566643
}
66576644
key = val1 = val2 = NULL;
66586645

Objects/enumobject.c

Lines changed: 3 additions & 17 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,14 +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);
229+
result = _PyTuple_FromPairSteal(next_index, next_item);
237230
return result;
238231
}
239232

@@ -276,14 +269,7 @@ enum_next(PyObject *op)
276269
_PyTuple_Recycle(result);
277270
return result;
278271
}
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);
272+
result = _PyTuple_FromPairSteal(next_index, next_item);
287273
return result;
288274
}
289275

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()
@@ -1540,7 +1541,8 @@ float_as_integer_ratio_impl(PyObject *self)
15401541
goto error;
15411542
}
15421543

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

15451547
error:
15461548
Py_XDECREF(py_exponent);

Objects/frameobject.c

Lines changed: 3 additions & 5 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,19 @@ 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) {
635636
Py_DECREF(items);
636-
Py_DECREF(value);
637637
return NULL;
638638
}
639639

640640
if (PyList_Append(items, pair) < 0) {
641641
Py_DECREF(items);
642642
Py_DECREF(pair);
643-
Py_DECREF(value);
644643
return NULL;
645644
}
646645

647646
Py_DECREF(pair);
648-
Py_DECREF(value);
649647
}
650648
}
651649

@@ -655,7 +653,7 @@ framelocalsproxy_items(PyObject *self, PyObject *Py_UNUSED(ignored))
655653
PyObject *key = NULL;
656654
PyObject *value = NULL;
657655
while (PyDict_Next(frame->f_extra_locals, &j, &key, &value)) {
658-
PyObject *pair = PyTuple_Pack(2, key, value);
656+
PyObject *pair = _PyTuple_FromPair(key, value);
659657
if (pair == NULL) {
660658
Py_DECREF(items);
661659
return NULL;

Objects/listobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1439,7 +1439,7 @@ list_extend_dictitems(PyListObject *self, PyDictObject *dict)
14391439
Py_ssize_t i = 0;
14401440
PyObject *key_value[2];
14411441
while (_PyDict_Next((PyObject *)dict, &pos, &key_value[0], &key_value[1], NULL)) {
1442-
PyObject *item = PyTuple_FromArray(key_value, 2);
1442+
PyObject *item = _PyTuple_FromPair(key_value[0], key_value[1]);
14431443
if (item == NULL) {
14441444
Py_SET_SIZE(self, m + i);
14451445
return -1;

Objects/longobject.c

Lines changed: 4 additions & 18 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
@@ -4886,15 +4887,7 @@ long_divmod(PyObject *a, PyObject *b)
48864887
if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
48874888
return NULL;
48884889
}
4889-
z = PyTuple_New(2);
4890-
if (z != NULL) {
4891-
PyTuple_SET_ITEM(z, 0, (PyObject *) div);
4892-
PyTuple_SET_ITEM(z, 1, (PyObject *) mod);
4893-
}
4894-
else {
4895-
Py_DECREF(div);
4896-
Py_DECREF(mod);
4897-
}
4890+
z = _PyTuple_FromPairSteal((PyObject *)div, (PyObject *)mod);
48984891
return z;
48994892
}
49004893

@@ -6185,13 +6178,7 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b)
61856178
goto error;
61866179
}
61876180

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

61976184
error:
@@ -6374,8 +6361,7 @@ int_as_integer_ratio_impl(PyObject *self)
63746361
if (numerator == NULL) {
63756362
return NULL;
63766363
}
6377-
ratio_tuple = PyTuple_Pack(2, numerator, _PyLong_GetOne());
6378-
Py_DECREF(numerator);
6364+
ratio_tuple = _PyTuple_FromPairSteal(numerator, _PyLong_GetOne());
63796365
return ratio_tuple;
63806366
}
63816367

Objects/odictobject.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,9 +1171,7 @@ OrderedDict_popitem_impl(PyODictObject *self, int last)
11711171
value = _odict_popkey_hash((PyObject *)self, key, NULL, _odictnode_HASH(node));
11721172
if (value == NULL)
11731173
return NULL;
1174-
item = PyTuple_Pack(2, key, value);
1175-
Py_DECREF(key);
1176-
Py_DECREF(value);
1174+
item = _PyTuple_FromPairSteal(key, value);
11771175
return item;
11781176
}
11791177

@@ -1828,18 +1826,16 @@ odictiter_iternext_lock_held(PyObject *op)
18281826
// bpo-42536: The GC may have untracked this result tuple. Since we're
18291827
// recycling it, make sure it's tracked again:
18301828
_PyTuple_Recycle(result);
1829+
PyTuple_SET_ITEM(result, 0, key); /* steals reference */
1830+
PyTuple_SET_ITEM(result, 1, value); /* steals reference */
18311831
}
18321832
else {
1833-
result = PyTuple_New(2);
1833+
result = _PyTuple_FromPairSteal(key, value);
18341834
if (result == NULL) {
1835-
Py_DECREF(key);
1836-
Py_DECREF(value);
18371835
goto done;
18381836
}
18391837
}
18401838

1841-
PyTuple_SET_ITEM(result, 0, key); /* steals reference */
1842-
PyTuple_SET_ITEM(result, 1, value); /* steals reference */
18431839
return result;
18441840

18451841
done:
@@ -1933,7 +1929,7 @@ odictiter_new(PyODictObject *od, int kind)
19331929
return NULL;
19341930

19351931
if ((kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) {
1936-
di->di_result = PyTuple_Pack(2, Py_None, Py_None);
1932+
di->di_result = _PyTuple_FromPairSteal(Py_None, Py_None);
19371933
if (di->di_result == NULL) {
19381934
Py_DECREF(di);
19391935
return NULL;

Objects/stringlib/unicode_format.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "pycore_complexobject.h" // _PyComplex_FormatAdvancedWriter()
66
#include "pycore_floatobject.h" // _PyFloat_FormatAdvancedWriter()
7+
#include "pycore_tuple.h" // _PyTuple_FromPairSteal
78

89
/************************************************************************/
910
/*********** Global data structures and forward declarations *********/
@@ -1183,7 +1184,8 @@ fieldnameiter_next(PyObject *op)
11831184
goto done;
11841185

11851186
/* return a tuple of values */
1186-
result = PyTuple_Pack(2, is_attr_obj, obj);
1187+
result = _PyTuple_FromPairSteal(is_attr_obj, obj);
1188+
return result;
11871189

11881190
done:
11891191
Py_XDECREF(is_attr_obj);
@@ -1274,7 +1276,8 @@ formatter_field_name_split(PyObject *Py_UNUSED(module), PyObject *self)
12741276
goto done;
12751277

12761278
/* return a tuple of values */
1277-
result = PyTuple_Pack(2, first_obj, it);
1279+
result = _PyTuple_FromPairSteal(first_obj, (PyObject *)it);
1280+
return result;
12781281

12791282
done:
12801283
Py_XDECREF(it);

Objects/typeobject.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "pycore_pyerrors.h" // _PyErr_Occurred()
2020
#include "pycore_pystate.h" // _PyThreadState_GET()
2121
#include "pycore_symtable.h" // _Py_Mangle()
22+
#include "pycore_tuple.h" // _PyTuple_FromPair
2223
#include "pycore_typeobject.h" // struct type_cache
2324
#include "pycore_unicodeobject.h" // _PyUnicode_Copy
2425
#include "pycore_unionobject.h" // _Py_union_type_or
@@ -1782,7 +1783,7 @@ mro_hierarchy_for_complete_type(PyTypeObject *type, PyObject *temp)
17821783
tuple = PyTuple_Pack(3, type, new_mro, old_mro);
17831784
}
17841785
else {
1785-
tuple = PyTuple_Pack(2, type, new_mro);
1786+
tuple = _PyTuple_FromPair((PyObject *)type, new_mro);
17861787
}
17871788

17881789
if (tuple != NULL) {
@@ -7826,7 +7827,7 @@ object_getstate_default(PyObject *obj, int required)
78267827
if (PyDict_GET_SIZE(slots) > 0) {
78277828
PyObject *state2;
78287829

7829-
state2 = PyTuple_Pack(2, state, slots);
7830+
state2 = _PyTuple_FromPair(state, slots);
78307831
Py_DECREF(state);
78317832
if (state2 == NULL) {
78327833
Py_DECREF(slotnames);

0 commit comments

Comments
 (0)