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).
This commit is contained in:
Anthony Shaw 2023-11-02 09:09:01 +09:00 committed by GitHub
parent 9322ce90ac
commit 230e8e924d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 4 deletions

View file

@ -102,6 +102,8 @@ class IsShareableTests(unittest.TestCase):
'spam', 'spam',
10, 10,
-10, -10,
True,
False,
100.0, 100.0,
] ]
for obj in shareables: for obj in shareables:
@ -121,8 +123,6 @@ class IsShareableTests(unittest.TestCase):
not_shareables = [ not_shareables = [
# singletons # singletons
True,
False,
NotImplemented, NotImplemented,
..., ...,
# builtin types and objects # builtin types and objects
@ -189,6 +189,9 @@ class ShareableTypeTests(unittest.TestCase):
with self.assertRaises(OverflowError): with self.assertRaises(OverflowError):
_testinternalcapi.get_crossinterp_data(i) _testinternalcapi.get_crossinterp_data(i)
def test_bool(self):
self._assert_values([True, False])
def test_float(self): def test_float(self):
self._assert_values([0.0, 1.1, -1.0, 0.12345678, -0.12345678]) self._assert_values([0.0, 1.1, -1.0, 0.12345678, -0.12345678])

View file

@ -778,6 +778,8 @@ class TestIsShareable(TestBase):
'spam', 'spam',
10, 10,
-10, -10,
True,
False,
100.0, 100.0,
] ]
for obj in shareables: for obj in shareables:
@ -797,8 +799,6 @@ class TestIsShareable(TestBase):
not_shareables = [ not_shareables = [
# singletons # singletons
True,
False,
NotImplemented, NotImplemented,
..., ...,
# builtin types and objects # builtin types and objects

View file

@ -0,0 +1 @@
Added support for sharing of bool type with interpreters API.

View file

@ -693,6 +693,26 @@ _none_shared(PyThreadState *tstate, PyObject *obj,
return 0; 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 static void
_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry) _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"); 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 // float
if (_xidregistry_add_type(xidregistry, &PyFloat_Type, _float_shared) != 0) { if (_xidregistry_add_type(xidregistry, &PyFloat_Type, _float_shared) != 0) {
Py_FatalError("could not register float for cross-interpreter sharing"); Py_FatalError("could not register float for cross-interpreter sharing");