@@ -194,19 +194,22 @@ impl BuildSet for Bound<'_, PyFrozenSet> {
194194 }
195195}
196196
197- fn validate_hashable < ' py > (
197+ fn validate_add < ' py > (
198198 py : Python < ' py > ,
199- item : & ( impl Input < ' py > + ?Sized ) ,
199+ set : & impl BuildSet ,
200+ item : impl BorrowInput < ' py > ,
200201 state : & mut ValidationState < ' _ , ' py > ,
201202 validator : & CombinedValidator ,
202- ) -> ValResult < PyObject > {
203- let result: PyObject = validator. validate ( py, item, state) ?;
204-
205- let bound_result: & Bound < ' _ , PyAny > = result. bind ( py) ;
206-
207- match bound_result. hash ( ) {
208- Ok ( _) => Ok ( result) ,
209- Err ( _) => Err ( ValError :: new ( ErrorTypeDefaults :: SetItemNotHashable , item) ) ,
203+ ) -> ValResult < ( ) > {
204+ let validated_item = validator. validate ( py, item. borrow_input ( ) , state) ?;
205+ match set. build_add ( validated_item) {
206+ Ok ( ( ) ) => Ok ( ( ) ) ,
207+ Err ( err) => {
208+ if err. matches ( py, py. get_type :: < PyTypeError > ( ) ) ? {
209+ return Err ( ValError :: new ( ErrorTypeDefaults :: SetItemNotHashable , item) ) ;
210+ }
211+ Err ( err) ?
212+ }
210213 }
211214}
212215
@@ -232,9 +235,8 @@ pub(crate) fn validate_iter_to_set<'py>(
232235 false => PartialMode :: Off ,
233236 } ;
234237 let item = item_result. map_err ( |e| any_next_error ! ( py, e, input, index) ) ?;
235- match validate_hashable ( py, item. borrow_input ( ) , state, validator) {
236- Ok ( item) => {
237- set. build_add ( item) ?;
238+ match validate_add ( py, set, item, state, validator) {
239+ Ok ( ( ) ) => {
238240 if let Some ( max_length) = max_length {
239241 if set. build_len ( ) > max_length {
240242 return Err ( ValError :: new (
0 commit comments