@@ -79,17 +79,20 @@ func RangeNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) {
79
79
}
80
80
81
81
func (r * Range ) M__getitem__ (key Object ) (Object , error ) {
82
+ if slice , ok := key .(* Slice ); ok {
83
+ return computeRangeSlice (r , slice )
84
+ }
85
+
82
86
index , err := Index (key )
83
87
if err != nil {
84
88
return nil , err
85
89
}
86
- // TODO(corona10): Support slice case
87
- length := computeRangeLength (r .Start , r .Stop , r .Step )
90
+
88
91
if index < 0 {
89
- index += length
92
+ index += r . Length
90
93
}
91
94
92
- if index < 0 || index >= length {
95
+ if index < 0 || index >= r . Length {
93
96
return nil , ExceptionNewf (TypeError , "range object index out of range" )
94
97
}
95
98
result := computeItem (r , index )
@@ -152,6 +155,48 @@ func computeRangeLength(start, stop, step Int) Int {
152
155
return res
153
156
}
154
157
158
+ func computeRangeSlice (r * Range , s * Slice ) (Object , error ) {
159
+ length , err := r .Length .GoInt ()
160
+ if err != nil {
161
+ return nil , err
162
+ }
163
+ start , stop , step , sliceLength , err := s .GetIndices (length )
164
+ if err != nil {
165
+ return nil , err
166
+ }
167
+
168
+ if step == 0 {
169
+ return nil , ExceptionNewf (ValueError , "slice step cannot be zero" )
170
+ }
171
+ if start < 0 {
172
+ start += length
173
+ }
174
+ if stop < 0 {
175
+ stop += length
176
+ }
177
+ if start < 0 {
178
+ start = 0
179
+ } else if start >= length {
180
+ start = length
181
+ }
182
+ if stop < 0 {
183
+ stop = 0
184
+ } else if stop >= length {
185
+ stop = length
186
+ }
187
+
188
+ startIndex := computeItem (r , Int (start ))
189
+ stopIndex := computeItem (r , Int (stop ))
190
+ stepIndex := Int (step ) * r .Step
191
+
192
+ return & Range {
193
+ Start : startIndex ,
194
+ Stop : stopIndex ,
195
+ Step : stepIndex ,
196
+ Length : Int (sliceLength ),
197
+ }, nil
198
+ }
199
+
155
200
// Check interface is satisfied
156
201
var _ I__getitem__ = (* Range )(nil )
157
202
var _ I__iter__ = (* Range )(nil )
0 commit comments