@@ -101,6 +101,32 @@ fn set_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
101101 }
102102}
103103
104+ fn set_discard ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
105+ trace ! ( "set.discard called with: {:?}" , args) ;
106+ arg_check ! (
107+ vm,
108+ args,
109+ required = [ ( s, Some ( vm. ctx. set_type( ) ) ) , ( item, None ) ]
110+ ) ;
111+ let mut mut_obj = s. borrow_mut ( ) ;
112+
113+ match mut_obj. payload {
114+ PyObjectPayload :: Set { ref mut elements } => {
115+ fn discard (
116+ vm : & mut VirtualMachine ,
117+ elements : & mut HashMap < u64 , PyObjectRef > ,
118+ key : u64 ,
119+ _value : & PyObjectRef ,
120+ ) -> PyResult {
121+ elements. remove ( & key) ;
122+ Ok ( vm. get_none ( ) )
123+ }
124+ perform_action_with_hash ( vm, elements, item, & discard)
125+ }
126+ _ => Err ( vm. new_type_error ( "set.discard is called with no item" . to_string ( ) ) ) ,
127+ }
128+ }
129+
104130fn set_clear ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
105131 trace ! ( "set.clear called" ) ;
106132 arg_check ! ( vm, args, required = [ ( s, Some ( vm. ctx. set_type( ) ) ) ] ) ;
@@ -449,6 +475,7 @@ pub fn init(context: &PyContext) {
449475 context. set_attr ( & set_type, "__doc__" , context. new_str ( set_doc. to_string ( ) ) ) ;
450476 context. set_attr ( & set_type, "add" , context. new_rustfunc ( set_add) ) ;
451477 context. set_attr ( & set_type, "remove" , context. new_rustfunc ( set_remove) ) ;
478+ context. set_attr ( & set_type, "discard" , context. new_rustfunc ( set_discard) ) ;
452479 context. set_attr ( & set_type, "clear" , context. new_rustfunc ( set_clear) ) ;
453480
454481 let frozenset_type = & context. frozenset_type ;
0 commit comments