@@ -77,18 +77,11 @@ where
7777{
7878 let vec_size = vec. len ( ) ;
7979 let mut result = Vec :: with_capacity ( vec_size) ;
80- let mut index = 0 ;
81- while index < vec_size {
82- let previous = if index != 0 {
83- Some ( & vec[ index - 1 ] )
84- } else {
85- None // cannot using `index - 1` because it may overflow when index is 0u32
86- } ;
87- // SAFETY: index is always less than vec_size
88- let c = vec. get ( index) . unwrap ( ) ;
89- let element = c. to_element ( accessor, previous) ?;
80+ let mut prev_index = 0 ;
81+ for c in vec {
82+ let ( current_index, element) = c. to_element ( accessor, prev_index) ?;
83+ prev_index = current_index;
9084 result. push ( element) ;
91- index += 1 ;
9285 }
9386 Ok ( result)
9487}
@@ -120,9 +113,9 @@ fn read_method(
120113 MethodElement { access_flags, name, shorty_descriptor, return_type, parameters, code_off } . ok ( )
121114}
122115
123- impl AsElement < ClassContentElement > for ClassDataItem {
124- fn to_element (
125- & self , accessor : & DexFileAccessor , _previous : Option < & ClassDataItem > ,
116+ impl ClassDataItem {
117+ pub ( crate ) fn to_element (
118+ & self , accessor : & DexFileAccessor
126119 ) -> AsmResult < ClassContentElement > {
127120 let static_fields = to_element_list_impl (
128121 accessor, & self . static_fields ,
@@ -145,20 +138,18 @@ impl AsElement<ClassContentElement> for ClassDataItem {
145138
146139impl AsElement < FieldElement > for EncodedField {
147140 fn to_element (
148- & self , accessor : & DexFileAccessor , previous : Option < & EncodedField > ,
149- ) -> AsmResult < FieldElement > {
150- let previous_field_idx = previous. map_or ( 0 , |f| f. field_idx_diff . value ( ) ) ;
151- let field_idx = self . field_idx_diff . value ( ) + previous_field_idx;
152- read_field ( accessor, self , field_idx)
141+ & self , accessor : & DexFileAccessor , previous_index : u32 ,
142+ ) -> AsmResult < ( u32 , FieldElement ) > {
143+ let field_idx = self . field_idx_diff . value ( ) + previous_index;
144+ Ok ( ( field_idx, read_field ( accessor, self , field_idx) ?) )
153145 }
154146}
155147
156148impl AsElement < MethodElement > for EncodedMethod {
157149 fn to_element (
158- & self , accessor : & DexFileAccessor , previous : Option < & EncodedMethod > ,
159- ) -> AsmResult < MethodElement > {
160- let previous_method_idx = previous. map_or ( 0 , |m| m. method_idx_diff . value ( ) ) ;
161- let method_idx = self . method_idx_diff . value ( ) + previous_method_idx;
162- read_method ( accessor, self , method_idx)
150+ & self , accessor : & DexFileAccessor , previous_index : u32 ,
151+ ) -> AsmResult < ( u32 , MethodElement ) > {
152+ let method_idx = self . method_idx_diff . value ( ) + previous_index;
153+ Ok ( ( method_idx, read_method ( accessor, self , method_idx) ?) )
163154 }
164155}
0 commit comments