diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp')
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp new file mode 100644 index 0000000000..3bb99eded6 --- /dev/null +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibJS/Runtime/Date.h> +#include <LibJS/Runtime/GlobalObject.h> +#include <LibJS/Runtime/Temporal/PlainDate.h> +#include <LibJS/Runtime/Temporal/PlainDateTime.h> +#include <LibJS/Runtime/Temporal/PlainTime.h> + +namespace JS::Temporal { + +// 5.5.1 GetEpochFromISOParts ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond ), https://tc39.es/proposal-temporal/#sec-temporal-getepochfromisoparts +BigInt* get_epoch_from_iso_parts(GlobalObject& global_object, i32 year, i32 month, i32 day, i32 hour, i32 minute, i32 second, i32 millisecond, i32 microsecond, i32 nanosecond) +{ + auto& vm = global_object.vm(); + + // 1. Assert: year, month, day, hour, minute, second, millisecond, microsecond, and nanosecond are integers. + + // 2. Assert: ! IsValidISODate(year, month, day) is true. + VERIFY(is_valid_iso_date(year, month, day)); + + // 3. Assert: ! IsValidTime(hour, minute, second, millisecond, microsecond, nanosecond) is true. + VERIFY(is_valid_time(hour, minute, second, millisecond, microsecond, nanosecond)); + + // 4. Let date be ! MakeDay(𝔽(year), 𝔽(month − 1), 𝔽(day)). + auto date = make_day(global_object, Value(year), Value(month - 1), Value(day)); + + // 5. Let time be ! MakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond)). + auto time = make_time(global_object, Value(hour), Value(minute), Value(second), Value(millisecond)); + + // 6. Let ms be ! MakeDate(date, time). + auto ms = make_date(date, time); + + // 7. Assert: ms is finite. + VERIFY(ms.is_finite_number()); + + // 8. Return ℝ(ms) × 10^6 + microsecond × 10^3 + nanosecond. + return js_bigint(vm.heap(), Crypto::SignedBigInteger::create_from(static_cast<i64>(ms.as_double())).multiplied_by(Crypto::UnsignedBigInteger { 1'000'000 }).plus(Crypto::SignedBigInteger::create_from((i64)microsecond * 1000)).plus(Crypto::SignedBigInteger(nanosecond))); +} + +} |