1
1
use super :: super :: pyobject:: {
2
- PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectRef , PyResult , TypeProtocol ,
2
+ IdProtocol , PyContext , PyFuncArgs , PyObject , PyObjectPayload , PyObjectRef , PyResult ,
3
+ TypeProtocol ,
3
4
} ;
4
5
use super :: super :: vm:: { ReprGuard , VirtualMachine } ;
5
6
use super :: objbool;
@@ -66,6 +67,10 @@ fn list_eq(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
66
67
required = [ ( zelf, Some ( vm. ctx. list_type( ) ) ) , ( other, None ) ]
67
68
) ;
68
69
70
+ if zelf. is ( & other) {
71
+ return Ok ( vm. ctx . new_bool ( true ) ) ;
72
+ }
73
+
69
74
let result = if objtype:: isinstance ( other, & vm. ctx . list_type ( ) ) {
70
75
let zelf = get_elements ( zelf) ;
71
76
let other = get_elements ( other) ;
@@ -249,9 +254,13 @@ fn list_count(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
249
254
let elements = get_elements ( zelf) ;
250
255
let mut count: usize = 0 ;
251
256
for element in elements. iter ( ) {
252
- let is_eq = vm. _eq ( element. clone ( ) , value. clone ( ) ) ?;
253
- if objbool:: boolval ( vm, is_eq) ? {
257
+ if value. is ( & element) {
254
258
count += 1 ;
259
+ } else {
260
+ let is_eq = vm. _eq ( element. clone ( ) , value. clone ( ) ) ?;
261
+ if objbool:: boolval ( vm, is_eq) ? {
262
+ count += 1 ;
263
+ }
255
264
}
256
265
}
257
266
Ok ( vm. context ( ) . new_int ( count) )
@@ -277,6 +286,9 @@ fn list_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
277
286
required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle, None ) ]
278
287
) ;
279
288
for ( index, element) in get_elements ( list) . iter ( ) . enumerate ( ) {
289
+ if needle. is ( & element) {
290
+ return Ok ( vm. context ( ) . new_int ( index) ) ;
291
+ }
280
292
let py_equal = vm. _eq ( needle. clone ( ) , element. clone ( ) ) ?;
281
293
if objbool:: get_value ( & py_equal) {
282
294
return Ok ( vm. context ( ) . new_int ( index) ) ;
@@ -350,6 +362,9 @@ fn list_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
350
362
required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle, None ) ]
351
363
) ;
352
364
for element in get_elements ( list) . iter ( ) {
365
+ if needle. is ( & element) {
366
+ return Ok ( vm. new_bool ( true ) ) ;
367
+ }
353
368
match vm. _eq ( needle. clone ( ) , element. clone ( ) ) {
354
369
Ok ( value) => {
355
370
if objbool:: get_value ( & value) {
@@ -431,9 +446,12 @@ fn list_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
431
446
required = [ ( list, Some ( vm. ctx. list_type( ) ) ) , ( needle, None ) ]
432
447
) ;
433
448
434
- let mut elements = get_mut_elements ( list) ;
435
449
let mut ri: Option < usize > = None ;
436
- for ( index, element) in elements. iter ( ) . enumerate ( ) {
450
+ for ( index, element) in get_elements ( list) . iter ( ) . enumerate ( ) {
451
+ if needle. is ( & element) {
452
+ ri = Some ( index) ;
453
+ break ;
454
+ }
437
455
let py_equal = vm. _eq ( needle. clone ( ) , element. clone ( ) ) ?;
438
456
if objbool:: get_value ( & py_equal) {
439
457
ri = Some ( index) ;
@@ -442,6 +460,7 @@ fn list_remove(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
442
460
}
443
461
444
462
if let Some ( index) = ri {
463
+ let mut elements = get_mut_elements ( list) ;
445
464
elements. remove ( index) ;
446
465
Ok ( vm. get_none ( ) )
447
466
} else {
0 commit comments