summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Objects/boolobject.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2024-02-12 07:53:52 +0300
committerDaniil Cherednik <[email protected]>2024-02-14 14:26:16 +0000
commit31f2a419764a8ba77c2a970cfc80056c6cd06756 (patch)
treec1995d239eba8571cefc640f6648e1d5dd4ce9e2 /contrib/tools/python3/src/Objects/boolobject.c
parentfe2ef02b38d9c85d80060963b265a1df9f38c3bb (diff)
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Objects/boolobject.c')
-rw-r--r--contrib/tools/python3/src/Objects/boolobject.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/contrib/tools/python3/src/Objects/boolobject.c b/contrib/tools/python3/src/Objects/boolobject.c
index 8a20e368d4a..f43e26f3f24 100644
--- a/contrib/tools/python3/src/Objects/boolobject.c
+++ b/contrib/tools/python3/src/Objects/boolobject.c
@@ -2,8 +2,11 @@
#include "Python.h"
#include "pycore_object.h" // _Py_FatalRefcountError()
+#include "pycore_long.h" // FALSE_TAG TRUE_TAG
#include "pycore_runtime.h" // _Py_ID()
+#include <stddef.h>
+
/* We define bool_repr to return "False" or "True" */
static PyObject *
@@ -17,14 +20,7 @@ bool_repr(PyObject *self)
PyObject *PyBool_FromLong(long ok)
{
- PyObject *result;
-
- if (ok)
- result = Py_True;
- else
- result = Py_False;
- Py_INCREF(result);
- return result;
+ return ok ? Py_True : Py_False;
}
/* We define bool_new to always return either Py_True or Py_False */
@@ -72,6 +68,22 @@ bool_vectorcall(PyObject *type, PyObject * const*args,
/* Arithmetic operations redefined to return bool if both args are bool. */
static PyObject *
+bool_invert(PyObject *v)
+{
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Bitwise inversion '~' on bool is deprecated. This "
+ "returns the bitwise inversion of the underlying int "
+ "object and is usually not what you expect from negating "
+ "a bool. Use the 'not' operator for boolean negation or "
+ "~int(x) if you really want the bitwise inversion of the "
+ "underlying int.",
+ 1) < 0) {
+ return NULL;
+ }
+ return PyLong_Type.tp_as_number->nb_invert(v);
+}
+
+static PyObject *
bool_and(PyObject *a, PyObject *b)
{
if (!PyBool_Check(a) || !PyBool_Check(b))
@@ -117,7 +129,7 @@ static PyNumberMethods bool_as_number = {
0, /* nb_positive */
0, /* nb_absolute */
0, /* nb_bool */
- 0, /* nb_invert */
+ (unaryfunc)bool_invert, /* nb_invert */
0, /* nb_lshift */
0, /* nb_rshift */
bool_and, /* nb_and */
@@ -143,10 +155,14 @@ static PyNumberMethods bool_as_number = {
0, /* nb_index */
};
-static void _Py_NO_RETURN
-bool_dealloc(PyObject* Py_UNUSED(ignore))
+static void
+bool_dealloc(PyObject *boolean)
{
- _Py_FatalRefcountError("deallocating True or False");
+ /* This should never get called, but we also don't want to SEGV if
+ * we accidentally decref Booleans out of existence. Instead,
+ * since bools are immortal, re-set the reference count.
+ */
+ _Py_SetImmortal(boolean);
}
/* The type object for bool. Note that this cannot be subclassed! */
@@ -154,8 +170,8 @@ bool_dealloc(PyObject* Py_UNUSED(ignore))
PyTypeObject PyBool_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"bool",
- sizeof(struct _longobject),
- 0,
+ offsetof(struct _longobject, long_value.ob_digit), /* tp_basicsize */
+ sizeof(digit), /* tp_itemsize */
bool_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */
0, /* tp_getattr */
@@ -196,11 +212,15 @@ PyTypeObject PyBool_Type = {
/* The objects representing bool values False and True */
struct _longobject _Py_FalseStruct = {
- PyVarObject_HEAD_INIT(&PyBool_Type, 0)
- { 0 }
+ PyObject_HEAD_INIT(&PyBool_Type)
+ { .lv_tag = _PyLong_FALSE_TAG,
+ { 0 }
+ }
};
struct _longobject _Py_TrueStruct = {
- PyVarObject_HEAD_INIT(&PyBool_Type, 1)
- { 1 }
+ PyObject_HEAD_INIT(&PyBool_Type)
+ { .lv_tag = _PyLong_TRUE_TAG,
+ { 1 }
+ }
};