Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions Lib/test/test_uuid.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,26 @@ def check(actual, expected):
with self.subTest(protocol=proto):
check(pickle.loads(pickle.dumps(u, proto)), u)

def test_pickle_roundtrip_default_is_safe(self):
def check(actual, expected):
self.assertEqual(actual, expected)
self.assertEqual(actual.is_safe, expected.is_safe)

with support.swap_item(sys.modules, 'uuid', self.uuid):
uuids = [
self.uuid.UUID('d82579ce6642a0de7ddf490a7aec7aa5'),
self.uuid.UUID(int=1),
self.uuid.uuid4(),
self.uuid.uuid7(),
]
for u in uuids:
with self.subTest(u=u):
self.assertEqual(u.is_safe, self.uuid.SafeUUID.unknown)
check(copy.copy(u), u)
check(copy.deepcopy(u), u)
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
check(pickle.loads(pickle.dumps(u, proto)), u)

def test_setstate_mapping(self):
# State restoration accepts mappings and decodes serialized safety values.
safety_states = [({}, self.uuid.SafeUUID.unknown)]
Expand Down
5 changes: 4 additions & 1 deletion Modules/_uuidmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1621,7 +1621,10 @@ _uuid_UUID___getstate___impl(uuidobject *self)
}
Py_DECREF(int_value);

if (PyDict_SetItem(dict, &_Py_ID(is_safe), self->is_safe) < 0) {
// NULL means SafeUUID.unknown, which __setstate__() restores by default.
if (self->is_safe != NULL &&
PyDict_SetItem(dict, &_Py_ID(is_safe), self->is_safe) < 0)
{
Py_DECREF(dict);
return NULL;
}
Expand Down
Loading