@@ -194,6 +194,25 @@ impl BuildSet for Bound<'_, PyFrozenSet> {
194
194
}
195
195
}
196
196
197
+ fn validate_add < ' py > (
198
+ py : Python < ' py > ,
199
+ set : & impl BuildSet ,
200
+ item : impl BorrowInput < ' py > ,
201
+ state : & mut ValidationState < ' _ , ' py > ,
202
+ validator : & CombinedValidator ,
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
+ }
213
+ }
214
+ }
215
+
197
216
#[ allow( clippy:: too_many_arguments) ]
198
217
pub ( crate ) fn validate_iter_to_set < ' py > (
199
218
py : Python < ' py > ,
@@ -216,9 +235,8 @@ pub(crate) fn validate_iter_to_set<'py>(
216
235
false => PartialMode :: Off ,
217
236
} ;
218
237
let item = item_result. map_err ( |e| any_next_error ! ( py, e, input, index) ) ?;
219
- match validator. validate ( py, item. borrow_input ( ) , state) {
220
- Ok ( item) => {
221
- set. build_add ( item) ?;
238
+ match validate_add ( py, set, item, state, validator) {
239
+ Ok ( ( ) ) => {
222
240
if let Some ( max_length) = max_length {
223
241
if set. build_len ( ) > max_length {
224
242
return Err ( ValError :: new (
0 commit comments