@@ -2,6 +2,7 @@ use super::super::pyobject::{
22 AttributeProtocol , PyContext , PyFuncArgs , PyObjectKind , PyObjectRef , PyResult , TypeProtocol ,
33} ;
44use super :: super :: vm:: VirtualMachine ;
5+ use super :: objbool;
56use super :: objiter;
67use super :: objsequence:: { seq_equal, PySliceableSequence } ;
78use super :: objstr;
@@ -162,16 +163,21 @@ fn reverse(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
162163 }
163164}
164165
165- pub fn contains ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
166- trace ! ( "list.len called with: {:?}" , args) ;
166+ fn list_contains ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
167+ trace ! ( "list.contains called with: {:?}" , args) ;
167168 arg_check ! (
168169 vm,
169170 args,
170- required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( x , None ) ]
171+ required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle , None ) ]
171172 ) ;
172173 for element in get_elements ( list) . iter ( ) {
173- if x == element {
174- return Ok ( vm. new_bool ( true ) ) ;
174+ match vm. call_method ( needle, "__eq__" , vec ! [ element. clone( ) ] ) {
175+ Ok ( value) => {
176+ if objbool:: get_value ( & value) {
177+ return Ok ( vm. new_bool ( true ) ) ;
178+ }
179+ }
180+ Err ( _) => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
175181 }
176182 }
177183
@@ -181,7 +187,7 @@ pub fn contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
181187pub fn init ( context : & PyContext ) {
182188 let ref list_type = context. list_type ;
183189 list_type. set_attr ( "__add__" , context. new_rustfunc ( list_add) ) ;
184- list_type. set_attr ( "__contains__" , context. new_rustfunc ( contains ) ) ;
190+ list_type. set_attr ( "__contains__" , context. new_rustfunc ( list_contains ) ) ;
185191 list_type. set_attr ( "__eq__" , context. new_rustfunc ( list_eq) ) ;
186192 list_type. set_attr ( "__len__" , context. new_rustfunc ( list_len) ) ;
187193 list_type. set_attr ( "__new__" , context. new_rustfunc ( list_new) ) ;
0 commit comments