OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of _interceptors; | 5 part of _interceptors; |
6 | 6 |
7 /** | 7 /** |
8 * The interceptor class for [List]. The compiler recognizes this | 8 * The interceptor class for [List]. The compiler recognizes this |
9 * class as an interceptor, and changes references to [:this:] to | 9 * class as an interceptor, and changes references to [:this:] to |
10 * actually use the receiver of the method, which is generated as an extra | 10 * actually use the receiver of the method, which is generated as an extra |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 // TODO(ngeoffray): Parameterize the return value. | 153 // TODO(ngeoffray): Parameterize the return value. |
154 if (start == end) return []; | 154 if (start == end) return []; |
155 return JS('=List', r'#.slice(#, #)', this, start, end); | 155 return JS('=List', r'#.slice(#, #)', this, start, end); |
156 } | 156 } |
157 | 157 |
158 | 158 |
159 Iterable<E> getRange(int start, int end) { | 159 Iterable<E> getRange(int start, int end) { |
160 return IterableMixinWorkaround.getRangeList(this, start, end); | 160 return IterableMixinWorkaround.getRangeList(this, start, end); |
161 } | 161 } |
162 | 162 |
163 void insertRange(int start, int length, [E initialValue]) { | |
164 checkGrowable(this, 'insertRange'); | |
165 if (length == 0) { | |
166 return; | |
167 } | |
168 if (length is !int) throw new ArgumentError(length); | |
169 if (length < 0) throw new ArgumentError(length); | |
170 if (start is !int) throw new ArgumentError(start); | |
171 | |
172 var receiver = this; | |
173 var receiverLength = receiver.length; | |
174 if (start < 0 || start > receiverLength) { | |
175 throw new RangeError.value(start); | |
176 } | |
177 receiver.length = receiverLength + length; | |
178 Arrays.copy(receiver, | |
179 start, | |
180 receiver, | |
181 start + length, | |
182 receiverLength - start); | |
183 if (initialValue != null) { | |
184 for (int i = start; i < start + length; i++) { | |
185 receiver[i] = initialValue; | |
186 } | |
187 } | |
188 receiver.length = receiverLength + length; | |
189 } | |
190 | |
191 E get first { | 163 E get first { |
192 if (length > 0) return this[0]; | 164 if (length > 0) return this[0]; |
193 throw new StateError("No elements"); | 165 throw new StateError("No elements"); |
194 } | 166 } |
195 | 167 |
196 E get last { | 168 E get last { |
197 if (length > 0) return this[length - 1]; | 169 if (length > 0) return this[length - 1]; |
198 throw new StateError("No elements"); | 170 throw new StateError("No elements"); |
199 } | 171 } |
200 | 172 |
201 E get single { | 173 E get single { |
202 if (length == 1) return this[0]; | 174 if (length == 1) return this[0]; |
203 if (length == 0) throw new StateError("No elements"); | 175 if (length == 0) throw new StateError("No elements"); |
204 throw new StateError("More than one element"); | 176 throw new StateError("More than one element"); |
205 } | 177 } |
206 | 178 |
207 void removeRange(int start, int length) { | 179 void removeRange(int start, int end) { |
208 checkGrowable(this, 'removeRange'); | 180 checkGrowable(this, 'removeRange'); |
209 if (length == 0) { | 181 int receiverLength = this.length; |
210 return; | 182 if (start < 0 || start > receiverLength) { |
| 183 throw new RangeError.range(start, 0, receiverLength); |
211 } | 184 } |
212 checkNull(start); // TODO(ahe): This is not specified but co19 tests it. | 185 if (end < start || end > receiverLength) { |
213 checkNull(length); // TODO(ahe): This is not specified but co19 tests it. | 186 throw new RangeError.range(end, start, receiverLength); |
214 if (start is !int) throw new ArgumentError(start); | |
215 if (length is !int) throw new ArgumentError(length); | |
216 if (length < 0) throw new ArgumentError(length); | |
217 var receiverLength = this.length; | |
218 if (start < 0 || start >= receiverLength) { | |
219 throw new RangeError.value(start); | |
220 } | |
221 if (start + length > receiverLength) { | |
222 throw new RangeError.value(start + length); | |
223 } | 187 } |
224 Arrays.copy(this, | 188 Arrays.copy(this, |
225 start + length, | 189 end, |
226 this, | 190 this, |
227 start, | 191 start, |
228 receiverLength - length - start); | 192 receiverLength - end); |
229 this.length = receiverLength - length; | 193 this.length = receiverLength - (end - start); |
230 } | 194 } |
231 | 195 |
232 void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) { | 196 void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) { |
233 checkMutable(this, 'set range'); | 197 checkMutable(this, 'set range'); |
234 IterableMixinWorkaround.setRangeList(this, start, end, iterable, skipCount); | 198 IterableMixinWorkaround.setRangeList(this, start, end, iterable, skipCount); |
235 } | 199 } |
236 | 200 |
237 bool any(bool f(E element)) => IterableMixinWorkaround.any(this, f); | 201 bool any(bool f(E element)) => IterableMixinWorkaround.any(this, f); |
238 | 202 |
239 bool every(bool f(E element)) => IterableMixinWorkaround.every(this, f); | 203 bool every(bool f(E element)) => IterableMixinWorkaround.every(this, f); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 } | 269 } |
306 } | 270 } |
307 | 271 |
308 /** | 272 /** |
309 * Dummy subclasses that allow the backend to track more precise | 273 * Dummy subclasses that allow the backend to track more precise |
310 * information about arrays through their type. | 274 * information about arrays through their type. |
311 */ | 275 */ |
312 class JSMutableArray extends JSArray {} | 276 class JSMutableArray extends JSArray {} |
313 class JSFixedArray extends JSMutableArray {} | 277 class JSFixedArray extends JSMutableArray {} |
314 class JSExtendableArray extends JSMutableArray {} | 278 class JSExtendableArray extends JSMutableArray {} |
OLD | NEW |