BaseException.__setstate__ (#5821)

* docs

* BaseException.__setstate__
This commit is contained in:
Jeong, YunWon
2025-06-23 13:49:59 +09:00
committed by GitHub
4 changed files with 21 additions and 6 deletions

View File

@@ -1933,8 +1933,7 @@ def _check_tracemalloc():
"if tracemalloc module is tracing "
"memory allocations")
# TODO: RUSTPYTHON (comment out before)
# TODO: RUSTPYTHON; GC is not supported yet
# def check_free_after_iterating(test, iter, cls, args=()):
# class A(cls):
# def __del__(self):

View File

@@ -176,7 +176,7 @@ class ArrayReconstructorTest(unittest.TestCase):
self.assertEqual(a, b,
msg="{0!r} != {1!r}; testcase={2!r}".format(a, b, testcase))
# TODO: RUSTPYTHON
# TODO: RUSTPYTHON - requires UTF-32 encoding support in codecs and proper array reconstructor implementation
@unittest.expectedFailure
def test_unicode(self):
teststr = "Bonne Journ\xe9e \U0002030a\U00020347"

View File

@@ -83,7 +83,7 @@ class ExceptionClassTests(unittest.TestCase):
exc_set = set(e for e in exc_set if not e.startswith('_'))
# RUSTPYTHON specific
exc_set.discard("JitError")
# TODO: RUSTPYTHON; this will be officially introduced in Python 3.15
# XXX: RUSTPYTHON; IncompleteInputError will be officially introduced in Python 3.15
exc_set.discard("IncompleteInputError")
self.assertEqual(len(exc_set), 0, "%s not accounted for" % exc_set)
@@ -121,8 +121,6 @@ class ExceptionClassTests(unittest.TestCase):
[repr(exc), exc.__class__.__name__ + '()'])
self.interface_test_driver(results)
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_setstate_refcount_no_crash(self):
# gh-97591: Acquire strong reference before calling tp_hash slot
# in PyObject_SetAttr.

View File

@@ -647,6 +647,24 @@ impl PyRef<PyBaseException> {
vm.new_tuple((self.class().to_owned(), self.args()))
}
}
#[pymethod(magic)]
fn setstate(self, state: PyObjectRef, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
if !vm.is_none(&state) {
let dict = state
.downcast::<crate::builtins::PyDict>()
.map_err(|_| vm.new_type_error("state is not a dictionary".to_owned()))?;
for (key, value) in &dict {
let key_str = key.str(vm)?;
if key_str.as_str().starts_with("__") {
continue;
}
self.as_object().set_attr(&key_str, value.clone(), vm)?;
}
}
Ok(vm.ctx.none())
}
}
impl Constructor for PyBaseException {