Skip to content

Commit 9c3b42f

Browse files
committed
Add PyTuple_GetItemRef() and Py_NO_BORROWED_REF
If Py_NO_BORROWED_REF is defined, PyTuple_GetItem() and PyTuple_GET_ITEM() are not defined.
1 parent 1812c37 commit 9c3b42f

3 files changed

Lines changed: 27 additions & 10 deletions

File tree

‎Include/pyport.h‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -793,8 +793,12 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler;
793793
#endif
794794

795795
/* New C API */
796-
#ifdef Py_NEWCAPI
797-
# define Py_NEWCAPI_BORROWED_REF
796+
#ifdef Py_NEWCAPI_BORROWED_REF
797+
# define Py_NEWCAPI
798+
#endif
799+
800+
#if defined(Py_NEWCAPI) && !defined(Py_NEWCAPI_BORROWED_REF)
801+
# define Py_NO_BORROWED_REF
798802
#endif
799803

800804
#endif /* Py_PYPORT_H */

‎Include/tupleobject.h‎

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ PyAPI_DATA(PyTypeObject) PyTupleIter_Type;
4242

4343
PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size);
4444
PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *);
45+
#ifndef Py_NO_BORROWED_REF
4546
PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t);
47+
#endif
48+
PyAPI_FUNC(PyObject *) PyTuple_GetItemRef(PyObject *, Py_ssize_t);
4649
PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *);
4750
PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t);
4851
#ifndef Py_LIMITED_API
@@ -54,16 +57,18 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *);
5457
#endif
5558

5659
#ifdef Py_NEWCAPI_BORROWED_REF
57-
#define PyTuple_GET_ITEM(op, i) PyTuple_GetItem(op, i)
58-
#define PyTuple_GET_SIZE(op) PyTuple_Size(op)
59-
#define PyTuple_SET_ITEM(op, i, v) PyTuple_SetItem(op, i, v)
60+
# define PyTuple_GET_SIZE(op) PyTuple_Size(op)
61+
# ifdef Py_NEWCAPI_BORROWED_REF
62+
# define PyTuple_GET_ITEM(op, i) PyTuple_GetItem(op, i)
63+
# define PyTuple_SET_ITEM(op, i, v) PyTuple_SetItem(op, i, v)
64+
# endif
6065
#elif !defined(Py_LIMITED_API)
61-
/* Macro, trading safety for speed */
62-
#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i])
63-
#define PyTuple_GET_SIZE(op) (assert(PyTuple_Check(op)),Py_SIZE(op))
66+
/* Macro, trading safety for speed */
67+
# define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i])
68+
# define PyTuple_GET_SIZE(op) (assert(PyTuple_Check(op)), Py_SIZE(op))
6469

65-
/* Macro, *only* to be used to fill in brand new tuples */
66-
#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v)
70+
/* Macro, *only* to be used to fill in brand new tuples */
71+
# define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v)
6772
#endif
6873

6974
PyAPI_FUNC(int) PyTuple_ClearFreeList(void);

‎Objects/tupleobject.c‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ PyTuple_GetItem(PyObject *op, Py_ssize_t i)
159159
return ((PyTupleObject *)op) -> ob_item[i];
160160
}
161161

162+
PyObject *
163+
PyTuple_GetItemRef(PyObject *op, Py_ssize_t i)
164+
{
165+
PyObject *item = PyTuple_GetItem(op, i);
166+
Py_XINCREF(item);
167+
return item;
168+
}
169+
162170
int
163171
PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
164172
{

0 commit comments

Comments
 (0)