mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 03:55:24 +00:00
LibJS: Use Temporal for the Date constructor and Date.now()
This commit is contained in:
parent
7aee254708
commit
8e8c133db5
Notes:
github-actions[bot]
2024-11-26 21:57:43 +00:00
Author: https://github.com/trflynn89 Commit: https://github.com/LadybirdBrowser/ladybird/commit/8e8c133db56 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2594
3 changed files with 26 additions and 14 deletions
|
@ -2,7 +2,7 @@
|
|||
* Copyright (c) 2020-2023, Linus Groh <linusg@serenityos.org>
|
||||
* Copyright (c) 2020, Nico Weber <thakis@chromium.org>
|
||||
* Copyright (c) 2021, Petróczi Zoltán <petroczizoltan@tutanota.com>
|
||||
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
|
||||
* Copyright (c) 2022-2024, Tim Flynn <trflynn89@ladybird.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
@ -16,10 +16,9 @@
|
|||
#include <LibJS/Runtime/DateConstructor.h>
|
||||
#include <LibJS/Runtime/DatePrototype.h>
|
||||
#include <LibJS/Runtime/GlobalObject.h>
|
||||
#include <LibJS/Runtime/Temporal/Now.h>
|
||||
#include <LibJS/Runtime/VM.h>
|
||||
#include <LibJS/Runtime/ValueInlines.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
namespace JS {
|
||||
|
||||
|
@ -227,17 +226,17 @@ void DateConstructor::initialize(Realm& realm)
|
|||
}
|
||||
|
||||
// 21.4.2.1 Date ( ...values ), https://tc39.es/ecma262/#sec-date
|
||||
// 14.6.1 Date ( ...values ), https://tc39.es/proposal-temporal/#sec-temporal-date
|
||||
ThrowCompletionOr<Value> DateConstructor::call()
|
||||
{
|
||||
// 1. If NewTarget is undefined, then
|
||||
// a. Let now be the time value (UTC) identifying the current time.
|
||||
auto now = AK::UnixDateTime::now().milliseconds_since_epoch();
|
||||
auto& vm = this->vm();
|
||||
|
||||
// b. Return ToDateString(now).
|
||||
return PrimitiveString::create(vm(), to_date_string(now));
|
||||
// 1. If NewTarget is undefined, return ToDateString(SystemUTCEpochMilliseconds()).
|
||||
return PrimitiveString::create(vm, to_date_string(Temporal::system_utc_epoch_milliseconds(vm)));
|
||||
}
|
||||
|
||||
// 21.4.2.1 Date ( ...values ), https://tc39.es/ecma262/#sec-date
|
||||
// 14.6.1 Date ( ...values ), https://tc39.es/proposal-temporal/#sec-temporal-date
|
||||
ThrowCompletionOr<GC::Ref<Object>> DateConstructor::construct(FunctionObject& new_target)
|
||||
{
|
||||
auto& vm = this->vm();
|
||||
|
@ -247,9 +246,8 @@ ThrowCompletionOr<GC::Ref<Object>> DateConstructor::construct(FunctionObject& ne
|
|||
// 2. Let numberOfArgs be the number of elements in values.
|
||||
// 3. If numberOfArgs = 0, then
|
||||
if (vm.argument_count() == 0) {
|
||||
// a. Let dv be the time value (UTC) identifying the current time.
|
||||
auto now = AK::UnixDateTime::now().milliseconds_since_epoch();
|
||||
date_value = static_cast<double>(now);
|
||||
// a. Let dv be SystemUTCEpochMilliseconds().
|
||||
date_value = Temporal::system_utc_epoch_milliseconds(vm);
|
||||
}
|
||||
// 4. Else if numberOfArgs = 1, then
|
||||
else if (vm.argument_count() == 1) {
|
||||
|
@ -333,11 +331,11 @@ ThrowCompletionOr<GC::Ref<Object>> DateConstructor::construct(FunctionObject& ne
|
|||
}
|
||||
|
||||
// 21.4.3.1 Date.now ( ), https://tc39.es/ecma262/#sec-date.now
|
||||
// 14.7.1 Date.now ( ), https://tc39.es/proposal-temporal/#sec-temporal-date.now
|
||||
JS_DEFINE_NATIVE_FUNCTION(DateConstructor::now)
|
||||
{
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, nullptr);
|
||||
return Value(floor(tv.tv_sec * 1000.0 + tv.tv_usec / 1000.0));
|
||||
// 1. Return SystemUTCEpochMilliseconds().
|
||||
return Temporal::system_utc_epoch_milliseconds(vm);
|
||||
}
|
||||
|
||||
// 21.4.3.2 Date.parse ( string ), https://tc39.es/ecma262/#sec-date.parse
|
||||
|
|
|
@ -119,6 +119,19 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_time_iso)
|
|||
return MUST(create_temporal_time(vm, iso_date_time.time));
|
||||
}
|
||||
|
||||
// 2.3.2 SystemUTCEpochMilliseconds ( ), https://tc39.es/proposal-temporal/#sec-temporal-systemutcepochmilliseconds
|
||||
double system_utc_epoch_milliseconds(VM& vm)
|
||||
{
|
||||
// 1. Let global be GetGlobalObject().
|
||||
auto const& global = vm.get_global_object();
|
||||
|
||||
// 2. Let nowNs be HostSystemUTCEpochNanoseconds(global).
|
||||
auto now_ns = vm.host_system_utc_epoch_nanoseconds(global);
|
||||
|
||||
// 3. Return 𝔽(floor(nowNs / 10**6)).
|
||||
return big_floor(now_ns, NANOSECONDS_PER_MILLISECOND).to_double();
|
||||
}
|
||||
|
||||
// 2.3.3 SystemUTCEpochNanoseconds ( ), https://tc39.es/proposal-temporal/#sec-temporal-systemutcepochnanoseconds
|
||||
Crypto::SignedBigInteger system_utc_epoch_nanoseconds(VM& vm)
|
||||
{
|
||||
|
|
|
@ -32,6 +32,7 @@ private:
|
|||
JS_DECLARE_NATIVE_FUNCTION(plain_time_iso);
|
||||
};
|
||||
|
||||
double system_utc_epoch_milliseconds(VM&);
|
||||
Crypto::SignedBigInteger system_utc_epoch_nanoseconds(VM&);
|
||||
ThrowCompletionOr<ISODateTime> system_date_time(VM&, Value temporal_time_zone_like);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue