Skip to content

Commit 282ea58

Browse files
mkustermannCommit Queue
authored andcommitted
[dart2wasm] Make json parser use JS parseFloat() directly instead of double.parse()
The `double.parse()` function first runs a regular expression over the string to validate it's a valid string representation of a double. Though the json parser does this kind of validation itself, so we can avoid this regexp match and call the JavaScript `parseFloat()` function directly. Change-Id: Ib2c2c4789d63b75b9a24eac5b5ee2b3483c65327 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410320 Reviewed-by: Ömer Ağacan <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent d3f28d7 commit 282ea58

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

sdk/lib/_internal/wasm/lib/convert_patch.dart

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import "dart:_internal"
88
show patch, POWERS_OF_TEN, unsafeCast, pushWasmArray, popWasmArray;
99
import "dart:_js_string_convert";
1010
import "dart:_js_types";
11-
import "dart:_js_helper" show jsStringToDartString;
11+
import "dart:_js_helper" show JS, jsStringToDartString, jsStringFromDartString;
1212
import "dart:_list"
1313
show GrowableList, WasmListBaseUnsafeExtensions, WasmListBase;
1414
import "dart:_string";
@@ -308,7 +308,7 @@ class _NumberBuffer {
308308
// not only working on strings, but also on char-code lists, without losing
309309
// performance.
310310
num parseNum() => num.parse(getString());
311-
double parseDouble() => double.parse(getString());
311+
double parseDouble() => _jsParseFloat(getString());
312312
}
313313

314314
/**
@@ -719,7 +719,7 @@ mixin _ChunkedJsonParser<T> on _ChunkedJsonParserState {
719719
*/
720720
double parseDouble(int start, int end) {
721721
const int asciiBits = 0x7f; // Double literals are ASCII only.
722-
return double.parse(getString(start, end, asciiBits));
722+
return _jsParseFloat(getString(start, end, asciiBits));
723723
}
724724

725725
/**
@@ -1683,8 +1683,7 @@ class _JsonOneByteStringParser extends _ChunkedJsonParserState
16831683
}
16841684

16851685
double parseDouble(int start, int end) {
1686-
final string = chunk.substringUnchecked(start, end);
1687-
return double.parse(string);
1686+
return _jsParseFloat(chunk.substringUnchecked(start, end));
16881687
}
16891688
}
16901689

@@ -1777,8 +1776,7 @@ class _JsonTwoByteStringParser extends _ChunkedJsonParserState
17771776
}
17781777

17791778
double parseDouble(int start, int end) {
1780-
final string = chunk.substringUnchecked(start, end);
1781-
return double.parse(string);
1779+
return _jsParseFloat(chunk.substringUnchecked(start, end));
17821780
}
17831781
}
17841782

@@ -2044,8 +2042,7 @@ class _JsonUtf8Parser extends _ChunkedJsonParserState
20442042
}
20452043

20462044
double parseDouble(int start, int end) {
2047-
final string = getString(start, end, 0x7f);
2048-
return double.parse(string);
2045+
return _jsParseFloat(getString(start, end, 0x7f));
20492046
}
20502047
}
20512048

@@ -2786,3 +2783,8 @@ WasmArray<WasmI8> _makeI8ArrayFromWasmI8ArrayBase(
27862783
}
27872784
return bytes;
27882785
}
2786+
2787+
double _jsParseFloat(String string) => JS<double>(
2788+
'(s) => parseFloat(s)',
2789+
jsStringFromDartString(string).toExternRef,
2790+
);

0 commit comments

Comments
 (0)