_, dump_1, _ = assert_python_ok(*args, PYTHONHASHSEED="1")
self.assertEqual(dump_0, dump_1)
+ def test_unmarshallable(self):
+ # Check no crash after encountering unmarshallable objects.
+ # See https://github.com/python/cpython/issues/106287.
+ fset = frozenset([int])
+ code = compile("a = 1", "<string>", "exec")
+ code = code.replace(co_consts=(1, fset, None))
+ cases = (('tuple', (fset,)),
+ ('list', [fset]),
+ ('set', fset),
+ ('dict key', {fset: 'x'}),
+ ('dict value', {'x': fset}),
+ ('dict key & value', {fset: fset}),
+ ('slice', slice(fset, fset)),
+ ('code', code))
+ for name, arg in cases:
+ with self.subTest(name, arg=arg):
+ with self.assertRaisesRegex(ValueError, "unmarshallable object"):
+ marshal.dumps((arg, memoryview(b'')))
+
+
LARGE_SIZE = 2**31
pointer_size = 8 if sys.maxsize > 0xFFFFFFFF else 4