@@ -65,9 +65,9 @@ pub enum UnionElement {
65
65
66
66
#[ derive( Debug ) ]
67
67
pub struct Slice {
68
- pub start : Option < i64 > , // FIXME: usize?
69
- pub end : Option < i64 > , // FIXME: usize?
70
- pub step : Option < i64 > , // FIXME: usize?
68
+ pub start : Option < isize > ,
69
+ pub end : Option < isize > ,
70
+ pub step : Option < isize > ,
71
71
}
72
72
73
73
type Iter < ' a > = Box < dyn Iterator < Item = & ' a Value > + ' a > ;
@@ -103,17 +103,17 @@ impl UnionElement {
103
103
if let Value :: Array ( arr) = v {
104
104
let step = slice. step . unwrap_or ( 1 ) ;
105
105
106
- let len = arr. len ( ) as i64 ;
106
+ let len = arr. len ( ) ;
107
107
108
108
let start = slice
109
109
. start
110
- . map ( |s| if s < 0 { s + len } else { s } )
111
- . unwrap_or ( if step > 0 { 0 } else { len - 1 } ) ;
110
+ . map ( |s| if s < 0 { s + ( len as isize ) } else { s } )
111
+ . unwrap_or ( if step > 0 { 0 } else { ( len as isize ) - 1 } ) ;
112
112
113
113
let end = slice
114
114
. end
115
- . map ( |e| if e < 0 { e + len } else { e } )
116
- . unwrap_or ( if step > 0 { len } else { -1 } ) ;
115
+ . map ( |e| if e < 0 { e + ( len as isize ) } else { e } )
116
+ . unwrap_or ( if step > 0 { len as isize } else { -1 } ) ;
117
117
118
118
Box :: new ( array_slice ( arr, start, end, step, len) )
119
119
} else {
@@ -125,24 +125,32 @@ impl UnionElement {
125
125
}
126
126
}
127
127
128
- fn array_slice ( arr : & [ Value ] , start : i64 , end : i64 , step : i64 , len : i64 ) -> Iter < ' _ > {
128
+ fn array_slice ( arr : & [ Value ] , start : isize , end : isize , step : isize , len : usize ) -> Iter < ' _ > {
129
129
let mut sl = vec ! [ ] ;
130
130
match step. cmp ( & 0 ) {
131
131
Ordering :: Greater => {
132
- let st = if start < 0 { 0 } else { start } ; // avoid CPU attack
133
- let e = if end > len { len } else { end } ; // avoid CPU attack
134
- for i in ( st..e) . step_by ( step as usize ) {
135
- if 0 <= i && i < len {
136
- sl. push ( & arr[ i as usize ] ) ;
132
+ let strt = if start < 0 { 0 } else { start as usize } ; // avoid CPU attack
133
+ let e = if end > ( len as isize ) {
134
+ len
135
+ } else {
136
+ end as usize
137
+ } ; // avoid CPU attack
138
+ for i in ( strt..e) . step_by ( step as usize ) {
139
+ if i < len {
140
+ sl. push ( & arr[ i] ) ;
137
141
}
138
142
}
139
143
}
140
144
141
145
Ordering :: Less => {
142
- let strt = if start > len { len } else { start } ; // avoid CPU attack
146
+ let strt = if start > ( len as isize ) {
147
+ len as isize
148
+ } else {
149
+ start
150
+ } ; // avoid CPU attack
143
151
let e = if end < -1 { -1 } else { end } ; // avoid CPU attack
144
152
for i in ( -strt..-e) . step_by ( -step as usize ) {
145
- if 0 <= -i && -i < len {
153
+ if 0 <= -i && -i < ( len as isize ) {
146
154
sl. push ( & arr[ -i as usize ] ) ;
147
155
}
148
156
}
0 commit comments