11use crate :: {
2- builtins:: PyIntRef ,
3- function:: { Either , OptionalArg , PyComparisonValue } ,
4- sliceable:: SequenceIndexOp ,
5- types:: { richcompare_wrapper, PyComparisonOp , RichCompareFunc } ,
6- vm:: VirtualMachine ,
7- AsObject , PyObject , PyObjectRef , PyResult ,
2+ builtins:: PyIntRef , function:: OptionalArg , sliceable:: SequenceIndexOp , types:: PyComparisonOp ,
3+ vm:: VirtualMachine , AsObject , PyObject , PyObjectRef , PyResult ,
84} ;
95use optional:: Optioned ;
106use std:: ops:: Range ;
@@ -50,11 +46,6 @@ pub trait MutObjectSequenceOp<'a> {
5046 where
5147 F : FnMut ( ) ,
5248 {
53- let needle_cls = needle. class ( ) ;
54- let needle_cmp = needle_cls
55- . mro_find_map ( |cls| cls. slots . richcompare . load ( ) )
56- . unwrap ( ) ;
57-
5849 let mut borrower = None ;
5950 let mut i = range. start ;
6051
@@ -81,94 +72,10 @@ pub trait MutObjectSequenceOp<'a> {
8172 }
8273 borrower = Some ( guard) ;
8374 } else {
84- let elem_cls = elem. class ( ) ;
85- let reverse_first =
86- !elem_cls. is ( & needle_cls) && elem_cls. fast_issubclass ( & needle_cls) ;
87-
88- let eq = if reverse_first {
89- let elem_cmp = elem_cls
90- . mro_find_map ( |cls| cls. slots . richcompare . load ( ) )
91- . unwrap ( ) ;
92- drop ( elem_cls) ;
93-
94- fn cmp (
95- elem : & PyObject ,
96- needle : & PyObject ,
97- elem_cmp : RichCompareFunc ,
98- needle_cmp : RichCompareFunc ,
99- vm : & VirtualMachine ,
100- ) -> PyResult < bool > {
101- match elem_cmp ( elem, needle, PyComparisonOp :: Eq , vm) ? {
102- Either :: B ( PyComparisonValue :: Implemented ( value) ) => Ok ( value) ,
103- Either :: A ( obj) if !obj. is ( & vm. ctx . not_implemented ) => {
104- obj. try_to_bool ( vm)
105- }
106- _ => match needle_cmp ( needle, elem, PyComparisonOp :: Eq , vm) ? {
107- Either :: B ( PyComparisonValue :: Implemented ( value) ) => Ok ( value) ,
108- Either :: A ( obj) if !obj. is ( & vm. ctx . not_implemented ) => {
109- obj. try_to_bool ( vm)
110- }
111- _ => Ok ( false ) ,
112- } ,
113- }
114- }
115-
116- if elem_cmp as usize == richcompare_wrapper as usize {
117- let elem = elem. clone ( ) ;
118- drop ( guard) ;
119- cmp ( & elem, needle, elem_cmp, needle_cmp, vm) ?
120- } else {
121- let eq = cmp ( elem, needle, elem_cmp, needle_cmp, vm) ?;
122- borrower = Some ( guard) ;
123- eq
124- }
125- } else {
126- match needle_cmp ( needle, elem, PyComparisonOp :: Eq , vm) ? {
127- Either :: B ( PyComparisonValue :: Implemented ( value) ) => {
128- drop ( elem_cls) ;
129- borrower = Some ( guard) ;
130- value
131- }
132- Either :: A ( obj) if !obj. is ( & vm. ctx . not_implemented ) => {
133- drop ( elem_cls) ;
134- borrower = Some ( guard) ;
135- obj. try_to_bool ( vm) ?
136- }
137- _ => {
138- let elem_cmp = elem_cls
139- . mro_find_map ( |cls| cls. slots . richcompare . load ( ) )
140- . unwrap ( ) ;
141- drop ( elem_cls) ;
142-
143- fn cmp (
144- elem : & PyObject ,
145- needle : & PyObject ,
146- elem_cmp : RichCompareFunc ,
147- vm : & VirtualMachine ,
148- ) -> PyResult < bool > {
149- match elem_cmp ( elem, needle, PyComparisonOp :: Eq , vm) ? {
150- Either :: B ( PyComparisonValue :: Implemented ( value) ) => Ok ( value) ,
151- Either :: A ( obj) if !obj. is ( & vm. ctx . not_implemented ) => {
152- obj. try_to_bool ( vm)
153- }
154- _ => Ok ( false ) ,
155- }
156- }
157-
158- if elem_cmp as usize == richcompare_wrapper as usize {
159- let elem = elem. clone ( ) ;
160- drop ( guard) ;
161- cmp ( & elem, needle, elem_cmp, vm) ?
162- } else {
163- let eq = cmp ( elem, needle, elem_cmp, vm) ?;
164- borrower = Some ( guard) ;
165- eq
166- }
167- }
168- }
169- } ;
75+ let elem = elem. clone ( ) ;
76+ drop ( guard) ;
17077
171- if eq {
78+ if elem . rich_compare_bool ( needle , PyComparisonOp :: Eq , vm ) ? {
17279 f ( ) ;
17380 if SHORT {
17481 break Optioned :: < usize > :: some ( i) ;
0 commit comments