diff options
author | Linus Groh <mail@linusgroh.de> | 2023-01-26 14:15:13 +0000 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2023-01-26 20:20:54 +0000 |
commit | 82ba940646037ee9a0536c1eed7cc151a73b4297 (patch) | |
tree | 15744658f4d8db07f389364ed0f49fffd7d54356 /Userland/Libraries/LibJS/Runtime | |
parent | 654911444e73dfee473aebf5b95b504b9fa752ab (diff) | |
download | serenity-82ba940646037ee9a0536c1eed7cc151a73b4297.zip |
LibJS: Port format_seconds_string_part() to String
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime')
6 files changed, 20 insertions, 19 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp index ee303fcdcd..ace23c744d 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp @@ -824,7 +824,7 @@ ThrowCompletionOr<void> reject_object_with_calendar_or_time_zone(VM& vm, Object& } // 13.21 FormatSecondsStringPart ( second, millisecond, microsecond, nanosecond, precision ), https://tc39.es/proposal-temporal/#sec-temporal-formatsecondsstringpart -DeprecatedString format_seconds_string_part(u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision) +ThrowCompletionOr<String> format_seconds_string_part(VM& vm, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision) { // 1. Assert: second, millisecond, microsecond, and nanosecond are integers. @@ -834,15 +834,15 @@ DeprecatedString format_seconds_string_part(u8 second, u16 millisecond, u16 micr // 2. If precision is "minute", return "". if (precision.has<StringView>() && precision.get<StringView>() == "minute"sv) - return DeprecatedString::empty(); + return String {}; // 3. Let secondsString be the string-concatenation of the code unit 0x003A (COLON) and ToZeroPaddedDecimalString(second, 2). - auto seconds_string = DeprecatedString::formatted(":{:02}", second); + auto seconds_string = TRY_OR_THROW_OOM(vm, String::formatted(":{:02}", second)); // 4. Let fraction be millisecond × 10^6 + microsecond × 10^3 + nanosecond. u32 fraction = millisecond * 1'000'000 + microsecond * 1'000 + nanosecond; - DeprecatedString fraction_string; + String fraction_string; // 5. If precision is "auto", then if (precision.has<StringView>() && precision.get<StringView>() == "auto"sv) { @@ -851,10 +851,11 @@ DeprecatedString format_seconds_string_part(u8 second, u16 millisecond, u16 micr return seconds_string; // b. Set fraction to ToZeroPaddedDecimalString(fraction, 9). - fraction_string = DeprecatedString::formatted("{:09}", fraction); + fraction_string = TRY_OR_THROW_OOM(vm, String::formatted("{:09}", fraction)); // c. Set fraction to the longest possible substring of fraction starting at position 0 and not ending with the code unit 0x0030 (DIGIT ZERO). - fraction_string = fraction_string.trim("0"sv, TrimMode::Right); + // FIXME: Add String::trim() + fraction_string = TRY_OR_THROW_OOM(vm, String::from_utf8(fraction_string.bytes_as_string_view().trim("0"sv, TrimMode::Right))); } // 6. Else, else { @@ -863,14 +864,14 @@ DeprecatedString format_seconds_string_part(u8 second, u16 millisecond, u16 micr return seconds_string; // b. Set fraction to ToZeroPaddedDecimalString(fraction, 9) - fraction_string = DeprecatedString::formatted("{:09}", fraction); + fraction_string = TRY_OR_THROW_OOM(vm, String::formatted("{:09}", fraction)); // c. Set fraction to the substring of fraction from 0 to precision. - fraction_string = fraction_string.substring(0, precision.get<u8>()); + fraction_string = TRY_OR_THROW_OOM(vm, fraction_string.substring_from_byte_offset(0, precision.get<u8>())); } // 7. Return the string-concatenation of secondsString, the code unit 0x002E (FULL STOP), and fraction. - return DeprecatedString::formatted("{}.{}", seconds_string, fraction_string); + return TRY_OR_THROW_OOM(vm, String::formatted("{}.{}", seconds_string, fraction_string)); } // 13.23 GetUnsignedRoundingMode ( roundingMode, isNegative ), https://tc39.es/proposal-temporal/#sec-temporal-getunsignedroundingmode diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h index 40948829ea..b1d312b176 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h @@ -152,7 +152,7 @@ StringView larger_of_two_temporal_units(StringView, StringView); ThrowCompletionOr<Object*> merge_largest_unit_option(VM&, Object const& options, String largest_unit); Optional<u16> maximum_temporal_duration_rounding_increment(StringView unit); ThrowCompletionOr<void> reject_object_with_calendar_or_time_zone(VM&, Object&); -DeprecatedString format_seconds_string_part(u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision); +ThrowCompletionOr<String> format_seconds_string_part(VM&, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision); double sign(double); double sign(Crypto::SignedBigInteger const&); UnsignedRoundingMode get_unsigned_rounding_mode(StringView rounding_mode, bool is_negative); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp index 3b57fe6d3a..7a1c059099 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp @@ -258,7 +258,7 @@ ThrowCompletionOr<DeprecatedString> temporal_date_time_to_string(VM& vm, i32 iso // 6. Let minute be ToZeroPaddedDecimalString(minute, 2). // 7. Let seconds be ! FormatSecondsStringPart(second, millisecond, microsecond, nanosecond, precision). - auto seconds = format_seconds_string_part(second, millisecond, microsecond, nanosecond, precision); + auto seconds = MUST_OR_THROW_OOM(format_seconds_string_part(vm, second, millisecond, microsecond, nanosecond, precision)); // 8. Let calendarString be ? MaybeFormatCalendarAnnotation(calendar, showCalendar). auto calendar_string = TRY(maybe_format_calendar_annotation(vm, calendar, show_calendar)); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp index 8aab78db60..8067a64400 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org> - * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org> + * Copyright (c) 2021-2023, Linus Groh <linusg@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -434,7 +434,7 @@ ThrowCompletionOr<TemporalTimeLikeRecord> to_temporal_time_record(VM& vm, Object } // 4.5.9 TemporalTimeToString ( hour, minute, second, millisecond, microsecond, nanosecond, precision ), https://tc39.es/proposal-temporal/#sec-temporal-temporaltimetostring -DeprecatedString temporal_time_to_string(u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision) +ThrowCompletionOr<DeprecatedString> temporal_time_to_string(VM& vm, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision) { // 1. Assert: hour, minute, second, millisecond, microsecond and nanosecond are integers. @@ -442,7 +442,7 @@ DeprecatedString temporal_time_to_string(u8 hour, u8 minute, u8 second, u16 mill // 3. Let minute be ToZeroPaddedDecimalString(minute, 2). // 4. Let seconds be ! FormatSecondsStringPart(second, millisecond, microsecond, nanosecond, precision). - auto seconds = format_seconds_string_part(second, millisecond, microsecond, nanosecond, precision); + auto seconds = MUST_OR_THROW_OOM(format_seconds_string_part(vm, second, millisecond, microsecond, nanosecond, precision)); // 5. Return the string-concatenation of hour, the code unit 0x003A (COLON), minute, and seconds. return DeprecatedString::formatted("{:02}:{:02}{}", hour, minute, seconds); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h index 6266b56d07..b57769c000 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org> - * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org> + * Copyright (c) 2021-2023, Linus Groh <linusg@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -85,7 +85,7 @@ DaysAndTime balance_time(double hour, double minute, double second, double milli TemporalTime constrain_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond); ThrowCompletionOr<PlainTime*> create_temporal_time(VM&, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, FunctionObject const* new_target = nullptr); ThrowCompletionOr<TemporalTimeLikeRecord> to_temporal_time_record(VM&, Object const& temporal_time_like, ToTemporalTimeRecordCompleteness = ToTemporalTimeRecordCompleteness::Complete); -DeprecatedString temporal_time_to_string(u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision); +ThrowCompletionOr<DeprecatedString> temporal_time_to_string(VM&, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision); i8 compare_temporal_time(u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2); DaysAndTime add_time(u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); DaysAndTime round_time(u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, u64 increment, StringView unit, StringView rounding_mode, Optional<double> day_length_ns = {}); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp index bb492a0b02..7d28371fe3 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp @@ -472,7 +472,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_string) auto round_result = round_time(temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), precision.increment, precision.unit, rounding_mode); // 7. Return ! TemporalTimeToString(roundResult.[[Hour]], roundResult.[[Minute]], roundResult.[[Second]], roundResult.[[Millisecond]], roundResult.[[Microsecond]], roundResult.[[Nanosecond]], precision.[[Precision]]). - auto string = temporal_time_to_string(round_result.hour, round_result.minute, round_result.second, round_result.millisecond, round_result.microsecond, round_result.nanosecond, precision.precision); + auto string = MUST_OR_THROW_OOM(temporal_time_to_string(vm, round_result.hour, round_result.minute, round_result.second, round_result.millisecond, round_result.microsecond, round_result.nanosecond, precision.precision)); return PrimitiveString::create(vm, move(string)); } @@ -484,7 +484,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_locale_string) auto* temporal_time = TRY(typed_this_object(vm)); // 3. Return ! TemporalTimeToString(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], "auto"). - auto string = temporal_time_to_string(temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), "auto"sv); + auto string = MUST_OR_THROW_OOM(temporal_time_to_string(vm, temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), "auto"sv)); return PrimitiveString::create(vm, move(string)); } @@ -496,7 +496,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_json) auto* temporal_time = TRY(typed_this_object(vm)); // 3. Return ! TemporalTimeToString(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], "auto"). - auto string = temporal_time_to_string(temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), "auto"sv); + auto string = MUST_OR_THROW_OOM(temporal_time_to_string(vm, temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), "auto"sv)); return PrimitiveString::create(vm, move(string)); } |