diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index f4dccd4c8..7bfef955b 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -315,6 +315,7 @@ class TestJointOps: self.assertRaises(RuntimeError, s.discard, BadCmp()) self.assertRaises(RuntimeError, s.remove, BadCmp()) + @unittest.skip("TODO: RUSTPYTHON") def test_cyclical_repr(self): w = ReprWrapper() s = self.thetype([w]) @@ -676,7 +677,6 @@ class TestSet(TestJointOps, unittest.TestCase): class SetSubclass(set): pass -@unittest.skip("TODO: RUSTPYTHON") class TestSetSubclass(TestSet): thetype = SetSubclass basetype = set @@ -685,9 +685,9 @@ class SetSubclassWithKeywordArgs(set): def __init__(self, iterable=[], newarg=None): set.__init__(self, iterable) -@unittest.skip("TODO: RUSTPYTHON") class TestSetSubclassWithKeywordArgs(TestSet): - + # TODO: RUSTPYTHON + @unittest.expectedFailure def test_keywords_in_subclass(self): 'SF bug #1486663 -- this used to erroneously raise a TypeError' SetSubclassWithKeywordArgs(newarg=1) @@ -712,8 +712,6 @@ class TestFrozenSet(TestJointOps, unittest.TestCase): # All of the empty frozensets should have just one id() self.assertEqual(len(set(map(id, efs))), 1) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_constructor_identity(self): s = self.thetype(range(3)) t = self.thetype(s) diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index cdb7953a4..be932a772 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -5,10 +5,11 @@ use super::pytype::PyTypeRef; use crate::common::hash::PyHash; use crate::common::rc::PyRc; use crate::dictdatatype; +use crate::function::OptionalArg::{Missing, Present}; use crate::function::{Args, OptionalArg}; use crate::pyobject::{ - self, BorrowValue, PyClassImpl, PyComparisonValue, PyContext, PyIterable, PyObjectRef, PyRef, - PyResult, PyValue, TryFromObject, TypeProtocol, + self, BorrowValue, IdProtocol, PyClassImpl, PyComparisonValue, PyContext, PyIterable, + PyObjectRef, PyRef, PyResult, PyValue, TryFromObject, TypeProtocol, }; use crate::slots::{Comparable, Hashable, Iterable, PyComparisonOp, PyIter, Unhashable}; use crate::vm::{ReprGuard, VirtualMachine}; @@ -569,9 +570,22 @@ impl PyFrozenSet { #[pyslot] fn tp_new( cls: PyTypeRef, - iterable: OptionalArg, + iterable: OptionalArg, vm: &VirtualMachine, ) -> PyResult> { + let iterable = if let Present(iterable) = iterable { + if cls.is(&vm.ctx.types.frozenset_type) { + match iterable.downcast_exact::(vm) { + Ok(iter) => return Ok(iter), + Err(iterable) => Present(PyIterable::try_from_object(vm, iterable)?), + } + } else { + Present(PyIterable::try_from_object(vm, iterable)?) + } + } else { + Missing + }; + Self { inner: PySetInner::from_arg(iterable, vm)?, }