gh-99741: Clean Up the _xxsubinterpreters Module (gh-99940)

This cleanup up resolves a few subtle bugs and makes the implementation for multi-phase init much cleaner.

https://github.com/python/cpython/issues/99741
This commit is contained in:
Eric Snow 2022-12-02 11:36:57 -07:00 committed by GitHub
parent ab02262cd0
commit 0547a981ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 659 additions and 317 deletions

View file

@ -386,7 +386,6 @@ class ShareableTypeTests(unittest.TestCase):
self._assert_values([
b'spam',
9999,
self.cid,
])
def test_bytes(self):
@ -1213,6 +1212,18 @@ class ChannelIDTests(TestBase):
self.assertFalse(cid1 != cid2)
self.assertTrue(cid1 != cid3)
def test_shareable(self):
chan = interpreters.channel_create()
obj = interpreters.channel_create()
interpreters.channel_send(chan, obj)
got = interpreters.channel_recv(chan)
self.assertEqual(got, obj)
self.assertIs(type(got), type(obj))
# XXX Check the following in the channel tests?
#self.assertIsNot(got, obj)
class ChannelTests(TestBase):
@ -1545,6 +1556,19 @@ class ChannelTests(TestBase):
self.assertEqual(obj5, b'eggs')
self.assertIs(obj6, default)
def test_recv_sending_interp_destroyed(self):
cid = interpreters.channel_create()
interp = interpreters.create()
interpreters.run_string(interp, dedent(f"""
import _xxsubinterpreters as _interpreters
_interpreters.channel_send({cid}, b'spam')
"""))
interpreters.destroy(interp)
with self.assertRaisesRegex(RuntimeError,
'unrecognized interpreter ID'):
interpreters.channel_recv(cid)
def test_run_string_arg_unresolved(self):
cid = interpreters.channel_create()
interp = interpreters.create()