Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Unified Diff: lib/runtime/dart_sdk.js

Side-by-side diff isn't available for this file because of its large size.
Issue 1950133008: Update number parsing. (Closed) Base URL: https://github.com/dart-lang/dev_compiler@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
Download patch
« no previous file with comments | « no previous file | test/browser/language_tests.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/runtime/dart_sdk.js
diff --git a/lib/runtime/dart_sdk.js b/lib/runtime/dart_sdk.js
index 671d12de31eb509dfbc0f032665efc8548382e12..327328e52e37b80d06c47091fe27bd75d529df61 100644
--- a/lib/runtime/dart_sdk.js
+++ b/lib/runtime/dart_sdk.js
@@ -4566,34 +4566,29 @@ dart_library.library('dart_sdk', null, /* Imports */[
static parse(input, onError) {
if (onError === void 0) onError = null;
let source = input[dartx.trim]();
- core.num._parseError = false;
- let result = core.int.parse(source, {onError: core.num._onParseErrorInt});
- if (!dart.notNull(core.num._parseError)) return result;
- core.num._parseError = false;
- result = core.double.parse(source, core.num._onParseErrorDouble);
- if (!dart.notNull(core.num._parseError)) return result;
+ let result = core.int.parse(source, {onError: core.num._returnIntNull});
+ if (result != null) return result;
+ result = core.double.parse(source, core.num._returnDoubleNull);
+ if (result != null) return result;
if (onError == null) dart.throw(new core.FormatException(input));
return onError(input);
}
- static _onParseErrorInt(_) {
- core.num._parseError = true;
- return 0;
+ static _returnIntNull(_) {
+ return null;
}
- static _onParseErrorDouble(_) {
- core.num._parseError = true;
- return 0.0;
+ static _returnDoubleNull(_) {
+ return null;
}
};
core.num[dart.implements] = () => [core.Comparable$(core.num)];
dart.setSignature(core.num, {
statics: () => ({
parse: [core.num, [core.String], [dart.functionType(core.num, [core.String])]],
- _onParseErrorInt: [core.int, [core.String]],
- _onParseErrorDouble: [core.double, [core.String]]
+ _returnIntNull: [core.int, [core.String]],
+ _returnDoubleNull: [core.double, [core.String]]
}),
- names: ['parse', '_onParseErrorInt', '_onParseErrorDouble']
+ names: ['parse', '_returnIntNull', '_returnDoubleNull']
});
- core.num._parseError = false;
core.int = class int extends core.num {
static fromEnvironment(name, opts) {
let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
@@ -8972,62 +8967,68 @@ dart_library.library('dart_sdk', null, /* Imports */[
}
return hash;
}
- static _throwFormatException(string) {
- dart.throw(new core.FormatException(string));
+ static _parseIntError(source, handleError) {
+ if (handleError == null) dart.throw(new core.FormatException(source));
+ return handleError(source);
}
static parseInt(source, radix, handleError) {
- if (handleError == null) handleError = dart.fn(s => dart.as(_js_helper.Primitives._throwFormatException(s), core.int), core.int, [core.String]);
_js_helper.checkString(source);
- let match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+ let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
+ let match = re.exec(source);
let digitsIndex = 1;
let hexIndex = 2;
let decimalIndex = 3;
let nonDecimalHexIndex = 4;
+ if (match == null) {
+ return _js_helper.Primitives._parseIntError(source, handleError);
+ }
+ let decimalMatch = match[dartx.get](decimalIndex);
if (radix == null) {
- radix = 10;
- if (match != null) {
- if (dart.dindex(match, hexIndex) != null) {
- return parseInt(source, 16);
- }
- if (dart.dindex(match, decimalIndex) != null) {
- return parseInt(source, 10);
- }
- return handleError(source);
+ if (decimalMatch != null) {
+ return parseInt(source, 10);
}
- } else {
- if (!(typeof radix == 'number')) dart.throw(new core.ArgumentError("Radix is not an integer"));
- if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
- dart.throw(new core.RangeError(`Radix ${radix} not in range 2..36`));
+ if (match[dartx.get](hexIndex) != null) {
+ return parseInt(source, 16);
}
- if (match != null) {
- if (radix == 10 && dart.dindex(match, decimalIndex) != null) {
- return parseInt(source, 10);
- }
- if (dart.notNull(radix) < 10 || dart.dindex(match, decimalIndex) == null) {
- let maxCharCode = null;
- if (dart.notNull(radix) <= 10) {
- maxCharCode = 48 + dart.notNull(radix) - 1;
- } else {
- maxCharCode = 97 + dart.notNull(radix) - 10 - 1;
- }
- let digitsPart = dart.as(dart.dindex(match, digitsIndex), core.String);
- for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
- let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](0)) | 32) >>> 0;
- if (dart.notNull(digitsPart[dartx.codeUnitAt](i)) > dart.notNull(maxCharCode)) {
- return handleError(source);
- }
- }
+ return _js_helper.Primitives._parseIntError(source, handleError);
+ }
+ if (!(typeof radix == 'number')) {
+ dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
+ }
+ if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
+ dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
+ }
+ if (radix == 10 && decimalMatch != null) {
+ return parseInt(source, 10);
+ }
+ if (dart.notNull(radix) < 10 || decimalMatch == null) {
+ let maxCharCode = null;
+ if (dart.notNull(radix) <= 10) {
+ maxCharCode = 48 - 1 + dart.notNull(radix);
+ } else {
+ maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
+ }
+ dart.assert(typeof match[dartx.get](digitsIndex) == 'string');
+ let digitsPart = match[digitsIndex];
+ for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
+ let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
+ if (characterCode > dart.notNull(maxCharCode)) {
+ return _js_helper.Primitives._parseIntError(source, handleError);
}
}
}
- if (match == null) return handleError(source);
return parseInt(source, radix);
}
+ static _parseDoubleError(source, handleError) {
+ if (handleError == null) {
+ dart.throw(new core.FormatException('Invalid double', source));
+ }
+ return handleError(source);
+ }
static parseDouble(source, handleError) {
_js_helper.checkString(source);
- if (handleError == null) handleError = dart.fn(s => dart.as(_js_helper.Primitives._throwFormatException(s), core.double), core.double, [core.String]);
if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
- return handleError(source);
+ return _js_helper.Primitives._parseDoubleError(source, handleError);
}
let result = parseFloat(source);
if (dart.notNull(result[dartx.isNaN])) {
@@ -9035,7 +9036,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
return result;
}
- return handleError(source);
+ return _js_helper.Primitives._parseDoubleError(source, handleError);
}
return result;
}
@@ -9237,8 +9238,9 @@ dart_library.library('dart_sdk', null, /* Imports */[
statics: () => ({
initializeStatics: [dart.void, [core.int]],
objectHashCode: [core.int, [dart.dynamic]],
- _throwFormatException: [dart.dynamic, [core.String]],
+ _parseIntError: [core.int, [core.String, dart.functionType(core.int, [core.String])]],
parseInt: [core.int, [core.String, core.int, dart.functionType(core.int, [core.String])]],
+ _parseDoubleError: [core.double, [core.String, dart.functionType(core.double, [core.String])]],
parseDouble: [core.double, [core.String, dart.functionType(core.double, [core.String])]],
objectTypeName: [core.String, [core.Object]],
objectToString: [core.String, [core.Object]],
@@ -9270,7 +9272,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
identicalImplementation: [core.bool, [dart.dynamic, dart.dynamic]],
extractStackTrace: [core.StackTrace, [core.Error]]
}),
- names: ['initializeStatics', 'objectHashCode', '_throwFormatException', 'parseInt', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'identicalImplementation', 'extractStackTrace']
+ names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'identicalImplementation', 'extractStackTrace']
});
_js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
_js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
@@ -24139,7 +24141,7 @@ dart_library.library('dart_sdk', null, /* Imports */[
return new dart.JsIterator(this[dartx.iterator]);
}
}
- List[dart.implements] = () => [core.Iterable$(E)];
+ List[dart.implements] = () => [core.Iterable$(E), _internal.EfficientLength];
dart.setSignature(List, {
constructors: () => ({
new: [core.List$(E), [], [core.int]],
« no previous file with comments | « no previous file | test/browser/language_tests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698