Browse Source

LibJS: Implement Temporal AO BalanceDuration

Shannon Booth 1 năm trước cách đây
mục cha
commit
c4f37c1bfa

+ 18 - 0
Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp

@@ -458,6 +458,24 @@ ThrowCompletionOr<double> calculate_offset_shift(VM& vm, Value relative_to_value
     return offset_after - offset_before;
 }
 
+// 7.5.17 BalanceTimeDuration ( days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, largestUnit ), https://tc39.es/proposal-temporal/#sec-temporal-balancetimeduration
+ThrowCompletionOr<TimeDurationRecord> balance_time_duration(VM& vm, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, StringView largest_unit)
+{
+    // 1. Let balanceResult be BalancePossiblyInfiniteTimeDuration(days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, largestUnit).
+    auto balance_result = balance_possibly_infinite_time_duration(vm, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, largest_unit);
+
+    // 2. If balanceResult is positive overflow or negative overflow, then
+    if (balance_result.has<Overflow>()) {
+        // a. Throw a RangeError exception.
+        return vm.throw_completion<RangeError>(ErrorType::TemporalInvalidDuration);
+    }
+    // 3. Else,
+    else {
+        // a. Return balanceResult.
+        return balance_result.get<TimeDurationRecord>();
+    }
+}
+
 // 7.5.17 TotalDurationNanoseconds ( days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, offsetShift ), https://tc39.es/proposal-temporal/#sec-temporal-totaldurationnanoseconds
 Crypto::SignedBigInteger total_duration_nanoseconds(double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, double offset_shift)
 {

+ 1 - 0
Userland/Libraries/LibJS/Runtime/Temporal/Duration.h

@@ -133,6 +133,7 @@ ThrowCompletionOr<Duration*> create_temporal_duration(VM&, double years, double
 Duration* create_negated_temporal_duration(VM&, Duration const& duration);
 ThrowCompletionOr<double> calculate_offset_shift(VM&, Value relative_to_value, double years, double months, double weeks, double days);
 Crypto::SignedBigInteger total_duration_nanoseconds(double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, double offset_shift);
+ThrowCompletionOr<TimeDurationRecord> balance_time_duration(VM& vm, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, StringView largest_unit);
 ThrowCompletionOr<TimeDurationRecord> balance_duration(VM&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, StringView largest_unit, Object* relative_to = nullptr);
 
 enum class Overflow {