File tree Expand file tree Collapse file tree 3 files changed +20
-5
lines changed Expand file tree Collapse file tree 3 files changed +20
-5
lines changed Original file line number Diff line number Diff line change @@ -34,9 +34,16 @@ PyAPI_FUNC(int) Py_IsTrue(PyObject *x);
34
34
PyAPI_FUNC (int ) Py_IsFalse (PyObject * x );
35
35
#define Py_IsFalse (x ) Py_Is((x), Py_False)
36
36
37
- /* Macros for returning Py_True or Py_False, respectively */
38
- #define Py_RETURN_TRUE return Py_True
39
- #define Py_RETURN_FALSE return Py_False
37
+ /* Macros for returning Py_True or Py_False, respectively.
38
+ * Only treat Py_True and Py_False as immortal in the limited C API 3.12
39
+ * and newer. */
40
+ #if defined(Py_LIMITED_API ) && Py_LIMITED_API + 0 < 0x030c0000
41
+ # define Py_RETURN_TRUE return Py_NewRef(Py_True)
42
+ # define Py_RETURN_FALSE return Py_NewRef(Py_False)
43
+ #else
44
+ # define Py_RETURN_TRUE return Py_True
45
+ # define Py_RETURN_FALSE return Py_False
46
+ #endif
40
47
41
48
/* Function to return a bool from a C long */
42
49
PyAPI_FUNC (PyObject * ) PyBool_FromLong (long );
Original file line number Diff line number Diff line change @@ -660,8 +660,13 @@ PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */
660
660
PyAPI_FUNC (int ) Py_IsNone (PyObject * x );
661
661
#define Py_IsNone (x ) Py_Is((x), Py_None)
662
662
663
- /* Macro for returning Py_None from a function */
664
- #define Py_RETURN_NONE return Py_None
663
+ /* Macro for returning Py_None from a function.
664
+ * Only treat Py_None as immortal in the limited C API 3.12 and newer. */
665
+ #if defined(Py_LIMITED_API ) && Py_LIMITED_API + 0 < 0x030c0000
666
+ # define Py_RETURN_NONE return Py_NewRef(Py_None)
667
+ #else
668
+ # define Py_RETURN_NONE return Py_None
669
+ #endif
665
670
666
671
/*
667
672
Py_NotImplemented is a singleton used to signal that an operation is
Original file line number Diff line number Diff line change
1
+ Fix ``Py_RETURN_NONE ``, ``Py_RETURN_TRUE `` and ``Py_RETURN_FALSE `` macros in
2
+ the limited C API 3.11 and older: don't treat ``Py_None ``, ``Py_True `` and
3
+ ``Py_False `` as immortal. Patch by Victor Stinner.
You can’t perform that action at this time.
0 commit comments