From 230e8e924dbafe093fd1cc7b6c510dc0b9ec0caf Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Thu, 2 Nov 2023 09:09:01 +0900 Subject: GH-111435: Add Support for Sharing True and False Between Interpreters (gh-111436) This only affects users of the APIs in pycore_crossinterp.h (AKA _xxsubinterpretersmodule.c and _xxinterpchannels.c). --- Lib/test/test__xxsubinterpreters.py | 7 ++++-- Lib/test/test_interpreters.py | 4 ++-- .../2023-10-29-11-35-21.gh-issue-111435.ageUWQ.rst | 1 + Python/crossinterp.c | 25 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-10-29-11-35-21.gh-issue-111435.ageUWQ.rst diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__xxsubinterpreters.py index 5dce3e5..ae7dfa1 100644 --- a/Lib/test/test__xxsubinterpreters.py +++ b/Lib/test/test__xxsubinterpreters.py @@ -102,6 +102,8 @@ class IsShareableTests(unittest.TestCase): 'spam', 10, -10, + True, + False, 100.0, ] for obj in shareables: @@ -121,8 +123,6 @@ class IsShareableTests(unittest.TestCase): not_shareables = [ # singletons - True, - False, NotImplemented, ..., # builtin types and objects @@ -189,6 +189,9 @@ class ShareableTypeTests(unittest.TestCase): with self.assertRaises(OverflowError): _testinternalcapi.get_crossinterp_data(i) + def test_bool(self): + self._assert_values([True, False]) + def test_float(self): self._assert_values([0.0, 1.1, -1.0, 0.12345678, -0.12345678]) diff --git a/Lib/test/test_interpreters.py b/Lib/test/test_interpreters.py index 7a2f489..74f8608 100644 --- a/Lib/test/test_interpreters.py +++ b/Lib/test/test_interpreters.py @@ -778,6 +778,8 @@ class TestIsShareable(TestBase): 'spam', 10, -10, + True, + False, 100.0, ] for obj in shareables: @@ -797,8 +799,6 @@ class TestIsShareable(TestBase): not_shareables = [ # singletons - True, - False, NotImplemented, ..., # builtin types and objects diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-10-29-11-35-21.gh-issue-111435.ageUWQ.rst b/Misc/NEWS.d/next/Core and Builtins/2023-10-29-11-35-21.gh-issue-111435.ageUWQ.rst new file mode 100644 index 0000000..95044dc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-10-29-11-35-21.gh-issue-111435.ageUWQ.rst @@ -0,0 +1 @@ +Added support for sharing of bool type with interpreters API. diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 00eccbd..5e3bf4c 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -693,6 +693,26 @@ _none_shared(PyThreadState *tstate, PyObject *obj, return 0; } +static PyObject * +_new_bool_object(_PyCrossInterpreterData *data) +{ + if (data->data){ + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + +static int +_bool_shared(PyThreadState *tstate, PyObject *obj, + _PyCrossInterpreterData *data) +{ + _PyCrossInterpreterData_Init(data, tstate->interp, + (void *) (Py_IsTrue(obj) ? (uintptr_t) 1 : (uintptr_t) 0), NULL, + _new_bool_object); + // data->obj and data->free remain NULL + return 0; +} + static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry) { @@ -716,6 +736,11 @@ _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry) Py_FatalError("could not register str for cross-interpreter sharing"); } + // bool + if (_xidregistry_add_type(xidregistry, &PyBool_Type, _bool_shared) != 0) { + Py_FatalError("could not register bool for cross-interpreter sharing"); + } + // float if (_xidregistry_add_type(xidregistry, &PyFloat_Type, _float_shared) != 0) { Py_FatalError("could not register float for cross-interpreter sharing"); -- cgit v0.12