Index: sdk/lib/_internal/compiler/js_lib/native_typed_data.dart |
diff --git a/sdk/lib/_internal/compiler/js_lib/native_typed_data.dart b/sdk/lib/_internal/compiler/js_lib/native_typed_data.dart |
index d134c6db81766fb4a62ebd0f0d3d10207c0f48b9..b09537d11f25cc5755d130e70817189a28fb66aa 100644 |
--- a/sdk/lib/_internal/compiler/js_lib/native_typed_data.dart |
+++ b/sdk/lib/_internal/compiler/js_lib/native_typed_data.dart |
@@ -11,9 +11,8 @@ library dart.typed_data.implementation; |
import 'dart:collection'; |
import 'dart:_internal'; |
import 'dart:_interceptors' show JSIndexable, JSUInt32, JSUInt31; |
-import 'dart:_js_helper' show |
- Creates, JavaScriptIndexingBehavior, JSName, Native, Null, Returns, |
- diagnoseIndexError; |
+import 'dart:_js_helper' |
+show Creates, JavaScriptIndexingBehavior, JSName, Native, Null, Returns; |
import 'dart:_foreign_helper' show JS; |
import 'dart:math' as Math; |
@@ -446,34 +445,35 @@ class NativeTypedData implements TypedData { |
@JSName('BYTES_PER_ELEMENT') |
final int elementSizeInBytes; |
- void _checkIndex(int index, int length) { |
- if (JS('bool', '(# >>> 0) !== #', index, index) || |
- JS('int', '#', index) >= length) { // 'int' guaranteed by above test. |
- throw diagnoseIndexError(this, index); |
- } |
- } |
- |
- void _invalidPosition(int position, int length) { |
- if (position is !int) { |
- throw new ArgumentError.value(position, null, 'Invalid list position'); |
+ void _invalidIndex(int index, int length) { |
+ if (index < 0 || index >= length) { |
+ if (this is List) { |
+ var list = this; // Typed as dynamic to avoid warning. |
+ if (length == list.length) { |
+ throw new RangeError.index(index, this); |
+ } |
+ } |
+ throw new RangeError.range(index, 0, length - 1); |
} else { |
- throw new RangeError.range(position, 0, length); |
+ throw new ArgumentError('Invalid list index $index'); |
} |
} |
- void _checkPosition(int position, int length) { |
- if (JS('bool', '(# >>> 0) !== #', position, position) || |
- JS('int', '#', position) > length) { // 'int' guaranteed by above test. |
- _invalidPosition(position, length); |
+ void _checkIndex(int index, int length) { |
+ if (JS('bool', '(# >>> 0) !== #', index, index) || |
+ JS('int', '#', index) >= length) { // 'int' guaranteed by above test. |
+ _invalidIndex(index, length); |
} |
} |
int _checkSublistArguments(int start, int end, int length) { |
// For `sublist` the [start] and [end] indices are allowed to be equal to |
- // [length]. |
- _checkPosition(start, length); |
+ // [length]. However, [_checkIndex] only allows indices in the range |
+ // 0 .. length - 1. We therefore increment the [length] argument by one |
+ // for the [_checkIndex] checks. |
+ _checkIndex(start, length + 1); |
if (end == null) return length; |
- _checkPosition(end, length); |
+ _checkIndex(end, length + 1); |
if (start > end) throw new RangeError.range(start, 0, end); |
return end; |
} |
@@ -862,8 +862,8 @@ abstract class NativeTypedArray extends NativeTypedData |
void _setRangeFast(int start, int end, |
NativeTypedArray source, int skipCount) { |
int targetLength = this.length; |
- _checkPosition(start, targetLength); |
- _checkPosition(end, targetLength); |
+ _checkIndex(start, targetLength + 1); |
+ _checkIndex(end, targetLength + 1); |
if (start > end) throw new RangeError.range(start, 0, end); |
int count = end - start; |