1
1
use 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 ,
8
4
} ;
9
5
use optional:: Optioned ;
10
6
use std:: ops:: Range ;
@@ -50,11 +46,6 @@ pub trait MutObjectSequenceOp<'a> {
50
46
where
51
47
F : FnMut ( ) ,
52
48
{
53
- let needle_cls = needle. class ( ) ;
54
- let needle_cmp = needle_cls
55
- . mro_find_map ( |cls| cls. slots . richcompare . load ( ) )
56
- . unwrap ( ) ;
57
-
58
49
let mut borrower = None ;
59
50
let mut i = range. start ;
60
51
@@ -81,94 +72,10 @@ pub trait MutObjectSequenceOp<'a> {
81
72
}
82
73
borrower = Some ( guard) ;
83
74
} 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) ;
170
77
171
- if eq {
78
+ if elem . rich_compare_bool ( needle , PyComparisonOp :: Eq , vm ) ? {
172
79
f ( ) ;
173
80
if SHORT {
174
81
break Optioned :: < usize > :: some ( i) ;
0 commit comments