1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:48:10 +00:00

LibJS: Make parseFloat use the new double parser

This means it no longer is locale dependent and doesn't incorrectly
accept hex floats anymore.
This commit is contained in:
davidot 2022-10-12 02:12:13 +02:00 committed by Linus Groh
parent 29a96b1304
commit 62fc3e50f3
2 changed files with 19 additions and 4 deletions

View file

@ -7,6 +7,7 @@
#include <AK/BuiltinWrappers.h> #include <AK/BuiltinWrappers.h>
#include <AK/CharacterTypes.h> #include <AK/CharacterTypes.h>
#include <AK/FloatingPointStringConversions.h>
#include <AK/Hex.h> #include <AK/Hex.h>
#include <AK/UnicodeUtils.h> #include <AK/UnicodeUtils.h>
#include <AK/Utf16View.h> #include <AK/Utf16View.h>
@ -226,10 +227,21 @@ JS_DEFINE_NATIVE_FUNCTION(GlobalObject::parse_float)
return vm.argument(0); return vm.argument(0);
auto input_string = TRY(vm.argument(0).to_string(vm)); auto input_string = TRY(vm.argument(0).to_string(vm));
auto trimmed_string = MUST(trim_string(vm, js_string(vm, input_string), TrimMode::Left)); auto trimmed_string = MUST(trim_string(vm, js_string(vm, input_string), TrimMode::Left));
for (size_t length = trimmed_string.length(); length > 0; --length) { if (trimmed_string.is_empty())
auto number = MUST(Value(js_string(vm, trimmed_string.substring(0, length))).to_number(vm)); return js_nan();
if (!number.is_nan())
return number; auto result = parse_first_floating_point<double>(trimmed_string.characters(), trimmed_string.characters() + trimmed_string.length());
if (result.parsed_value())
return result.value;
bool starts_with_sign = trimmed_string[0] == '-' || trimmed_string[0] == '+';
auto signless_view = starts_with_sign ? trimmed_string.substring_view(1) : trimmed_string.view();
if (signless_view.starts_with("Infinity"sv, AK::CaseSensitivity::CaseSensitive)) {
// Only an immediate - means we should return negative infinity
if (trimmed_string[0] == '-')
return js_negative_infinity();
return js_infinity();
} }
return js_nan(); return js_nan();
} }

View file

@ -22,6 +22,9 @@ test("parsing strings", () => {
["1.23", 1.23], ["1.23", 1.23],
["0.0123E+2", 1.23], ["0.0123E+2", 1.23],
["1.23e4", 12300], ["1.23e4", 12300],
["0x1.23p5", 0],
["1.23p5", 1.23],
["1.23e42351245", Infinity],
["Infinity", Infinity], ["Infinity", Infinity],
].forEach(test => { ].forEach(test => {
expect(parseFloat(test[0])).toBe(test[1]); expect(parseFloat(test[0])).toBe(test[1]);