diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index 187484cbad..070ea5664b 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -1169,7 +1169,7 @@ Object* create_mapped_arguments_object(VM& vm, FunctionObject& function, Vector< } // 7.1.21 CanonicalNumericIndexString ( argument ), https://tc39.es/ecma262/#sec-canonicalnumericindexstring -CanonicalIndex canonical_numeric_index_string(PropertyKey const& property_key, CanonicalIndexMode mode) +ThrowCompletionOr canonical_numeric_index_string(VM& vm, PropertyKey const& property_key, CanonicalIndexMode mode) { // NOTE: If the property name is a number type (An implementation-defined optimized // property key type), it can be treated as a string property that has already been @@ -1219,11 +1219,10 @@ CanonicalIndex canonical_numeric_index_string(PropertyKey const& property_key, C auto maybe_double = argument.to_double(AK::TrimWhitespace::No); if (!maybe_double.has_value()) return CanonicalIndex(CanonicalIndex::Type::Undefined, 0); - auto double_value = Value(maybe_double.value()); // FIXME: We return 0 instead of n but it might not observable? // 3. If SameValue(! ToString(n), argument) is true, return n. - if (double_value.to_deprecated_string_without_side_effects() == argument) + if (TRY_OR_THROW_OOM(vm, number_to_string(*maybe_double)) == argument.view()) return CanonicalIndex(CanonicalIndex::Type::Numeric, 0); // 4. Return undefined. diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h index 105108c753..90087fc8ec 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h @@ -57,7 +57,7 @@ enum class CanonicalIndexMode { DetectNumericRoundtrip, IgnoreNumericRoundtrip, }; -CanonicalIndex canonical_numeric_index_string(PropertyKey const&, CanonicalIndexMode needs_numeric); +ThrowCompletionOr canonical_numeric_index_string(VM&, PropertyKey const&, CanonicalIndexMode needs_numeric); ThrowCompletionOr get_substitution(VM&, Utf16View const& matched, Utf16View const& str, size_t position, Span captures, Value named_captures, Value replacement); enum class CallerMode { diff --git a/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp b/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp index c423170596..14c9834083 100644 --- a/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp +++ b/Userland/Libraries/LibJS/Runtime/PrimitiveString.cpp @@ -144,7 +144,7 @@ ThrowCompletionOr> PrimitiveString::get(VM& vm, PropertyKey cons return Value(static_cast(length)); } } - auto index = canonical_numeric_index_string(property_key, CanonicalIndexMode::IgnoreNumericRoundtrip); + auto index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm, property_key, CanonicalIndexMode::IgnoreNumericRoundtrip)); if (!index.is_index()) return Optional {}; auto str = TRY(utf16_string_view()); diff --git a/Userland/Libraries/LibJS/Runtime/StringObject.cpp b/Userland/Libraries/LibJS/Runtime/StringObject.cpp index e6e12a1a85..f0ee141ebb 100644 --- a/Userland/Libraries/LibJS/Runtime/StringObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/StringObject.cpp @@ -47,6 +47,8 @@ static ThrowCompletionOr> string_get_own_property(S { VERIFY(property_key.is_valid()); + auto& vm = string.vm(); + // 1. If Type(P) is not String, return undefined. // NOTE: The spec only uses string and symbol keys, and later coerces to numbers - // this is not the case for PropertyKey, so '!property_key.is_string()' would be wrong. @@ -54,7 +56,7 @@ static ThrowCompletionOr> string_get_own_property(S return Optional {}; // 2. Let index be CanonicalNumericIndexString(P). - auto index = canonical_numeric_index_string(property_key, CanonicalIndexMode::IgnoreNumericRoundtrip); + auto index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm, property_key, CanonicalIndexMode::IgnoreNumericRoundtrip)); // 3. If index is undefined, return undefined. // 4. If IsIntegralNumber(index) is false, return undefined. @@ -74,7 +76,7 @@ static ThrowCompletionOr> string_get_own_property(S return Optional {}; // 10. Let resultStr be the String value of length 1, containing one code unit from str, specifically the code unit at index ℝ(index). - auto result_str = PrimitiveString::create(string.vm(), TRY(Utf16String::create(string.vm(), str.substring_view(index.as_index(), 1)))); + auto result_str = PrimitiveString::create(vm, TRY(Utf16String::create(vm, str.substring_view(index.as_index(), 1)))); // 11. Return the PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }. return PropertyDescriptor { diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.h b/Userland/Libraries/LibJS/Runtime/TypedArray.h index 1fe3cd5e37..8f1211fe81 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -191,7 +191,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, then if (!numeric_index.is_undefined()) { // i. Let value be IntegerIndexedElementGet(O, numericIndex). @@ -228,7 +228,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, return IsValidIntegerIndex(O, numericIndex). if (!numeric_index.is_undefined()) return is_valid_integer_index(*this, numeric_index); @@ -251,7 +251,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, then if (!numeric_index.is_undefined()) { // i. If IsValidIntegerIndex(O, numericIndex) is false, return false. @@ -301,7 +301,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, then if (!numeric_index.is_undefined()) { // i. Return IntegerIndexedElementGet(O, numericIndex). @@ -328,7 +328,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, then if (!numeric_index.is_undefined()) { // i. If SameValue(O, Receiver) is true, then @@ -363,7 +363,7 @@ public: // NOTE: This includes an implementation-defined optimization, see note above! if (property_key.is_string() || property_key.is_number()) { // a. Let numericIndex be CanonicalNumericIndexString(P). - auto numeric_index = canonical_numeric_index_string(property_key, CanonicalIndexMode::DetectNumericRoundtrip); + auto numeric_index = MUST_OR_THROW_OOM(canonical_numeric_index_string(vm(), property_key, CanonicalIndexMode::DetectNumericRoundtrip)); // b. If numericIndex is not undefined, then if (!numeric_index.is_undefined()) { // i. If IsValidIntegerIndex(O, numericIndex) is false, return true; else return false.