11use super :: super :: pyobject:: {
2- PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectRef , PyResult , TypeProtocol ,
2+ IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectRef , PyResult , TypeProtocol ,
33} ;
44use super :: super :: vm:: { ReprGuard , VirtualMachine } ;
55use super :: objbool;
@@ -234,9 +234,13 @@ fn list_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
234234 let elements = get_elements ( zelf) ;
235235 let mut count: usize = 0 ;
236236 for element in elements. iter ( ) {
237- let is_eq = vm. _eq ( element. clone ( ) , value. clone ( ) ) ?;
238- if objbool:: boolval ( vm, is_eq) ? {
237+ if value. is ( & element) {
239238 count += 1 ;
239+ } else {
240+ let is_eq = vm. _eq ( element. clone ( ) , value. clone ( ) ) ?;
241+ if objbool:: boolval ( vm, is_eq) ? {
242+ count += 1 ;
243+ }
240244 }
241245 }
242246 Ok ( vm. context ( ) . new_int ( count) )
@@ -262,6 +266,9 @@ fn list_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
262266 required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle, None ) ]
263267 ) ;
264268 for ( index, element) in get_elements ( list) . iter ( ) . enumerate ( ) {
269+ if needle. is ( & element) {
270+ return Ok ( vm. context ( ) . new_int ( index) ) ;
271+ }
265272 let py_equal = vm. _eq ( needle. clone ( ) , element. clone ( ) ) ?;
266273 if objbool:: get_value ( & py_equal) {
267274 return Ok ( vm. context ( ) . new_int ( index) ) ;
@@ -335,6 +342,9 @@ fn list_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
335342 required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle, None ) ]
336343 ) ;
337344 for element in get_elements ( list) . iter ( ) {
345+ if needle. is ( & element) {
346+ return Ok ( vm. new_bool ( true ) ) ;
347+ }
338348 match vm. _eq ( needle. clone ( ) , element. clone ( ) ) {
339349 Ok ( value) => {
340350 if objbool:: get_value ( & value) {
0 commit comments