Index: tool/input_sdk/private/js_helper.dart |
diff --git a/tool/input_sdk/private/js_helper.dart b/tool/input_sdk/private/js_helper.dart |
index 7ac7fb46ad1215b3dd2d989b8420fe72a3b187d4..fb930ac1701b40e3e1fbd04d9a96607a4017ad0e 100644 |
--- a/tool/input_sdk/private/js_helper.dart |
+++ b/tool/input_sdk/private/js_helper.dart |
@@ -243,14 +243,14 @@ class Primitives { |
static String stringFromCodePoints(codePoints) { |
List<int> a = <int>[]; |
for (var i in codePoints) { |
- if (i is !int) throw new ArgumentError(i); |
+ if (i is !int) throw argumentErrorValue(i); |
if (i <= 0xffff) { |
a.add(i); |
} else if (i <= 0x10ffff) { |
a.add(0xd800 + ((((i - 0x10000) >> 10) & 0x3ff))); |
a.add(0xdc00 + (i & 0x3ff)); |
} else { |
- throw new ArgumentError(i); |
+ throw argumentErrorValue(i); |
} |
} |
return _fromCharCodeApply(a); |
@@ -258,14 +258,14 @@ class Primitives { |
static String stringFromCharCodes(charCodes) { |
for (var i in charCodes) { |
- if (i is !int) throw new ArgumentError(i); |
- if (i < 0) throw new ArgumentError(i); |
+ if (i is !int) throw argumentErrorValue(i); |
+ if (i < 0) throw argumentErrorValue(i); |
if (i > 0xffff) return stringFromCodePoints(charCodes); |
} |
return _fromCharCodeApply(charCodes); |
} |
- static String stringFromCharCode(charCode) { |
+ static String stringFromCharCode(int charCode) { |
if (0 <= charCode) { |
if (charCode <= 0xffff) { |
return JS('String', 'String.fromCharCode(#)', charCode); |
@@ -430,22 +430,22 @@ class Primitives { |
} |
static valueFromDateString(str) { |
- if (str is !String) throw new ArgumentError(str); |
+ if (str is !String) throw argumentErrorValue(str); |
var value = JS('num', r'Date.parse(#)', str); |
- if (value.isNaN) throw new ArgumentError(str); |
+ if (value.isNaN) throw argumentErrorValue(str); |
return value; |
} |
static getProperty(object, key) { |
if (object == null || object is bool || object is num || object is String) { |
- throw new ArgumentError(object); |
+ throw argumentErrorValue(object); |
} |
return JS('var', '#[#]', object, key); |
} |
static void setProperty(object, key, value) { |
if (object == null || object is bool || object is num || object is String) { |
- throw new ArgumentError(object); |
+ throw argumentErrorValue(object); |
} |
JS('void', '#[#] = #', object, key, value); |
} |
@@ -460,41 +460,79 @@ class Primitives { |
return getTraceFromException(JS('', r'#.$thrownJsError', error)); |
} |
} |
+/** |
+ * Diagnoses an indexing error. Returns the ArgumentError or RangeError that |
+ * describes the problem. |
+ */ |
+@NoInline() |
+Error diagnoseIndexError(indexable, index) { |
+ if (index is !int) return new ArgumentError.value(index, 'index'); |
+ int length = indexable.length; |
+ // The following returns the same error that would be thrown by calling |
+ // [RangeError.checkValidIndex] with no optional parameters provided. |
+ if (index < 0 || index >= length) { |
+ return new RangeError.index(index, indexable, 'index', null, length); |
+ } |
+ // The above should always match, but if it does not, use the following. |
+ return new RangeError.value(index, 'index'); |
+} |
+ |
+/** |
+ * Diagnoses a range error. Returns the ArgumentError or RangeError that |
+ * describes the problem. |
+ */ |
+@NoInline() |
+Error diagnoseRangeError(start, end, length) { |
+ if (start is! int) { |
+ return new ArgumentError.value(start, 'start'); |
+ } |
+ if (start < 0 || start > length) { |
+ return new RangeError.range(start, 0, length, 'start'); |
+ } |
+ if (end != null) { |
+ if (end is! int) { |
+ return new ArgumentError.value(end, 'end'); |
+ } |
+ if (end < start || end > length) { |
+ return new RangeError.range(end, start, length, 'end'); |
+ } |
+ } |
+ // The above should always match, but if it does not, use the following. |
+ return new ArgumentError.value(end, "end"); |
+} |
stringLastIndexOfUnchecked(receiver, element, start) |
=> JS('int', r'#.lastIndexOf(#, #)', receiver, element, start); |
+/// 'factory' for constructing ArgumentError.value to keep the call sites small. |
+@NoInline() |
+ArgumentError argumentErrorValue(object) { |
+ return new ArgumentError.value(object); |
+} |
+ |
checkNull(object) { |
- if (object == null) throw new ArgumentError(null); |
+ if (object == null) throw argumentErrorValue(object); |
return object; |
} |
checkNum(value) { |
- if (value is !num) { |
- throw new ArgumentError(value); |
- } |
+ if (value is !num) throw argumentErrorValue(value); |
return value; |
} |
checkInt(value) { |
- if (value is !int) { |
- throw new ArgumentError(value); |
- } |
+ if (value is !int) throw argumentErrorValue(value); |
return value; |
} |
checkBool(value) { |
- if (value is !bool) { |
- throw new ArgumentError(value); |
- } |
+ if (value is !bool) throw argumentErrorValue(value); |
return value; |
} |
checkString(value) { |
- if (value is !String) { |
- throw new ArgumentError(value); |
- } |
+ if (value is !String) throw argumentErrorValue(value); |
return value; |
} |