@@ -36,6 +36,7 @@ impl Vector {
3636 JavaMethodProto :: new( "remove" , "(I)Ljava/lang/Object;" , Self :: remove, Default :: default ( ) ) ,
3737 JavaMethodProto :: new( "removeAllElements" , "()V" , Self :: remove_all_elements, Default :: default ( ) ) ,
3838 JavaMethodProto :: new( "removeElementAt" , "(I)V" , Self :: remove_element_at, Default :: default ( ) ) ,
39+ JavaMethodProto :: new( "indexOf" , "(Ljava/lang/Object;)I" , Self :: index_of, Default :: default ( ) ) ,
3940 JavaMethodProto :: new( "lastIndexOf" , "(Ljava/lang/Object;)I" , Self :: last_index_of, Default :: default ( ) ) ,
4041 JavaMethodProto :: new( "lastIndexOf" , "(Ljava/lang/Object;I)I" , Self :: last_index_of_index, Default :: default ( ) ) ,
4142 JavaMethodProto :: new( "firstElement" , "()Ljava/lang/Object;" , Self :: first_element, Default :: default ( ) ) ,
@@ -181,6 +182,30 @@ impl Vector {
181182 Ok ( ( ) )
182183 }
183184
185+ async fn index_of ( jvm : & Jvm , _: & mut RuntimeContext , this : ClassInstanceRef < Self > , element : ClassInstanceRef < Object > ) -> Result < i32 > {
186+ tracing:: debug!( "java.util.Vector::indexOf({:?}, {:?})" , & this, & element) ;
187+
188+ let rust_vector = Self :: get_rust_vector ( jvm, & this) . await ?;
189+ let vector = rust_vector. lock ( ) ;
190+
191+ for ( i, item) in vector. iter ( ) . enumerate ( ) {
192+ if item. is_none ( ) && element. is_null ( ) {
193+ return Ok ( i as i32 ) ;
194+ }
195+
196+ if item. is_none ( ) || element. is_null ( ) {
197+ continue ;
198+ }
199+
200+ let value: Box < dyn ClassInstance > = element. clone ( ) . into ( ) ;
201+ if item. as_ref ( ) . unwrap ( ) . equals ( & * value) ? {
202+ return Ok ( i as i32 ) ;
203+ }
204+ }
205+
206+ Ok ( -1 )
207+ }
208+
184209 async fn last_index_of ( jvm : & Jvm , _: & mut RuntimeContext , this : ClassInstanceRef < Self > , element : ClassInstanceRef < Object > ) -> Result < i32 > {
185210 tracing:: debug!( "java.util.Vector::lastIndexOf({:?}, {:?})" , & this, & element) ;
186211
@@ -213,10 +238,11 @@ impl Vector {
213238 let vector = rust_vector. lock ( ) ;
214239
215240 for ( i, item) in vector[ ..=index as usize ] . iter ( ) . enumerate ( ) . rev ( ) {
216- if item. is_none ( ) {
217- if element. is_null ( ) {
218- return Ok ( i as i32 ) ;
219- }
241+ if item. is_none ( ) && element. is_null ( ) {
242+ return Ok ( i as i32 ) ;
243+ }
244+
245+ if item. is_none ( ) || element. is_null ( ) {
220246 continue ;
221247 }
222248
0 commit comments