diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 3768a979b2..aab31a366e 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -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): diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c3250ef72e..be89bec522 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -176,7 +176,7 @@ def test_numbers(self): 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" diff --git a/Lib/test/test_baseexception.py b/Lib/test/test_baseexception.py index 09db151ad2..63bf538aa5 100644 --- a/Lib/test/test_baseexception.py +++ b/Lib/test/test_baseexception.py @@ -83,7 +83,7 @@ def test_inheritance(self): 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 @@ def test_interface_no_arg(self): [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. diff --git a/vm/src/exceptions.rs b/vm/src/exceptions.rs index 77829608b2..885f82b71a 100644 --- a/vm/src/exceptions.rs +++ b/vm/src/exceptions.rs @@ -647,6 +647,24 @@ impl PyRef { vm.new_tuple((self.class().to_owned(), self.args())) } } + + #[pymethod(magic)] + fn setstate(self, state: PyObjectRef, vm: &VirtualMachine) -> PyResult { + if !vm.is_none(&state) { + let dict = state + .downcast::() + .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 {