diff --git a/Userland/Libraries/LibJS/Console.cpp b/Userland/Libraries/LibJS/Console.cpp index 2d2bfadf79..732cfd4ef5 100644 --- a/Userland/Libraries/LibJS/Console.cpp +++ b/Userland/Libraries/LibJS/Console.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, Emanuele Torre - * Copyright (c) 2020-2021, Linus Groh + * Copyright (c) 2020-2022, Linus Groh * Copyright (c) 2021, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause @@ -454,8 +454,10 @@ ThrowCompletionOr Console::value_vector_to_string(MarkedVector co ThrowCompletionOr Console::format_time_since(Core::ElapsedTimer timer) { + auto& vm = this->vm(); + auto elapsed_ms = timer.elapsed_time().to_milliseconds(); - auto duration = TRY(Temporal::balance_duration(global_object(), 0, 0, 0, 0, elapsed_ms, 0, "0"_sbigint, "year")); + auto duration = TRY(Temporal::balance_duration(vm, 0, 0, 0, 0, elapsed_ms, 0, "0"_sbigint, "year")); auto append = [&](StringBuilder& builder, auto format, auto... number) { if (!builder.is_empty()) diff --git a/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp b/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp index 9a717ff0e2..03ba9700d5 100644 --- a/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/DatePrototype.cpp @@ -1184,7 +1184,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_temporal_instant) ns = js_bigint(vm, ns->big_integer().multiplied_by(Crypto::UnsignedBigInteger { 1'000'000 })); // 3. Return ! CreateTemporalInstant(ns). - return MUST(Temporal::create_temporal_instant(global_object, *ns)); + return MUST(Temporal::create_temporal_instant(vm, *ns)); } // 21.4.4.42 Date.prototype.toTimeString ( ), https://tc39.es/ecma262/#sec-date.prototype.totimestring diff --git a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp index d521709aa8..ce3157c770 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp @@ -569,13 +569,12 @@ Vector best_fit_supported_locales(Vector const& requested_locale ThrowCompletionOr supported_locales(VM& vm, Vector const& requested_locales, Value options) { auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); // 1. Set options to ? CoerceOptionsToObject(options). auto* options_object = TRY(coerce_options_to_object(vm, options)); // 2. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options_object, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options_object, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); Vector supported_locales; diff --git a/Userland/Libraries/LibJS/Runtime/Intl/CollatorConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/CollatorConstructor.cpp index 23e2cc26d9..8f5724a8e7 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/CollatorConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/CollatorConstructor.cpp @@ -27,7 +27,7 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat auto* options = TRY(coerce_options_to_object(vm, options_value)); // 3. Let usage be ? GetOption(options, "usage", "string", « "sort", "search" », "sort"). - auto usage = TRY(get_option(global_object, *options, vm.names.usage, OptionType::String, { "sort"sv, "search"sv }, "sort"sv)); + auto usage = TRY(get_option(vm, *options, vm.names.usage, OptionType::String, { "sort"sv, "search"sv }, "sort"sv)); // 4. Set collator.[[Usage]] to usage. collator.set_usage(usage.as_string().string()); @@ -41,13 +41,13 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat LocaleOptions opt {}; // 8. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 9. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; // 10. Let collation be ? GetOption(options, "collation", "string", undefined, undefined). - auto collation = TRY(get_option(global_object, *options, vm.names.collation, OptionType::String, {}, Empty {})); + auto collation = TRY(get_option(vm, *options, vm.names.collation, OptionType::String, {}, Empty {})); // 11. If collation is not undefined, then if (!collation.is_undefined()) { @@ -60,7 +60,7 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat } // 13. Let numeric be ? GetOption(options, "numeric", "boolean", undefined, undefined). - auto numeric = TRY(get_option(global_object, *options, vm.names.numeric, OptionType::Boolean, {}, Empty {})); + auto numeric = TRY(get_option(vm, *options, vm.names.numeric, OptionType::Boolean, {}, Empty {})); // 14. If numeric is not undefined, then // a. Let numeric be ! ToString(numeric). @@ -70,7 +70,7 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat // 16. Let caseFirst be ? GetOption(options, "caseFirst", "string", « "upper", "lower", "false" », undefined). // 17. Set opt.[[kf]] to caseFirst. - auto case_first = TRY(get_option(global_object, *options, vm.names.caseFirst, OptionType::String, { "upper"sv, "lower"sv, "false"sv }, Empty {})); + auto case_first = TRY(get_option(vm, *options, vm.names.caseFirst, OptionType::String, { "upper"sv, "lower"sv, "false"sv }, Empty {})); if (!case_first.is_undefined()) opt.kf = case_first.as_string().string(); @@ -101,7 +101,7 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat } // 26. Let sensitivity be ? GetOption(options, "sensitivity", "string", « "base", "accent", "case", "variant" », undefined). - auto sensitivity = TRY(get_option(global_object, *options, vm.names.sensitivity, OptionType::String, { "base"sv, "accent"sv, "case"sv, "variant"sv }, Empty {})); + auto sensitivity = TRY(get_option(vm, *options, vm.names.sensitivity, OptionType::String, { "base"sv, "accent"sv, "case"sv, "variant"sv }, Empty {})); // 27. If sensitivity is undefined, then if (sensitivity.is_undefined()) { @@ -123,7 +123,7 @@ static ThrowCompletionOr initialize_collator(VM& vm, Collator& collat collator.set_sensitivity(sensitivity.as_string().string()); // 29. Let ignorePunctuation be ? GetOption(options, "ignorePunctuation", "boolean", undefined, false). - auto ignore_punctuation = TRY(get_option(global_object, *options, vm.names.ignorePunctuation, OptionType::Boolean, {}, false)); + auto ignore_punctuation = TRY(get_option(vm, *options, vm.names.ignorePunctuation, OptionType::Boolean, {}, false)); // 30. Set collator.[[IgnorePunctuation]] to ignorePunctuation. collator.set_ignore_punctuation(ignore_punctuation.as_bool()); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp index 9a44050345..dcd46ff63e 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DateTimeFormatConstructor.cpp @@ -98,13 +98,13 @@ ThrowCompletionOr initialize_date_time_format(VM& vm, DateTimeF LocaleOptions opt {}; // 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); // 5. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; // 6. Let calendar be ? GetOption(options, "calendar", "string", undefined, undefined). - auto calendar = TRY(get_option(global_object, *options, vm.names.calendar, OptionType::String, {}, Empty {})); + auto calendar = TRY(get_option(vm, *options, vm.names.calendar, OptionType::String, {}, Empty {})); // 7. If calendar is not undefined, then if (!calendar.is_undefined()) { @@ -117,7 +117,7 @@ ThrowCompletionOr initialize_date_time_format(VM& vm, DateTimeF } // 9. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). - auto numbering_system = TRY(get_option(global_object, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); + auto numbering_system = TRY(get_option(vm, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); // 10. If numberingSystem is not undefined, then if (!numbering_system.is_undefined()) { @@ -130,10 +130,10 @@ ThrowCompletionOr initialize_date_time_format(VM& vm, DateTimeF } // 12. Let hour12 be ? GetOption(options, "hour12", "boolean", undefined, undefined). - auto hour12 = TRY(get_option(global_object, *options, vm.names.hour12, OptionType::Boolean, {}, Empty {})); + auto hour12 = TRY(get_option(vm, *options, vm.names.hour12, OptionType::Boolean, {}, Empty {})); // 13. Let hourCycle be ? GetOption(options, "hourCycle", "string", « "h11", "h12", "h23", "h24" », undefined). - auto hour_cycle = TRY(get_option(global_object, *options, vm.names.hourCycle, OptionType::String, AK::Array { "h11"sv, "h12"sv, "h23"sv, "h24"sv }, Empty {})); + auto hour_cycle = TRY(get_option(vm, *options, vm.names.hourCycle, OptionType::String, AK::Array { "h11"sv, "h12"sv, "h23"sv, "h24"sv }, Empty {})); // 14. If hour12 is not undefined, then if (!hour12.is_undefined()) { @@ -274,7 +274,7 @@ ThrowCompletionOr initialize_date_time_format(VM& vm, DateTimeF else { // i. Let values be a List whose elements are the strings given in the Values column of the row. // ii. Let value be ? GetOption(options, prop, "string", values, undefined). - auto value = TRY(get_option(global_object, *options, property, OptionType::String, values, Empty {})); + auto value = TRY(get_option(vm, *options, property, OptionType::String, values, Empty {})); // d. Set formatOptions.[[]] to value. if (!value.is_undefined()) { @@ -290,17 +290,17 @@ ThrowCompletionOr initialize_date_time_format(VM& vm, DateTimeF })); // 37. Let matcher be ? GetOption(options, "formatMatcher", "string", « "basic", "best fit" », "best fit"). - matcher = TRY(get_option(global_object, *options, vm.names.formatMatcher, OptionType::String, AK::Array { "basic"sv, "best fit"sv }, "best fit"sv)); + matcher = TRY(get_option(vm, *options, vm.names.formatMatcher, OptionType::String, AK::Array { "basic"sv, "best fit"sv }, "best fit"sv)); // 38. Let dateStyle be ? GetOption(options, "dateStyle", "string", « "full", "long", "medium", "short" », undefined). - auto date_style = TRY(get_option(global_object, *options, vm.names.dateStyle, OptionType::String, AK::Array { "full"sv, "long"sv, "medium"sv, "short"sv }, Empty {})); + auto date_style = TRY(get_option(vm, *options, vm.names.dateStyle, OptionType::String, AK::Array { "full"sv, "long"sv, "medium"sv, "short"sv }, Empty {})); // 39. Set dateTimeFormat.[[DateStyle]] to dateStyle. if (!date_style.is_undefined()) date_time_format.set_date_style(date_style.as_string().string()); // 40. Let timeStyle be ? GetOption(options, "timeStyle", "string", « "full", "long", "medium", "short" », undefined). - auto time_style = TRY(get_option(global_object, *options, vm.names.timeStyle, OptionType::String, AK::Array { "full"sv, "long"sv, "medium"sv, "short"sv }, Empty {})); + auto time_style = TRY(get_option(vm, *options, vm.names.timeStyle, OptionType::String, AK::Array { "full"sv, "long"sv, "medium"sv, "short"sv }, Empty {})); // 41. Set dateTimeFormat.[[TimeStyle]] to timeStyle. if (!time_style.is_undefined()) diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DisplayNamesConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DisplayNamesConstructor.cpp index cbbf0c3426..03d3452431 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DisplayNamesConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DisplayNamesConstructor.cpp @@ -63,7 +63,7 @@ ThrowCompletionOr DisplayNamesConstructor::construct(FunctionObject& ne return vm.throw_completion(ErrorType::IsUndefined, "options"sv); // 5. Set options to ? GetOptionsObject(options). - auto* options = TRY(Temporal::get_options_object(global_object, options_value)); + auto* options = TRY(Temporal::get_options_object(vm, options_value)); // 6. Let opt be a new Record. LocaleOptions opt {}; @@ -71,7 +71,7 @@ ThrowCompletionOr DisplayNamesConstructor::construct(FunctionObject& ne // 7. Let localeData be %DisplayNames%.[[LocaleData]]. // 8. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 9. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; @@ -80,13 +80,13 @@ ThrowCompletionOr DisplayNamesConstructor::construct(FunctionObject& ne auto result = resolve_locale(requested_locales, opt, {}); // 11. Let style be ? GetOption(options, "style", "string", « "narrow", "short", "long" », "long"). - auto style = TRY(get_option(global_object, *options, vm.names.style, OptionType::String, { "narrow"sv, "short"sv, "long"sv }, "long"sv)); + auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "narrow"sv, "short"sv, "long"sv }, "long"sv)); // 12. Set displayNames.[[Style]] to style. display_names->set_style(style.as_string().string()); // 13. Let type be ? GetOption(options, "type", "string", « "language", "region", "script", "currency", "calendar", "dateTimeField" », undefined). - auto type = TRY(get_option(global_object, *options, vm.names.type, OptionType::String, { "language"sv, "region"sv, "script"sv, "currency"sv, "calendar"sv, "dateTimeField"sv }, Empty {})); + auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, { "language"sv, "region"sv, "script"sv, "currency"sv, "calendar"sv, "dateTimeField"sv }, Empty {})); // 14. If type is undefined, throw a TypeError exception. if (type.is_undefined()) @@ -96,7 +96,7 @@ ThrowCompletionOr DisplayNamesConstructor::construct(FunctionObject& ne display_names->set_type(type.as_string().string()); // 16. Let fallback be ? GetOption(options, "fallback", "string", « "code", "none" », "code"). - auto fallback = TRY(get_option(global_object, *options, vm.names.fallback, OptionType::String, { "code"sv, "none"sv }, "code"sv)); + auto fallback = TRY(get_option(vm, *options, vm.names.fallback, OptionType::String, { "code"sv, "none"sv }, "code"sv)); // 17. Set displayNames.[[Fallback]] to fallback. display_names->set_fallback(fallback.as_string().string()); @@ -112,7 +112,7 @@ ThrowCompletionOr DisplayNamesConstructor::construct(FunctionObject& ne // 22. Assert: types is a Record (see 12.4.3). // 23. Let languageDisplay be ? GetOption(options, "languageDisplay", "string", « "dialect", "standard" », "dialect"). - auto language_display = TRY(get_option(global_object, *options, vm.names.languageDisplay, OptionType::String, { "dialect"sv, "standard"sv }, "dialect"sv)); + auto language_display = TRY(get_option(vm, *options, vm.names.languageDisplay, OptionType::String, { "dialect"sv, "standard"sv }, "dialect"sv)); // 24. Let typeFields be types.[[]]. // 25. Assert: typeFields is a Record (see 12.4.3). diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp index 4cea981932..453352520c 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp @@ -133,9 +133,6 @@ StringView DurationFormat::display_to_string(Display display) // 1.1.3 ToDurationRecord ( input ), https://tc39.es/proposal-intl-duration-format/#sec-todurationrecord ThrowCompletionOr to_duration_record(VM& vm, Value input) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. If Type(input) is not Object, throw a TypeError exception. if (!input.is_object()) return vm.throw_completion(ErrorType::NotAnObject, input); @@ -164,7 +161,7 @@ ThrowCompletionOr to_duration_record(VM& vm, Value inp // i. Set any to true. any = true; // ii. Set value to ? ToIntegerWithoutRounding(value). - value_number = TRY(Temporal::to_integer_without_rounding(global_object, value, ErrorType::TemporalInvalidDurationPropertyValueNonIntegral, unit, value)); + value_number = TRY(Temporal::to_integer_without_rounding(vm, value, ErrorType::TemporalInvalidDurationPropertyValueNonIntegral, unit, value)); } // e. Else, else { @@ -242,11 +239,8 @@ bool is_valid_duration_record(Temporal::DurationRecord const& record) // 1.1.6 GetDurationUnitOptions ( unit, options, baseStyle, stylesList, digitalBase, prevStyle ), https://tc39.es/proposal-intl-duration-format/#sec-getdurationunitoptions ThrowCompletionOr get_duration_unit_options(VM& vm, String const& unit, Object const& options, StringView base_style, Span styles_list, StringView digital_base, Optional const& previous_style) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. Let style be ? GetOption(options, unit, "string", stylesList, undefined). - auto style_value = TRY(get_option(global_object, options, unit, OptionType::String, styles_list, Empty {})); + auto style_value = TRY(get_option(vm, options, unit, OptionType::String, styles_list, Empty {})); // 2. Let displayDefault be "always". auto display_default = "always"sv; @@ -276,7 +270,7 @@ ThrowCompletionOr get_duration_unit_options(VM& vm, String auto display_field = String::formatted("{}Display", unit); // 5. Let display be ? GetOption(options, displayField, "string", « "auto", "always" », displayDefault). - auto display = TRY(get_option(global_object, options, display_field, OptionType::String, { "auto"sv, "always"sv }, display_default)); + auto display = TRY(get_option(vm, options, display_field, OptionType::String, { "auto"sv, "always"sv }, display_default)); // 6. If prevStyle is "numeric" or "2-digit", then if (previous_style == "numeric"sv || previous_style == "2-digit"sv) { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormatConstructor.cpp index 995ef3953d..a0457cbb4f 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/DurationFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/DurationFormatConstructor.cpp @@ -56,13 +56,13 @@ ThrowCompletionOr DurationFormatConstructor::construct(FunctionObject& auto requested_locales = TRY(canonicalize_locale_list(vm, locales)); // 4. Let options be ? GetOptionsObject(options). - auto* options = TRY(Temporal::get_options_object(global_object, options_value)); + auto* options = TRY(Temporal::get_options_object(vm, options_value)); // 5. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). - auto numbering_system = TRY(get_option(global_object, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); + auto numbering_system = TRY(get_option(vm, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); // FIXME: Missing spec step - If numberingSystem is not undefined, then if (!numbering_system.is_undefined()) { @@ -90,7 +90,7 @@ ThrowCompletionOr DurationFormatConstructor::construct(FunctionObject& duration_format->set_numbering_system(result.nu.release_value()); // 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow", "digital" », "long"). - auto style = TRY(get_option(global_object, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv, "digital"sv }, "long"sv)); + auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv, "digital"sv }, "long"sv)); // 14. Set durationFormat.[[Style]] to style. duration_format->set_style(style.as_string().string()); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/ListFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/ListFormatConstructor.cpp index abc0c29df7..dcfabc52ab 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/ListFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/ListFormatConstructor.cpp @@ -58,13 +58,13 @@ ThrowCompletionOr ListFormatConstructor::construct(FunctionObject& new_ auto requested_locales = TRY(canonicalize_locale_list(vm, locale_value)); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(Temporal::get_options_object(global_object, options_value)); + auto* options = TRY(Temporal::get_options_object(vm, options_value)); // 5. Let opt be a new Record. LocaleOptions opt {}; // 6. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 7. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; @@ -78,13 +78,13 @@ ThrowCompletionOr ListFormatConstructor::construct(FunctionObject& new_ list_format->set_locale(move(result.locale)); // 11. Let type be ? GetOption(options, "type", "string", « "conjunction", "disjunction", "unit" », "conjunction"). - auto type = TRY(get_option(global_object, *options, vm.names.type, OptionType::String, { "conjunction"sv, "disjunction"sv, "unit"sv }, "conjunction"sv)); + auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, { "conjunction"sv, "disjunction"sv, "unit"sv }, "conjunction"sv)); // 12. Set listFormat.[[Type]] to type. list_format->set_type(type.as_string().string()); // 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow" », "long"). - auto style = TRY(get_option(global_object, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv)); + auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv)); // 14. Set listFormat.[[Style]] to style. list_format->set_style(style.as_string().string()); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp index b7a28b5357..f11afc57d6 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp @@ -28,10 +28,7 @@ struct LocaleAndKeys { // Note: This is not an AO in the spec. This just serves to abstract very similar steps in ApplyOptionsToTag and the Intl.Locale constructor. static ThrowCompletionOr> get_string_option(VM& vm, Object const& options, PropertyKey const& property, Function validator, Span values = {}) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - - auto option = TRY(get_option(global_object, options, property, OptionType::String, values, Empty {})); + auto option = TRY(get_option(vm, options, property, OptionType::String, values, Empty {})); if (option.is_undefined()) return Optional {}; @@ -311,7 +308,7 @@ ThrowCompletionOr LocaleConstructor::construct(FunctionObject& new_targ opt.kf = TRY(get_string_option(vm, *options, vm.names.caseFirst, nullptr, AK::Array { "upper"sv, "lower"sv, "false"sv })); // 23. Let kn be ? GetOption(options, "numeric", "boolean", undefined, undefined). - auto kn = TRY(get_option(global_object, *options, vm.names.numeric, OptionType::Boolean, {}, Empty {})); + auto kn = TRY(get_option(vm, *options, vm.names.numeric, OptionType::Boolean, {}, Empty {})); // 24. If kn is not undefined, set kn to ! ToString(kn). // 25. Set opt.[[kn]] to kn. diff --git a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormatConstructor.cpp index 8d4785b430..4294200fcd 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormatConstructor.cpp @@ -83,9 +83,6 @@ JS_DEFINE_NATIVE_FUNCTION(NumberFormatConstructor::supported_locales_of) // 1.1.2 InitializeNumberFormat ( numberFormat, locales, options ), https://tc39.es/proposal-intl-numberformat-v3/out/numberformat/proposed.html#sec-initializenumberformat ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& number_format, Value locales_value, Value options_value) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. Let requestedLocales be ? CanonicalizeLocaleList(locales). auto requested_locales = TRY(canonicalize_locale_list(vm, locales_value)); @@ -96,13 +93,13 @@ ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& LocaleOptions opt {}; // 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 5. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; // 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). - auto numbering_system = TRY(get_option(global_object, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); + auto numbering_system = TRY(get_option(vm, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); // 7. If numberingSystem is not undefined, then if (!numbering_system.is_undefined()) { @@ -164,7 +161,7 @@ ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& } // 18. Let notation be ? GetOption(options, "notation", "string", « "standard", "scientific", "engineering", "compact" », "standard"). - auto notation = TRY(get_option(global_object, *options, vm.names.notation, OptionType::String, { "standard"sv, "scientific"sv, "engineering"sv, "compact"sv }, "standard"sv)); + auto notation = TRY(get_option(vm, *options, vm.names.notation, OptionType::String, { "standard"sv, "scientific"sv, "engineering"sv, "compact"sv }, "standard"sv)); // 19. Set numberFormat.[[Notation]] to notation. number_format.set_notation(notation.as_string().string()); @@ -193,13 +190,13 @@ ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& number_format.set_rounding_increment(*rounding_increment); // 26. Let trailingZeroDisplay be ? GetOption(options, "trailingZeroDisplay", "string", « "auto", "stripIfInteger" », "auto"). - auto trailing_zero_display = TRY(get_option(global_object, *options, vm.names.trailingZeroDisplay, OptionType::String, { "auto"sv, "stripIfInteger"sv }, "auto"sv)); + auto trailing_zero_display = TRY(get_option(vm, *options, vm.names.trailingZeroDisplay, OptionType::String, { "auto"sv, "stripIfInteger"sv }, "auto"sv)); // 27. Set numberFormat.[[TrailingZeroDisplay]] to trailingZeroDisplay. number_format.set_trailing_zero_display(trailing_zero_display.as_string().string()); // 28. Let compactDisplay be ? GetOption(options, "compactDisplay", "string", « "short", "long" », "short"). - auto compact_display = TRY(get_option(global_object, *options, vm.names.compactDisplay, OptionType::String, { "short"sv, "long"sv }, "short"sv)); + auto compact_display = TRY(get_option(vm, *options, vm.names.compactDisplay, OptionType::String, { "short"sv, "long"sv }, "short"sv)); // 29. Let defaultUseGrouping be "auto". auto default_use_grouping = "auto"sv; @@ -220,13 +217,13 @@ ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& number_format.set_use_grouping(use_grouping); // 33. Let signDisplay be ? GetOption(options, "signDisplay", "string", « "auto", "never", "always", "exceptZero, "negative" », "auto"). - auto sign_display = TRY(get_option(global_object, *options, vm.names.signDisplay, OptionType::String, { "auto"sv, "never"sv, "always"sv, "exceptZero"sv, "negative"sv }, "auto"sv)); + auto sign_display = TRY(get_option(vm, *options, vm.names.signDisplay, OptionType::String, { "auto"sv, "never"sv, "always"sv, "exceptZero"sv, "negative"sv }, "auto"sv)); // 34. Set numberFormat.[[SignDisplay]] to signDisplay. number_format.set_sign_display(sign_display.as_string().string()); // 35. Let roundingMode be ? GetOption(options, "roundingMode", "string", « "ceil", "floor", "expand", "trunc", "halfCeil", "halfFloor", "halfExpand", "halfTrunc", "halfEven" », "halfExpand"). - auto rounding_mode = TRY(get_option(global_object, *options, vm.names.roundingMode, OptionType::String, { "ceil"sv, "floor"sv, "expand"sv, "trunc"sv, "halfCeil"sv, "halfFloor"sv, "halfExpand"sv, "halfTrunc"sv, "halfEven"sv }, "halfExpand"sv)); + auto rounding_mode = TRY(get_option(vm, *options, vm.names.roundingMode, OptionType::String, { "ceil"sv, "floor"sv, "expand"sv, "trunc"sv, "halfCeil"sv, "halfFloor"sv, "halfExpand"sv, "halfTrunc"sv, "halfEven"sv }, "halfExpand"sv)); // 36. Set numberFormat.[[RoundingMode]] to roundingMode. number_format.set_rounding_mode(rounding_mode.as_string().string()); @@ -239,9 +236,6 @@ ThrowCompletionOr initialize_number_format(VM& vm, NumberFormat& // 1.1.1 SetNumberFormatDigitOptions ( intlObj, options, mnfdDefault, mxfdDefault, notation ), https://tc39.es/proposal-intl-numberformat-v3/out/numberformat/proposed.html#sec-setnfdigitoptions ThrowCompletionOr set_number_format_digit_options(VM& vm, NumberFormatBase& intl_object, Object const& options, int default_min_fraction_digits, int default_max_fraction_digits, NumberFormat::Notation notation) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. Let mnid be ? GetNumberOption(options, "minimumIntegerDigits,", 1, 21, 1). auto min_integer_digits = TRY(get_number_option(vm, options, vm.names.minimumIntegerDigits, 1, 21, 1)); @@ -261,7 +255,7 @@ ThrowCompletionOr set_number_format_digit_options(VM& vm, NumberFormatBase intl_object.set_min_integer_digits(*min_integer_digits); // 7. Let roundingPriority be ? GetOption(options, "roundingPriority", "string", « "auto", "morePrecision", "lessPrecision" », "auto"). - auto rounding_priority = TRY(get_option(global_object, options, vm.names.roundingPriority, OptionType::String, { "auto"sv, "morePrecision"sv, "lessPrecision"sv }, "auto"sv)); + auto rounding_priority = TRY(get_option(vm, options, vm.names.roundingPriority, OptionType::String, { "auto"sv, "morePrecision"sv, "lessPrecision"sv }, "auto"sv)); // 8. If mnsd is not undefined or mxsd is not undefined, then // a. Let hasSd be true. @@ -403,20 +397,17 @@ ThrowCompletionOr set_number_format_digit_options(VM& vm, NumberFormatBase // 15.1.4 SetNumberFormatUnitOptions ( intlObj, options ), https://tc39.es/ecma402/#sec-setnumberformatunitoptions ThrowCompletionOr set_number_format_unit_options(VM& vm, NumberFormat& intl_object, Object const& options) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. Assert: Type(intlObj) is Object. // 2. Assert: Type(options) is Object. // 3. Let style be ? GetOption(options, "style", "string", « "decimal", "percent", "currency", "unit" », "decimal"). - auto style = TRY(get_option(global_object, options, vm.names.style, OptionType::String, { "decimal"sv, "percent"sv, "currency"sv, "unit"sv }, "decimal"sv)); + auto style = TRY(get_option(vm, options, vm.names.style, OptionType::String, { "decimal"sv, "percent"sv, "currency"sv, "unit"sv }, "decimal"sv)); // 4. Set intlObj.[[Style]] to style. intl_object.set_style(style.as_string().string()); // 5. Let currency be ? GetOption(options, "currency", "string", undefined, undefined). - auto currency = TRY(get_option(global_object, options, vm.names.currency, OptionType::String, {}, Empty {})); + auto currency = TRY(get_option(vm, options, vm.names.currency, OptionType::String, {}, Empty {})); // 6. If currency is undefined, then if (currency.is_undefined()) { @@ -430,13 +421,13 @@ ThrowCompletionOr set_number_format_unit_options(VM& vm, NumberFormat& int return vm.throw_completion(ErrorType::OptionIsNotValidValue, currency, "currency"sv); // 8. Let currencyDisplay be ? GetOption(options, "currencyDisplay", "string", « "code", "symbol", "narrowSymbol", "name" », "symbol"). - auto currency_display = TRY(get_option(global_object, options, vm.names.currencyDisplay, OptionType::String, { "code"sv, "symbol"sv, "narrowSymbol"sv, "name"sv }, "symbol"sv)); + auto currency_display = TRY(get_option(vm, options, vm.names.currencyDisplay, OptionType::String, { "code"sv, "symbol"sv, "narrowSymbol"sv, "name"sv }, "symbol"sv)); // 9. Let currencySign be ? GetOption(options, "currencySign", "string", « "standard", "accounting" », "standard"). - auto currency_sign = TRY(get_option(global_object, options, vm.names.currencySign, OptionType::String, { "standard"sv, "accounting"sv }, "standard"sv)); + auto currency_sign = TRY(get_option(vm, options, vm.names.currencySign, OptionType::String, { "standard"sv, "accounting"sv }, "standard"sv)); // 10. Let unit be ? GetOption(options, "unit", "string", undefined, undefined). - auto unit = TRY(get_option(global_object, options, vm.names.unit, OptionType::String, {}, Empty {})); + auto unit = TRY(get_option(vm, options, vm.names.unit, OptionType::String, {}, Empty {})); // 11. If unit is undefined, then if (unit.is_undefined()) { @@ -450,7 +441,7 @@ ThrowCompletionOr set_number_format_unit_options(VM& vm, NumberFormat& int return vm.throw_completion(ErrorType::OptionIsNotValidValue, unit, "unit"sv); // 13. Let unitDisplay be ? GetOption(options, "unitDisplay", "string", « "short", "narrow", "long" », "short"). - auto unit_display = TRY(get_option(global_object, options, vm.names.unitDisplay, OptionType::String, { "short"sv, "narrow"sv, "long"sv }, "short"sv)); + auto unit_display = TRY(get_option(vm, options, vm.names.unitDisplay, OptionType::String, { "short"sv, "narrow"sv, "long"sv }, "short"sv)); // 14. If style is "currency", then if (intl_object.style() == NumberFormat::Style::Currency) { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesConstructor.cpp index 0bf55d104e..029e4bcef8 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/PluralRulesConstructor.cpp @@ -76,9 +76,6 @@ JS_DEFINE_NATIVE_FUNCTION(PluralRulesConstructor::supported_locales_of) // 16.1.2 InitializePluralRules ( pluralRules, locales, options ), https://tc39.es/ecma402/#sec-initializepluralrules ThrowCompletionOr initialize_plural_rules(VM& vm, PluralRules& plural_rules, Value locales_value, Value options_value) { - auto& realm = *vm.current_realm(); - auto& global_object = realm.global_object(); - // 1. Let requestedLocales be ? CanonicalizeLocaleList(locales). auto requested_locales = TRY(canonicalize_locale_list(vm, locales_value)); @@ -89,13 +86,13 @@ ThrowCompletionOr initialize_plural_rules(VM& vm, PluralRules& plu LocaleOptions opt {}; // 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); // 5. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; // 6. Let t be ? GetOption(options, "type", "string", « "cardinal", "ordinal" », "cardinal"). - auto type = TRY(get_option(global_object, *options, vm.names.type, OptionType::String, AK::Array { "cardinal"sv, "ordinal"sv }, "cardinal"sv)); + auto type = TRY(get_option(vm, *options, vm.names.type, OptionType::String, AK::Array { "cardinal"sv, "ordinal"sv }, "cardinal"sv)); // 7. Set pluralRules.[[Type]] to t. plural_rules.set_type(type.as_string().string()); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatConstructor.cpp index 701c6f78ab..22e40b3f5f 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/RelativeTimeFormatConstructor.cpp @@ -92,13 +92,13 @@ ThrowCompletionOr initialize_relative_time_format(VM& vm, R LocaleOptions opt {}; // 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, AK::Array { "lookup"sv, "best fit"sv }, "best fit"sv)); // 5. Set opt.[[LocaleMatcher]] to matcher. opt.locale_matcher = matcher; // 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). - auto numbering_system = TRY(get_option(global_object, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); + auto numbering_system = TRY(get_option(vm, *options, vm.names.numberingSystem, OptionType::String, {}, Empty {})); // 7. If numberingSystem is not undefined, then if (!numbering_system.is_undefined()) { @@ -128,13 +128,13 @@ ThrowCompletionOr initialize_relative_time_format(VM& vm, R relative_time_format.set_numbering_system(result.nu.release_value()); // 15. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow" », "long"). - auto style = TRY(get_option(global_object, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv)); + auto style = TRY(get_option(vm, *options, vm.names.style, OptionType::String, { "long"sv, "short"sv, "narrow"sv }, "long"sv)); // 16. Set relativeTimeFormat.[[Style]] to style. relative_time_format.set_style(style.as_string().string()); // 17. Let numeric be ? GetOption(options, "numeric", "string", « "always", "auto" », "always"). - auto numeric = TRY(get_option(global_object, *options, vm.names.numeric, OptionType::String, { "always"sv, "auto"sv }, "always"sv)); + auto numeric = TRY(get_option(vm, *options, vm.names.numeric, OptionType::String, { "always"sv, "auto"sv }, "always"sv)); // 18. Set relativeTimeFormat.[[Numeric]] to numeric. relative_time_format.set_numeric(numeric.as_string().string()); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/SegmenterConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/SegmenterConstructor.cpp index ddc0be47c0..009baa2ef9 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/SegmenterConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/SegmenterConstructor.cpp @@ -58,13 +58,13 @@ ThrowCompletionOr SegmenterConstructor::construct(FunctionObject& new_t auto requested_locales = TRY(canonicalize_locale_list(vm, locales)); // 5. Set options to ? GetOptionsObject(options). - auto* options = TRY(Temporal::get_options_object(global_object, options_value)); + auto* options = TRY(Temporal::get_options_object(vm, options_value)); // 6. Let opt be a new Record. LocaleOptions opt {}; // 7. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). - auto matcher = TRY(get_option(global_object, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); + auto matcher = TRY(get_option(vm, *options, vm.names.localeMatcher, OptionType::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); // 8. Set opt.[[localeMatcher]] to matcher. opt.locale_matcher = matcher; @@ -78,7 +78,7 @@ ThrowCompletionOr SegmenterConstructor::construct(FunctionObject& new_t segmenter->set_locale(move(result.locale)); // 12. Let granularity be ? GetOption(options, "granularity", "string", « "grapheme", "word", "sentence" », "grapheme"). - auto granularity = TRY(get_option(global_object, *options, vm.names.granularity, OptionType::String, { "grapheme"sv, "word"sv, "sentence"sv }, "grapheme"sv)); + auto granularity = TRY(get_option(vm, *options, vm.names.granularity, OptionType::String, { "grapheme"sv, "word"sv, "sentence"sv }, "grapheme"sv)); // 13. Set segmenter.[[SegmenterGranularity]] to granularity. segmenter->set_segmenter_granularity(granularity.as_string().string()); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp index d579d96b5e..a2ed94f5a4 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp @@ -39,16 +39,16 @@ static Optional to_option_type(Value value) } // 13.1 IterableToListOfType ( items, elementTypes ), https://tc39.es/proposal-temporal/#sec-iterabletolistoftype -ThrowCompletionOr> iterable_to_list_of_type(GlobalObject& global_object, Value items, Vector const& element_types) +ThrowCompletionOr> iterable_to_list_of_type(VM& vm, Value items, Vector const& element_types) { - auto& vm = global_object.vm(); - auto& heap = global_object.heap(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let iteratorRecord be ? GetIterator(items, sync). auto iterator_record = TRY(get_iterator(global_object, items, IteratorHint::Sync)); // 2. Let values be a new empty List. - MarkedVector values(heap); + MarkedVector values(vm.heap()); // 3. Let next be true. auto next = true; @@ -79,10 +79,9 @@ ThrowCompletionOr> iterable_to_list_of_type(GlobalObject& gl } // 13.2 GetOptionsObject ( options ), https://tc39.es/proposal-temporal/#sec-getoptionsobject -ThrowCompletionOr get_options_object(GlobalObject& global_object, Value options) +ThrowCompletionOr get_options_object(VM& vm, Value options) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); // 1. If options is undefined, then if (options.is_undefined()) { @@ -101,11 +100,12 @@ ThrowCompletionOr get_options_object(GlobalObject& global_object, Value } // 13.3 GetOption ( options, property, type, values, fallback ), https://tc39.es/proposal-temporal/#sec-getoption -ThrowCompletionOr get_option(GlobalObject& global_object, Object const& options, PropertyKey const& property, OptionType type, Span values, OptionDefault const& default_) +ThrowCompletionOr get_option(VM& vm, Object const& options, PropertyKey const& property, OptionType type, Span values, OptionDefault const& default_) { VERIFY(property.is_string()); - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let value be ? Get(options, property). auto value = TRY(options.get(property)); @@ -161,44 +161,38 @@ ThrowCompletionOr get_option(GlobalObject& global_object, Object const& o } // 13.4 ToTemporalOverflow ( options ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaloverflow -ThrowCompletionOr to_temporal_overflow(GlobalObject& global_object, Object const* options) +ThrowCompletionOr to_temporal_overflow(VM& vm, Object const* options) { - auto& vm = global_object.vm(); - // 1. If options is undefined, return "constrain". if (options == nullptr) return "constrain"sv; // 2. Return ? GetOption(options, "overflow", "string", « "constrain", "reject" », "constrain"). - auto option = TRY(get_option(global_object, *options, vm.names.overflow, OptionType::String, { "constrain"sv, "reject"sv }, "constrain"sv)); + auto option = TRY(get_option(vm, *options, vm.names.overflow, OptionType::String, { "constrain"sv, "reject"sv }, "constrain"sv)); VERIFY(option.is_string()); return option.as_string().string(); } // 13.5 ToTemporalDisambiguation ( options ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaldisambiguation -ThrowCompletionOr to_temporal_disambiguation(GlobalObject& global_object, Object const* options) +ThrowCompletionOr to_temporal_disambiguation(VM& vm, Object const* options) { - auto& vm = global_object.vm(); - // 1. If options is undefined, return "compatible". if (options == nullptr) return "compatible"sv; // 2. Return ? GetOption(options, "disambiguation", "string", « "compatible", "earlier", "later", "reject" », "compatible"). - auto option = TRY(get_option(global_object, *options, vm.names.disambiguation, OptionType::String, { "compatible"sv, "earlier"sv, "later"sv, "reject"sv }, "compatible"sv)); + auto option = TRY(get_option(vm, *options, vm.names.disambiguation, OptionType::String, { "compatible"sv, "earlier"sv, "later"sv, "reject"sv }, "compatible"sv)); VERIFY(option.is_string()); return option.as_string().string(); } // 13.6 ToTemporalRoundingMode ( normalizedOptions, fallback ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalroundingmode -ThrowCompletionOr to_temporal_rounding_mode(GlobalObject& global_object, Object const& normalized_options, String const& fallback) +ThrowCompletionOr to_temporal_rounding_mode(VM& vm, Object const& normalized_options, String const& fallback) { - auto& vm = global_object.vm(); - // 1. Return ? GetOption(normalizedOptions, "roundingMode", "string", « "ceil", "floor", "trunc", "halfExpand" », fallback). - auto option = TRY(get_option(global_object, normalized_options, vm.names.roundingMode, OptionType::String, { "ceil"sv, "floor"sv, "trunc"sv, "halfExpand"sv }, fallback.view())); + auto option = TRY(get_option(vm, normalized_options, vm.names.roundingMode, OptionType::String, { "ceil"sv, "floor"sv, "trunc"sv, "halfExpand"sv }, fallback.view())); VERIFY(option.is_string()); return option.as_string().string(); @@ -220,62 +214,52 @@ StringView negate_temporal_rounding_mode(String const& rounding_mode) } // 13.8 ToTemporalOffset ( options, fallback ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaloffset -ThrowCompletionOr to_temporal_offset(GlobalObject& global_object, Object const* options, String const& fallback) +ThrowCompletionOr to_temporal_offset(VM& vm, Object const* options, String const& fallback) { - auto& vm = global_object.vm(); - // 1. If options is undefined, return fallback. if (options == nullptr) return fallback; // 2. Return ? GetOption(options, "offset", "string", « "prefer", "use", "ignore", "reject" », fallback). - auto option = TRY(get_option(global_object, *options, vm.names.offset, OptionType::String, { "prefer"sv, "use"sv, "ignore"sv, "reject"sv }, fallback.view())); + auto option = TRY(get_option(vm, *options, vm.names.offset, OptionType::String, { "prefer"sv, "use"sv, "ignore"sv, "reject"sv }, fallback.view())); VERIFY(option.is_string()); return option.as_string().string(); } // 13.9 ToShowCalendarOption ( normalizedOptions ), https://tc39.es/proposal-temporal/#sec-temporal-toshowcalendaroption -ThrowCompletionOr to_show_calendar_option(GlobalObject& global_object, Object const& normalized_options) +ThrowCompletionOr to_show_calendar_option(VM& vm, Object const& normalized_options) { - auto& vm = global_object.vm(); - // 1. Return ? GetOption(normalizedOptions, "calendarName", "string", « "auto", "always", "never" », "auto"). - auto option = TRY(get_option(global_object, normalized_options, vm.names.calendarName, OptionType::String, { "auto"sv, "always"sv, "never"sv }, "auto"sv)); + auto option = TRY(get_option(vm, normalized_options, vm.names.calendarName, OptionType::String, { "auto"sv, "always"sv, "never"sv }, "auto"sv)); VERIFY(option.is_string()); return option.as_string().string(); } // 13.10 ToShowTimeZoneNameOption ( normalizedOptions ), https://tc39.es/proposal-temporal/#sec-temporal-toshowtimezonenameoption -ThrowCompletionOr to_show_time_zone_name_option(GlobalObject& global_object, Object const& normalized_options) +ThrowCompletionOr to_show_time_zone_name_option(VM& vm, Object const& normalized_options) { - auto& vm = global_object.vm(); - // 1. Return ? GetOption(normalizedOptions, "timeZoneName", "string, « "auto", "never" », "auto"). - auto option = TRY(get_option(global_object, normalized_options, vm.names.timeZoneName, OptionType::String, { "auto"sv, "never"sv }, "auto"sv)); + auto option = TRY(get_option(vm, normalized_options, vm.names.timeZoneName, OptionType::String, { "auto"sv, "never"sv }, "auto"sv)); VERIFY(option.is_string()); return option.as_string().string(); } // 13.11 ToShowOffsetOption ( normalizedOptions ), https://tc39.es/proposal-temporal/#sec-temporal-toshowoffsetoption -ThrowCompletionOr to_show_offset_option(GlobalObject& global_object, Object const& normalized_options) +ThrowCompletionOr to_show_offset_option(VM& vm, Object const& normalized_options) { - auto& vm = global_object.vm(); - // 1. Return ? GetOption(normalizedOptions, "offset", "string", « "auto", "never" », "auto"). - auto option = TRY(get_option(global_object, normalized_options, vm.names.offset, OptionType::String, { "auto"sv, "never"sv }, "auto"sv)); + auto option = TRY(get_option(vm, normalized_options, vm.names.offset, OptionType::String, { "auto"sv, "never"sv }, "auto"sv)); VERIFY(option.is_string()); return option.as_string().string(); } // 13.12 ToTemporalRoundingIncrement ( normalizedOptions, dividend, inclusive ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalroundingincrement -ThrowCompletionOr to_temporal_rounding_increment(GlobalObject& global_object, Object const& normalized_options, Optional dividend, bool inclusive) +ThrowCompletionOr to_temporal_rounding_increment(VM& vm, Object const& normalized_options, Optional dividend, bool inclusive) { - auto& vm = global_object.vm(); - double maximum; // 1. If dividend is undefined, then if (!dividend.has_value()) { @@ -299,7 +283,7 @@ ThrowCompletionOr to_temporal_rounding_increment(GlobalObject& global_objec } // 5. Let increment be ? GetOption(normalizedOptions, "roundingIncrement", "number", undefined, 1𝔽). - auto increment_value = TRY(get_option(global_object, normalized_options, vm.names.roundingIncrement, OptionType::Number, {}, 1.0)); + auto increment_value = TRY(get_option(vm, normalized_options, vm.names.roundingIncrement, OptionType::Number, {}, 1.0)); VERIFY(increment_value.is_number()); auto increment = increment_value.as_double(); @@ -320,7 +304,7 @@ ThrowCompletionOr to_temporal_rounding_increment(GlobalObject& global_objec } // 13.13 ToTemporalDateTimeRoundingIncrement ( normalizedOptions, smallestUnit ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaldatetimeroundingincrement -ThrowCompletionOr to_temporal_date_time_rounding_increment(GlobalObject& global_object, Object const& normalized_options, StringView smallest_unit) +ThrowCompletionOr to_temporal_date_time_rounding_increment(VM& vm, Object const& normalized_options, StringView smallest_unit) { u16 maximum; @@ -337,16 +321,17 @@ ThrowCompletionOr to_temporal_date_time_rounding_increment(GlobalObject& gl } // 3. Return ? ToTemporalRoundingIncrement(normalizedOptions, maximum, false). - return to_temporal_rounding_increment(global_object, normalized_options, maximum, false); + return to_temporal_rounding_increment(vm, normalized_options, maximum, false); } // 13.14 ToSecondsStringPrecision ( normalizedOptions ), https://tc39.es/proposal-temporal/#sec-temporal-tosecondsstringprecision -ThrowCompletionOr to_seconds_string_precision(GlobalObject& global_object, Object const& normalized_options) +ThrowCompletionOr to_seconds_string_precision(VM& vm, Object const& normalized_options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let smallestUnit be ? GetTemporalUnit(normalizedOptions, "smallestUnit", time, undefined). - auto smallest_unit = TRY(get_temporal_unit(global_object, normalized_options, vm.names.smallestUnit, UnitGroup::Time, Optional {})); + auto smallest_unit = TRY(get_temporal_unit(vm, normalized_options, vm.names.smallestUnit, UnitGroup::Time, Optional {})); // 2. If smallestUnit is "hour", throw a RangeError exception. if (smallest_unit == "hour"sv) @@ -460,10 +445,8 @@ static Vector temporal_units = { }; // 13.15 GetTemporalUnit ( normalizedOptions, key, unitGroup, default [ , extraValues ] ), https://tc39.es/proposal-temporal/#sec-temporal-gettemporalunit -ThrowCompletionOr> get_temporal_unit(GlobalObject& global_object, Object const& normalized_options, PropertyKey const& key, UnitGroup unit_group, TemporalUnitDefault const& default_, Vector const& extra_values) +ThrowCompletionOr> get_temporal_unit(VM& vm, Object const& normalized_options, PropertyKey const& key, UnitGroup unit_group, TemporalUnitDefault const& default_, Vector const& extra_values) { - auto& vm = global_object.vm(); - // 1. Let singularNames be a new empty List. Vector singular_names; @@ -527,7 +510,7 @@ ThrowCompletionOr> get_temporal_unit(GlobalObject& global_objec // 8. NOTE: For each singular Temporal unit name that is contained within allowedValues, the corresponding plural name is also contained within it. // 9. Let value be ? GetOption(normalizedOptions, key, "string", allowedValues, defaultValue). - auto option_value = TRY(get_option(global_object, normalized_options, key, OptionType::String, allowed_values.span(), default_value)); + auto option_value = TRY(get_option(vm, normalized_options, key, OptionType::String, allowed_values.span(), default_value)); // 10. If value is undefined and default is required, throw a RangeError exception. if (option_value.is_undefined() && default_.has()) @@ -550,10 +533,10 @@ ThrowCompletionOr> get_temporal_unit(GlobalObject& global_objec } // 13.16 ToRelativeTemporalObject ( options ), https://tc39.es/proposal-temporal/#sec-temporal-torelativetemporalobject -ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object, Object const& options) +ThrowCompletionOr to_relative_temporal_object(VM& vm, Object const& options) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: Type(options) is Object. @@ -592,17 +575,17 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object auto& plain_date_time = static_cast(value_object); // i. Return ? CreateTemporalDate(value.[[ISOYear]], value.[[ISOMonth]], value.[[ISODay]], 0, 0, 0, 0, 0, 0, value.[[Calendar]]). - return TRY(create_temporal_date(global_object, plain_date_time.iso_year(), plain_date_time.iso_month(), plain_date_time.iso_day(), plain_date_time.calendar())); + return TRY(create_temporal_date(vm, plain_date_time.iso_year(), plain_date_time.iso_month(), plain_date_time.iso_day(), plain_date_time.calendar())); } // c. Let calendar be ? GetTemporalCalendarWithISODefault(value). - calendar = TRY(get_temporal_calendar_with_iso_default(global_object, value_object)); + calendar = TRY(get_temporal_calendar_with_iso_default(vm, value_object)); // d. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); // e. Let fields be ? PrepareTemporalFields(value, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, value_object, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, value_object, field_names, Vector {})); // f. Let dateOptions be OrdinaryObjectCreate(null). auto* date_options = Object::create(realm, nullptr); @@ -611,7 +594,7 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object MUST(date_options->create_data_property_or_throw(vm.names.overflow, js_string(vm, "constrain"sv))); // h. Let result be ? InterpretTemporalDateTimeFields(calendar, fields, dateOptions). - result = TRY(interpret_temporal_date_time_fields(global_object, *calendar, *fields, *date_options)); + result = TRY(interpret_temporal_date_time_fields(vm, *calendar, *fields, *date_options)); // i. Let offsetString be ? Get(value, "offset"). offset_string = TRY(value_object.get(vm.names.offset)); @@ -622,7 +605,7 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object // k. If timeZone is not undefined, then if (!time_zone.is_undefined()) { // i. Set timeZone to ? ToTemporalTimeZone(timeZone). - time_zone = TRY(to_temporal_time_zone(global_object, time_zone)); + time_zone = TRY(to_temporal_time_zone(vm, time_zone)); } // l. If offsetString is undefined, then @@ -637,13 +620,13 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object auto string = TRY(value.to_string(global_object)); // b. Let result be ? ParseTemporalRelativeToString(string). - auto parsed_result = TRY(parse_temporal_relative_to_string(global_object, string)); + auto parsed_result = TRY(parse_temporal_relative_to_string(vm, string)); // NOTE: The ISODateTime struct inside `parsed_result` will be moved into `result` at the end of this path to avoid mismatching names. // Thus, all remaining references to `result` in this path actually refer to `parsed_result`. // c. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). - calendar = TRY(to_temporal_calendar_with_iso_default(global_object, parsed_result.date_time.calendar.has_value() ? js_string(vm, *parsed_result.date_time.calendar) : js_undefined())); + calendar = TRY(to_temporal_calendar_with_iso_default(vm, parsed_result.date_time.calendar.has_value() ? js_string(vm, *parsed_result.date_time.calendar) : js_undefined())); // d. Let offsetString be result.[[TimeZoneOffsetString]]. offset_string = parsed_result.time_zone.offset_string.has_value() ? js_string(vm, *parsed_result.time_zone.offset_string) : js_undefined(); @@ -664,7 +647,7 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object } // ii. Let timeZone be ! CreateTemporalTimeZone(timeZoneName). - time_zone = MUST(create_temporal_time_zone(global_object, *time_zone_name)); + time_zone = MUST(create_temporal_time_zone(vm, *time_zone_name)); } // g. Else, else { @@ -701,7 +684,7 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object auto actual_offset_string = TRY(offset_string.to_string(global_object)); // ii. Let offsetNs be ? ParseTimeZoneOffsetString(offsetString). - offset_ns = TRY(parse_time_zone_offset_string(global_object, actual_offset_string)); + offset_ns = TRY(parse_time_zone_offset_string(vm, actual_offset_string)); } // b. Else, else { @@ -710,14 +693,14 @@ ThrowCompletionOr to_relative_temporal_object(GlobalObject& global_object } // c. Let epochNanoseconds be ? InterpretISODateTimeOffset(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], offsetBehaviour, offsetNs, timeZone, "compatible", "reject", matchBehaviour). - auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, offset_behavior, offset_ns, time_zone, "compatible"sv, "reject"sv, match_behavior)); + auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, offset_behavior, offset_ns, time_zone, "compatible"sv, "reject"sv, match_behavior)); // d. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, time_zone.as_object(), *calendar)); + return MUST(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, time_zone.as_object(), *calendar)); } // 9. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar). - return TRY(create_temporal_date(global_object, result.year, result.month, result.day, *calendar)); + return TRY(create_temporal_date(vm, result.year, result.month, result.day, *calendar)); } // 13.17 LargerOfTwoTemporalUnits ( u1, u2 ), https://tc39.es/proposal-temporal/#sec-temporal-largeroftwotemporalunits @@ -742,10 +725,10 @@ StringView larger_of_two_temporal_units(StringView unit1, StringView unit2) } // 13.18 MergeLargestUnitOption ( options, largestUnit ), https://tc39.es/proposal-temporal/#sec-temporal-mergelargestunitoption -ThrowCompletionOr merge_largest_unit_option(GlobalObject& global_object, Object const& options, String largest_unit) +ThrowCompletionOr merge_largest_unit_option(VM& vm, Object const& options, String largest_unit) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let merged be OrdinaryObjectCreate(null). auto* merged = Object::create(realm, nullptr); @@ -800,10 +783,8 @@ Optional maximum_temporal_duration_rounding_increment(StringView unit) } // 13.20 RejectObjectWithCalendarOrTimeZone ( object ), https://tc39.es/proposal-temporal/#sec-temporal-rejectobjectwithcalendarortimezone -ThrowCompletionOr reject_object_with_calendar_or_time_zone(GlobalObject& global_object, Object& object) +ThrowCompletionOr reject_object_with_calendar_or_time_zone(VM& vm, Object& object) { - auto& vm = global_object.vm(); - // 1. Assert: Type(object) is Object. // 2. If object has an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], [[InitializedTemporalTime]], [[InitializedTemporalYearMonth]], or [[InitializedTemporalZonedDateTime]] internal slot, then @@ -1193,10 +1174,8 @@ Crypto::SignedBigInteger round_number_to_increment_as_if_positive(Crypto::Signed } // 13.28 ParseISODateTime ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parseisodatetime -ThrowCompletionOr parse_iso_date_time(GlobalObject& global_object, ParseResult const& parse_result) +ThrowCompletionOr parse_iso_date_time(VM& vm, ParseResult const& parse_result) { - auto& vm = global_object.vm(); - // 1. Let parseResult be empty. // 2. For each nonterminal goal of « TemporalDateTimeString, TemporalInstantString, TemporalMonthDayString, TemporalTimeString, TemporalYearMonthString, TemporalZonedDateTimeString », do // a. If parseResult is not a Parse Node, set parseResult to ParseText(StringToCodePoints(isoString), goal). @@ -1340,20 +1319,18 @@ ThrowCompletionOr parse_iso_date_time(GlobalObject& global_object, } // 13.29 ParseTemporalInstantString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalinstantstring -ThrowCompletionOr parse_temporal_instant_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_instant_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. If ParseText(StringToCodePoints(isoString), TemporalInstantString) is a List of errors, throw a RangeError exception. auto parse_result = parse_iso8601(Production::TemporalInstantString, iso_string); if (!parse_result.has_value()) return vm.throw_completion(ErrorType::TemporalInvalidInstantString, iso_string); // 2. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); // 3. Let timeZoneResult be ? ParseTemporalTimeZoneString(isoString). - auto time_zone_result = TRY(parse_temporal_time_zone_string(global_object, iso_string)); + auto time_zone_result = TRY(parse_temporal_time_zone_string(vm, iso_string)); // 4. Let offsetString be timeZoneResult.[[OffsetString]]. auto offset_string = time_zone_result.offset_string; @@ -1372,20 +1349,18 @@ ThrowCompletionOr parse_temporal_instant_string(GlobalObject& g } // 13.30 ParseTemporalZonedDateTimeString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalzoneddatetimestring -ThrowCompletionOr parse_temporal_zoned_date_time_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_zoned_date_time_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. If ParseText(StringToCodePoints(isoString), TemporalZonedDateTimeString) is a List of errors, throw a RangeError exception. auto parse_result = parse_iso8601(Production::TemporalZonedDateTimeString, iso_string); if (!parse_result.has_value()) return vm.throw_completion(ErrorType::TemporalInvalidZonedDateTimeString, iso_string); // 2. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); // 3. Let timeZoneResult be ? ParseTemporalTimeZoneString(isoString). - auto time_zone_result = TRY(parse_temporal_time_zone_string(global_object, iso_string)); + auto time_zone_result = TRY(parse_temporal_time_zone_string(vm, iso_string)); // 4. Return the Record { [[Year]]: result.[[Year]], [[Month]]: result.[[Month]], [[Day]]: result.[[Day]], [[Hour]]: result.[[Hour]], [[Minute]]: result.[[Minute]], [[Second]]: result.[[Second]], [[Millisecond]]: result.[[Millisecond]], [[Microsecond]]: result.[[Microsecond]], [[Nanosecond]]: result.[[Nanosecond]], [[Calendar]]: result.[[Calendar]], [[TimeZoneZ]]: timeZoneResult.[[Z]], [[TimeZoneOffsetString]]: timeZoneResult.[[OffsetString]], [[TimeZoneName]]: timeZoneResult.[[Name]] }. // NOTE: This returns the two structs together instead of separated to avoid a copy in ToTemporalZonedDateTime, as the spec tries to put the result of InterpretTemporalDateTimeFields and ParseTemporalZonedDateTimeString into the same `result` variable. @@ -1394,10 +1369,8 @@ ThrowCompletionOr parse_temporal_zoned_date_time_string(G } // 13.31 ParseTemporalCalendarString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalcalendarstring -ThrowCompletionOr parse_temporal_calendar_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_calendar_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalCalendarString). auto parse_result = parse_iso8601(Production::TemporalCalendarString, iso_string); @@ -1419,20 +1392,18 @@ ThrowCompletionOr parse_temporal_calendar_string(GlobalObject& global_ob } // 13.32 ParseTemporalDateString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaldatestring -ThrowCompletionOr parse_temporal_date_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_date_string(VM& vm, String const& iso_string) { // 1. Let parts be ? ParseTemporalDateTimeString(isoString). - auto parts = TRY(parse_temporal_date_time_string(global_object, iso_string)); + auto parts = TRY(parse_temporal_date_time_string(vm, iso_string)); // 2. Return the Record { [[Year]]: parts.[[Year]], [[Month]]: parts.[[Month]], [[Day]]: parts.[[Day]], [[Calendar]]: parts.[[Calendar]] }. return TemporalDate { .year = parts.year, .month = parts.month, .day = parts.day, .calendar = move(parts.calendar) }; } // 13.33 ParseTemporalDateTimeString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaldatetimestring -ThrowCompletionOr parse_temporal_date_time_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_date_time_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalDateTimeString). auto parse_result = parse_iso8601(Production::TemporalDateTimeString, iso_string); @@ -1445,14 +1416,12 @@ ThrowCompletionOr parse_temporal_date_time_string(GlobalObject& glo return vm.throw_completion(ErrorType::TemporalInvalidDateTimeStringUTCDesignator, iso_string); // 4. Return ? ParseISODateTime(isoString). - return parse_iso_date_time(global_object, *parse_result); + return parse_iso_date_time(vm, *parse_result); } // 13.34 ParseTemporalDurationString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaldurationstring -ThrowCompletionOr parse_temporal_duration_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_duration_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let duration be ParseText(StringToCodePoints(isoString), TemporalDurationString). auto parse_result = parse_iso8601(Production::TemporalDurationString, iso_string); @@ -1585,14 +1554,12 @@ ThrowCompletionOr parse_temporal_duration_string(GlobalObject& g } // 20. Return ? CreateDurationRecord(yearsMV × factor, monthsMV × factor, weeksMV × factor, daysMV × factor, hoursMV × factor, floor(minutesMV) × factor, floor(secondsMV) × factor, floor(millisecondsMV) × factor, floor(microsecondsMV) × factor, floor(nanosecondsMV) × factor). - return create_duration_record(global_object, years * factor, months * factor, weeks * factor, days * factor, hours * factor, floor(minutes) * factor, floor(seconds) * factor, floor(milliseconds) * factor, floor(microseconds) * factor, floor(nanoseconds) * factor); + return create_duration_record(vm, years * factor, months * factor, weeks * factor, days * factor, hours * factor, floor(minutes) * factor, floor(seconds) * factor, floor(milliseconds) * factor, floor(microseconds) * factor, floor(nanoseconds) * factor); } // 13.35 ParseTemporalMonthDayString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalmonthdaystring -ThrowCompletionOr parse_temporal_month_day_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_month_day_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalMonthDayString). auto parse_result = parse_iso8601(Production::TemporalMonthDayString, iso_string); @@ -1605,7 +1572,7 @@ ThrowCompletionOr parse_temporal_month_day_string(GlobalObject return vm.throw_completion(ErrorType::TemporalInvalidMonthDayStringUTCDesignator, iso_string); // 4. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); // 5. Let year be result.[[Year]]. Optional year = result.year; @@ -1621,17 +1588,15 @@ ThrowCompletionOr parse_temporal_month_day_string(GlobalObject } // 13.36 ParseTemporalRelativeToString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalrelativetostring -ThrowCompletionOr parse_temporal_relative_to_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_relative_to_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. If ParseText(StringToCodePoints(isoString), TemporalDateTimeString) is a List of errors, throw a RangeError exception. auto parse_result = parse_iso8601(Production::TemporalDateTimeString, iso_string); if (!parse_result.has_value()) return vm.throw_completion(ErrorType::TemporalInvalidDateTimeString, iso_string); // 2. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); bool z; Optional offset_string; @@ -1641,7 +1606,7 @@ ThrowCompletionOr parse_temporal_relative_to_string(Globa parse_result = parse_iso8601(Production::TemporalZonedDateTimeString, iso_string); if (parse_result.has_value()) { // a. Let timeZoneResult be ! ParseTemporalTimeZoneString(isoString). - auto time_zone_result = MUST(parse_temporal_time_zone_string(global_object, iso_string)); + auto time_zone_result = MUST(parse_temporal_time_zone_string(vm, iso_string)); // b. Let z be timeZoneResult.[[Z]]. z = time_zone_result.z; @@ -1666,10 +1631,8 @@ ThrowCompletionOr parse_temporal_relative_to_string(Globa } // 13.37 ParseTemporalTimeString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaltimestring -ThrowCompletionOr parse_temporal_time_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_time_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalTimeString). auto parse_result = parse_iso8601(Production::TemporalTimeString, iso_string); @@ -1682,17 +1645,15 @@ ThrowCompletionOr parse_temporal_time_string(GlobalObject& global_ return vm.throw_completion(ErrorType::TemporalInvalidTimeStringUTCDesignator, iso_string); // 4. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); // 5. Return the Record { [[Hour]]: result.[[Hour]], [[Minute]]: result.[[Minute]], [[Second]]: result.[[Second]], [[Millisecond]]: result.[[Millisecond]], [[Microsecond]]: result.[[Microsecond]], [[Nanosecond]]: result.[[Nanosecond]], [[Calendar]]: result.[[Calendar]] }. return TemporalTime { .hour = result.hour, .minute = result.minute, .second = result.second, .millisecond = result.millisecond, .microsecond = result.microsecond, .nanosecond = result.nanosecond, .calendar = move(result.calendar) }; } // 13.38 ParseTemporalTimeZoneString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaltimezonestring -ThrowCompletionOr parse_temporal_time_zone_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_time_zone_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalTimeZoneString). auto parse_result = parse_iso8601(Production::TemporalTimeZoneString, iso_string); @@ -1728,10 +1689,8 @@ ThrowCompletionOr parse_temporal_time_zone_string(GlobalObject } // 13.39 ParseTemporalYearMonthString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalyearmonthstring -ThrowCompletionOr parse_temporal_year_month_string(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_year_month_string(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalYearMonthString). auto parse_result = parse_iso8601(Production::TemporalYearMonthString, iso_string); @@ -1744,19 +1703,17 @@ ThrowCompletionOr parse_temporal_year_month_string(GlobalObje return vm.throw_completion(ErrorType::TemporalInvalidYearMonthStringUTCDesignator, iso_string); // 4. Let result be ? ParseISODateTime(isoString). - auto result = TRY(parse_iso_date_time(global_object, *parse_result)); + auto result = TRY(parse_iso_date_time(vm, *parse_result)); // 5. Return the Record { [[Year]]: result.[[Year]], [[Month]]: result.[[Month]], [[Day]]: result.[[Day]], [[Calendar]]: result.[[Calendar]] }. return TemporalYearMonth { .year = result.year, .month = result.month, .day = result.day, .calendar = move(result.calendar) }; } // 13.40 ToPositiveInteger ( argument ), https://tc39.es/proposal-temporal/#sec-temporal-topositiveinteger -ThrowCompletionOr to_positive_integer(GlobalObject& global_object, Value argument) +ThrowCompletionOr to_positive_integer(VM& vm, Value argument) { - auto& vm = global_object.vm(); - // 1. Let integer be ? ToIntegerThrowOnInfinity(argument). - auto integer = TRY(to_integer_throw_on_infinity(global_object, argument, ErrorType::TemporalPropertyMustBePositiveInteger)); + auto integer = TRY(to_integer_throw_on_infinity(vm, argument, ErrorType::TemporalPropertyMustBePositiveInteger)); // 2. If integer ≤ 0, then if (integer <= 0) { @@ -1769,10 +1726,10 @@ ThrowCompletionOr to_positive_integer(GlobalObject& global_object, Value } // 13.43 PrepareTemporalFields ( fields, fieldNames, requiredFields ), https://tc39.es/proposal-temporal/#sec-temporal-preparetemporalfields -ThrowCompletionOr prepare_temporal_fields(GlobalObject& global_object, Object const& fields, Vector const& field_names, Variant> const& required_fields) +ThrowCompletionOr prepare_temporal_fields(VM& vm, Object const& fields, Vector const& field_names, Variant> const& required_fields) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let result be OrdinaryObjectCreate(null). auto* result = Object::create(realm, nullptr); @@ -1797,13 +1754,13 @@ ThrowCompletionOr prepare_temporal_fields(GlobalObject& global_object, if (property.is_one_of("year"sv, "hour"sv, "minute"sv, "second"sv, "millisecond"sv, "microsecond"sv, "nanosecond"sv, "eraYear"sv)) { // a. Set value to ? ToIntegerThrowOnInfinity(value). // b. Set value to 𝔽(value). - value = Value(TRY(to_integer_throw_on_infinity(global_object, value, ErrorType::TemporalPropertyMustBeFinite))); + value = Value(TRY(to_integer_throw_on_infinity(vm, value, ErrorType::TemporalPropertyMustBeFinite))); } // 3. Else if Conversion is ToPositiveInteger, then else if (property.is_one_of("month"sv, "day"sv)) { // a. Set value to ? ToPositiveInteger(value). // b. Set value to 𝔽(value). - value = Value(TRY(to_positive_integer(global_object, value))); + value = Value(TRY(to_positive_integer(vm, value))); } // 4. Else, else if (property.is_one_of("monthCode"sv, "offset"sv, "era"sv)) { @@ -1845,15 +1802,13 @@ ThrowCompletionOr prepare_temporal_fields(GlobalObject& global_object, } // 13.44 GetDifferenceSettings ( operation, options, unitGroup, disallowedUnits, fallbackSmallestUnit, smallestLargestDefaultUnit ), https://tc39.es/proposal-temporal/#sec-temporal-getdifferencesettings -ThrowCompletionOr get_difference_settings(GlobalObject& global_object, DifferenceOperation operation, Value options_value, UnitGroup unit_group, Vector const& disallowed_units, TemporalUnitDefault const& fallback_smallest_unit, StringView smallest_largest_default_unit) +ThrowCompletionOr get_difference_settings(VM& vm, DifferenceOperation operation, Value options_value, UnitGroup unit_group, Vector const& disallowed_units, TemporalUnitDefault const& fallback_smallest_unit, StringView smallest_largest_default_unit) { - auto& vm = global_object.vm(); - // 1. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, options_value)); + auto* options = TRY(get_options_object(vm, options_value)); // 2. Let smallestUnit be ? GetTemporalUnit(options, "smallestUnit", unitGroup, fallbackSmallestUnit). - auto smallest_unit = TRY(get_temporal_unit(global_object, *options, vm.names.smallestUnit, unit_group, fallback_smallest_unit)); + auto smallest_unit = TRY(get_temporal_unit(vm, *options, vm.names.smallestUnit, unit_group, fallback_smallest_unit)); // 3. If disallowedUnits contains smallestUnit, throw a RangeError exception. if (disallowed_units.contains_slow(*smallest_unit)) @@ -1863,7 +1818,7 @@ ThrowCompletionOr get_difference_settings(GlobalObject& glob auto default_largest_unit = larger_of_two_temporal_units(smallest_largest_default_unit, *smallest_unit); // 5. Let largestUnit be ? GetTemporalUnit(options, "largestUnit", unitGroup, "auto"). - auto largest_unit = TRY(get_temporal_unit(global_object, *options, vm.names.largestUnit, unit_group, { "auto"sv })); + auto largest_unit = TRY(get_temporal_unit(vm, *options, vm.names.largestUnit, unit_group, { "auto"sv })); // 6. If disallowedUnits contains largestUnit, throw a RangeError exception. if (disallowed_units.contains_slow(*largest_unit)) @@ -1878,7 +1833,7 @@ ThrowCompletionOr get_difference_settings(GlobalObject& glob return vm.throw_completion(ErrorType::TemporalInvalidUnitRange, *smallest_unit, *largest_unit); // 9. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc"sv)); // 10. If operation is since, then if (operation == DifferenceOperation::Since) { @@ -1890,7 +1845,7 @@ ThrowCompletionOr get_difference_settings(GlobalObject& glob auto maximum = maximum_temporal_duration_rounding_increment(*smallest_unit); // 12. Let roundingIncrement be ? ToTemporalRoundingIncrement(options, maximum, false). - auto rounding_increment = TRY(to_temporal_rounding_increment(global_object, *options, Optional { maximum }, false)); + auto rounding_increment = TRY(to_temporal_rounding_increment(vm, *options, Optional { maximum }, false)); // 13. Return the Record { [[SmallestUnit]]: smallestUnit, [[LargestUnit]]: largestUnit, [[RoundingMode]]: roundingMode, [[RoundingIncrement]]: roundingIncrement, [[Options]]: options }. return DifferenceSettings { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h index 4dd247ba54..c174d964c2 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.h @@ -136,26 +136,26 @@ struct GetOptionRequired { }; using OptionDefault = Variant; using TemporalUnitDefault = Variant>; -ThrowCompletionOr> iterable_to_list_of_type(GlobalObject&, Value items, Vector const& element_types); -ThrowCompletionOr get_options_object(GlobalObject&, Value options); -ThrowCompletionOr get_option(GlobalObject&, Object const& options, PropertyKey const& property, OptionType type, Span values, OptionDefault const&); -ThrowCompletionOr to_temporal_overflow(GlobalObject&, Object const* options); -ThrowCompletionOr to_temporal_disambiguation(GlobalObject&, Object const* options); -ThrowCompletionOr to_temporal_rounding_mode(GlobalObject&, Object const& normalized_options, String const& fallback); +ThrowCompletionOr> iterable_to_list_of_type(VM&, Value items, Vector const& element_types); +ThrowCompletionOr get_options_object(VM&, Value options); +ThrowCompletionOr get_option(VM&, Object const& options, PropertyKey const& property, OptionType type, Span values, OptionDefault const&); +ThrowCompletionOr to_temporal_overflow(VM&, Object const* options); +ThrowCompletionOr to_temporal_disambiguation(VM&, Object const* options); +ThrowCompletionOr to_temporal_rounding_mode(VM&, Object const& normalized_options, String const& fallback); StringView negate_temporal_rounding_mode(String const& rounding_mode); -ThrowCompletionOr to_temporal_offset(GlobalObject&, Object const* options, String const& fallback); -ThrowCompletionOr to_show_calendar_option(GlobalObject&, Object const& normalized_options); -ThrowCompletionOr to_show_time_zone_name_option(GlobalObject&, Object const& normalized_options); -ThrowCompletionOr to_show_offset_option(GlobalObject&, Object const& normalized_options); -ThrowCompletionOr to_temporal_rounding_increment(GlobalObject&, Object const& normalized_options, Optional dividend, bool inclusive); -ThrowCompletionOr to_temporal_date_time_rounding_increment(GlobalObject&, Object const& normalized_options, StringView smallest_unit); -ThrowCompletionOr to_seconds_string_precision(GlobalObject&, Object const& normalized_options); -ThrowCompletionOr> get_temporal_unit(GlobalObject&, Object const& normalized_options, PropertyKey const&, UnitGroup, TemporalUnitDefault const& default_, Vector const& extra_values = {}); -ThrowCompletionOr to_relative_temporal_object(GlobalObject&, Object const& options); +ThrowCompletionOr to_temporal_offset(VM&, Object const* options, String const& fallback); +ThrowCompletionOr to_show_calendar_option(VM&, Object const& normalized_options); +ThrowCompletionOr to_show_time_zone_name_option(VM&, Object const& normalized_options); +ThrowCompletionOr to_show_offset_option(VM&, Object const& normalized_options); +ThrowCompletionOr to_temporal_rounding_increment(VM&, Object const& normalized_options, Optional dividend, bool inclusive); +ThrowCompletionOr to_temporal_date_time_rounding_increment(VM&, Object const& normalized_options, StringView smallest_unit); +ThrowCompletionOr to_seconds_string_precision(VM&, Object const& normalized_options); +ThrowCompletionOr> get_temporal_unit(VM&, Object const& normalized_options, PropertyKey const&, UnitGroup, TemporalUnitDefault const& default_, Vector const& extra_values = {}); +ThrowCompletionOr to_relative_temporal_object(VM&, Object const& options); StringView larger_of_two_temporal_units(StringView, StringView); -ThrowCompletionOr merge_largest_unit_option(GlobalObject&, Object const& options, String largest_unit); +ThrowCompletionOr merge_largest_unit_option(VM&, Object const& options, String largest_unit); Optional maximum_temporal_duration_rounding_increment(StringView unit); -ThrowCompletionOr reject_object_with_calendar_or_time_zone(GlobalObject&, Object&); +ThrowCompletionOr reject_object_with_calendar_or_time_zone(VM&, Object&); String format_seconds_string_part(u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant const& precision); double sign(double); double sign(Crypto::SignedBigInteger const&); @@ -165,33 +165,34 @@ Crypto::SignedBigInteger apply_unsigned_rounding_mode(Crypto::SignedDivisionResu double round_number_to_increment(double, u64 increment, StringView rounding_mode); Crypto::SignedBigInteger round_number_to_increment(Crypto::SignedBigInteger const&, u64 increment, StringView rounding_mode); Crypto::SignedBigInteger round_number_to_increment_as_if_positive(Crypto::SignedBigInteger const&, u64 increment, StringView rounding_mode); -ThrowCompletionOr parse_iso_date_time(GlobalObject&, ParseResult const& parse_result); -ThrowCompletionOr parse_temporal_instant_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_zoned_date_time_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_calendar_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_date_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_date_time_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_duration_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_month_day_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_relative_to_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_time_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_time_zone_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr parse_temporal_year_month_string(GlobalObject&, String const& iso_string); -ThrowCompletionOr to_positive_integer(GlobalObject&, Value argument); -ThrowCompletionOr prepare_temporal_fields(GlobalObject&, Object const& fields, Vector const& field_names, Variant> const& required_fields); -ThrowCompletionOr get_difference_settings(GlobalObject&, DifferenceOperation, Value options_value, UnitGroup unit_group, Vector const& disallowed_units, TemporalUnitDefault const& fallback_smallest_unit, StringView smallest_largest_default_unit); +ThrowCompletionOr parse_iso_date_time(VM&, ParseResult const& parse_result); +ThrowCompletionOr parse_temporal_instant_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_zoned_date_time_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_calendar_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_date_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_date_time_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_duration_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_month_day_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_relative_to_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_time_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_time_zone_string(VM&, String const& iso_string); +ThrowCompletionOr parse_temporal_year_month_string(VM&, String const& iso_string); +ThrowCompletionOr to_positive_integer(VM&, Value argument); +ThrowCompletionOr prepare_temporal_fields(VM&, Object const& fields, Vector const& field_names, Variant> const& required_fields); +ThrowCompletionOr get_difference_settings(VM&, DifferenceOperation, Value options_value, UnitGroup unit_group, Vector const& disallowed_units, TemporalUnitDefault const& fallback_smallest_unit, StringView smallest_largest_default_unit); template -ThrowCompletionOr get_option(GlobalObject& global_object, Object const& options, PropertyKey const& property, OptionType type, StringView const (&values)[Size], OptionDefault const& default_) +ThrowCompletionOr get_option(VM& vm, Object const& options, PropertyKey const& property, OptionType type, StringView const (&values)[Size], OptionDefault const& default_) { - return get_option(global_object, options, property, type, Span { values }, default_); + return get_option(vm, options, property, type, Span { values }, default_); } // 13.40 ToIntegerThrowOnInfinity ( argument ), https://tc39.es/proposal-temporal/#sec-temporal-tointegerthrowoninfinity template -ThrowCompletionOr to_integer_throw_on_infinity(GlobalObject& global_object, Value argument, ErrorType error_type, Args... args) +ThrowCompletionOr to_integer_throw_on_infinity(VM& vm, Value argument, ErrorType error_type, Args... args) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let integer be ? ToIntegerOrInfinity(argument). auto integer = TRY(argument.to_integer_or_infinity(global_object)); @@ -208,9 +209,10 @@ ThrowCompletionOr to_integer_throw_on_infinity(GlobalObject& global_obje // 13.41 ToIntegerWithoutRounding ( argument ), https://tc39.es/proposal-temporal/#sec-temporal-tointegerwithoutrounding template -ThrowCompletionOr to_integer_without_rounding(GlobalObject& global_object, Value argument, ErrorType error_type, Args... args) +ThrowCompletionOr to_integer_without_rounding(VM& vm, Value argument, ErrorType error_type, Args... args) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let number be ? ToNumber(argument). auto number = TRY(argument.to_number(global_object)); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp index e1fc4731c1..9bb6b7f872 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp @@ -61,8 +61,11 @@ Span available_calendars() } // 12.2.1 CreateTemporalCalendar ( identifier [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalcalendar -ThrowCompletionOr create_temporal_calendar(GlobalObject& global_object, String const& identifier, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_calendar(VM& vm, String const& identifier, FunctionObject const* new_target) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: IsBuiltinCalendar(identifier) is true. VERIFY(is_builtin_calendar(identifier)); @@ -79,30 +82,28 @@ ThrowCompletionOr create_temporal_calendar(GlobalObject& global_objec } // 12.2.2 GetBuiltinCalendar ( id ), https://tc39.es/proposal-temporal/#sec-temporal-getbuiltincalendar -ThrowCompletionOr get_builtin_calendar(GlobalObject& global_object, String const& identifier) +ThrowCompletionOr get_builtin_calendar(VM& vm, String const& identifier) { - auto& vm = global_object.vm(); - // 1. If IsBuiltinCalendar(id) is false, throw a RangeError exception. if (!is_builtin_calendar(identifier)) return vm.throw_completion(ErrorType::TemporalInvalidCalendarIdentifier, identifier); // 2. Return ! CreateTemporalCalendar(id). - return MUST(create_temporal_calendar(global_object, identifier)); + return MUST(create_temporal_calendar(vm, identifier)); } // 12.2.3 GetISO8601Calendar ( ), https://tc39.es/proposal-temporal/#sec-temporal-getiso8601calendar -Calendar* get_iso8601_calendar(GlobalObject& global_object) +Calendar* get_iso8601_calendar(VM& vm) { // 1. Return ! GetBuiltinCalendar("iso8601"). - return MUST(get_builtin_calendar(global_object, "iso8601")); + return MUST(get_builtin_calendar(vm, "iso8601")); } // 12.2.4 CalendarFields ( calendar, fieldNames ), https://tc39.es/proposal-temporal/#sec-temporal-calendarfields -ThrowCompletionOr> calendar_fields(GlobalObject& global_object, Object& calendar, Vector const& field_names) +ThrowCompletionOr> calendar_fields(VM& vm, Object& calendar, Vector const& field_names) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let fields be ? GetMethod(calendar, "fields"). auto fields = TRY(Value(&calendar).get_method(global_object, vm.names.fields)); @@ -120,7 +121,7 @@ ThrowCompletionOr> calendar_fields(GlobalObject& global_object, O } // 4. Return ? IterableToListOfType(fieldsArray, « String »). - auto list = TRY(iterable_to_list_of_type(global_object, fields_array, { OptionType::String })); + auto list = TRY(iterable_to_list_of_type(vm, fields_array, { OptionType::String })); Vector result; for (auto& value : list) @@ -129,9 +130,10 @@ ThrowCompletionOr> calendar_fields(GlobalObject& global_object, O } // 12.2.5 CalendarMergeFields ( calendar, fields, additionalFields ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmergefields -ThrowCompletionOr calendar_merge_fields(GlobalObject& global_object, Object& calendar, Object& fields, Object& additional_fields) +ThrowCompletionOr calendar_merge_fields(VM& vm, Object& calendar, Object& fields, Object& additional_fields) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let mergeFields be ? GetMethod(calendar, "mergeFields"). auto* merge_fields = TRY(Value(&calendar).get_method(global_object, vm.names.mergeFields)); @@ -139,7 +141,7 @@ ThrowCompletionOr calendar_merge_fields(GlobalObject& global_object, Ob // 2. If mergeFields is undefined, then if (!merge_fields) { // a. Return ? DefaultMergeCalendarFields(fields, additionalFields). - return TRY(default_merge_calendar_fields(global_object, fields, additional_fields)); + return TRY(default_merge_calendar_fields(vm, fields, additional_fields)); } // 3. Let result be ? Call(mergeFields, calendar, « fields, additionalFields »). @@ -154,10 +156,11 @@ ThrowCompletionOr calendar_merge_fields(GlobalObject& global_object, Ob } // 12.2.6 CalendarDateAdd ( calendar, date, duration [ , options [ , dateAdd ] ] ), https://tc39.es/proposal-temporal/#sec-temporal-calendardateadd -ThrowCompletionOr calendar_date_add(GlobalObject& global_object, Object& calendar, Value date, Duration& duration, Object* options, FunctionObject* date_add) +ThrowCompletionOr calendar_date_add(VM& vm, Object& calendar, Value date, Duration& duration, Object* options, FunctionObject* date_add) { // NOTE: `date` is a `Value` because we sometimes need to pass a PlainDate, sometimes a PlainDateTime, and sometimes undefined. - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: Type(calendar) is Object. // 2. If options is not present, set options to undefined. @@ -180,9 +183,10 @@ ThrowCompletionOr calendar_date_add(GlobalObject& global_object, Obj } // 12.2.7 CalendarDateUntil ( calendar, one, two, options [ , dateUntil ] ), https://tc39.es/proposal-temporal/#sec-temporal-calendardateuntil -ThrowCompletionOr calendar_date_until(GlobalObject& global_object, Object& calendar, Value one, Value two, Object& options, FunctionObject* date_until) +ThrowCompletionOr calendar_date_until(VM& vm, Object& calendar, Value one, Value two, Object& options, FunctionObject* date_until) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: Type(calendar) is Object. @@ -203,9 +207,11 @@ ThrowCompletionOr calendar_date_until(GlobalObject& global_object, Ob } // 12.2.8 CalendarYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendaryear -ThrowCompletionOr calendar_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Let result be ? Invoke(calendar, "year", « dateLike »). @@ -216,13 +222,15 @@ ThrowCompletionOr calendar_year(GlobalObject& global_object, Object& cal return vm.throw_completion(ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.undefined.as_string()); // 4. Return ? ToIntegerThrowOnInfinity(result). - return TRY(to_integer_throw_on_infinity(global_object, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.Infinity.as_string())); + return TRY(to_integer_throw_on_infinity(vm, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.Infinity.as_string())); } // 12.2.9 CalendarMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonth -ThrowCompletionOr calendar_month(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_month(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Let result be ? Invoke(calendar, "month", « dateLike »). @@ -233,13 +241,15 @@ ThrowCompletionOr calendar_month(GlobalObject& global_object, Object& ca return vm.throw_completion(ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.month.as_string(), vm.names.undefined.as_string()); // 3. Return ? ToPositiveInteger(result). - return TRY(to_positive_integer(global_object, result)); + return TRY(to_positive_integer(vm, result)); } // 12.2.10 CalendarMonthCode ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthcode -ThrowCompletionOr calendar_month_code(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_month_code(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Let result be ? Invoke(calendar, "monthCode", « dateLike »). @@ -254,9 +264,11 @@ ThrowCompletionOr calendar_month_code(GlobalObject& global_object, Objec } // 12.2.11 CalendarDay ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarday -ThrowCompletionOr calendar_day(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_day(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Let result be ? Invoke(calendar, "day", « dateLike »). @@ -267,13 +279,15 @@ ThrowCompletionOr calendar_day(GlobalObject& global_object, Object& cale return vm.throw_completion(ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.day.as_string(), vm.names.undefined.as_string()); // 3. Return ? ToPositiveInteger(result). - return TRY(to_positive_integer(global_object, result)); + return TRY(to_positive_integer(vm, result)); } // 12.2.12 CalendarDayOfWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofweek -ThrowCompletionOr calendar_day_of_week(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_day_of_week(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "dayOfWeek", « dateLike »). @@ -281,9 +295,11 @@ ThrowCompletionOr calendar_day_of_week(GlobalObject& global_object, Objec } // 12.2.13 CalendarDayOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofyear -ThrowCompletionOr calendar_day_of_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_day_of_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "dayOfYear", « dateLike »). @@ -291,9 +307,11 @@ ThrowCompletionOr calendar_day_of_year(GlobalObject& global_object, Objec } // 12.2.14 CalendarWeekOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarweekofyear -ThrowCompletionOr calendar_week_of_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_week_of_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "weekOfYear", « dateLike »). @@ -301,9 +319,11 @@ ThrowCompletionOr calendar_week_of_year(GlobalObject& global_object, Obje } // 12.2.14 CalendarDaysInWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinweek -ThrowCompletionOr calendar_days_in_week(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_days_in_week(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "daysInWeek", « dateLike »). @@ -311,9 +331,11 @@ ThrowCompletionOr calendar_days_in_week(GlobalObject& global_object, Obje } // 12.2.16 CalendarDaysInMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinmonth -ThrowCompletionOr calendar_days_in_month(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_days_in_month(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "daysInMonth", « dateLike »). @@ -321,9 +343,11 @@ ThrowCompletionOr calendar_days_in_month(GlobalObject& global_object, Obj } // 12.2.17 CalendarDaysInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinyear -ThrowCompletionOr calendar_days_in_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_days_in_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "daysInYear", « dateLike »). @@ -331,9 +355,11 @@ ThrowCompletionOr calendar_days_in_year(GlobalObject& global_object, Obje } // 12.2.18 CalendarMonthsInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthsinyear -ThrowCompletionOr calendar_months_in_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_months_in_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "monthsInYear", « dateLike »). @@ -341,9 +367,11 @@ ThrowCompletionOr calendar_months_in_year(GlobalObject& global_object, Ob } // 12.2.29 CalendarInLeapYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarinleapyear -ThrowCompletionOr calendar_in_leap_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_in_leap_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(calendar) is Object. // 2. Return ? Invoke(calendar, "inLeapYear", « dateLike »). @@ -351,9 +379,10 @@ ThrowCompletionOr calendar_in_leap_year(GlobalObject& global_object, Obje } // 15.6.1.1 CalendarEra ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarera -ThrowCompletionOr calendar_era(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_era(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: Type(calendar) is Object. @@ -369,9 +398,10 @@ ThrowCompletionOr calendar_era(GlobalObject& global_object, Object& calen } // 15.6.1.2 CalendarEraYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarerayear -ThrowCompletionOr calendar_era_year(GlobalObject& global_object, Object& calendar, Object& date_like) +ThrowCompletionOr calendar_era_year(VM& vm, Object& calendar, Object& date_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: Type(calendar) is Object. @@ -380,16 +410,17 @@ ThrowCompletionOr calendar_era_year(GlobalObject& global_object, Object& // 3. If result is not undefined, set result to ? ToIntegerThrowOnInfinity(result). if (!result.is_undefined()) - result = Value(TRY(to_integer_throw_on_infinity(global_object, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.eraYear.as_string(), "Infinity"sv))); + result = Value(TRY(to_integer_throw_on_infinity(vm, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.eraYear.as_string(), "Infinity"sv))); // 4. Return result. return result; } // 12.2.20 ToTemporalCalendar ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendar -ThrowCompletionOr to_temporal_calendar(GlobalObject& global_object, Value temporal_calendar_like) +ThrowCompletionOr to_temporal_calendar(VM& vm, Value temporal_calendar_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If Type(temporalCalendarLike) is Object, then if (temporal_calendar_like.is_object()) { @@ -427,7 +458,7 @@ ThrowCompletionOr to_temporal_calendar(GlobalObject& global_object, Val // 3. If IsBuiltinCalendar(identifier) is false, then if (!is_builtin_calendar(identifier)) { // a. Set identifier to ? ParseTemporalCalendarString(identifier). - identifier = TRY(parse_temporal_calendar_string(global_object, identifier)); + identifier = TRY(parse_temporal_calendar_string(vm, identifier)); // b. If IsBuiltinCalendar(identifier) is false, throw a RangeError exception. if (!is_builtin_calendar(identifier)) @@ -435,26 +466,24 @@ ThrowCompletionOr to_temporal_calendar(GlobalObject& global_object, Val } // 4. Return ! CreateTemporalCalendar(identifier). - return MUST(create_temporal_calendar(global_object, identifier)); + return MUST(create_temporal_calendar(vm, identifier)); } // 12.2.21 ToTemporalCalendarWithISODefault ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendarwithisodefault -ThrowCompletionOr to_temporal_calendar_with_iso_default(GlobalObject& global_object, Value temporal_calendar_like) +ThrowCompletionOr to_temporal_calendar_with_iso_default(VM& vm, Value temporal_calendar_like) { // 1. If temporalCalendarLike is undefined, then if (temporal_calendar_like.is_undefined()) { // a. Return ! GetISO8601Calendar(). - return get_iso8601_calendar(global_object); + return get_iso8601_calendar(vm); } // 2. Return ? ToTemporalCalendar(temporalCalendarLike). - return to_temporal_calendar(global_object, temporal_calendar_like); + return to_temporal_calendar(vm, temporal_calendar_like); } // 12.2.22 GetTemporalCalendarWithISODefault ( item ), https://tc39.es/proposal-temporal/#sec-temporal-gettemporalcalendarwithisodefault -ThrowCompletionOr get_temporal_calendar_with_iso_default(GlobalObject& global_object, Object& item) +ThrowCompletionOr get_temporal_calendar_with_iso_default(VM& vm, Object& item) { - auto& vm = global_object.vm(); - // 1. If item has an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], [[InitializedTemporalTime]], [[InitializedTemporalYearMonth]], or [[InitializedTemporalZonedDateTime]] internal slot, then // a. Return item.[[Calendar]]. if (is(item)) @@ -474,13 +503,14 @@ ThrowCompletionOr get_temporal_calendar_with_iso_default(GlobalObject& auto calendar_like = TRY(item.get(vm.names.calendar)); // 3. Return ? ToTemporalCalendarWithISODefault(calendarLike). - return to_temporal_calendar_with_iso_default(global_object, calendar_like); + return to_temporal_calendar_with_iso_default(vm, calendar_like); } // 12.2.23 CalendarDateFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-calendardatefromfields -ThrowCompletionOr calendar_date_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options) +ThrowCompletionOr calendar_date_from_fields(VM& vm, Object& calendar, Object const& fields, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. @@ -497,9 +527,10 @@ ThrowCompletionOr calendar_date_from_fields(GlobalObject& global_obj } // 12.2.24 CalendarYearMonthFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-calendaryearmonthfromfields -ThrowCompletionOr calendar_year_month_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options) +ThrowCompletionOr calendar_year_month_from_fields(VM& vm, Object& calendar, Object const& fields, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. @@ -516,9 +547,10 @@ ThrowCompletionOr calendar_year_month_from_fields(GlobalObject& } // 12.2.25 CalendarMonthDayFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthdayfromfields -ThrowCompletionOr calendar_month_day_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options) +ThrowCompletionOr calendar_month_day_from_fields(VM& vm, Object& calendar, Object const& fields, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. @@ -553,8 +585,11 @@ String format_calendar_annotation(StringView id, StringView show_calendar) } // 12.2.27 CalendarEquals ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-calendarequals -ThrowCompletionOr calendar_equals(GlobalObject& global_object, Object& one, Object& two) +ThrowCompletionOr calendar_equals(VM& vm, Object& one, Object& two) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If one and two are the same Object value, return true. if (&one == &two) return true; @@ -574,9 +609,11 @@ ThrowCompletionOr calendar_equals(GlobalObject& global_object, Object& one } // 12.2.28 ConsolidateCalendars ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-consolidatecalendars -ThrowCompletionOr consolidate_calendars(GlobalObject& global_object, Object& one, Object& two) +ThrowCompletionOr consolidate_calendars(VM& vm, Object& one, Object& two) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If one and two are the same Object value, return two. if (&one == &two) return &two; @@ -667,9 +704,10 @@ String build_iso_month_code(u8 month) } // 12.2.32 ResolveISOMonth ( fields ), https://tc39.es/proposal-temporal/#sec-temporal-resolveisomonth -ThrowCompletionOr resolve_iso_month(GlobalObject& global_object, Object const& fields) +ThrowCompletionOr resolve_iso_month(VM& vm, Object const& fields) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: fields is an ordinary object with no more and no less than the own data properties listed in Table 13. @@ -730,17 +768,15 @@ ThrowCompletionOr resolve_iso_month(GlobalObject& global_object, Object } // 12.2.33 ISODateFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isodatefromfields -ThrowCompletionOr iso_date_from_fields(GlobalObject& global_object, Object const& fields, Object const& options) +ThrowCompletionOr iso_date_from_fields(VM& vm, Object const& fields, Object const& options) { - auto& vm = global_object.vm(); - // 1. Assert: Type(fields) is Object. // 2. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, &options)); + auto overflow = TRY(to_temporal_overflow(vm, &options)); // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », « "year", "day" »). - auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "day", "month", "monthCode", "year" }, Vector { "year"sv, "day"sv })); + auto* prepared_fields = TRY(prepare_temporal_fields(vm, fields, { "day", "month", "monthCode", "year" }, Vector { "year"sv, "day"sv })); // 4. Let year be ! Get(fields, "year"). auto year = MUST(prepared_fields->get(vm.names.year)); @@ -749,7 +785,7 @@ ThrowCompletionOr iso_date_from_fields(GlobalObject& global_objec VERIFY(year.is_number()); // 6. Let month be ? ResolveISOMonth(fields). - auto month = TRY(resolve_iso_month(global_object, *prepared_fields)); + auto month = TRY(resolve_iso_month(vm, *prepared_fields)); // 7. Let day be ! Get(fields, "day"). auto day = MUST(prepared_fields->get(vm.names.day)); @@ -758,21 +794,19 @@ ThrowCompletionOr iso_date_from_fields(GlobalObject& global_objec VERIFY(day.is_number()); // 9. Return ? RegulateISODate(ℝ(year), month, ℝ(day), overflow). - return regulate_iso_date(global_object, year.as_double(), month, day.as_double(), overflow); + return regulate_iso_date(vm, year.as_double(), month, day.as_double(), overflow); } // 12.2.34 ISOYearMonthFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isoyearmonthfromfields -ThrowCompletionOr iso_year_month_from_fields(GlobalObject& global_object, Object const& fields, Object const& options) +ThrowCompletionOr iso_year_month_from_fields(VM& vm, Object const& fields, Object const& options) { - auto& vm = global_object.vm(); - // 1. Assert: Type(fields) is Object. // 2. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, &options)); + auto overflow = TRY(to_temporal_overflow(vm, &options)); // 3. Set fields to ? PrepareTemporalFields(fields, « "month", "monthCode", "year" », « "year" »). - auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "month"sv, "monthCode"sv, "year"sv }, Vector { "year"sv })); + auto* prepared_fields = TRY(prepare_temporal_fields(vm, fields, { "month"sv, "monthCode"sv, "year"sv }, Vector { "year"sv })); // 4. Let year be ! Get(fields, "year"). auto year = MUST(prepared_fields->get(vm.names.year)); @@ -781,27 +815,25 @@ ThrowCompletionOr iso_year_month_from_fields(GlobalObject& global_ VERIFY(year.is_number()); // 6. Let month be ? ResolveISOMonth(fields). - auto month = TRY(resolve_iso_month(global_object, *prepared_fields)); + auto month = TRY(resolve_iso_month(vm, *prepared_fields)); // 7. Let result be ? RegulateISOYearMonth(ℝ(year), month, overflow). - auto result = TRY(regulate_iso_year_month(global_object, year.as_double(), month, overflow)); + auto result = TRY(regulate_iso_year_month(vm, year.as_double(), month, overflow)); // 8. Return the Record { [[Year]]: result.[[Year]], [[Month]]: result.[[Month]], [[ReferenceISODay]]: 1 }. return ISOYearMonth { .year = result.year, .month = result.month, .reference_iso_day = 1 }; } // 12.2.35 ISOMonthDayFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isomonthdayfromfields -ThrowCompletionOr iso_month_day_from_fields(GlobalObject& global_object, Object const& fields, Object const& options) +ThrowCompletionOr iso_month_day_from_fields(VM& vm, Object const& fields, Object const& options) { - auto& vm = global_object.vm(); - // 1. Assert: Type(fields) is Object. // 2. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, &options)); + auto overflow = TRY(to_temporal_overflow(vm, &options)); // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », « "day" »). - auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "day"sv, "month"sv, "monthCode"sv, "year"sv }, Vector { "day"sv })); + auto* prepared_fields = TRY(prepare_temporal_fields(vm, fields, { "day"sv, "month"sv, "monthCode"sv, "year"sv }, Vector { "day"sv })); // 4. Let month be ! Get(fields, "month"). auto month_value = MUST(prepared_fields->get(vm.names.month)); @@ -819,7 +851,7 @@ ThrowCompletionOr iso_month_day_from_fields(GlobalObject& global_ob } // 8. Set month to ? ResolveISOMonth(fields). - auto month = TRY(resolve_iso_month(global_object, *prepared_fields)); + auto month = TRY(resolve_iso_month(vm, *prepared_fields)); // 9. Let day be ! Get(fields, "day"). auto day = MUST(prepared_fields->get(vm.names.day)); @@ -838,12 +870,12 @@ ThrowCompletionOr iso_month_day_from_fields(GlobalObject& global_ob VERIFY(year.is_number()); // b. Let result be ? RegulateISODate(ℝ(year), month, ℝ(day), overflow). - result = TRY(regulate_iso_date(global_object, year.as_double(), month, day.as_double(), overflow)); + result = TRY(regulate_iso_date(vm, year.as_double(), month, day.as_double(), overflow)); } // 13. Else, else { // a. Let result be ? RegulateISODate(referenceISOYear, month, ℝ(day), overflow). - result = TRY(regulate_iso_date(global_object, reference_iso_year, month, day.as_double(), overflow)); + result = TRY(regulate_iso_date(vm, reference_iso_year, month, day.as_double(), overflow)); } // 14. Return the Record { [[Month]]: result.[[Month]], [[Day]]: result.[[Day]], [[ReferenceISOYear]]: referenceISOYear }. @@ -923,10 +955,10 @@ u8 iso_day(Object& temporal_object) } // 12.2.40 DefaultMergeCalendarFields ( fields, additionalFields ), https://tc39.es/proposal-temporal/#sec-temporal-defaultmergecalendarfields -ThrowCompletionOr default_merge_calendar_fields(GlobalObject& global_object, Object const& fields, Object const& additional_fields) +ThrowCompletionOr default_merge_calendar_fields(VM& vm, Object const& fields, Object const& additional_fields) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let merged be OrdinaryObjectCreate(%Object.prototype%). auto* merged = Object::create(realm, global_object.object_prototype()); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h index bada3ded72..13045fd604 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h @@ -32,47 +32,47 @@ private: bool is_builtin_calendar(String const& identifier); Span available_calendars(); -ThrowCompletionOr create_temporal_calendar(GlobalObject&, String const& identifier, FunctionObject const* new_target = nullptr); -ThrowCompletionOr get_builtin_calendar(GlobalObject&, String const& identifier); -Calendar* get_iso8601_calendar(GlobalObject&); -ThrowCompletionOr> calendar_fields(GlobalObject&, Object& calendar, Vector const& field_names); -ThrowCompletionOr calendar_merge_fields(GlobalObject&, Object& calendar, Object& fields, Object& additional_fields); -ThrowCompletionOr calendar_date_add(GlobalObject&, Object& calendar, Value date, Duration&, Object* options = nullptr, FunctionObject* date_add = nullptr); -ThrowCompletionOr calendar_date_until(GlobalObject&, Object& calendar, Value one, Value two, Object& options, FunctionObject* date_until = nullptr); -ThrowCompletionOr calendar_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_month(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_month_code(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_day(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_day_of_week(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_day_of_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_week_of_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_days_in_week(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_days_in_month(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_days_in_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_months_in_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_in_leap_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_era(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr calendar_era_year(GlobalObject&, Object& calendar, Object& date_like); -ThrowCompletionOr to_temporal_calendar(GlobalObject&, Value); -ThrowCompletionOr to_temporal_calendar_with_iso_default(GlobalObject&, Value); -ThrowCompletionOr get_temporal_calendar_with_iso_default(GlobalObject&, Object&); -ThrowCompletionOr calendar_date_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const* options = nullptr); -ThrowCompletionOr calendar_year_month_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const* options = nullptr); -ThrowCompletionOr calendar_month_day_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const* options = nullptr); +ThrowCompletionOr create_temporal_calendar(VM&, String const& identifier, FunctionObject const* new_target = nullptr); +ThrowCompletionOr get_builtin_calendar(VM&, String const& identifier); +Calendar* get_iso8601_calendar(VM&); +ThrowCompletionOr> calendar_fields(VM&, Object& calendar, Vector const& field_names); +ThrowCompletionOr calendar_merge_fields(VM&, Object& calendar, Object& fields, Object& additional_fields); +ThrowCompletionOr calendar_date_add(VM&, Object& calendar, Value date, Duration&, Object* options = nullptr, FunctionObject* date_add = nullptr); +ThrowCompletionOr calendar_date_until(VM&, Object& calendar, Value one, Value two, Object& options, FunctionObject* date_until = nullptr); +ThrowCompletionOr calendar_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_month(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_month_code(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_day(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_day_of_week(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_day_of_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_week_of_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_days_in_week(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_days_in_month(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_days_in_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_months_in_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_in_leap_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_era(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr calendar_era_year(VM&, Object& calendar, Object& date_like); +ThrowCompletionOr to_temporal_calendar(VM&, Value); +ThrowCompletionOr to_temporal_calendar_with_iso_default(VM&, Value); +ThrowCompletionOr get_temporal_calendar_with_iso_default(VM&, Object&); +ThrowCompletionOr calendar_date_from_fields(VM&, Object& calendar, Object const& fields, Object const* options = nullptr); +ThrowCompletionOr calendar_year_month_from_fields(VM&, Object& calendar, Object const& fields, Object const* options = nullptr); +ThrowCompletionOr calendar_month_day_from_fields(VM&, Object& calendar, Object const& fields, Object const* options = nullptr); String format_calendar_annotation(StringView id, StringView show_calendar); -ThrowCompletionOr calendar_equals(GlobalObject&, Object& one, Object& two); -ThrowCompletionOr consolidate_calendars(GlobalObject&, Object& one, Object& two); +ThrowCompletionOr calendar_equals(VM&, Object& one, Object& two); +ThrowCompletionOr consolidate_calendars(VM&, Object& one, Object& two); u8 iso_days_in_month(i32 year, u8 month); u8 to_iso_week_of_year(i32 year, u8 month, u8 day); String build_iso_month_code(u8 month); -ThrowCompletionOr resolve_iso_month(GlobalObject&, Object const& fields); -ThrowCompletionOr iso_date_from_fields(GlobalObject&, Object const& fields, Object const& options); -ThrowCompletionOr iso_year_month_from_fields(GlobalObject&, Object const& fields, Object const& options); -ThrowCompletionOr iso_month_day_from_fields(GlobalObject&, Object const& fields, Object const& options); +ThrowCompletionOr resolve_iso_month(VM&, Object const& fields); +ThrowCompletionOr iso_date_from_fields(VM&, Object const& fields, Object const& options); +ThrowCompletionOr iso_year_month_from_fields(VM&, Object const& fields, Object const& options); +ThrowCompletionOr iso_month_day_from_fields(VM&, Object const& fields, Object const& options); i32 iso_year(Object& temporal_object); u8 iso_month(Object& temporal_object); String iso_month_code(Object& temporal_object); u8 iso_day(Object& temporal_object); -ThrowCompletionOr default_merge_calendar_fields(GlobalObject&, Object const& fields, Object const& additional_fields); +ThrowCompletionOr default_merge_calendar_fields(VM&, Object const& fields, Object const& additional_fields); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp index 47fd73d3ae..b1a96096b4 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp @@ -57,7 +57,7 @@ ThrowCompletionOr CalendarConstructor::construct(FunctionObject& new_ta } // 4. Return ? CreateTemporalCalendar(id, NewTarget). - return TRY(create_temporal_calendar(global_object, identifier, &new_target)); + return TRY(create_temporal_calendar(vm, identifier, &new_target)); } // 12.3.2 Temporal.Calendar.from ( calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.from @@ -66,7 +66,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarConstructor::from) auto calendar_like = vm.argument(0); // 1. Return ? ToTemporalCalendar(calendarLike). - return TRY(to_temporal_calendar(global_object, calendar_like)); + return TRY(to_temporal_calendar(vm, calendar_like)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp index 0690c7c4db..539ae57ecc 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp @@ -90,13 +90,13 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::date_from_fields) return vm.throw_completion(ErrorType::NotAnObject, fields.to_string_without_side_effects()); // 5. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); // 6. Let result be ? ISODateFromFields(fields, options). - auto result = TRY(iso_date_from_fields(global_object, fields.as_object(), *options)); + auto result = TRY(iso_date_from_fields(vm, fields.as_object(), *options)); // 7. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar). - return TRY(create_temporal_date(global_object, result.year, result.month, result.day, *calendar)); + return TRY(create_temporal_date(vm, result.year, result.month, result.day, *calendar)); } // 12.4.5 Temporal.Calendar.prototype.yearMonthFromFields ( fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.yearmonthfromfields @@ -116,13 +116,13 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::year_month_from_fields) return vm.throw_completion(ErrorType::NotAnObject, fields.to_string_without_side_effects()); // 5. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); // 6. Let result be ? ISOYearMonthFromFields(fields, options). - auto result = TRY(iso_year_month_from_fields(global_object, fields.as_object(), *options)); + auto result = TRY(iso_year_month_from_fields(vm, fields.as_object(), *options)); // 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). - return TRY(create_temporal_year_month(global_object, result.year, result.month, *calendar, result.reference_iso_day)); + return TRY(create_temporal_year_month(vm, result.year, result.month, *calendar, result.reference_iso_day)); } // 12.4.6 Temporal.Calendar.prototype.monthDayFromFields ( fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.monthdayfromfields @@ -142,13 +142,13 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::month_day_from_fields) return vm.throw_completion(ErrorType::NotAnObject, fields.to_string_without_side_effects()); // 5. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); // 6. Let result be ? ISOMonthDayFromFields(fields, options). - auto result = TRY(iso_month_day_from_fields(global_object, fields.as_object(), *options)); + auto result = TRY(iso_month_day_from_fields(vm, fields.as_object(), *options)); // 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). - return TRY(create_temporal_month_day(global_object, result.month, result.day, *calendar, result.reference_iso_year)); + return TRY(create_temporal_month_day(vm, result.month, result.day, *calendar, result.reference_iso_year)); } // 12.4.7 Temporal.Calendar.prototype.dateAdd ( date, duration [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.dateadd @@ -163,26 +163,26 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::date_add) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Set date to ? ToTemporalDate(date). - auto* date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* date = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Set duration to ? ToTemporalDuration(duration). - auto* duration = TRY(to_temporal_duration(global_object, vm.argument(1))); + auto* duration = TRY(to_temporal_duration(vm, vm.argument(1))); // 6. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(2))); + auto const* options = TRY(get_options_object(vm, vm.argument(2))); // 7. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, options)); + auto overflow = TRY(to_temporal_overflow(vm, options)); // 8. Let balanceResult be ? BalanceDuration(duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], "day"). // FIXME: Narrowing conversion from 'double' to 'i64' - auto balance_result = TRY(balance_duration(global_object, duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from(duration->nanoseconds()), "day"sv)); + auto balance_result = TRY(balance_duration(vm, duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from(duration->nanoseconds()), "day"sv)); // 9. Let result be ? AddISODate(date.[[ISOYear]], date.[[ISOMonth]], date.[[ISODay]], duration.[[Years]], duration.[[Months]], duration.[[Weeks]], balanceResult.[[Days]], overflow). - auto result = TRY(add_iso_date(global_object, date->iso_year(), date->iso_month(), date->iso_day(), duration->years(), duration->months(), duration->weeks(), balance_result.days, overflow)); + auto result = TRY(add_iso_date(vm, date->iso_year(), date->iso_month(), date->iso_day(), duration->years(), duration->months(), duration->weeks(), balance_result.days, overflow)); // 10. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar). - return TRY(create_temporal_date(global_object, result.year, result.month, result.day, *calendar)); + return TRY(create_temporal_date(vm, result.year, result.month, result.day, *calendar)); } // 12.4.8 Temporal.Calendar.prototype.dateUntil ( one, two [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.dateuntil @@ -197,26 +197,26 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::date_until) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Set one to ? ToTemporalDate(one). - auto* one = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Set two to ? ToTemporalDate(two). - auto* two = TRY(to_temporal_date(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_date(vm, vm.argument(1))); // 6. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(2))); + auto const* options = TRY(get_options_object(vm, vm.argument(2))); // 7. Let largestUnit be ? GetTemporalUnit(options, "largestUnit", date, "auto"). - auto largest_unit = TRY(get_temporal_unit(global_object, *options, vm.names.largestUnit, UnitGroup::Date, { "auto"sv })); + auto largest_unit = TRY(get_temporal_unit(vm, *options, vm.names.largestUnit, UnitGroup::Date, { "auto"sv })); // 8. If largestUnit is "auto", set largestUnit to "day". if (largest_unit == "auto") largest_unit = "day"sv; // 9. Let result be DifferenceISODate(one.[[ISOYear]], one.[[ISOMonth]], one.[[ISODay]], two.[[ISOYear]], two.[[ISOMonth]], two.[[ISODay]], largestUnit). - auto result = difference_iso_date(global_object, one->iso_year(), one->iso_month(), one->iso_day(), two->iso_year(), two->iso_month(), two->iso_day(), *largest_unit); + auto result = difference_iso_date(vm, one->iso_year(), one->iso_month(), one->iso_day(), two->iso_year(), two->iso_month(), two->iso_day(), *largest_unit); // 10. Return ! CreateTemporalDuration(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], 0, 0, 0, 0, 0, 0). - return MUST(create_temporal_duration(global_object, result.years, result.months, result.weeks, result.days, 0, 0, 0, 0, 0, 0)); + return MUST(create_temporal_duration(vm, result.years, result.months, result.weeks, result.days, 0, 0, 0, 0, 0, 0)); } // 12.4.9 Temporal.Calendar.prototype.year ( temporalDateLike ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.year @@ -234,7 +234,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::year) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return ! ISOYear(temporalDateLike). @@ -263,7 +263,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::month) // 5. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 6. Return ! ISOMonth(temporalDateLike). @@ -285,7 +285,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::month_code) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return ! ISOMonthCode(temporalDateLike). @@ -307,7 +307,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::day) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]] or [[InitializedTemporalMonthDay]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return ! ISODay(temporalDateLike). @@ -326,7 +326,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::day_of_week) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). - auto* temporal_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* temporal_date = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Let epochDays be MakeDay(𝔽(temporalDate.[[ISOYear]]), 𝔽(temporalDate.[[ISOMonth]] - 1), 𝔽(temporalDate.[[ISODay]])). auto epoch_days = make_day(temporal_date->iso_year(), temporal_date->iso_month() - 1, temporal_date->iso_day()); @@ -357,7 +357,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::day_of_year) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). - auto* temporal_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* temporal_date = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Let epochDays be MakeDay(𝔽(temporalDate.[[ISOYear]]), 𝔽(temporalDate.[[ISOMonth]] - 1), 𝔽(temporalDate.[[ISODay]])). auto epoch_days = make_day(temporal_date->iso_year(), temporal_date->iso_month() - 1, temporal_date->iso_day()); @@ -381,7 +381,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::week_of_year) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). - auto* temporal_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* temporal_date = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Return 𝔽(! ToISODayOfYear(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]])). return Value(to_iso_week_of_year(temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day())); @@ -399,7 +399,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::days_in_week) VERIFY(calendar->identifier() == "iso8601"sv); // 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). - [[maybe_unused]] auto* temporal_date = TRY(to_temporal_date(global_object, vm.argument(0))); + [[maybe_unused]] auto* temporal_date = TRY(to_temporal_date(vm, vm.argument(0))); // 5. Return 7𝔽. return Value(7); @@ -420,7 +420,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::days_in_month) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slots, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return 𝔽(! ISODaysInMonth(temporalDateLike.[[ISOYear]], temporalDateLike.[[ISOMonth]])). @@ -442,7 +442,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::days_in_year) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return DaysInYear(𝔽(temporalDateLike.[[ISOYear]])). @@ -464,7 +464,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::months_in_year) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Perform ? ToTemporalDate(temporalDateLike). - (void)TRY(to_temporal_date(global_object, temporal_date_like)); + (void)TRY(to_temporal_date(vm, temporal_date_like)); } // 5. Return 12𝔽. @@ -486,7 +486,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::in_leap_year) // 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 5. If InLeapYear(TimeFromYear(𝔽(temporalDateLike.[[ISOYear]]))) is 1𝔽, return true. @@ -584,7 +584,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::merge_fields) VERIFY(calendar->identifier() == "iso8601"sv); // 6. Return ? DefaultMergeCalendarFields(fields, additionalFields). - return TRY(default_merge_calendar_fields(global_object, *fields, *additional_fields)); + return TRY(default_merge_calendar_fields(vm, *fields, *additional_fields)); } // 12.4.23 Temporal.Calendar.prototype.toString ( ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.tostring @@ -621,7 +621,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::era) // 3. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 4. If calendar.[[Identifier]] is "iso8601", then @@ -649,7 +649,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::era_year) // 3. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], or [[InitializedTemporalYearMonth]] internal slot, then if (!temporal_date_like.is_object() || !(is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()) || is(temporal_date_like.as_object()))) { // a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). - temporal_date_like = TRY(to_temporal_date(global_object, temporal_date_like)); + temporal_date_like = TRY(to_temporal_date(vm, temporal_date_like)); } // 4. If calendar.[[Identifier]] is "iso8601", then diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp index 0737bc6fb2..e533cbe8e8 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.cpp @@ -78,10 +78,8 @@ DurationRecord create_duration_record(double years, double months, double weeks, } // 7.5.5 CreateDurationRecord ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds ), https://tc39.es/proposal-temporal/#sec-temporal-createdurationrecord -ThrowCompletionOr create_duration_record(GlobalObject& global_object, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) +ThrowCompletionOr create_duration_record(VM& vm, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) { - auto& vm = global_object.vm(); - // 1. If ! IsValidDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds) is false, throw a RangeError exception. if (!is_valid_duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)) return vm.throw_completion(ErrorType::TemporalInvalidDuration); @@ -101,10 +99,8 @@ DateDurationRecord create_date_duration_record(double years, double months, doub } // 7.5.6 CreateDateDurationRecord ( years, months, weeks, days ), https://tc39.es/proposal-temporal/#sec-temporal-createdatedurationrecord -ThrowCompletionOr create_date_duration_record(GlobalObject& global_object, double years, double months, double weeks, double days) +ThrowCompletionOr create_date_duration_record(VM& vm, double years, double months, double weeks, double days) { - auto& vm = global_object.vm(); - // 1. If ! IsValidDuration(years, months, weeks, days, 0, 0, 0, 0, 0, 0) is false, throw a RangeError exception. if (!is_valid_duration(years, months, weeks, days, 0, 0, 0, 0, 0, 0)) return vm.throw_completion(ErrorType::TemporalInvalidDuration); @@ -114,10 +110,8 @@ ThrowCompletionOr create_date_duration_record(GlobalObject& } // 7.5.7 CreateTimeDurationRecord ( days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds ), https://tc39.es/proposal-temporal/#sec-temporal-createtimedurationrecord -ThrowCompletionOr create_time_duration_record(GlobalObject& global_object, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) +ThrowCompletionOr create_time_duration_record(VM& vm, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) { - auto& vm = global_object.vm(); - // 1. If ! IsValidDuration(0, 0, 0, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds) is false, throw a RangeError exception. if (!is_valid_duration(0, 0, 0, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)) return vm.throw_completion(ErrorType::TemporalInvalidDuration); @@ -127,7 +121,7 @@ ThrowCompletionOr create_time_duration_record(GlobalObject& } // 7.5.8 ToTemporalDuration ( item ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalduration -ThrowCompletionOr to_temporal_duration(GlobalObject& global_object, Value item) +ThrowCompletionOr to_temporal_duration(VM& vm, Value item) { // 1. If Type(item) is Object and item has an [[InitializedTemporalDuration]] internal slot, then if (item.is_object() && is(item.as_object())) { @@ -136,16 +130,17 @@ ThrowCompletionOr to_temporal_duration(GlobalObject& global_object, V } // 2. Let result be ? ToTemporalDurationRecord(item). - auto result = TRY(to_temporal_duration_record(global_object, item)); + auto result = TRY(to_temporal_duration_record(vm, item)); // 3. Return ! CreateTemporalDuration(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, result.years, result.months, result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); + return MUST(create_temporal_duration(vm, result.years, result.months, result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); } // 7.5.9 ToTemporalDurationRecord ( temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaldurationrecord -ThrowCompletionOr to_temporal_duration_record(GlobalObject& global_object, Value temporal_duration_like) +ThrowCompletionOr to_temporal_duration_record(VM& vm, Value temporal_duration_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If Type(temporalDurationLike) is not Object, then if (!temporal_duration_like.is_object()) { @@ -153,7 +148,7 @@ ThrowCompletionOr to_temporal_duration_record(GlobalObject& glob auto string = TRY(temporal_duration_like.to_string(global_object)); // b. Return ? ParseTemporalDurationString(string). - return parse_temporal_duration_string(global_object, string); + return parse_temporal_duration_string(vm, string); } // 2. If temporalDurationLike has an [[InitializedTemporalDuration]] internal slot, then @@ -168,7 +163,7 @@ ThrowCompletionOr to_temporal_duration_record(GlobalObject& glob auto result = DurationRecord {}; // 4. Let partial be ? ToTemporalPartialDurationRecord(temporalDurationLike). - auto partial = TRY(to_temporal_partial_duration_record(global_object, temporal_duration_like)); + auto partial = TRY(to_temporal_partial_duration_record(vm, temporal_duration_like)); auto duration_record_fields = temporal_duration_record_fields(vm); auto partial_duration_record_fields = temporal_duration_record_fields>(vm); @@ -286,10 +281,8 @@ StringView default_temporal_largest_unit(double years, double months, double wee } // 7.5.13 ToTemporalPartialDurationRecord ( temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalpartialdurationrecord -ThrowCompletionOr to_temporal_partial_duration_record(GlobalObject& global_object, Value temporal_duration_like) +ThrowCompletionOr to_temporal_partial_duration_record(VM& vm, Value temporal_duration_like) { - auto& vm = global_object.vm(); - // 1. If Type(temporalDurationLike) is not Object, then if (!temporal_duration_like.is_object()) { // a. Throw a TypeError exception. @@ -315,7 +308,7 @@ ThrowCompletionOr to_temporal_partial_duration_record(Glo any = true; // ii. Set value to ? ToIntegerWithoutRounding(value). - auto value_integer = TRY(to_integer_without_rounding(global_object, value, ErrorType::TemporalInvalidDurationPropertyValueNonIntegral, property.as_string(), value.to_string_without_side_effects())); + auto value_integer = TRY(to_integer_without_rounding(vm, value, ErrorType::TemporalInvalidDurationPropertyValueNonIntegral, property.as_string(), value.to_string_without_side_effects())); // iii. Let fieldName be the Field Name value of the current row. // iv. Set the field of result whose name is fieldName to value. @@ -334,9 +327,10 @@ ThrowCompletionOr to_temporal_partial_duration_record(Glo } // 7.5.14 CreateTemporalDuration ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalduration -ThrowCompletionOr create_temporal_duration(GlobalObject& global_object, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_duration(VM& vm, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If ! IsValidDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds) is false, throw a RangeError exception. if (!is_valid_duration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)) @@ -364,14 +358,14 @@ ThrowCompletionOr create_temporal_duration(GlobalObject& global_objec } // 7.5.15 CreateNegatedTemporalDuration ( duration ), https://tc39.es/proposal-temporal/#sec-temporal-createnegatedtemporalduration -Duration* create_negated_temporal_duration(GlobalObject& global_object, Duration const& duration) +Duration* create_negated_temporal_duration(VM& vm, Duration const& duration) { // 1. Return ! CreateTemporalDuration(-duration.[[Years]], -duration.[[Months]], -duration.[[Weeks]], -duration.[[Days]], -duration.[[Hours]], -duration.[[Minutes]], -duration.[[Seconds]], -duration.[[Milliseconds]], -duration.[[Microseconds]], -duration.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, -duration.years(), -duration.months(), -duration.weeks(), -duration.days(), -duration.hours(), -duration.minutes(), -duration.seconds(), -duration.milliseconds(), -duration.microseconds(), -duration.nanoseconds())); + return MUST(create_temporal_duration(vm, -duration.years(), -duration.months(), -duration.weeks(), -duration.days(), -duration.hours(), -duration.minutes(), -duration.seconds(), -duration.milliseconds(), -duration.microseconds(), -duration.nanoseconds())); } // 7.5.16 CalculateOffsetShift ( relativeTo, y, mon, w, d ), https://tc39.es/proposal-temporal/#sec-temporal-calculateoffsetshift -ThrowCompletionOr calculate_offset_shift(GlobalObject& global_object, Value relative_to_value, double years, double months, double weeks, double days) +ThrowCompletionOr calculate_offset_shift(VM& vm, Value relative_to_value, double years, double months, double weeks, double days) { // 1. If Type(relativeTo) is not Object or relativeTo does not have an [[InitializedTemporalZonedDateTime]] internal slot, return 0. if (!relative_to_value.is_object() || !is(relative_to_value.as_object())) @@ -380,19 +374,19 @@ ThrowCompletionOr calculate_offset_shift(GlobalObject& global_object, Va auto& relative_to = static_cast(relative_to_value.as_object()); // 2. Let instant be ! CreateTemporalInstant(relativeTo.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, relative_to.nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, relative_to.nanoseconds())); // 3. Let offsetBefore be ? GetOffsetNanosecondsFor(relativeTo.[[TimeZone]], instant). - auto offset_before = TRY(get_offset_nanoseconds_for(global_object, &relative_to.time_zone(), *instant)); + auto offset_before = TRY(get_offset_nanoseconds_for(vm, &relative_to.time_zone(), *instant)); // 4. Let after be ? AddZonedDateTime(relativeTo.[[Nanoseconds]], relativeTo.[[TimeZone]], relativeTo.[[Calendar]], y, mon, w, d, 0, 0, 0, 0, 0, 0). - auto* after = TRY(add_zoned_date_time(global_object, relative_to.nanoseconds(), &relative_to.time_zone(), relative_to.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); + auto* after = TRY(add_zoned_date_time(vm, relative_to.nanoseconds(), &relative_to.time_zone(), relative_to.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); // 5. Let instantAfter be ! CreateTemporalInstant(after). - auto* instant_after = MUST(create_temporal_instant(global_object, *after)); + auto* instant_after = MUST(create_temporal_instant(vm, *after)); // 6. Let offsetAfter be ? GetOffsetNanosecondsFor(relativeTo.[[TimeZone]], instantAfter). - auto offset_after = TRY(get_offset_nanoseconds_for(global_object, &relative_to.time_zone(), *instant_after)); + auto offset_after = TRY(get_offset_nanoseconds_for(vm, &relative_to.time_zone(), *instant_after)); // 7. Return offsetAfter - offsetBefore. return offset_after - offset_before; @@ -428,7 +422,7 @@ Crypto::SignedBigInteger total_duration_nanoseconds(double days, double hours, d } // 7.5.18 BalanceDuration ( days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, largestUnit [ , relativeTo ] ), https://tc39.es/proposal-temporal/#sec-temporal-balanceduration -ThrowCompletionOr balance_duration(GlobalObject& global_object, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, String const& largest_unit, Object* relative_to) +ThrowCompletionOr balance_duration(VM& vm, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, String const& largest_unit, Object* relative_to) { // 1. If relativeTo is not present, set relativeTo to undefined. @@ -438,7 +432,7 @@ ThrowCompletionOr balance_duration(GlobalObject& global_obje auto& relative_to_zoned_date_time = static_cast(*relative_to); // a. Let endNs be ? AddZonedDateTime(relativeTo.[[Nanoseconds]], relativeTo.[[TimeZone]], relativeTo.[[Calendar]], 0, 0, 0, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). - auto* end_ns = TRY(add_zoned_date_time(global_object, relative_to_zoned_date_time.nanoseconds(), &relative_to_zoned_date_time.time_zone(), relative_to_zoned_date_time.calendar(), 0, 0, 0, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds.to_double())); + auto* end_ns = TRY(add_zoned_date_time(vm, relative_to_zoned_date_time.nanoseconds(), &relative_to_zoned_date_time.time_zone(), relative_to_zoned_date_time.calendar(), 0, 0, 0, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds.to_double())); // b. Set nanoseconds to ℝ(endNs - relativeTo.[[Nanoseconds]]). total_nanoseconds = end_ns->big_integer().minus(relative_to_zoned_date_time.nanoseconds().big_integer()); @@ -452,7 +446,7 @@ ThrowCompletionOr balance_duration(GlobalObject& global_obje // 4. If largestUnit is one of "year", "month", "week", or "day", then if (largest_unit.is_one_of("year"sv, "month"sv, "week"sv, "day"sv)) { // a. Let result be ? NanosecondsToDays(nanoseconds, relativeTo). - auto result = TRY(nanoseconds_to_days(global_object, total_nanoseconds, relative_to ?: js_undefined())); + auto result = TRY(nanoseconds_to_days(vm, total_nanoseconds, relative_to ?: js_undefined())); // b. Set days to result.[[Days]]. days = result.days; @@ -565,14 +559,14 @@ ThrowCompletionOr balance_duration(GlobalObject& global_obje VERIFY(largest_unit == "nanosecond"sv); } // 15. Return ? CreateTimeDurationRecord(days, hours × sign, minutes × sign, seconds × sign, milliseconds × sign, microseconds × sign, nanoseconds × sign). - return create_time_duration_record(global_object, days, hours * sign, minutes * sign, seconds * sign, milliseconds * sign, microseconds * sign, result_nanoseconds * sign); + return create_time_duration_record(vm, days, hours * sign, minutes * sign, seconds * sign, milliseconds * sign, microseconds * sign, result_nanoseconds * sign); } // 7.5.19 UnbalanceDurationRelative ( years, months, weeks, days, largestUnit, relativeTo ), https://tc39.es/proposal-temporal/#sec-temporal-unbalancedurationrelative -ThrowCompletionOr unbalance_duration_relative(GlobalObject& global_object, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to) +ThrowCompletionOr unbalance_duration_relative(VM& vm, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If largestUnit is "year", or years, months, weeks, and days are all 0, then if (largest_unit == "year"sv || (years == 0 && months == 0 && weeks == 0 && days == 0)) { @@ -587,20 +581,20 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& VERIFY(sign != 0); // 4. Let oneYear be ! CreateTemporalDuration(sign, 0, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_year = MUST(create_temporal_duration(global_object, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_year = MUST(create_temporal_duration(vm, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); // 5. Let oneMonth be ! CreateTemporalDuration(0, sign, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_month = MUST(create_temporal_duration(global_object, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_month = MUST(create_temporal_duration(vm, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); // 6. Let oneWeek be ! CreateTemporalDuration(0, 0, sign, 0, 0, 0, 0, 0, 0, 0). - auto* one_week = MUST(create_temporal_duration(global_object, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); + auto* one_week = MUST(create_temporal_duration(vm, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); Object* calendar; // 7. If relativeTo is not undefined, then if (!relative_to.is_undefined()) { // a. Set relativeTo to ? ToTemporalDate(relativeTo). - auto* relative_to_plain_date = TRY(to_temporal_date(global_object, relative_to)); + auto* relative_to_plain_date = TRY(to_temporal_date(vm, relative_to)); relative_to = relative_to_plain_date; // b. Let calendar be relativeTo.[[Calendar]]. @@ -629,7 +623,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // d. Repeat, while years ≠ 0, while (years != 0) { // i. Let newRelativeTo be ? CalendarDateAdd(calendar, relativeTo, oneYear, undefined, dateAdd). - auto* new_relative_to = TRY(calendar_date_add(global_object, *calendar, relative_to, *one_year, nullptr, date_add)); + auto* new_relative_to = TRY(calendar_date_add(vm, *calendar, relative_to, *one_year, nullptr, date_add)); // ii. Let untilOptions be OrdinaryObjectCreate(null). auto* until_options = Object::create(realm, nullptr); @@ -638,7 +632,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& MUST(until_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, "month"sv))); // iv. Let untilResult be ? CalendarDateUntil(calendar, relativeTo, newRelativeTo, untilOptions, dateUntil). - auto* until_result = TRY(calendar_date_until(global_object, *calendar, relative_to, new_relative_to, *until_options, date_until)); + auto* until_result = TRY(calendar_date_until(vm, *calendar, relative_to, new_relative_to, *until_options, date_until)); // v. Let oneYearMonths be untilResult.[[Months]]. auto one_year_months = until_result->months(); @@ -664,7 +658,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // b. Repeat, while years ≠ 0, while (years != 0) { // i. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear). - auto move_result = TRY(move_relative_date(global_object, *calendar, verify_cast(relative_to.as_object()), *one_year)); + auto move_result = TRY(move_relative_date(vm, *calendar, verify_cast(relative_to.as_object()), *one_year)); // ii. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -679,7 +673,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // c. Repeat, while months ≠ 0, while (months != 0) { // i. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth). - auto move_result = TRY(move_relative_date(global_object, *calendar, verify_cast(relative_to.as_object()), *one_month)); + auto move_result = TRY(move_relative_date(vm, *calendar, verify_cast(relative_to.as_object()), *one_month)); // ii. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -704,7 +698,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // ii. Repeat, while years ≠ 0, while (years != 0) { // 1. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear). - auto move_result = TRY(move_relative_date(global_object, *calendar, verify_cast(relative_to.as_object()), *one_year)); + auto move_result = TRY(move_relative_date(vm, *calendar, verify_cast(relative_to.as_object()), *one_year)); // 2. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -719,7 +713,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // iii. Repeat, while months ≠ 0, while (months != 0) { // 1. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth). - auto move_result = TRY(move_relative_date(global_object, *calendar, verify_cast(relative_to.as_object()), *one_month)); + auto move_result = TRY(move_relative_date(vm, *calendar, verify_cast(relative_to.as_object()), *one_month)); // 2. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -734,7 +728,7 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& // iv. Repeat, while weeks ≠ 0, while (weeks != 0) { // 1. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek). - auto move_result = TRY(move_relative_date(global_object, *calendar, verify_cast(relative_to.as_object()), *one_week)); + auto move_result = TRY(move_relative_date(vm, *calendar, verify_cast(relative_to.as_object()), *one_week)); // 2. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -749,14 +743,14 @@ ThrowCompletionOr unbalance_duration_relative(GlobalObject& } // 12. Return ? CreateDateDurationRecord(years, months, weeks, days). - return create_date_duration_record(global_object, years, months, weeks, days); + return create_date_duration_record(vm, years, months, weeks, days); } // 7.5.20 BalanceDurationRelative ( years, months, weeks, days, largestUnit, relativeTo ), https://tc39.es/proposal-temporal/#sec-temporal-balancedurationrelative -ThrowCompletionOr balance_duration_relative(GlobalObject& global_object, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to_value) +ThrowCompletionOr balance_duration_relative(VM& vm, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to_value) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If largestUnit is not one of "year", "month", or "week", or years, months, weeks, and days are all 0, then if (!largest_unit.is_one_of("year"sv, "month"sv, "week"sv) || (years == 0 && months == 0 && weeks == 0 && days == 0)) { @@ -777,16 +771,16 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl VERIFY(sign != 0); // 5. Let oneYear be ! CreateTemporalDuration(sign, 0, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_year = MUST(create_temporal_duration(global_object, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_year = MUST(create_temporal_duration(vm, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); // 6. Let oneMonth be ! CreateTemporalDuration(0, sign, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_month = MUST(create_temporal_duration(global_object, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_month = MUST(create_temporal_duration(vm, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); // 7. Let oneWeek be ! CreateTemporalDuration(0, 0, sign, 0, 0, 0, 0, 0, 0, 0). - auto* one_week = MUST(create_temporal_duration(global_object, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); + auto* one_week = MUST(create_temporal_duration(vm, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); // 8. Set relativeTo to ? ToTemporalDate(relativeTo). - auto* relative_to = TRY(to_temporal_date(global_object, relative_to_value)); + auto* relative_to = TRY(to_temporal_date(vm, relative_to_value)); // 9. Let calendar be relativeTo.[[Calendar]]. auto& calendar = relative_to->calendar(); @@ -794,7 +788,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl // 10. If largestUnit is "year", then if (largest_unit == "year"sv) { // a. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear). - auto move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_year)); + auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_year)); // b. Let newRelativeTo be moveResult.[[RelativeTo]]. auto* new_relative_to = move_result.relative_to.cell(); @@ -814,7 +808,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl relative_to = new_relative_to; // iv. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneYear). - move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_year)); + move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_year)); // v. Set newRelativeTo to moveResult.[[RelativeTo]]. new_relative_to = move_result.relative_to.cell(); @@ -824,7 +818,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl } // e. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneMonth). - move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_month)); + move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month)); // f. Set newRelativeTo to moveResult.[[RelativeTo]]. new_relative_to = move_result.relative_to.cell(); @@ -844,7 +838,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl relative_to = new_relative_to; // iv. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneMonth). - move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_month)); + move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month)); // v. Set newRelativeTo to moveResult.[[RelativeTo]]. new_relative_to = move_result.relative_to.cell(); @@ -857,7 +851,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl auto* date_add = TRY(Value(&calendar).get_method(global_object, vm.names.dateAdd)); // j. Set newRelativeTo to ? CalendarDateAdd(calendar, relativeTo, oneYear, undefined, dateAdd). - new_relative_to = TRY(calendar_date_add(global_object, calendar, relative_to, *one_year, nullptr, date_add)); + new_relative_to = TRY(calendar_date_add(vm, calendar, relative_to, *one_year, nullptr, date_add)); // k. Let dateUntil be ? GetMethod(calendar, "dateUntil"). auto* date_until = TRY(Value(&calendar).get_method(global_object, vm.names.dateUntil)); @@ -869,7 +863,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl MUST(until_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, "month"sv))); // n. Let untilResult be ? CalendarDateUntil(calendar, relativeTo, newRelativeTo, untilOptions, dateUntil). - auto* until_result = TRY(calendar_date_until(global_object, calendar, relative_to, new_relative_to, *until_options, date_until)); + auto* until_result = TRY(calendar_date_until(vm, calendar, relative_to, new_relative_to, *until_options, date_until)); // o. Let oneYearMonths be untilResult.[[Months]]. auto one_year_months = until_result->months(); @@ -886,7 +880,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl relative_to = new_relative_to; // iv. Set newRelativeTo to ? CalendarDateAdd(calendar, relativeTo, oneYear, undefined, dateAdd). - new_relative_to = TRY(calendar_date_add(global_object, calendar, relative_to, *one_year, nullptr, date_add)); + new_relative_to = TRY(calendar_date_add(vm, calendar, relative_to, *one_year, nullptr, date_add)); // v. Set untilOptions to OrdinaryObjectCreate(null). until_options = Object::create(realm, nullptr); @@ -895,7 +889,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl MUST(until_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, "month"sv))); // vii. Set untilResult to ? CalendarDateUntil(calendar, relativeTo, newRelativeTo, untilOptions, dateUntil). - until_result = TRY(calendar_date_until(global_object, calendar, relative_to, new_relative_to, *until_options, date_until)); + until_result = TRY(calendar_date_until(vm, calendar, relative_to, new_relative_to, *until_options, date_until)); // viii. Set oneYearMonths to untilResult.[[Months]]. one_year_months = until_result->months(); @@ -904,7 +898,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl // 11. Else if largestUnit is "month", then else if (largest_unit == "month"sv) { // a. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth). - auto move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_month)); + auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month)); // b. Let newRelativeTo be moveResult.[[RelativeTo]]. auto* new_relative_to = move_result.relative_to.cell(); @@ -924,7 +918,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl relative_to = new_relative_to; // iv. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneMonth). - move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_month)); + move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month)); // v. Set newRelativeTo to moveResult.[[RelativeTo]]. new_relative_to = move_result.relative_to.cell(); @@ -939,7 +933,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl VERIFY(largest_unit == "week"sv); // b. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek). - auto move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_week)); + auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_week)); // c. Let newRelativeTo be moveResult.[[RelativeTo]]. auto* new_relative_to = move_result.relative_to.cell(); @@ -959,7 +953,7 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl relative_to = new_relative_to; // iv. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneWeek). - move_result = TRY(move_relative_date(global_object, calendar, *relative_to, *one_week)); + move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_week)); // v. Set newRelativeTo to moveResult.[[RelativeTo]]. new_relative_to = move_result.relative_to.cell(); @@ -974,10 +968,10 @@ ThrowCompletionOr balance_duration_relative(GlobalObject& gl } // 7.5.21 AddDuration ( y1, mon1, w1, d1, h1, min1, s1, ms1, mus1, ns1, y2, mon2, w2, d2, h2, min2, s2, ms2, mus2, ns2, relativeTo ), https://tc39.es/proposal-temporal/#sec-temporal-addduration -ThrowCompletionOr add_duration(GlobalObject& global_object, double years1, double months1, double weeks1, double days1, double hours1, double minutes1, double seconds1, double milliseconds1, double microseconds1, double nanoseconds1, double years2, double months2, double weeks2, double days2, double hours2, double minutes2, double seconds2, double milliseconds2, double microseconds2, double nanoseconds2, Value relative_to_value) +ThrowCompletionOr add_duration(VM& vm, double years1, double months1, double weeks1, double days1, double hours1, double minutes1, double seconds1, double milliseconds1, double microseconds1, double nanoseconds1, double years2, double months2, double weeks2, double days2, double hours2, double minutes2, double seconds2, double milliseconds2, double microseconds2, double nanoseconds2, Value relative_to_value) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); VERIFY(all_of(AK::Array { years1, months1, weeks1, days1, hours1, minutes1, seconds1, milliseconds1, microseconds1, nanoseconds1, years2, months2, weeks2, days2, hours2, minutes2, seconds2, milliseconds2, microseconds2, nanoseconds2 }, [](auto value) { return value == trunc(value); })); @@ -1000,10 +994,10 @@ ThrowCompletionOr add_duration(GlobalObject& global_object, doub // b. Let result be ? BalanceDuration(d1 + d2, h1 + h2, min1 + min2, s1 + s2, ms1 + ms2, mus1 + mus2, ns1 + ns2, largestUnit). // FIXME: Narrowing conversion from 'double' to 'i64' - auto result = TRY(balance_duration(global_object, days1 + days2, hours1 + hours2, minutes1 + minutes2, seconds1 + seconds2, milliseconds1 + milliseconds2, microseconds1 + microseconds2, Crypto::SignedBigInteger::create_from(nanoseconds1 + nanoseconds2), largest_unit)); + auto result = TRY(balance_duration(vm, days1 + days2, hours1 + hours2, minutes1 + minutes2, seconds1 + seconds2, milliseconds1 + milliseconds2, microseconds1 + microseconds2, Crypto::SignedBigInteger::create_from(nanoseconds1 + nanoseconds2), largest_unit)); // c. Return ! CreateDurationRecord(0, 0, 0, result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return MUST(create_duration_record(global_object, 0, 0, 0, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); + return MUST(create_duration_record(vm, 0, 0, 0, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); } // 5. If relativeTo has an [[InitializedTemporalDate]] internal slot, then @@ -1014,19 +1008,19 @@ ThrowCompletionOr add_duration(GlobalObject& global_object, doub auto& calendar = relative_to.calendar(); // b. Let dateDuration1 be ! CreateTemporalDuration(y1, mon1, w1, d1, 0, 0, 0, 0, 0, 0). - auto* date_duration1 = MUST(create_temporal_duration(global_object, years1, months1, weeks1, days1, 0, 0, 0, 0, 0, 0)); + auto* date_duration1 = MUST(create_temporal_duration(vm, years1, months1, weeks1, days1, 0, 0, 0, 0, 0, 0)); // c. Let dateDuration2 be ! CreateTemporalDuration(y2, mon2, w2, d2, 0, 0, 0, 0, 0, 0). - auto* date_duration2 = MUST(create_temporal_duration(global_object, years2, months2, weeks2, days2, 0, 0, 0, 0, 0, 0)); + auto* date_duration2 = MUST(create_temporal_duration(vm, years2, months2, weeks2, days2, 0, 0, 0, 0, 0, 0)); // d. Let dateAdd be ? GetMethod(calendar, "dateAdd"). auto* date_add = TRY(Value(&calendar).get_method(global_object, vm.names.dateAdd)); // e. Let intermediate be ? CalendarDateAdd(calendar, relativeTo, dateDuration1, undefined, dateAdd). - auto* intermediate = TRY(calendar_date_add(global_object, calendar, &relative_to, *date_duration1, nullptr, date_add)); + auto* intermediate = TRY(calendar_date_add(vm, calendar, &relative_to, *date_duration1, nullptr, date_add)); // f. Let end be ? CalendarDateAdd(calendar, intermediate, dateDuration2, undefined, dateAdd). - auto* end = TRY(calendar_date_add(global_object, calendar, intermediate, *date_duration2, nullptr, date_add)); + auto* end = TRY(calendar_date_add(vm, calendar, intermediate, *date_duration2, nullptr, date_add)); // g. Let dateLargestUnit be ! LargerOfTwoTemporalUnits("day", largestUnit). auto date_largest_unit = larger_of_two_temporal_units("day"sv, largest_unit); @@ -1038,14 +1032,14 @@ ThrowCompletionOr add_duration(GlobalObject& global_object, doub MUST(difference_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, date_largest_unit))); // j. Let dateDifference be ? CalendarDateUntil(calendar, relativeTo, end, differenceOptions). - auto* date_difference = TRY(calendar_date_until(global_object, calendar, &relative_to, end, *difference_options)); + auto* date_difference = TRY(calendar_date_until(vm, calendar, &relative_to, end, *difference_options)); // k. Let result be ? BalanceDuration(dateDifference.[[Days]], h1 + h2, min1 + min2, s1 + s2, ms1 + ms2, mus1 + mus2, ns1 + ns2, largestUnit). // FIXME: Narrowing conversion from 'double' to 'i64' - auto result = TRY(balance_duration(global_object, date_difference->days(), hours1 + hours2, minutes1 + minutes2, seconds1 + seconds2, milliseconds1 + milliseconds2, microseconds1 + microseconds2, Crypto::SignedBigInteger::create_from(nanoseconds1 + nanoseconds2), largest_unit)); + auto result = TRY(balance_duration(vm, date_difference->days(), hours1 + hours2, minutes1 + minutes2, seconds1 + seconds2, milliseconds1 + milliseconds2, microseconds1 + microseconds2, Crypto::SignedBigInteger::create_from(nanoseconds1 + nanoseconds2), largest_unit)); // l. Return ? CreateDurationRecord(dateDifference.[[Years]], dateDifference.[[Months]], dateDifference.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return MUST(create_duration_record(global_object, date_difference->years(), date_difference->months(), date_difference->weeks(), result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); + return MUST(create_duration_record(vm, date_difference->years(), date_difference->months(), date_difference->weeks(), result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); } // 6. Assert: relativeTo has an [[InitializedTemporalZonedDateTime]] internal slot. @@ -1058,34 +1052,34 @@ ThrowCompletionOr add_duration(GlobalObject& global_object, doub auto& calendar = relative_to.calendar(); // 9. Let intermediateNs be ? AddZonedDateTime(relativeTo.[[Nanoseconds]], timeZone, calendar, y1, mon1, w1, d1, h1, min1, s1, ms1, mus1, ns1). - auto* intermediate_ns = TRY(add_zoned_date_time(global_object, relative_to.nanoseconds(), &time_zone, calendar, years1, months1, weeks1, days1, hours1, minutes1, seconds1, milliseconds1, microseconds1, nanoseconds1)); + auto* intermediate_ns = TRY(add_zoned_date_time(vm, relative_to.nanoseconds(), &time_zone, calendar, years1, months1, weeks1, days1, hours1, minutes1, seconds1, milliseconds1, microseconds1, nanoseconds1)); // 10. Let endNs be ? AddZonedDateTime(intermediateNs, timeZone, calendar, y2, mon2, w2, d2, h2, min2, s2, ms2, mus2, ns2). - auto* end_ns = TRY(add_zoned_date_time(global_object, *intermediate_ns, &time_zone, calendar, years2, months2, weeks2, days2, hours2, minutes2, seconds2, milliseconds2, microseconds2, nanoseconds2)); + auto* end_ns = TRY(add_zoned_date_time(vm, *intermediate_ns, &time_zone, calendar, years2, months2, weeks2, days2, hours2, minutes2, seconds2, milliseconds2, microseconds2, nanoseconds2)); // 11. If largestUnit is not one of "year", "month", "week", or "day", then if (!largest_unit.is_one_of("year"sv, "month"sv, "week"sv, "day"sv)) { // a. Let diffNs be ! DifferenceInstant(relativeTo.[[Nanoseconds]], endNs, 1, "nanosecond", "halfExpand"). - auto* diff_ns = difference_instant(global_object, relative_to.nanoseconds(), *end_ns, 1, "nanosecond"sv, "halfExpand"sv); + auto* diff_ns = difference_instant(vm, relative_to.nanoseconds(), *end_ns, 1, "nanosecond"sv, "halfExpand"sv); // b. Assert: The following steps cannot fail due to overflow in the Number domain because abs(diffNs) ≤ 2 × nsMaxInstant. // c. Let result be ! BalanceDuration(0, 0, 0, 0, 0, 0, diffNs, largestUnit). - auto result = MUST(balance_duration(global_object, 0, 0, 0, 0, 0, 0, diff_ns->big_integer(), largest_unit)); + auto result = MUST(balance_duration(vm, 0, 0, 0, 0, 0, 0, diff_ns->big_integer(), largest_unit)); // d. Return ? CreateDurationRecord(0, 0, 0, 0, result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return create_duration_record(global_object, 0, 0, 0, 0, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds); + return create_duration_record(vm, 0, 0, 0, 0, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds); } // 12. Return ? DifferenceZonedDateTime(relativeTo.[[Nanoseconds]], endNs, timeZone, calendar, largestUnit, OrdinaryObjectCreate(null)). - return difference_zoned_date_time(global_object, relative_to.nanoseconds(), *end_ns, time_zone, calendar, largest_unit, *Object::create(realm, nullptr)); + return difference_zoned_date_time(vm, relative_to.nanoseconds(), *end_ns, time_zone, calendar, largest_unit, *Object::create(realm, nullptr)); } // 7.5.23 MoveRelativeDate ( calendar, relativeTo, duration ), https://tc39.es/proposal-temporal/#sec-temporal-moverelativedate -ThrowCompletionOr move_relative_date(GlobalObject& global_object, Object& calendar, PlainDate& relative_to, Duration& duration) +ThrowCompletionOr move_relative_date(VM& vm, Object& calendar, PlainDate& relative_to, Duration& duration) { // 1. Let newDate be ? CalendarDateAdd(calendar, relativeTo, duration, options). - auto* new_date = TRY(calendar_date_add(global_object, calendar, &relative_to, duration)); + auto* new_date = TRY(calendar_date_add(vm, calendar, &relative_to, duration)); // 2. Let days be DaysUntil(relativeTo, newDate). auto days = days_until(relative_to, *new_date); @@ -1095,20 +1089,20 @@ ThrowCompletionOr move_relative_date(GlobalObject& globa } // 7.5.24 MoveRelativeZonedDateTime ( zonedDateTime, years, months, weeks, days ), https://tc39.es/proposal-temporal/#sec-temporal-moverelativezoneddatetime -ThrowCompletionOr move_relative_zoned_date_time(GlobalObject& global_object, ZonedDateTime& zoned_date_time, double years, double months, double weeks, double days) +ThrowCompletionOr move_relative_zoned_date_time(VM& vm, ZonedDateTime& zoned_date_time, double years, double months, double weeks, double days) { // 1. Let intermediateNs be ? AddZonedDateTime(zonedDateTime.[[Nanoseconds]], zonedDateTime.[[TimeZone]], zonedDateTime.[[Calendar]], years, months, weeks, days, 0, 0, 0, 0, 0, 0). - auto* intermediate_ns = TRY(add_zoned_date_time(global_object, zoned_date_time.nanoseconds(), &zoned_date_time.time_zone(), zoned_date_time.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); + auto* intermediate_ns = TRY(add_zoned_date_time(vm, zoned_date_time.nanoseconds(), &zoned_date_time.time_zone(), zoned_date_time.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); // 2. Return ! CreateTemporalZonedDateTime(intermediateNs, zonedDateTime.[[TimeZone]], zonedDateTime.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, *intermediate_ns, zoned_date_time.time_zone(), zoned_date_time.calendar())); + return MUST(create_temporal_zoned_date_time(vm, *intermediate_ns, zoned_date_time.time_zone(), zoned_date_time.calendar())); } // 7.5.25 RoundDuration ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, increment, unit, roundingMode [ , relativeTo ] ), https://tc39.es/proposal-temporal/#sec-temporal-roundduration -ThrowCompletionOr round_duration(GlobalObject& global_object, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object) +ThrowCompletionOr round_duration(VM& vm, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); Object* calendar = nullptr; double fractional_seconds = 0; @@ -1140,7 +1134,7 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d zoned_relative_to = relative_to_zoned_date_time; // ii. Set relativeTo to ? ToTemporalDate(relativeTo). - relative_to = TRY(to_temporal_date(global_object, relative_to_object)); + relative_to = TRY(to_temporal_date(vm, relative_to_object)); } // b. Else, else { @@ -1167,11 +1161,11 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d // c. If zonedRelativeTo is not undefined, then if (zoned_relative_to) { // i. Let intermediate be ? MoveRelativeZonedDateTime(zonedRelativeTo, years, months, weeks, days). - intermediate = TRY(move_relative_zoned_date_time(global_object, *zoned_relative_to, years, months, weeks, days)); + intermediate = TRY(move_relative_zoned_date_time(vm, *zoned_relative_to, years, months, weeks, days)); } // d. Let result be ? NanosecondsToDays(nanoseconds, intermediate). - auto result = TRY(nanoseconds_to_days(global_object, nanoseconds_bigint, intermediate)); + auto result = TRY(nanoseconds_to_days(vm, nanoseconds_bigint, intermediate)); // e. Set days to days + result.[[Days]] + result.[[Nanoseconds]] / result.[[DayLength]]. auto nanoseconds_division_result = result.nanoseconds.divided_by(Crypto::UnsignedBigInteger::create_from((u64)result.day_length)); @@ -1199,19 +1193,19 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d VERIFY(relative_to); // a. Let yearsDuration be ! CreateTemporalDuration(years, 0, 0, 0, 0, 0, 0, 0, 0, 0). - auto* years_duration = MUST(create_temporal_duration(global_object, years, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* years_duration = MUST(create_temporal_duration(vm, years, 0, 0, 0, 0, 0, 0, 0, 0, 0)); // b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). auto* date_add = TRY(Value(calendar).get_method(global_object, vm.names.dateAdd)); // c. Let yearsLater be ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). - auto* years_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_duration, nullptr, date_add)); + auto* years_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_duration, nullptr, date_add)); // d. Let yearsMonthsWeeks be ! CreateTemporalDuration(years, months, weeks, 0, 0, 0, 0, 0, 0, 0). - auto* years_months_weeks = MUST(create_temporal_duration(global_object, years, months, weeks, 0, 0, 0, 0, 0, 0, 0)); + auto* years_months_weeks = MUST(create_temporal_duration(vm, years, months, weeks, 0, 0, 0, 0, 0, 0, 0)); // e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd). - auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); + auto* years_months_weeks_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); // f. Let monthsWeeksInDays be DaysUntil(yearsLater, yearsMonthsWeeksLater). auto months_weeks_in_days = days_until(*years_later, *years_months_weeks_later); @@ -1223,10 +1217,10 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d days += months_weeks_in_days; // i. Let daysDuration be ? CreateTemporalDuration(0, 0, 0, days, 0, 0, 0, 0, 0, 0). - auto* days_duration = TRY(create_temporal_duration(global_object, 0, 0, 0, days, 0, 0, 0, 0, 0, 0)); + auto* days_duration = TRY(create_temporal_duration(vm, 0, 0, 0, days, 0, 0, 0, 0, 0, 0)); // j. Let daysLater be ? CalendarDateAdd(calendar, relativeTo, daysDuration, undefined, dateAdd). - auto* days_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *days_duration, nullptr, date_add)); + auto* days_later = TRY(calendar_date_add(vm, *calendar, relative_to, *days_duration, nullptr, date_add)); // k. Let untilOptions be OrdinaryObjectCreate(null). auto* until_options = Object::create(realm, nullptr); @@ -1235,7 +1229,7 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d MUST(until_options->create_data_property_or_throw(vm.names.largestUnit, js_string(vm, "year"sv))); // m. Let timePassed be ? CalendarDateUntil(calendar, relativeTo, daysLater, untilOptions). - auto* time_passed = TRY(calendar_date_until(global_object, *calendar, relative_to, days_later, *until_options)); + auto* time_passed = TRY(calendar_date_until(vm, *calendar, relative_to, days_later, *until_options)); // n. Let yearsPassed be timePassed.[[Years]]. auto years_passed = time_passed->years(); @@ -1247,10 +1241,10 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d auto* old_relative_to = relative_to; // q. Let yearsDuration be ! CreateTemporalDuration(yearsPassed, 0, 0, 0, 0, 0, 0, 0, 0, 0). - years_duration = MUST(create_temporal_duration(global_object, years_passed, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + years_duration = MUST(create_temporal_duration(vm, years_passed, 0, 0, 0, 0, 0, 0, 0, 0, 0)); // r. Set relativeTo to ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). - relative_to = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_duration, nullptr, date_add)); + relative_to = TRY(calendar_date_add(vm, *calendar, relative_to, *years_duration, nullptr, date_add)); // s. Let daysPassed be DaysUntil(oldRelativeTo, relativeTo). auto days_passed = days_until(*old_relative_to, *relative_to); @@ -1262,10 +1256,10 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d auto sign = days < 0 ? -1 : 1; // v. Let oneYear be ! CreateTemporalDuration(sign, 0, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_year = MUST(create_temporal_duration(global_object, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_year = MUST(create_temporal_duration(vm, sign, 0, 0, 0, 0, 0, 0, 0, 0, 0)); // w. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear). - auto move_result = TRY(move_relative_date(global_object, *calendar, *relative_to, *one_year)); + auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_year)); // x. Let oneYearDays be moveResult.[[Days]]. auto one_year_days = move_result.days; @@ -1289,19 +1283,19 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d VERIFY(relative_to); // a. Let yearsMonths be ! CreateTemporalDuration(years, months, 0, 0, 0, 0, 0, 0, 0, 0). - auto* years_months = MUST(create_temporal_duration(global_object, years, months, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* years_months = MUST(create_temporal_duration(vm, years, months, 0, 0, 0, 0, 0, 0, 0, 0)); // b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). auto* date_add = TRY(Value(calendar).get_method(global_object, vm.names.dateAdd)); // c. Let yearsMonthsLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonths, undefined, dateAdd). - auto* years_months_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months, nullptr, date_add)); + auto* years_months_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_months, nullptr, date_add)); // d. Let yearsMonthsWeeks be ! CreateTemporalDuration(years, months, weeks, 0, 0, 0, 0, 0, 0, 0). - auto* years_months_weeks = MUST(create_temporal_duration(global_object, years, months, weeks, 0, 0, 0, 0, 0, 0, 0)); + auto* years_months_weeks = MUST(create_temporal_duration(vm, years, months, weeks, 0, 0, 0, 0, 0, 0, 0)); // e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd). - auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); + auto* years_months_weeks_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_months_weeks, nullptr, date_add)); // f. Let weeksInDays be DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater). auto weeks_in_days = days_until(*years_months_later, *years_months_weeks_later); @@ -1316,10 +1310,10 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d auto sign = days < 0 ? -1 : 1; // j. Let oneMonth be ! CreateTemporalDuration(0, sign, 0, 0, 0, 0, 0, 0, 0, 0). - auto* one_month = MUST(create_temporal_duration(global_object, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); + auto* one_month = MUST(create_temporal_duration(vm, 0, sign, 0, 0, 0, 0, 0, 0, 0, 0)); // k. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth). - auto move_result = TRY(move_relative_date(global_object, *calendar, *relative_to, *one_month)); + auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_month)); // l. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -1336,7 +1330,7 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d days -= one_month_days; // iii. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneMonth). - move_result = TRY(move_relative_date(global_object, *calendar, *relative_to, *one_month)); + move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_month)); // iv. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -1366,10 +1360,10 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d auto sign = days < 0 ? -1 : 1; // b. Let oneWeek be ! CreateTemporalDuration(0, 0, sign, 0, 0, 0, 0, 0, 0, 0). - auto* one_week = MUST(create_temporal_duration(global_object, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); + auto* one_week = MUST(create_temporal_duration(vm, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); // c. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek). - auto move_result = TRY(move_relative_date(global_object, *calendar, *relative_to, *one_week)); + auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_week)); // d. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -1386,7 +1380,7 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d days -= one_week_days; // iii. Set moveResult to ? MoveRelativeDate(calendar, relativeTo, oneWeek). - move_result = TRY(move_relative_date(global_object, *calendar, *relative_to, *one_week)); + move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_week)); // iv. Set relativeTo to moveResult.[[RelativeTo]]. relative_to = move_result.relative_to.cell(); @@ -1511,17 +1505,15 @@ ThrowCompletionOr round_duration(GlobalObject& global_object, d } // 19. Let duration be ? CreateDurationRecord(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). - auto duration = TRY(create_duration_record(global_object, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)); + auto duration = TRY(create_duration_record(vm, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)); // 20. Return the Record { [[DurationRecord]]: duration, [[Remainder]]: remainder }. return RoundedDuration { .duration_record = duration, .remainder = remainder }; } // 7.5.26 AdjustRoundedDurationDays ( years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, increment, unit, roundingMode, relativeTo ), https://tc39.es/proposal-temporal/#sec-temporal-adjustroundeddurationdays -ThrowCompletionOr adjust_rounded_duration_days(GlobalObject& global_object, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object) +ThrowCompletionOr adjust_rounded_duration_days(VM& vm, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object) { - auto& vm = global_object.vm(); - // 1. If Type(relativeTo) is not Object; or relativeTo does not have an [[InitializedTemporalZonedDateTime]] internal slot; or unit is one of "year", "month", "week", or "day"; or unit is "nanosecond" and increment is 1, then if (relative_to_object == nullptr || !is(relative_to_object) || unit.is_one_of("year"sv, "month"sv, "week"sv, "day"sv) || (unit == "nanosecond"sv && increment == 1)) { // a. Return ! CreateDurationRecord(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). @@ -1546,10 +1538,10 @@ ThrowCompletionOr adjust_rounded_duration_days(GlobalObject& glo direction = 1; // 6. Let dayStart be ? AddZonedDateTime(relativeTo.[[Nanoseconds]], relativeTo.[[TimeZone]], relativeTo.[[Calendar]], years, months, weeks, days, 0, 0, 0, 0, 0, 0). - auto* day_start = TRY(add_zoned_date_time(global_object, relative_to.nanoseconds(), &relative_to.time_zone(), relative_to.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); + auto* day_start = TRY(add_zoned_date_time(vm, relative_to.nanoseconds(), &relative_to.time_zone(), relative_to.calendar(), years, months, weeks, days, 0, 0, 0, 0, 0, 0)); // 7. Let dayEnd be ? AddZonedDateTime(dayStart, relativeTo.[[TimeZone]], relativeTo.[[Calendar]], 0, 0, 0, direction, 0, 0, 0, 0, 0, 0). - auto* day_end = TRY(add_zoned_date_time(global_object, *day_start, &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, direction, 0, 0, 0, 0, 0, 0)); + auto* day_end = TRY(add_zoned_date_time(vm, *day_start, &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, direction, 0, 0, 0, 0, 0, 0)); // 8. Let dayLengthNs be ℝ(dayEnd - dayStart). auto day_length_ns = day_end->big_integer().minus(day_start->big_integer()); @@ -1561,13 +1553,13 @@ ThrowCompletionOr adjust_rounded_duration_days(GlobalObject& glo } // 10. Set timeRemainderNs to ! RoundTemporalInstant(ℤ(timeRemainderNs - dayLengthNs), increment, unit, roundingMode). - time_remainder_ns = round_temporal_instant(global_object, *js_bigint(vm, time_remainder_ns.minus(day_length_ns)), increment, unit, rounding_mode)->big_integer(); + time_remainder_ns = round_temporal_instant(vm, *js_bigint(vm, time_remainder_ns.minus(day_length_ns)), increment, unit, rounding_mode)->big_integer(); // 11. Let adjustedDateDuration be ? AddDuration(years, months, weeks, days, 0, 0, 0, 0, 0, 0, 0, 0, 0, direction, 0, 0, 0, 0, 0, 0, relativeTo). - auto adjusted_date_duration = TRY(add_duration(global_object, years, months, weeks, days, 0, 0, 0, 0, 0, 0, 0, 0, 0, direction, 0, 0, 0, 0, 0, 0, &relative_to)); + auto adjusted_date_duration = TRY(add_duration(vm, years, months, weeks, days, 0, 0, 0, 0, 0, 0, 0, 0, 0, direction, 0, 0, 0, 0, 0, 0, &relative_to)); // 12. Let adjustedTimeDuration be ? BalanceDuration(0, 0, 0, 0, 0, 0, timeRemainderNs, "hour"). - auto adjusted_time_duration = TRY(balance_duration(global_object, 0, 0, 0, 0, 0, 0, time_remainder_ns, "hour"sv)); + auto adjusted_time_duration = TRY(balance_duration(vm, 0, 0, 0, 0, 0, 0, time_remainder_ns, "hour"sv)); // 13. Return ! CreateDurationRecord(adjustedDateDuration.[[Years]], adjustedDateDuration.[[Months]], adjustedDateDuration.[[Weeks]], adjustedDateDuration.[[Days]], adjustedTimeDuration.[[Hours]], adjustedTimeDuration.[[Minutes]], adjustedTimeDuration.[[Seconds]], adjustedTimeDuration.[[Milliseconds]], adjustedTimeDuration.[[Microseconds]], adjustedTimeDuration.[[Nanoseconds]]). return create_duration_record(adjusted_date_duration.years, adjusted_date_duration.months, adjusted_date_duration.weeks, adjusted_date_duration.days, adjusted_time_duration.hours, adjusted_time_duration.minutes, adjusted_time_duration.seconds, adjusted_time_duration.milliseconds, adjusted_time_duration.microseconds, adjusted_time_duration.nanoseconds); @@ -1712,25 +1704,25 @@ String temporal_duration_to_string(double years, double months, double weeks, do } // 7.5.28 AddDurationToOrSubtractDurationFromDuration ( operation, duration, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-adddurationtoorsubtractdurationfromduration -ThrowCompletionOr add_duration_to_or_subtract_duration_from_duration(GlobalObject& global_object, ArithmeticOperation operation, Duration const& duration, Value other_value, Value options_value) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_duration(VM& vm, ArithmeticOperation operation, Duration const& duration, Value other_value, Value options_value) { // 1. If operation is subtract, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == ArithmeticOperation::Subtract ? -1 : 1; // 2. Set other to ? ToTemporalDurationRecord(other). - auto other = TRY(to_temporal_duration_record(global_object, other_value)); + auto other = TRY(to_temporal_duration_record(vm, other_value)); // 3. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, options_value)); + auto const* options = TRY(get_options_object(vm, options_value)); // 4. Let relativeTo be ? ToRelativeTemporalObject(options). - auto relative_to = TRY(to_relative_temporal_object(global_object, *options)); + auto relative_to = TRY(to_relative_temporal_object(vm, *options)); // 5. Let result be ? AddDuration(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], sign × other.[[Years]], sign × other.[[Months]], sign × other.[[Weeks]], sign × other.[[Days]], sign × other.[[Hours]], sign × other.[[Minutes]], sign × other.[[Seconds]], sign × other.[[Milliseconds]], sign × other.[[Microseconds]], sign × other.[[Nanoseconds]], relativeTo). - auto result = TRY(add_duration(global_object, duration.years(), duration.months(), duration.weeks(), duration.days(), duration.hours(), duration.minutes(), duration.seconds(), duration.milliseconds(), duration.microseconds(), duration.nanoseconds(), sign * other.years, sign * other.months, sign * other.weeks, sign * other.days, sign * other.hours, sign * other.minutes, sign * other.seconds, sign * other.milliseconds, sign * other.microseconds, sign * other.nanoseconds, relative_to)); + auto result = TRY(add_duration(vm, duration.years(), duration.months(), duration.weeks(), duration.days(), duration.hours(), duration.minutes(), duration.seconds(), duration.milliseconds(), duration.microseconds(), duration.nanoseconds(), sign * other.years, sign * other.months, sign * other.weeks, sign * other.days, sign * other.hours, sign * other.minutes, sign * other.seconds, sign * other.milliseconds, sign * other.microseconds, sign * other.nanoseconds, relative_to)); // 6. Return ! CreateTemporalDuration(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, result.years, result.months, result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); + return MUST(create_temporal_duration(vm, result.years, result.months, result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h index 7dc3088517..b50a9ef9b5 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Duration.h @@ -135,30 +135,30 @@ auto temporal_duration_record_fields = [](VM& vm) { }; DurationRecord create_duration_record(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); -ThrowCompletionOr create_duration_record(GlobalObject&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); +ThrowCompletionOr create_duration_record(VM&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); DateDurationRecord create_date_duration_record(double years, double months, double weeks, double days); -ThrowCompletionOr create_date_duration_record(GlobalObject&, double years, double months, double weeks, double days); -ThrowCompletionOr create_time_duration_record(GlobalObject&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); -ThrowCompletionOr to_temporal_duration(GlobalObject&, Value item); -ThrowCompletionOr to_temporal_duration_record(GlobalObject&, Value temporal_duration_like); +ThrowCompletionOr create_date_duration_record(VM&, double years, double months, double weeks, double days); +ThrowCompletionOr create_time_duration_record(VM&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); +ThrowCompletionOr to_temporal_duration(VM&, Value item); +ThrowCompletionOr to_temporal_duration_record(VM&, Value temporal_duration_like); i8 duration_sign(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); bool is_valid_duration(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); StringView default_temporal_largest_unit(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds); -ThrowCompletionOr to_temporal_partial_duration_record(GlobalObject&, Value temporal_duration_like); -ThrowCompletionOr create_temporal_duration(GlobalObject&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target = nullptr); -Duration* create_negated_temporal_duration(GlobalObject& global_object, Duration const& duration); -ThrowCompletionOr calculate_offset_shift(GlobalObject&, Value relative_to_value, double years, double months, double weeks, double days); +ThrowCompletionOr to_temporal_partial_duration_record(VM&, Value temporal_duration_like); +ThrowCompletionOr create_temporal_duration(VM&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, FunctionObject const* new_target = nullptr); +Duration* create_negated_temporal_duration(VM&, Duration const& duration); +ThrowCompletionOr 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 balance_duration(GlobalObject&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, String const& largest_unit, Object* relative_to = nullptr); -ThrowCompletionOr unbalance_duration_relative(GlobalObject&, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to); -ThrowCompletionOr balance_duration_relative(GlobalObject&, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to); -ThrowCompletionOr add_duration(GlobalObject&, double years1, double months1, double weeks1, double days1, double hours1, double minutes1, double seconds1, double milliseconds1, double microseconds1, double nanoseconds1, double years2, double months2, double weeks2, double days2, double hours2, double minutes2, double seconds2, double milliseconds2, double microseconds2, double nanoseconds2, Value relative_to_value); -ThrowCompletionOr move_relative_date(GlobalObject&, Object& calendar, PlainDate& relative_to, Duration& duration); -ThrowCompletionOr move_relative_zoned_date_time(GlobalObject&, ZonedDateTime&, double years, double months, double weeks, double days); -ThrowCompletionOr round_duration(GlobalObject&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object = nullptr); -ThrowCompletionOr adjust_rounded_duration_days(GlobalObject& global_object, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object); +ThrowCompletionOr balance_duration(VM&, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, Crypto::SignedBigInteger const& nanoseconds, String const& largest_unit, Object* relative_to = nullptr); +ThrowCompletionOr unbalance_duration_relative(VM&, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to); +ThrowCompletionOr balance_duration_relative(VM&, double years, double months, double weeks, double days, String const& largest_unit, Value relative_to); +ThrowCompletionOr add_duration(VM&, double years1, double months1, double weeks1, double days1, double hours1, double minutes1, double seconds1, double milliseconds1, double microseconds1, double nanoseconds1, double years2, double months2, double weeks2, double days2, double hours2, double minutes2, double seconds2, double milliseconds2, double microseconds2, double nanoseconds2, Value relative_to_value); +ThrowCompletionOr move_relative_date(VM&, Object& calendar, PlainDate& relative_to, Duration& duration); +ThrowCompletionOr move_relative_zoned_date_time(VM&, ZonedDateTime&, double years, double months, double weeks, double days); +ThrowCompletionOr round_duration(VM&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object = nullptr); +ThrowCompletionOr adjust_rounded_duration_days(VM&, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, u32 increment, StringView unit, StringView rounding_mode, Object* relative_to_object); String temporal_duration_to_string(double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Variant const& precision); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_duration(GlobalObject&, ArithmeticOperation, Duration const&, Value other_value, Value options_value); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_duration(VM&, ArithmeticOperation, Duration const&, Value other_value, Value options_value); // 7.5.22 DaysUntil ( earlier, later ), https://tc39.es/proposal-temporal/#sec-temporal-daysuntil template diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp index d5008cc76f..c1e983ce83 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/DurationConstructor.cpp @@ -49,40 +49,39 @@ ThrowCompletionOr DurationConstructor::call() ThrowCompletionOr DurationConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); // 2. Let y be ? ToIntegerWithoutRounding(years). - auto y = TRY(to_integer_without_rounding(global_object, vm.argument(0), ErrorType::TemporalInvalidDuration)); + auto y = TRY(to_integer_without_rounding(vm, vm.argument(0), ErrorType::TemporalInvalidDuration)); // 3. Let mo be ? ToIntegerWithoutRounding(months). - auto mo = TRY(to_integer_without_rounding(global_object, vm.argument(1), ErrorType::TemporalInvalidDuration)); + auto mo = TRY(to_integer_without_rounding(vm, vm.argument(1), ErrorType::TemporalInvalidDuration)); // 4. Let w be ? ToIntegerWithoutRounding(weeks). - auto w = TRY(to_integer_without_rounding(global_object, vm.argument(2), ErrorType::TemporalInvalidDuration)); + auto w = TRY(to_integer_without_rounding(vm, vm.argument(2), ErrorType::TemporalInvalidDuration)); // 5. Let d be ? ToIntegerWithoutRounding(days). - auto d = TRY(to_integer_without_rounding(global_object, vm.argument(3), ErrorType::TemporalInvalidDuration)); + auto d = TRY(to_integer_without_rounding(vm, vm.argument(3), ErrorType::TemporalInvalidDuration)); // 6. Let h be ? ToIntegerWithoutRounding(hours). - auto h = TRY(to_integer_without_rounding(global_object, vm.argument(4), ErrorType::TemporalInvalidDuration)); + auto h = TRY(to_integer_without_rounding(vm, vm.argument(4), ErrorType::TemporalInvalidDuration)); // 7. Let m be ? ToIntegerWithoutRounding(minutes). - auto m = TRY(to_integer_without_rounding(global_object, vm.argument(5), ErrorType::TemporalInvalidDuration)); + auto m = TRY(to_integer_without_rounding(vm, vm.argument(5), ErrorType::TemporalInvalidDuration)); // 8. Let s be ? ToIntegerWithoutRounding(seconds). - auto s = TRY(to_integer_without_rounding(global_object, vm.argument(6), ErrorType::TemporalInvalidDuration)); + auto s = TRY(to_integer_without_rounding(vm, vm.argument(6), ErrorType::TemporalInvalidDuration)); // 9. Let ms be ? ToIntegerWithoutRounding(milliseconds). - auto ms = TRY(to_integer_without_rounding(global_object, vm.argument(7), ErrorType::TemporalInvalidDuration)); + auto ms = TRY(to_integer_without_rounding(vm, vm.argument(7), ErrorType::TemporalInvalidDuration)); // 10. Let mis be ? ToIntegerWithoutRounding(microseconds). - auto mis = TRY(to_integer_without_rounding(global_object, vm.argument(8), ErrorType::TemporalInvalidDuration)); + auto mis = TRY(to_integer_without_rounding(vm, vm.argument(8), ErrorType::TemporalInvalidDuration)); // 11. Let ns be ? ToIntegerWithoutRounding(nanoseconds). - auto ns = TRY(to_integer_without_rounding(global_object, vm.argument(9), ErrorType::TemporalInvalidDuration)); + auto ns = TRY(to_integer_without_rounding(vm, vm.argument(9), ErrorType::TemporalInvalidDuration)); // 12. Return ? CreateTemporalDuration(y, mo, w, d, h, m, s, ms, mis, ns, NewTarget). - return TRY(create_temporal_duration(global_object, y, mo, w, d, h, m, s, ms, mis, ns, &new_target)); + return TRY(create_temporal_duration(vm, y, mo, w, d, h, m, s, ms, mis, ns, &new_target)); } // 7.2.2 Temporal.Duration.from ( item ), https://tc39.es/proposal-temporal/#sec-temporal.duration.from @@ -95,33 +94,33 @@ JS_DEFINE_NATIVE_FUNCTION(DurationConstructor::from) auto& duration = static_cast(item.as_object()); // a. Return ! CreateTemporalDuration(item.[[Years]], item.[[Months]], item.[[Weeks]], item.[[Days]], item.[[Hours]], item.[[Minutes]], item.[[Seconds]], item.[[Milliseconds]], item.[[Microseconds]], item.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, duration.years(), duration.months(), duration.weeks(), duration.days(), duration.hours(), duration.minutes(), duration.seconds(), duration.milliseconds(), duration.microseconds(), duration.nanoseconds())); + return MUST(create_temporal_duration(vm, duration.years(), duration.months(), duration.weeks(), duration.days(), duration.hours(), duration.minutes(), duration.seconds(), duration.milliseconds(), duration.microseconds(), duration.nanoseconds())); } // 2. Return ? ToTemporalDuration(item). - return TRY(to_temporal_duration(global_object, item)); + return TRY(to_temporal_duration(vm, item)); } // 7.2.3 Temporal.Duration.compare ( one, two [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.duration.compare JS_DEFINE_NATIVE_FUNCTION(DurationConstructor::compare) { // 1. Set one to ? ToTemporalDuration(one). - auto* one = TRY(to_temporal_duration(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_duration(vm, vm.argument(0))); // 2. Set two to ? ToTemporalDuration(two). - auto* two = TRY(to_temporal_duration(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_duration(vm, vm.argument(1))); // 3. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(2))); + auto const* options = TRY(get_options_object(vm, vm.argument(2))); // 4. Let relativeTo be ? ToRelativeTemporalObject(options). - auto relative_to = TRY(to_relative_temporal_object(global_object, *options)); + auto relative_to = TRY(to_relative_temporal_object(vm, *options)); // 5. Let shift1 be ? CalculateOffsetShift(relativeTo, one.[[Years]], one.[[Months]], one.[[Weeks]], one.[[Days]]). - auto shift1 = TRY(calculate_offset_shift(global_object, relative_to, one->years(), one->months(), one->weeks(), one->days())); + auto shift1 = TRY(calculate_offset_shift(vm, relative_to, one->years(), one->months(), one->weeks(), one->days())); // 6. Let shift2 be ? CalculateOffsetShift(relativeTo, two.[[Years]], two.[[Months]], two.[[Weeks]], two.[[Days]]). - auto shift2 = TRY(calculate_offset_shift(global_object, relative_to, two->years(), two->months(), two->weeks(), two->days())); + auto shift2 = TRY(calculate_offset_shift(vm, relative_to, two->years(), two->months(), two->weeks(), two->days())); double days1; double days2; @@ -129,10 +128,10 @@ JS_DEFINE_NATIVE_FUNCTION(DurationConstructor::compare) // 7. If any of one.[[Years]], two.[[Years]], one.[[Months]], two.[[Months]], one.[[Weeks]], or two.[[Weeks]] are not 0, then if (one->years() != 0 || two->years() != 0 || one->months() != 0 || two->months() != 0 || one->weeks() != 0 || two->weeks() != 0) { // a. Let unbalanceResult1 be ? UnbalanceDurationRelative(one.[[Years]], one.[[Months]], one.[[Weeks]], one.[[Days]], "day", relativeTo). - auto unbalance_result1 = TRY(unbalance_duration_relative(global_object, one->years(), one->months(), one->weeks(), one->days(), "day", relative_to)); + auto unbalance_result1 = TRY(unbalance_duration_relative(vm, one->years(), one->months(), one->weeks(), one->days(), "day", relative_to)); // b. Let unbalanceResult2 be ? UnbalanceDurationRelative(two.[[Years]], two.[[Months]], two.[[Weeks]], two.[[Days]], "day", relativeTo). - auto unbalance_result2 = TRY(unbalance_duration_relative(global_object, two->years(), two->months(), two->weeks(), two->days(), "day", relative_to)); + auto unbalance_result2 = TRY(unbalance_duration_relative(vm, two->years(), two->months(), two->weeks(), two->days(), "day", relative_to)); // c. Let days1 be unbalanceResult1.[[Days]]. days1 = unbalance_result1.days; diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp index da6a4b548d..a31231aa62 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/DurationPrototype.cpp @@ -203,7 +203,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::with) auto* duration = TRY(typed_this_object(global_object)); // 3. Let temporalDurationLike be ? ToTemporalPartialDurationRecord(temporalDurationLike). - auto temporal_duration_like = TRY(to_temporal_partial_duration_record(global_object, vm.argument(0))); + auto temporal_duration_like = TRY(to_temporal_partial_duration_record(vm, vm.argument(0))); // 4. If temporalDurationLike.[[Years]] is not undefined, then // a. Let years be temporalDurationLike.[[Years]]. @@ -266,7 +266,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::with) auto nanoseconds = temporal_duration_like.nanoseconds.value_or(duration->nanoseconds()); // 24. Return ? CreateTemporalDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). - return TRY(create_temporal_duration(global_object, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)); + return TRY(create_temporal_duration(vm, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds)); } // 7.3.16 Temporal.Duration.prototype.negated ( ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.negated @@ -277,7 +277,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::negated) auto* duration = TRY(typed_this_object(global_object)); // 3. Return ! CreateNegatedTemporalDuration(duration). - return create_negated_temporal_duration(global_object, *duration); + return create_negated_temporal_duration(vm, *duration); } // 7.3.17 Temporal.Duration.prototype.abs ( ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.abs @@ -288,7 +288,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::abs) auto* duration = TRY(typed_this_object(global_object)); // 3. Return ! CreateTemporalDuration(abs(duration.[[Years]]), abs(duration.[[Months]]), abs(duration.[[Weeks]]), abs(duration.[[Days]]), abs(duration.[[Hours]]), abs(duration.[[Minutes]]), abs(duration.[[Seconds]]), abs(duration.[[Milliseconds]]), abs(duration.[[Microseconds]]), abs(duration.[[Nanoseconds]])). - return TRY(create_temporal_duration(global_object, fabs(duration->years()), fabs(duration->months()), fabs(duration->weeks()), fabs(duration->days()), fabs(duration->hours()), fabs(duration->minutes()), fabs(duration->seconds()), fabs(duration->milliseconds()), fabs(duration->microseconds()), fabs(duration->nanoseconds()))); + return TRY(create_temporal_duration(vm, fabs(duration->years()), fabs(duration->months()), fabs(duration->weeks()), fabs(duration->days()), fabs(duration->hours()), fabs(duration->minutes()), fabs(duration->seconds()), fabs(duration->milliseconds()), fabs(duration->microseconds()), fabs(duration->nanoseconds()))); } // 7.3.18 Temporal.Duration.prototype.add ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.add @@ -302,7 +302,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::add) auto* duration = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromDuration(add, duration, other, options). - return TRY(add_duration_to_or_subtract_duration_from_duration(global_object, ArithmeticOperation::Add, *duration, other, options)); + return TRY(add_duration_to_or_subtract_duration_from_duration(vm, ArithmeticOperation::Add, *duration, other, options)); } // 7.3.19 Temporal.Duration.prototype.subtract ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.subtract @@ -316,7 +316,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::subtract) auto* duration = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromDuration(subtract, duration, other, options). - return TRY(add_duration_to_or_subtract_duration_from_duration(global_object, ArithmeticOperation::Subtract, *duration, other, options)); + return TRY(add_duration_to_or_subtract_duration_from_duration(vm, ArithmeticOperation::Subtract, *duration, other, options)); } // 7.3.20 Temporal.Duration.prototype.round ( roundTo ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.round @@ -349,7 +349,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::round) // 5. Else, else { // a. Set roundTo to ? GetOptionsObject(roundTo). - round_to = TRY(get_options_object(global_object, vm.argument(0))); + round_to = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let smallestUnitPresent be true. @@ -359,7 +359,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::round) bool largest_unit_present = true; // 8. Let smallestUnit be ? GetTemporalUnit(roundTo, "smallestUnit", datetime, undefined). - auto smallest_unit = TRY(get_temporal_unit(global_object, *round_to, vm.names.smallestUnit, UnitGroup::DateTime, Optional {})); + auto smallest_unit = TRY(get_temporal_unit(vm, *round_to, vm.names.smallestUnit, UnitGroup::DateTime, Optional {})); // 9. If smallestUnit is undefined, then if (!smallest_unit.has_value()) { @@ -377,7 +377,7 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::round) default_largest_unit = larger_of_two_temporal_units(default_largest_unit, *smallest_unit); // 12. Let largestUnit be ? GetTemporalUnit(roundTo, "largestUnit", datetime, undefined, « "auto" »). - auto largest_unit = TRY(get_temporal_unit(global_object, *round_to, vm.names.largestUnit, UnitGroup::DateTime, Optional {}, { "auto"sv })); + auto largest_unit = TRY(get_temporal_unit(vm, *round_to, vm.names.largestUnit, UnitGroup::DateTime, Optional {}, { "auto"sv })); // 13. If largestUnit is undefined, then if (!largest_unit.has_value()) { @@ -404,43 +404,43 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::round) return vm.throw_completion(ErrorType::TemporalInvalidUnitRange, *smallest_unit, *largest_unit); // 17. Let roundingMode be ? ToTemporalRoundingMode(roundTo, "halfExpand"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *round_to, "halfExpand"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *round_to, "halfExpand"sv)); // 18. Let maximum be ! MaximumTemporalDurationRoundingIncrement(smallestUnit). auto maximum = maximum_temporal_duration_rounding_increment(*smallest_unit); // 19. Let roundingIncrement be ? ToTemporalRoundingIncrement(roundTo, maximum, false). - auto rounding_increment = TRY(to_temporal_rounding_increment(global_object, *round_to, Optional(maximum), false)); + auto rounding_increment = TRY(to_temporal_rounding_increment(vm, *round_to, Optional(maximum), false)); // 20. Let relativeTo be ? ToRelativeTemporalObject(roundTo). - auto relative_to = TRY(to_relative_temporal_object(global_object, *round_to)); + auto relative_to = TRY(to_relative_temporal_object(vm, *round_to)); // 21. Let unbalanceResult be ? UnbalanceDurationRelative(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], largestUnit, relativeTo). - auto unbalance_result = TRY(unbalance_duration_relative(global_object, duration->years(), duration->months(), duration->weeks(), duration->days(), *largest_unit, relative_to)); + auto unbalance_result = TRY(unbalance_duration_relative(vm, duration->years(), duration->months(), duration->weeks(), duration->days(), *largest_unit, relative_to)); // 22. Let roundResult be (? RoundDuration(unbalanceResult.[[Years]], unbalanceResult.[[Months]], unbalanceResult.[[Weeks]], unbalanceResult.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], roundingIncrement, smallestUnit, roundingMode, relativeTo)).[[DurationRecord]]. - auto round_result = TRY(round_duration(global_object, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, unbalance_result.days, duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), duration->nanoseconds(), rounding_increment, *smallest_unit, rounding_mode, relative_to.is_object() ? &relative_to.as_object() : nullptr)).duration_record; + auto round_result = TRY(round_duration(vm, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, unbalance_result.days, duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), duration->nanoseconds(), rounding_increment, *smallest_unit, rounding_mode, relative_to.is_object() ? &relative_to.as_object() : nullptr)).duration_record; // 23. Let adjustResult be ? AdjustRoundedDurationDays(roundResult.[[Years]], roundResult.[[Months]], roundResult.[[Weeks]], roundResult.[[Days]], roundResult.[[Hours]], roundResult.[[Minutes]], roundResult.[[Seconds]], roundResult.[[Milliseconds]], roundResult.[[Microseconds]], roundResult.[[Nanoseconds]], roundingIncrement, smallestUnit, roundingMode, relativeTo). - auto adjust_result = TRY(adjust_rounded_duration_days(global_object, round_result.years, round_result.months, round_result.weeks, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, round_result.nanoseconds, rounding_increment, *smallest_unit, rounding_mode, relative_to.is_object() ? &relative_to.as_object() : nullptr)); + auto adjust_result = TRY(adjust_rounded_duration_days(vm, round_result.years, round_result.months, round_result.weeks, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, round_result.nanoseconds, rounding_increment, *smallest_unit, rounding_mode, relative_to.is_object() ? &relative_to.as_object() : nullptr)); // 24. Let balanceResult be ? BalanceDurationRelative(adjustResult.[[Years]], adjustResult.[[Months]], adjustResult.[[Weeks]], adjustResult.[[Days]], largestUnit, relativeTo). - auto balance_result = TRY(balance_duration_relative(global_object, adjust_result.years, adjust_result.months, adjust_result.weeks, adjust_result.days, *largest_unit, relative_to)); + auto balance_result = TRY(balance_duration_relative(vm, adjust_result.years, adjust_result.months, adjust_result.weeks, adjust_result.days, *largest_unit, relative_to)); // 25. If Type(relativeTo) is Object and relativeTo has an [[InitializedTemporalZonedDateTime]] internal slot, then if (relative_to.is_object() && is(relative_to.as_object())) { auto& relative_to_zoned_date_time = static_cast(relative_to.as_object()); // a. Set relativeTo to ? MoveRelativeZonedDateTime(relativeTo, balanceResult.[[Years]], balanceResult.[[Months]], balanceResult.[[Weeks]], 0). - relative_to = TRY(move_relative_zoned_date_time(global_object, relative_to_zoned_date_time, balance_result.years, balance_result.months, balance_result.weeks, 0)); + relative_to = TRY(move_relative_zoned_date_time(vm, relative_to_zoned_date_time, balance_result.years, balance_result.months, balance_result.weeks, 0)); } // 26. Let result be ? BalanceDuration(balanceResult.[[Days]], adjustResult.[[Hours]], adjustResult.[[Minutes]], adjustResult.[[Seconds]], adjustResult.[[Milliseconds]], adjustResult.[[Microseconds]], adjustResult.[[Nanoseconds]], largestUnit, relativeTo). // FIXME: Narrowing conversion from 'double' to 'i64' - auto result = TRY(balance_duration(global_object, balance_result.days, adjust_result.hours, adjust_result.minutes, adjust_result.seconds, adjust_result.milliseconds, adjust_result.microseconds, Crypto::SignedBigInteger::create_from(adjust_result.nanoseconds), *largest_unit, relative_to.is_object() ? &relative_to.as_object() : nullptr)); + auto result = TRY(balance_duration(vm, balance_result.days, adjust_result.hours, adjust_result.minutes, adjust_result.seconds, adjust_result.milliseconds, adjust_result.microseconds, Crypto::SignedBigInteger::create_from(adjust_result.nanoseconds), *largest_unit, relative_to.is_object() ? &relative_to.as_object() : nullptr)); // 27. Return ! CreateTemporalDuration(balanceResult.[[Years]], balanceResult.[[Months]], balanceResult.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, balance_result.years, balance_result.months, balance_result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); + return MUST(create_temporal_duration(vm, balance_result.years, balance_result.months, balance_result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds)); } // 7.3.21 Temporal.Duration.prototype.total ( totalOf ), https://tc39.es/proposal-temporal/#sec-temporal.duration.prototype.total @@ -471,17 +471,17 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::total) // 5. Else, else { // a. Set totalOf to ? GetOptionsObject(totalOf). - total_of = TRY(get_options_object(global_object, vm.argument(0))); + total_of = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let relativeTo be ? ToRelativeTemporalObject(totalOf). - auto relative_to = TRY(to_relative_temporal_object(global_object, *total_of)); + auto relative_to = TRY(to_relative_temporal_object(vm, *total_of)); // 7. Let unit be ? GetTemporalUnit(totalOf, "unit", datetime, required). - auto unit = TRY(get_temporal_unit(global_object, *total_of, vm.names.unit, UnitGroup::DateTime, TemporalUnitRequired {})); + auto unit = TRY(get_temporal_unit(vm, *total_of, vm.names.unit, UnitGroup::DateTime, TemporalUnitRequired {})); // 8. Let unbalanceResult be ? UnbalanceDurationRelative(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], unit, relativeTo). - auto unbalance_result = TRY(unbalance_duration_relative(global_object, duration->years(), duration->months(), duration->weeks(), duration->days(), *unit, relative_to)); + auto unbalance_result = TRY(unbalance_duration_relative(vm, duration->years(), duration->months(), duration->weeks(), duration->days(), *unit, relative_to)); // 9. Let intermediate be undefined. ZonedDateTime* intermediate = nullptr; @@ -491,14 +491,14 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::total) auto& relative_to_zoned_date_time = static_cast(relative_to.as_object()); // a. Set intermediate to ? MoveRelativeZonedDateTime(relativeTo, unbalanceResult.[[Years]], unbalanceResult.[[Months]], unbalanceResult.[[Weeks]], 0). - intermediate = TRY(move_relative_zoned_date_time(global_object, relative_to_zoned_date_time, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, 0)); + intermediate = TRY(move_relative_zoned_date_time(vm, relative_to_zoned_date_time, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, 0)); } // 11. Let balanceResult be ? BalanceDuration(unbalanceResult.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], unit, intermediate). - auto balance_result = TRY(balance_duration(global_object, unbalance_result.days, duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from(duration->nanoseconds()), *unit, intermediate)); + auto balance_result = TRY(balance_duration(vm, unbalance_result.days, duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from(duration->nanoseconds()), *unit, intermediate)); // 12. Let roundRecord be ? RoundDuration(unbalanceResult.[[Years]], unbalanceResult.[[Months]], unbalanceResult.[[Weeks]], balanceResult.[[Days]], balanceResult.[[Hours]], balanceResult.[[Minutes]], balanceResult.[[Seconds]], balanceResult.[[Milliseconds]], balanceResult.[[Microseconds]], balanceResult.[[Nanoseconds]], 1, unit, "trunc", relativeTo). - auto round_record = TRY(round_duration(global_object, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, balance_result.days, balance_result.hours, balance_result.minutes, balance_result.seconds, balance_result.milliseconds, balance_result.microseconds, balance_result.nanoseconds, 1, *unit, "trunc"sv, relative_to.is_object() ? &relative_to.as_object() : nullptr)); + auto round_record = TRY(round_duration(vm, unbalance_result.years, unbalance_result.months, unbalance_result.weeks, balance_result.days, balance_result.hours, balance_result.minutes, balance_result.seconds, balance_result.milliseconds, balance_result.microseconds, balance_result.nanoseconds, 1, *unit, "trunc"sv, relative_to.is_object() ? &relative_to.as_object() : nullptr)); // 13. Let roundResult be roundRecord.[[DurationRecord]]. auto& round_result = round_record.duration_record; @@ -571,20 +571,20 @@ JS_DEFINE_NATIVE_FUNCTION(DurationPrototype::to_string) auto* duration = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(0))); + auto const* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let precision be ? ToSecondsStringPrecision(options). - auto precision = TRY(to_seconds_string_precision(global_object, *options)); + auto precision = TRY(to_seconds_string_precision(vm, *options)); // 5. If precision.[[Unit]] is "minute", throw a RangeError exception. if (precision.unit == "minute"sv) return vm.throw_completion(ErrorType::OptionIsNotValidValue, "minute"sv, "smallestUnit"sv); // 6. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc"sv)); // 7. Let result be (? RoundDuration(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], precision.[[Increment]], precision.[[Unit]], roundingMode)).[[DurationRecord]]. - auto result = TRY(round_duration(global_object, duration->years(), duration->months(), duration->weeks(), duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), duration->nanoseconds(), precision.increment, precision.unit, rounding_mode)).duration_record; + auto result = TRY(round_duration(vm, duration->years(), duration->months(), duration->weeks(), duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), duration->nanoseconds(), precision.increment, precision.unit, rounding_mode)).duration_record; // 8. Return ! TemporalDurationToString(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]], precision.[[Precision]]). return js_string(vm, temporal_duration_to_string(result.years, result.months, result.weeks, result.days, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds, precision.precision)); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Instant.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Instant.cpp index 8f423a8cf3..7984c3e2ff 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Instant.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Instant.cpp @@ -50,8 +50,11 @@ bool is_valid_epoch_nanoseconds(BigInt const& epoch_nanoseconds) } // 8.5.2 CreateTemporalInstant ( epochNanoseconds [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalinstant -ThrowCompletionOr create_temporal_instant(GlobalObject& global_object, BigInt const& epoch_nanoseconds, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_instant(VM& vm, BigInt const& epoch_nanoseconds, FunctionObject const* new_target) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(epochNanoseconds) is BigInt. // 2. Assert: ! IsValidEpochNanoseconds(epochNanoseconds) is true. @@ -70,8 +73,11 @@ ThrowCompletionOr create_temporal_instant(GlobalObject& global_object, } // 8.5.3 ToTemporalInstant ( item ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalinstant -ThrowCompletionOr to_temporal_instant(GlobalObject& global_object, Value item) +ThrowCompletionOr to_temporal_instant(VM& vm, Value item) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If Type(item) is Object, then if (item.is_object()) { // a. If item has an [[InitializedTemporalInstant]] internal slot, then @@ -85,7 +91,7 @@ ThrowCompletionOr to_temporal_instant(GlobalObject& global_object, Val auto& zoned_date_time = static_cast(item.as_object()); // i. Return ! CreateTemporalInstant(item.[[Nanoseconds]]). - return create_temporal_instant(global_object, zoned_date_time.nanoseconds()); + return create_temporal_instant(vm, zoned_date_time.nanoseconds()); } } @@ -93,21 +99,19 @@ ThrowCompletionOr to_temporal_instant(GlobalObject& global_object, Val auto string = TRY(item.to_string(global_object)); // 3. Let epochNanoseconds be ? ParseTemporalInstant(string). - auto* epoch_nanoseconds = TRY(parse_temporal_instant(global_object, string)); + auto* epoch_nanoseconds = TRY(parse_temporal_instant(vm, string)); // 4. Return ! CreateTemporalInstant(ℤ(epochNanoseconds)). - return create_temporal_instant(global_object, *epoch_nanoseconds); + return create_temporal_instant(vm, *epoch_nanoseconds); } // 8.5.4 ParseTemporalInstant ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalinstant -ThrowCompletionOr parse_temporal_instant(GlobalObject& global_object, String const& iso_string) +ThrowCompletionOr parse_temporal_instant(VM& vm, String const& iso_string) { - auto& vm = global_object.vm(); - // 1. Assert: Type(isoString) is String. // 2. Let result be ? ParseTemporalInstantString(isoString). - auto result = TRY(parse_temporal_instant_string(global_object, iso_string)); + auto result = TRY(parse_temporal_instant_string(vm, iso_string)); // 3. Let offsetString be result.[[TimeZoneOffsetString]]. auto& offset_string = result.time_zone_offset; @@ -116,10 +120,10 @@ ThrowCompletionOr parse_temporal_instant(GlobalObject& global_object, S VERIFY(offset_string.has_value()); // 5. Let utc be GetEpochFromISOParts(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]). - auto* utc = get_epoch_from_iso_parts(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond); + auto* utc = get_epoch_from_iso_parts(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond); // 6. Let offsetNanoseconds be ? ParseTimeZoneOffsetString(offsetString). - auto offset_nanoseconds = TRY(parse_time_zone_offset_string(global_object, *offset_string)); + auto offset_nanoseconds = TRY(parse_time_zone_offset_string(vm, *offset_string)); // 7. Let result be utc - ℤ(offsetNanoseconds). auto* result_ns = js_bigint(vm, utc->big_integer().minus(Crypto::SignedBigInteger::create_from(offset_nanoseconds))); @@ -150,10 +154,8 @@ i32 compare_epoch_nanoseconds(BigInt const& epoch_nanoseconds_one, BigInt const& } // 8.5.6 AddInstant ( epochNanoseconds, hours, minutes, seconds, milliseconds, microseconds, nanoseconds ), https://tc39.es/proposal-temporal/#sec-temporal-addinstant -ThrowCompletionOr add_instant(GlobalObject& global_object, BigInt const& epoch_nanoseconds, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) +ThrowCompletionOr add_instant(VM& vm, BigInt const& epoch_nanoseconds, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds) { - auto& vm = global_object.vm(); - VERIFY(hours == trunc(hours) && minutes == trunc(minutes) && seconds == trunc(seconds) && milliseconds == trunc(milliseconds) && microseconds == trunc(microseconds) && nanoseconds == trunc(nanoseconds)); // 1. Let result be epochNanoseconds + ℤ(nanoseconds) + ℤ(microseconds) × 1000ℤ + ℤ(milliseconds) × 10^6ℤ + ℤ(seconds) × 10^9ℤ + ℤ(minutes) × 60ℤ × 10^9ℤ + ℤ(hours) × 3600ℤ × 10^9ℤ. @@ -176,22 +178,18 @@ ThrowCompletionOr add_instant(GlobalObject& global_object, BigInt const } // 8.5.7 DifferenceInstant ( ns1, ns2, roundingIncrement, smallestUnit, roundingMode ), https://tc39.es/proposal-temporal/#sec-temporal-differenceinstant -BigInt* difference_instant(GlobalObject& global_object, BigInt const& nanoseconds1, BigInt const& nanoseconds2, u64 rounding_increment, StringView smallest_unit, StringView rounding_mode) +BigInt* difference_instant(VM& vm, BigInt const& nanoseconds1, BigInt const& nanoseconds2, u64 rounding_increment, StringView smallest_unit, StringView rounding_mode) { - auto& vm = global_object.vm(); - // 1. Assert: Type(ns1) is BigInt. // 2. Assert: Type(ns2) is BigInt. // 3. Return ! RoundTemporalInstant(ns2 - ns1, roundingIncrement, smallestUnit, roundingMode). - return round_temporal_instant(global_object, *js_bigint(vm, nanoseconds2.big_integer().minus(nanoseconds1.big_integer())), rounding_increment, smallest_unit, rounding_mode); + return round_temporal_instant(vm, *js_bigint(vm, nanoseconds2.big_integer().minus(nanoseconds1.big_integer())), rounding_increment, smallest_unit, rounding_mode); } // 8.5.8 RoundTemporalInstant ( ns, increment, unit, roundingMode ), https://tc39.es/proposal-temporal/#sec-temporal-roundtemporalinstant -BigInt* round_temporal_instant(GlobalObject& global_object, BigInt const& nanoseconds, u64 increment, StringView unit, StringView rounding_mode) +BigInt* round_temporal_instant(VM& vm, BigInt const& nanoseconds, u64 increment, StringView unit, StringView rounding_mode) { - auto& vm = global_object.vm(); - // 1. Assert: Type(ns) is BigInt. u64 increment_nanoseconds; @@ -234,7 +232,7 @@ BigInt* round_temporal_instant(GlobalObject& global_object, BigInt const& nanose } // 8.5.9 TemporalInstantToString ( instant, timeZone, precision ), https://tc39.es/proposal-temporal/#sec-temporal-temporalinstanttostring -ThrowCompletionOr temporal_instant_to_string(GlobalObject& global_object, Instant& instant, Value time_zone, Variant const& precision) +ThrowCompletionOr temporal_instant_to_string(VM& vm, Instant& instant, Value time_zone, Variant const& precision) { // 1. Assert: Type(instant) is Object. // 2. Assert: instant has an [[InitializedTemporalInstant]] internal slot. @@ -245,17 +243,17 @@ ThrowCompletionOr temporal_instant_to_string(GlobalObject& global_object // 4. If outputTimeZone is undefined, then if (output_time_zone.is_undefined()) { // a. Set outputTimeZone to ! CreateTemporalTimeZone("UTC"). - output_time_zone = MUST(create_temporal_time_zone(global_object, "UTC"sv)); + output_time_zone = MUST(create_temporal_time_zone(vm, "UTC"sv)); } // 5. Let isoCalendar be ! GetISO8601Calendar(). - auto* iso_calendar = get_iso8601_calendar(global_object); + auto* iso_calendar = get_iso8601_calendar(vm); // 6. Let dateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(outputTimeZone, instant, isoCalendar). - auto* date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, output_time_zone, instant, *iso_calendar)); + auto* date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, output_time_zone, instant, *iso_calendar)); // 7. Let dateTimeString be ? TemporalDateTimeToString(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], undefined, precision, "never"). - auto date_time_string = TRY(temporal_date_time_to_string(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), js_undefined(), precision, "never"sv)); + auto date_time_string = TRY(temporal_date_time_to_string(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), js_undefined(), precision, "never"sv)); String time_zone_string; @@ -267,7 +265,7 @@ ThrowCompletionOr temporal_instant_to_string(GlobalObject& global_object // 9. Else, else { // a. Let offsetNs be ? GetOffsetNanosecondsFor(timeZone, instant). - auto offset_ns = TRY(get_offset_nanoseconds_for(global_object, time_zone, instant)); + auto offset_ns = TRY(get_offset_nanoseconds_for(vm, time_zone, instant)); // b. Let timeZoneString be ! FormatISOTimeZoneOffsetString(offsetNs). time_zone_string = format_iso_time_zone_offset_string(offset_ns); @@ -278,39 +276,37 @@ ThrowCompletionOr temporal_instant_to_string(GlobalObject& global_object } // 8.5.10 DifferenceTemporalInstant ( operation, instant, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalinstant -ThrowCompletionOr difference_temporal_instant(GlobalObject& global_object, DifferenceOperation operation, Instant const& instant, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_instant(VM& vm, DifferenceOperation operation, Instant const& instant, Value other_value, Value options_value) { // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalInstant(other). - auto* other = TRY(to_temporal_instant(global_object, other_value)); + auto* other = TRY(to_temporal_instant(vm, other_value)); // 3. Let settings be ? GetDifferenceSettings(operation, options, time, « », "nanosecond", "second"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::Time, {}, { "nanosecond"sv }, "second"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::Time, {}, { "nanosecond"sv }, "second"sv)); // 4. Let roundedNs be ! DifferenceInstant(instant.[[Nanoseconds]], other.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). - auto* rounded_ns = difference_instant(global_object, instant.nanoseconds(), other->nanoseconds(), settings.rounding_increment, settings.smallest_unit, settings.rounding_mode); + auto* rounded_ns = difference_instant(vm, instant.nanoseconds(), other->nanoseconds(), settings.rounding_increment, settings.smallest_unit, settings.rounding_mode); // 5. Assert: The following steps cannot fail due to overflow in the Number domain because abs(roundedNs) ≤ 2 × nsMaxInstant. // 6. Let result be ! BalanceDuration(0, 0, 0, 0, 0, 0, roundedNs, settings.[[LargestUnit]]). - auto result = MUST(balance_duration(global_object, 0, 0, 0, 0, 0, 0, rounded_ns->big_integer(), settings.largest_unit)); + auto result = MUST(balance_duration(vm, 0, 0, 0, 0, 0, 0, rounded_ns->big_integer(), settings.largest_unit)); // 7. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, 0, 0, 0, 0, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); + return MUST(create_temporal_duration(vm, 0, 0, 0, 0, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); } // 8.5.11 AddDurationToOrSubtractDurationFromInstant ( operation, instant, temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal-adddurationtoorsubtractdurationfrominstant -ThrowCompletionOr add_duration_to_or_subtract_duration_from_instant(GlobalObject& global_object, ArithmeticOperation operation, Instant const& instant, Value temporal_duration_like) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_instant(VM& vm, ArithmeticOperation operation, Instant const& instant, Value temporal_duration_like) { - auto& vm = global_object.vm(); - // 1. If operation is subtract, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == ArithmeticOperation::Subtract ? -1 : 1; // 2. Let duration be ? ToTemporalDurationRecord(temporalDurationLike). - auto duration = TRY(to_temporal_duration_record(global_object, temporal_duration_like)); + auto duration = TRY(to_temporal_duration_record(vm, temporal_duration_like)); // 3. If duration.[[Days]] is not 0, throw a RangeError exception. if (duration.days != 0) @@ -329,10 +325,10 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_instant(Gl return vm.throw_completion(ErrorType::TemporalInvalidDurationPropertyValueNonZero, "years", duration.years); // 7. Let ns be ? AddInstant(instant.[[Nanoseconds]], sign × duration.[[Hours]], sign × duration.[[Minutes]], sign × duration.[[Seconds]], sign × duration.[[Milliseconds]], sign × duration.[[Microseconds]], sign × duration.[[Nanoseconds]]). - auto* ns = TRY(add_instant(global_object, instant.nanoseconds(), sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds)); + auto* ns = TRY(add_instant(vm, instant.nanoseconds(), sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds)); // 8. Return ! CreateTemporalInstant(ns). - return MUST(create_temporal_instant(global_object, *ns)); + return MUST(create_temporal_instant(vm, *ns)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Instant.h b/Userland/Libraries/LibJS/Runtime/Temporal/Instant.h index 7a3800bc51..cf5f2b74fe 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Instant.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Instant.h @@ -41,15 +41,15 @@ static auto const ns_max_instant = "8640000000000000000000"_sbigint; static auto const ns_min_instant = "-8640000000000000000000"_sbigint; bool is_valid_epoch_nanoseconds(BigInt const& epoch_nanoseconds); -ThrowCompletionOr create_temporal_instant(GlobalObject&, BigInt const& nanoseconds, FunctionObject const* new_target = nullptr); -ThrowCompletionOr to_temporal_instant(GlobalObject&, Value item); -ThrowCompletionOr parse_temporal_instant(GlobalObject&, String const& iso_string); +ThrowCompletionOr create_temporal_instant(VM&, BigInt const& nanoseconds, FunctionObject const* new_target = nullptr); +ThrowCompletionOr to_temporal_instant(VM&, Value item); +ThrowCompletionOr parse_temporal_instant(VM&, String const& iso_string); i32 compare_epoch_nanoseconds(BigInt const&, BigInt const&); -ThrowCompletionOr add_instant(GlobalObject&, BigInt const& epoch_nanoseconds, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); -BigInt* difference_instant(GlobalObject&, BigInt const& nanoseconds1, BigInt const& nanoseconds2, u64 rounding_increment, StringView smallest_unit, StringView rounding_mode); -BigInt* round_temporal_instant(GlobalObject&, BigInt const& nanoseconds, u64 increment, StringView unit, StringView rounding_mode); -ThrowCompletionOr temporal_instant_to_string(GlobalObject&, Instant&, Value time_zone, Variant const& precision); -ThrowCompletionOr difference_temporal_instant(GlobalObject&, DifferenceOperation, Instant const&, Value other, Value options); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_instant(GlobalObject&, ArithmeticOperation, Instant const&, Value temporal_duration_like); +ThrowCompletionOr add_instant(VM&, BigInt const& epoch_nanoseconds, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds); +BigInt* difference_instant(VM&, BigInt const& nanoseconds1, BigInt const& nanoseconds2, u64 rounding_increment, StringView smallest_unit, StringView rounding_mode); +BigInt* round_temporal_instant(VM&, BigInt const& nanoseconds, u64 increment, StringView unit, StringView rounding_mode); +ThrowCompletionOr temporal_instant_to_string(VM&, Instant&, Value time_zone, Variant const& precision); +ThrowCompletionOr difference_temporal_instant(VM&, DifferenceOperation, Instant const&, Value other, Value options); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_instant(VM&, ArithmeticOperation, Instant const&, Value temporal_duration_like); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp index caef8ae4b3..b708002e69 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/InstantConstructor.cpp @@ -62,7 +62,7 @@ ThrowCompletionOr InstantConstructor::construct(FunctionObject& new_tar return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 4. Return ? CreateTemporalInstant(epochNanoseconds, NewTarget). - return TRY(create_temporal_instant(global_object, *epoch_nanoseconds, &new_target)); + return TRY(create_temporal_instant(vm, *epoch_nanoseconds, &new_target)); } // 8.2.2 Temporal.Instant.from ( item ), https://tc39.es/proposal-temporal/#sec-temporal.instant.from @@ -73,11 +73,11 @@ JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::from) // 1. If Type(item) is Object and item has an [[InitializedTemporalInstant]] internal slot, then if (item.is_object() && is(item.as_object())) { // a. Return ! CreateTemporalInstant(item.[[Nanoseconds]]). - return MUST(create_temporal_instant(global_object, *js_bigint(vm, static_cast(item.as_object()).nanoseconds().big_integer()))); + return MUST(create_temporal_instant(vm, *js_bigint(vm, static_cast(item.as_object()).nanoseconds().big_integer()))); } // 2. Return ? ToTemporalInstant(item). - return TRY(to_temporal_instant(global_object, item)); + return TRY(to_temporal_instant(vm, item)); } // 8.2.3 Temporal.Instant.fromEpochSeconds ( epochSeconds ), https://tc39.es/proposal-temporal/#sec-temporal.instant.fromepochseconds @@ -97,7 +97,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::from_epoch_seconds) return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 5. Return ! CreateTemporalInstant(epochNanoseconds). - return MUST(create_temporal_instant(global_object, *epoch_nanoseconds)); + return MUST(create_temporal_instant(vm, *epoch_nanoseconds)); } // 8.2.4 Temporal.Instant.fromEpochMilliseconds ( epochMilliseconds ), https://tc39.es/proposal-temporal/#sec-temporal.instant.fromepochmilliseconds @@ -117,7 +117,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::from_epoch_milliseconds) return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 5. Return ! CreateTemporalInstant(epochNanoseconds). - return MUST(create_temporal_instant(global_object, *epoch_nanoseconds)); + return MUST(create_temporal_instant(vm, *epoch_nanoseconds)); } // 8.2.5 Temporal.Instant.fromEpochMicroseconds ( epochMicroseconds ), https://tc39.es/proposal-temporal/#sec-temporal.instant.fromepochmicroseconds @@ -134,7 +134,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::from_epoch_microseconds) return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 4. Return ! CreateTemporalInstant(epochNanoseconds). - return MUST(create_temporal_instant(global_object, *epoch_nanoseconds)); + return MUST(create_temporal_instant(vm, *epoch_nanoseconds)); } // 8.2.6 Temporal.Instant.fromEpochNanoseconds ( epochNanoseconds ), https://tc39.es/proposal-temporal/#sec-temporal.instant.fromepochnanoseconds @@ -148,17 +148,17 @@ JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::from_epoch_nanoseconds) return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 3. Return ! CreateTemporalInstant(epochNanoseconds). - return MUST(create_temporal_instant(global_object, *epoch_nanoseconds)); + return MUST(create_temporal_instant(vm, *epoch_nanoseconds)); } // 8.2.7 Temporal.Instant.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.instant.compare JS_DEFINE_NATIVE_FUNCTION(InstantConstructor::compare) { // 1. Set one to ? ToTemporalInstant(one). - auto* one = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_instant(vm, vm.argument(0))); // 2. Set two to ? ToTemporalInstant(two). - auto* two = TRY(to_temporal_instant(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_instant(vm, vm.argument(1))); // 3. Return 𝔽(! CompareEpochNanoseconds(one.[[Nanoseconds]], two.[[Nanoseconds]])). return Value(compare_epoch_nanoseconds(one->nanoseconds(), two->nanoseconds())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp index 937025f054..3ccf9a9a82 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp @@ -128,7 +128,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::add) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromInstant(add, instant, temporalDurationLike). - return TRY(add_duration_to_or_subtract_duration_from_instant(global_object, ArithmeticOperation::Add, *instant, temporal_duration_like)); + return TRY(add_duration_to_or_subtract_duration_from_instant(vm, ArithmeticOperation::Add, *instant, temporal_duration_like)); } // 8.3.8 Temporal.Instant.prototype.subtract ( temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.subtract @@ -141,7 +141,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::subtract) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromInstant(subtract, instant, temporalDurationLike). - return TRY(add_duration_to_or_subtract_duration_from_instant(global_object, ArithmeticOperation::Subtract, *instant, temporal_duration_like)); + return TRY(add_duration_to_or_subtract_duration_from_instant(vm, ArithmeticOperation::Subtract, *instant, temporal_duration_like)); } // 8.3.9 Temporal.Instant.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.until @@ -155,7 +155,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::until) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalInstant(until, instant, other, options). - return TRY(difference_temporal_instant(global_object, DifferenceOperation::Until, *instant, other, options)); + return TRY(difference_temporal_instant(vm, DifferenceOperation::Until, *instant, other, options)); } // 8.3.10 Temporal.Instant.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.since @@ -169,7 +169,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::since) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalInstant(since, instant, other, options). - return TRY(difference_temporal_instant(global_object, DifferenceOperation::Since, *instant, other, options)); + return TRY(difference_temporal_instant(vm, DifferenceOperation::Since, *instant, other, options)); } // 8.3.11 Temporal.Instant.prototype.round ( roundTo ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.round @@ -202,11 +202,11 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::round) // 5. Else, else { // a. Set roundTo to ? GetOptionsObject(roundTo). - round_to = TRY(get_options_object(global_object, vm.argument(0))); + round_to = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let smallestUnit be ? GetTemporalUnit(roundTo, "smallestUnit", time, required). - auto smallest_unit_value = TRY(get_temporal_unit(global_object, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {})); + auto smallest_unit_value = TRY(get_temporal_unit(vm, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {})); // 6. If smallestUnit is undefined, throw a RangeError exception. if (!smallest_unit_value.has_value()) @@ -216,7 +216,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::round) auto& smallest_unit = *smallest_unit_value; // 7. Let roundingMode be ? ToTemporalRoundingMode(roundTo, "halfExpand"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *round_to, "halfExpand")); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *round_to, "halfExpand")); double maximum; // 8. If smallestUnit is "hour", then @@ -253,13 +253,13 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::round) } // 14. Let roundingIncrement be ? ToTemporalRoundingIncrement(roundTo, maximum, true). - auto rounding_increment = TRY(to_temporal_rounding_increment(global_object, *round_to, maximum, true)); + auto rounding_increment = TRY(to_temporal_rounding_increment(vm, *round_to, maximum, true)); // 15. Let roundedNs be ! RoundTemporalInstant(instant.[[Nanoseconds]], roundingIncrement, smallestUnit, roundingMode). - auto* rounded_ns = round_temporal_instant(global_object, instant->nanoseconds(), rounding_increment, smallest_unit, rounding_mode); + auto* rounded_ns = round_temporal_instant(vm, instant->nanoseconds(), rounding_increment, smallest_unit, rounding_mode); // 16. Return ! CreateTemporalInstant(roundedNs). - return MUST(create_temporal_instant(global_object, *rounded_ns)); + return MUST(create_temporal_instant(vm, *rounded_ns)); } // 8.3.12 Temporal.Instant.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.equals @@ -270,7 +270,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::equals) auto* instant = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalInstant(other). - auto other = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto other = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. If instant.[[Nanoseconds]] ≠ other.[[Nanoseconds]], return false. if (instant->nanoseconds().big_integer() != other->nanoseconds().big_integer()) @@ -288,7 +288,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_string) auto* instant = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(0))); + auto const* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let timeZone be ? Get(options, "timeZone"). auto time_zone = TRY(options->get(vm.names.timeZone)); @@ -296,23 +296,23 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_string) // 5. If timeZone is not undefined, then if (!time_zone.is_undefined()) { // a. Set timeZone to ? ToTemporalTimeZone(timeZone). - time_zone = TRY(to_temporal_time_zone(global_object, time_zone)); + time_zone = TRY(to_temporal_time_zone(vm, time_zone)); } // 6. Let precision be ? ToSecondsStringPrecision(options). - auto precision = TRY(to_seconds_string_precision(global_object, *options)); + auto precision = TRY(to_seconds_string_precision(vm, *options)); // 7. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc"sv)); // 8. Let roundedNs be ! RoundTemporalInstant(instant.[[Nanoseconds]], precision.[[Increment]], precision.[[Unit]], roundingMode). - auto* rounded_ns = round_temporal_instant(global_object, instant->nanoseconds(), precision.increment, precision.unit, rounding_mode); + auto* rounded_ns = round_temporal_instant(vm, instant->nanoseconds(), precision.increment, precision.unit, rounding_mode); // 9. Let roundedInstant be ! CreateTemporalInstant(roundedNs). - auto* rounded_instant = MUST(create_temporal_instant(global_object, *rounded_ns)); + auto* rounded_instant = MUST(create_temporal_instant(vm, *rounded_ns)); // 10. Return ? TemporalInstantToString(roundedInstant, timeZone, precision.[[Precision]]). - return js_string(vm, TRY(temporal_instant_to_string(global_object, *rounded_instant, time_zone, precision.precision))); + return js_string(vm, TRY(temporal_instant_to_string(vm, *rounded_instant, time_zone, precision.precision))); } // 8.3.14 Temporal.Instant.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.tolocalestring @@ -324,7 +324,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_locale_string) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? TemporalInstantToString(instant, undefined, "auto"). - return js_string(vm, TRY(temporal_instant_to_string(global_object, *instant, js_undefined(), "auto"sv))); + return js_string(vm, TRY(temporal_instant_to_string(vm, *instant, js_undefined(), "auto"sv))); } // 8.3.15 Temporal.Instant.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.tojson @@ -335,7 +335,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_json) auto* instant = TRY(typed_this_object(global_object)); // 3. Return ? TemporalInstantToString(instant, undefined, "auto"). - return js_string(vm, TRY(temporal_instant_to_string(global_object, *instant, js_undefined(), "auto"sv))); + return js_string(vm, TRY(temporal_instant_to_string(vm, *instant, js_undefined(), "auto"sv))); } // 8.3.16 Temporal.Instant.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.valueof @@ -370,7 +370,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_zoned_date_time) } // 6. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar(vm, calendar_like)); // 7. Let temporalTimeZoneLike be ? Get(item, "timeZone"). auto temporal_time_zone_like = TRY(item.as_object().get(vm.names.timeZone)); @@ -382,10 +382,10 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_zoned_date_time) } // 9. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike). - auto* time_zone = TRY(to_temporal_time_zone(global_object, temporal_time_zone_like)); + auto* time_zone = TRY(to_temporal_time_zone(vm, temporal_time_zone_like)); // 10. Return ? CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, calendar). - return TRY(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), *time_zone, *calendar)); + return TRY(create_temporal_zoned_date_time(vm, instant->nanoseconds(), *time_zone, *calendar)); } // 8.3.18 Temporal.Instant.prototype.toZonedDateTimeISO ( item ), https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.tozoneddatetimeiso @@ -410,13 +410,13 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_zoned_date_time_iso) } // 4. Let timeZone be ? ToTemporalTimeZone(item). - auto* time_zone = TRY(to_temporal_time_zone(global_object, item)); + auto* time_zone = TRY(to_temporal_time_zone(vm, item)); // 5. Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 6. Return ? CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, calendar). - return TRY(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), *time_zone, *calendar)); + return TRY(create_temporal_zoned_date_time(vm, instant->nanoseconds(), *time_zone, *calendar)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp index 88ccb39048..e732924a3f 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp @@ -50,14 +50,14 @@ void Now::initialize(Realm& realm) JS_DEFINE_NATIVE_FUNCTION(Now::time_zone) { // 1. Return ! SystemTimeZone(). - return system_time_zone(global_object); + return system_time_zone(vm); } // 2.2.2 Temporal.Now.instant ( ), https://tc39.es/proposal-temporal/#sec-temporal.now.instant JS_DEFINE_NATIVE_FUNCTION(Now::instant) { // 1. Return ! SystemInstant(). - return system_instant(global_object); + return system_instant(vm); } // 2.2.3 Temporal.Now.plainDateTime ( calendarLike [ , temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.plaindatetime @@ -67,7 +67,7 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_date_time) auto temporal_time_zone_like = vm.argument(1); // 1. Return ? SystemDateTime(temporalTimeZoneLike, calendarLike). - return TRY(system_date_time(global_object, temporal_time_zone_like, calendar_like)); + return TRY(system_date_time(vm, temporal_time_zone_like, calendar_like)); } // 2.2.4 Temporal.Now.plainDateTimeISO ( [ temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.plaindatetimeiso @@ -76,10 +76,10 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_date_time_iso) auto temporal_time_zone_like = vm.argument(0); // 1, Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 2. Return ? SystemDateTime(temporalTimeZoneLike, calendar). - return TRY(system_date_time(global_object, temporal_time_zone_like, calendar)); + return TRY(system_date_time(vm, temporal_time_zone_like, calendar)); } // 2.2.5 Temporal.Now.zonedDateTime ( calendarLike [ , temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.zoneddatetime @@ -89,7 +89,7 @@ JS_DEFINE_NATIVE_FUNCTION(Now::zoned_date_time) auto temporal_time_zone_like = vm.argument(1); // 1. Return ? SystemZonedDateTime(temporalTimeZoneLike, calendarLike). - return TRY(system_zoned_date_time(global_object, temporal_time_zone_like, calendar_like)); + return TRY(system_zoned_date_time(vm, temporal_time_zone_like, calendar_like)); } // 2.2.6 Temporal.Now.zonedDateTimeISO ( [ temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.zoneddatetimeiso @@ -98,10 +98,10 @@ JS_DEFINE_NATIVE_FUNCTION(Now::zoned_date_time_iso) auto temporal_time_zone_like = vm.argument(0); // 1, Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 2. Return ? SystemZonedDateTime(temporalTimeZoneLike, calendar). - return TRY(system_zoned_date_time(global_object, temporal_time_zone_like, calendar)); + return TRY(system_zoned_date_time(vm, temporal_time_zone_like, calendar)); } // 2.2.7 Temporal.Now.plainDate ( calendarLike [ , temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.plaindate @@ -111,10 +111,10 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_date) auto temporal_time_zone_like = vm.argument(1); // 1. Let dateTime be ? SystemDateTime(temporalTimeZoneLike, calendarLike). - auto* date_time = TRY(system_date_time(global_object, temporal_time_zone_like, calendar_like)); + auto* date_time = TRY(system_date_time(vm, temporal_time_zone_like, calendar_like)); // 2. Return ! CreateTemporalDate(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[Calendar]]). - return MUST(create_temporal_date(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); + return MUST(create_temporal_date(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); } // 2.2.8 Temporal.Now.plainDateISO ( [ temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.plaindateiso @@ -123,13 +123,13 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_date_iso) auto temporal_time_zone_like = vm.argument(0); // 1. Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 2. Let dateTime be ? SystemDateTime(temporalTimeZoneLike, calendar). - auto* date_time = TRY(system_date_time(global_object, temporal_time_zone_like, calendar)); + auto* date_time = TRY(system_date_time(vm, temporal_time_zone_like, calendar)); // 3. Return ! CreateTemporalDate(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[Calendar]]). - return MUST(create_temporal_date(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); + return MUST(create_temporal_date(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); } // 2.2.9 Temporal.Now.plainTimeISO ( [ temporalTimeZoneLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.now.plaintimeiso @@ -138,27 +138,27 @@ JS_DEFINE_NATIVE_FUNCTION(Now::plain_time_iso) auto temporal_time_zone_like = vm.argument(0); // 1. Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 2. Let dateTime be ? SystemDateTime(temporalTimeZoneLike, calendar). - auto* date_time = TRY(system_date_time(global_object, temporal_time_zone_like, calendar)); + auto* date_time = TRY(system_date_time(vm, temporal_time_zone_like, calendar)); // 3. Return ! CreateTemporalTime(dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]]). - return MUST(create_temporal_time(global_object, date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond())); + return MUST(create_temporal_time(vm, date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond())); } // 2.3.1 SystemTimeZone ( ), https://tc39.es/proposal-temporal/#sec-temporal-systemtimezone -TimeZone* system_time_zone(GlobalObject& global_object) +TimeZone* system_time_zone(VM& vm) { // 1. Let identifier be ! DefaultTimeZone(). auto identifier = default_time_zone(); // 2. Return ! CreateTemporalTimeZone(identifier). - return MUST(create_temporal_time_zone(global_object, identifier)); + return MUST(create_temporal_time_zone(vm, identifier)); } // 2.3.2 SystemUTCEpochNanoseconds ( ), https://tc39.es/proposal-temporal/#sec-temporal-systemutcepochnanoseconds -BigInt* system_utc_epoch_nanoseconds(GlobalObject& global_object) +BigInt* system_utc_epoch_nanoseconds(VM& vm) { // 1. Let ns be the approximate current UTC date and time, in nanoseconds since the epoch. auto now = Time::now_realtime().to_nanoseconds(); @@ -169,69 +169,69 @@ BigInt* system_utc_epoch_nanoseconds(GlobalObject& global_object) // if an overflow occurs during seconds -> nanoseconds conversion. // 3. Return ℤ(ns). - return js_bigint(global_object.heap(), move(ns)); + return js_bigint(vm, move(ns)); } // 2.3.3 SystemInstant ( ), https://tc39.es/proposal-temporal/#sec-temporal-systeminstant -Instant* system_instant(GlobalObject& global_object) +Instant* system_instant(VM& vm) { // 1. Let ns be ! SystemUTCEpochNanoseconds(). - auto* ns = system_utc_epoch_nanoseconds(global_object); + auto* ns = system_utc_epoch_nanoseconds(vm); // 2. Return ! CreateTemporalInstant(ns). - return MUST(create_temporal_instant(global_object, *ns)); + return MUST(create_temporal_instant(vm, *ns)); } // 2.3.4 SystemDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemdatetime -ThrowCompletionOr system_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like) +ThrowCompletionOr system_date_time(VM& vm, Value temporal_time_zone_like, Value calendar_like) { Object* time_zone; // 1. If temporalTimeZoneLike is undefined, then if (temporal_time_zone_like.is_undefined()) { // a. Let timeZone be ! SystemTimeZone(). - time_zone = system_time_zone(global_object); + time_zone = system_time_zone(vm); } // 2. Else, else { // a. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike). - time_zone = TRY(to_temporal_time_zone(global_object, temporal_time_zone_like)); + time_zone = TRY(to_temporal_time_zone(vm, temporal_time_zone_like)); } // 3. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar(vm, calendar_like)); // 4. Let instant be ! SystemInstant(). - auto* instant = system_instant(global_object); + auto* instant = system_instant(vm); // 5. Return ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - return builtin_time_zone_get_plain_date_time_for(global_object, time_zone, *instant, *calendar); + return builtin_time_zone_get_plain_date_time_for(vm, time_zone, *instant, *calendar); } // 2.3.5 SystemZonedDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemzoneddatetime -ThrowCompletionOr system_zoned_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like) +ThrowCompletionOr system_zoned_date_time(VM& vm, Value temporal_time_zone_like, Value calendar_like) { Object* time_zone; // 1. If temporalTimeZoneLike is undefined, then if (temporal_time_zone_like.is_undefined()) { // a. Let timeZone be ! SystemTimeZone(). - time_zone = system_time_zone(global_object); + time_zone = system_time_zone(vm); } // 2. Else, else { // a. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike). - time_zone = TRY(to_temporal_time_zone(global_object, temporal_time_zone_like)); + time_zone = TRY(to_temporal_time_zone(vm, temporal_time_zone_like)); } // 3. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar(vm, calendar_like)); // 4. Let ns be ! SystemUTCEpochNanoseconds(). - auto* ns = system_utc_epoch_nanoseconds(global_object); + auto* ns = system_utc_epoch_nanoseconds(vm); // 5. Return ? CreateTemporalZonedDateTime(ns, timeZone, calendar). - return create_temporal_zoned_date_time(global_object, *ns, *time_zone, *calendar); + return create_temporal_zoned_date_time(vm, *ns, *time_zone, *calendar); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/Now.h b/Userland/Libraries/LibJS/Runtime/Temporal/Now.h index a0486d5977..fe4e358218 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/Now.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/Now.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Linus Groh + * Copyright (c) 2021-2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ @@ -31,10 +31,10 @@ private: JS_DECLARE_NATIVE_FUNCTION(plain_time_iso); }; -TimeZone* system_time_zone(GlobalObject&); -BigInt* system_utc_epoch_nanoseconds(GlobalObject&); -Instant* system_instant(GlobalObject&); -ThrowCompletionOr system_date_time(GlobalObject&, Value temporal_time_zone_like, Value calendar_like); -ThrowCompletionOr system_zoned_date_time(GlobalObject&, Value temporal_time_zone_like, Value calendar_like); +TimeZone* system_time_zone(VM&); +BigInt* system_utc_epoch_nanoseconds(VM&); +Instant* system_instant(VM&); +ThrowCompletionOr system_date_time(VM&, Value temporal_time_zone_like, Value calendar_like); +ThrowCompletionOr system_zoned_date_time(VM&, Value temporal_time_zone_like, Value calendar_like); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp index 5130e68804..e0a5dd59cc 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp @@ -48,9 +48,10 @@ ISODateRecord create_iso_date_record(i32 year, u8 month, u8 day) } // 3.5.1 CreateTemporalDate ( isoYear, isoMonth, isoDay, calendar [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporaldate -ThrowCompletionOr create_temporal_date(GlobalObject& global_object, i32 iso_year, u8 iso_month, u8 iso_day, Object& calendar, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_date(VM& vm, i32 iso_year, u8 iso_month, u8 iso_day, Object& calendar, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: isoYear is an integer. // 2. Assert: isoMonth is an integer. @@ -62,7 +63,7 @@ ThrowCompletionOr create_temporal_date(GlobalObject& global_object, return vm.throw_completion(ErrorType::TemporalInvalidPlainDate); // 6. If ISODateTimeWithinLimits(isoYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0) is false, throw a RangeError exception. - if (!iso_date_time_within_limits(global_object, iso_year, iso_month, iso_day, 12, 0, 0, 0, 0, 0)) + if (!iso_date_time_within_limits(vm, iso_year, iso_month, iso_day, 12, 0, 0, 0, 0, 0)) return vm.throw_completion(ErrorType::TemporalInvalidPlainDate); // 7. If newTarget is not present, set newTarget to %Temporal.PlainDate%. @@ -80,9 +81,10 @@ ThrowCompletionOr create_temporal_date(GlobalObject& global_object, } // 3.5.2 ToTemporalDate ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaldate -ThrowCompletionOr to_temporal_date(GlobalObject& global_object, Value item, Object const* options) +ThrowCompletionOr to_temporal_date(VM& vm, Value item, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -101,16 +103,16 @@ ThrowCompletionOr to_temporal_date(GlobalObject& global_object, Valu auto& zoned_date_time = static_cast(item_object); // i. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // ii. Let instant be ! CreateTemporalInstant(item.[[Nanoseconds]]). - auto* instant = create_temporal_instant(global_object, zoned_date_time.nanoseconds()).release_value(); + auto* instant = create_temporal_instant(vm, zoned_date_time.nanoseconds()).release_value(); // iii. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(item.[[TimeZone]], instant, item.[[Calendar]]). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar())); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar())); // iv. Return ! CreateTemporalDate(plainDateTime.[[ISOYear]], plainDateTime.[[ISOMonth]], plainDateTime.[[ISODay]], plainDateTime.[[Calendar]]). - return create_temporal_date(global_object, plain_date_time->iso_year(), plain_date_time->iso_month(), plain_date_time->iso_day(), plain_date_time->calendar()); + return create_temporal_date(vm, plain_date_time->iso_year(), plain_date_time->iso_month(), plain_date_time->iso_day(), plain_date_time->calendar()); } // c. If item has an [[InitializedTemporalDateTime]] internal slot, then @@ -118,46 +120,46 @@ ThrowCompletionOr to_temporal_date(GlobalObject& global_object, Valu auto& date_time_item = static_cast(item_object); // i. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // ii. Return ! CreateTemporalDate(item.[[ISOYear]], item.[[ISOMonth]], item.[[ISODay]], item.[[Calendar]]). - return create_temporal_date(global_object, date_time_item.iso_year(), date_time_item.iso_month(), date_time_item.iso_day(), date_time_item.calendar()); + return create_temporal_date(vm, date_time_item.iso_year(), date_time_item.iso_month(), date_time_item.iso_day(), date_time_item.calendar()); } // d. Let calendar be ? GetTemporalCalendarWithISODefault(item). - auto* calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object)); + auto* calendar = TRY(get_temporal_calendar_with_iso_default(vm, item_object)); // e. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, item_object, field_names, Vector {})); // g. Return ? CalendarDateFromFields(calendar, fields, options). - return calendar_date_from_fields(global_object, *calendar, *fields, options); + return calendar_date_from_fields(vm, *calendar, *fields, options); } // 4. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // 5. Let string be ? ToString(item). auto string = TRY(item.to_string(global_object)); // 6. Let result be ? ParseTemporalDateString(string). - auto result = TRY(parse_temporal_date_string(global_object, string)); + auto result = TRY(parse_temporal_date_string(vm, string)); // 7. Assert: IsValidISODate(result.[[Year]], result.[[Month]], result.[[Day]]) is true. VERIFY(is_valid_iso_date(result.year, result.month, result.day)); // 8. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); // 9. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar). - return create_temporal_date(global_object, result.year, result.month, result.day, *calendar); + return create_temporal_date(vm, result.year, result.month, result.day, *calendar); } // 3.5.3 DifferenceISODate ( y1, m1, d1, y2, m2, d2, largestUnit ), https://tc39.es/proposal-temporal/#sec-temporal-differenceisodate -DateDurationRecord difference_iso_date(GlobalObject& global_object, i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2, StringView largest_unit) +DateDurationRecord difference_iso_date(VM& vm, i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2, StringView largest_unit) { VERIFY(largest_unit.is_one_of("year"sv, "month"sv, "week"sv, "day"sv)); @@ -180,7 +182,7 @@ DateDurationRecord difference_iso_date(GlobalObject& global_object, i32 year1, u double years = end.year - start.year; // f. Let mid be ! AddISODate(y1, m1, d1, years, 0, 0, 0, "constrain"). - auto mid = MUST(add_iso_date(global_object, year1, month1, day1, years, 0, 0, 0, "constrain"sv)); + auto mid = MUST(add_iso_date(vm, year1, month1, day1, years, 0, 0, 0, "constrain"sv)); // g. Let midSign be -(! CompareISODate(mid.[[Year]], mid.[[Month]], mid.[[Day]], y2, m2, d2)). auto mid_sign = -compare_iso_date(mid.year, mid.month, mid.day, year2, month2, day2); @@ -208,7 +210,7 @@ DateDurationRecord difference_iso_date(GlobalObject& global_object, i32 year1, u } // k. Set mid to ! AddISODate(y1, m1, d1, years, months, 0, 0, "constrain"). - mid = MUST(add_iso_date(global_object, year1, month1, day1, years, months, 0, 0, "constrain"sv)); + mid = MUST(add_iso_date(vm, year1, month1, day1, years, months, 0, 0, "constrain"sv)); // l. Set midSign to -(! CompareISODate(mid.[[Year]], mid.[[Month]], mid.[[Day]], y2, m2, d2)). mid_sign = -compare_iso_date(mid.year, mid.month, mid.day, year2, month2, day2); @@ -238,7 +240,7 @@ DateDurationRecord difference_iso_date(GlobalObject& global_object, i32 year1, u } // iii. Set mid to ! AddISODate(y1, m1, d1, years, months, 0, 0, "constrain"). - mid = MUST(add_iso_date(global_object, year1, month1, day1, years, months, 0, 0, "constrain"sv)); + mid = MUST(add_iso_date(vm, year1, month1, day1, years, months, 0, 0, "constrain"sv)); } double days; @@ -310,10 +312,8 @@ DateDurationRecord difference_iso_date(GlobalObject& global_object, i32 year1, u } // 3.5.4 RegulateISODate ( year, month, day, overflow ), https://tc39.es/proposal-temporal/#sec-temporal-regulateisodate -ThrowCompletionOr regulate_iso_date(GlobalObject& global_object, double year, double month, double day, StringView overflow) +ThrowCompletionOr regulate_iso_date(VM& vm, double year, double month, double day, StringView overflow) { - auto& vm = global_object.vm(); - VERIFY(year == trunc(year) && month == trunc(month) && day == trunc(day)); // 1. If overflow is "constrain", then @@ -417,8 +417,11 @@ String pad_iso_year(i32 y) } // 3.5.8 TemporalDateToString ( temporalDate, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporaldatetostring -ThrowCompletionOr temporal_date_to_string(GlobalObject& global_object, PlainDate& temporal_date, StringView show_calendar) +ThrowCompletionOr temporal_date_to_string(VM& vm, PlainDate& temporal_date, StringView show_calendar) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(temporalDate) is Object. // 2. Assert: temporalDate has an [[InitializedTemporalDate]] internal slot. @@ -442,7 +445,7 @@ ThrowCompletionOr temporal_date_to_string(GlobalObject& global_object, P } // 3.5.9 AddISODate ( year, month, day, years, months, weeks, days, overflow ), https://tc39.es/proposal-temporal/#sec-temporal-addisodate -ThrowCompletionOr add_iso_date(GlobalObject& global_object, i32 year, u8 month, u8 day, double years, double months, double weeks, double days, StringView overflow) +ThrowCompletionOr add_iso_date(VM& vm, i32 year, u8 month, u8 day, double years, double months, double weeks, double days, StringView overflow) { // 1. Assert: year, month, day, years, months, weeks, and days are integers. VERIFY(years == trunc(years) && months == trunc(months) && weeks == trunc(weeks) && days == trunc(days)); @@ -454,7 +457,7 @@ ThrowCompletionOr add_iso_date(GlobalObject& global_object, i32 y auto intermediate_year_month = balance_iso_year_month(year + years, month + months); // 4. Let intermediate be ? RegulateISODate(intermediate.[[Year]], intermediate.[[Month]], day, overflow). - auto intermediate = TRY(regulate_iso_date(global_object, intermediate_year_month.year, intermediate_year_month.month, day, overflow)); + auto intermediate = TRY(regulate_iso_date(vm, intermediate_year_month.year, intermediate_year_month.month, day, overflow)); // 5. Set days to days + 7 × weeks. days += 7 * weeks; @@ -500,39 +503,37 @@ i8 compare_iso_date(i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2 } // 3.5.11 DifferenceTemporalPlainDate ( operation, temporalDate, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplaindate -ThrowCompletionOr difference_temporal_plain_date(GlobalObject& global_object, DifferenceOperation operation, PlainDate& temporal_date, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_plain_date(VM& vm, DifferenceOperation operation, PlainDate& temporal_date, Value other_value, Value options_value) { - auto& vm = global_object.vm(); - // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalDate(other). - auto* other = TRY(to_temporal_date(global_object, other_value)); + auto* other = TRY(to_temporal_date(vm, other_value)); // 3. If ? CalendarEquals(temporalDate.[[Calendar]], other.[[Calendar]]) is false, throw a RangeError exception. - if (!TRY(calendar_equals(global_object, temporal_date.calendar(), other->calendar()))) + if (!TRY(calendar_equals(vm, temporal_date.calendar(), other->calendar()))) return vm.throw_completion(ErrorType::TemporalDifferentCalendars); // 4. Let settings be ? GetDifferenceSettings(operation, options, date, « », "day", "day"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::Date, {}, { "day"sv }, "day"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::Date, {}, { "day"sv }, "day"sv)); // 5. Let untilOptions be ? MergeLargestUnitOption(settings.[[Options]], settings.[[LargestUnit]]). - auto* until_options = TRY(merge_largest_unit_option(global_object, settings.options, settings.largest_unit)); + auto* until_options = TRY(merge_largest_unit_option(vm, settings.options, settings.largest_unit)); // 6. Let result be ? CalendarDateUntil(temporalDate.[[Calendar]], temporalDate, other, untilOptions). - auto* duration = TRY(calendar_date_until(global_object, temporal_date.calendar(), &temporal_date, other, *until_options)); + auto* duration = TRY(calendar_date_until(vm, temporal_date.calendar(), &temporal_date, other, *until_options)); auto result = DurationRecord { duration->years(), duration->months(), duration->weeks(), duration->days(), 0, 0, 0, 0, 0, 0 }; // 7. If settings.[[SmallestUnit]] is not "day" or settings.[[RoundingIncrement]] ≠ 1, then if (settings.smallest_unit != "day"sv || settings.rounding_increment != 1) { // a. Set result to (? RoundDuration(result.[[Years]], result.[[Months]], result.[[Weeks]], result.[[Days]], 0, 0, 0, 0, 0, 0, settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]], temporalDate)).[[DurationRecord]]. - result = TRY(round_duration(global_object, result.years, result.months, result.weeks, result.days, 0, 0, 0, 0, 0, 0, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &temporal_date)).duration_record; + result = TRY(round_duration(vm, result.years, result.months, result.weeks, result.days, 0, 0, 0, 0, 0, 0, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &temporal_date)).duration_record; } // 16. Return ! CreateTemporalDuration(sign × result.[[Years]], sign × result.[[Months]], sign × result.[[Weeks]], sign × result.[[Days]], 0, 0, 0, 0, 0, 0). - return TRY(create_temporal_duration(global_object, sign * result.years, sign * result.months, sign * result.weeks, sign * result.days, 0, 0, 0, 0, 0, 0)); + return TRY(create_temporal_duration(vm, sign * result.years, sign * result.months, sign * result.weeks, sign * result.days, 0, 0, 0, 0, 0, 0)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.h index d8418cecea..9cc63ca7f5 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.h @@ -45,16 +45,16 @@ struct ISODateRecord { }; ISODateRecord create_iso_date_record(i32 year, u8 month, u8 day); -ThrowCompletionOr create_temporal_date(GlobalObject&, i32 iso_year, u8 iso_month, u8 iso_day, Object& calendar, FunctionObject const* new_target = nullptr); -ThrowCompletionOr to_temporal_date(GlobalObject&, Value item, Object const* options = nullptr); -DateDurationRecord difference_iso_date(GlobalObject&, i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2, StringView largest_unit); -ThrowCompletionOr regulate_iso_date(GlobalObject&, double year, double month, double day, StringView overflow); +ThrowCompletionOr create_temporal_date(VM&, i32 iso_year, u8 iso_month, u8 iso_day, Object& calendar, FunctionObject const* new_target = nullptr); +ThrowCompletionOr to_temporal_date(VM&, Value item, Object const* options = nullptr); +DateDurationRecord difference_iso_date(VM&, i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2, StringView largest_unit); +ThrowCompletionOr regulate_iso_date(VM&, double year, double month, double day, StringView overflow); bool is_valid_iso_date(i32 year, u8 month, u8 day); ISODateRecord balance_iso_date(double year, double month, double day); String pad_iso_year(i32 y); -ThrowCompletionOr temporal_date_to_string(GlobalObject&, PlainDate&, StringView show_calendar); -ThrowCompletionOr add_iso_date(GlobalObject&, i32 year, u8 month, u8 day, double years, double months, double weeks, double days, StringView overflow); +ThrowCompletionOr temporal_date_to_string(VM&, PlainDate&, StringView show_calendar); +ThrowCompletionOr add_iso_date(VM&, i32 year, u8 month, u8 day, double years, double months, double weeks, double days, StringView overflow); i8 compare_iso_date(i32 year1, u8 month1, u8 day1, i32 year2, u8 month2, u8 day2); -ThrowCompletionOr difference_temporal_plain_date(GlobalObject&, DifferenceOperation, PlainDate&, Value other, Value options); +ThrowCompletionOr difference_temporal_plain_date(VM&, DifferenceOperation, PlainDate&, Value other, Value options); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp index 84378b3808..6e50f03b9d 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp @@ -49,19 +49,18 @@ ThrowCompletionOr PlainDateConstructor::call() ThrowCompletionOr PlainDateConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); // 2. Let y be ? ToIntegerThrowOnInfinity(isoYear). - auto y = TRY(to_integer_throw_on_infinity(global_object, vm.argument(0), ErrorType::TemporalInvalidPlainDate)); + auto y = TRY(to_integer_throw_on_infinity(vm, vm.argument(0), ErrorType::TemporalInvalidPlainDate)); // 3. Let m be ? ToIntegerThrowOnInfinity(isoMonth). - auto m = TRY(to_integer_throw_on_infinity(global_object, vm.argument(1), ErrorType::TemporalInvalidPlainDate)); + auto m = TRY(to_integer_throw_on_infinity(vm, vm.argument(1), ErrorType::TemporalInvalidPlainDate)); // 4. Let d be ? ToIntegerThrowOnInfinity(isoDay). - auto d = TRY(to_integer_throw_on_infinity(global_object, vm.argument(2), ErrorType::TemporalInvalidPlainDate)); + auto d = TRY(to_integer_throw_on_infinity(vm, vm.argument(2), ErrorType::TemporalInvalidPlainDate)); // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, vm.argument(3))); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, vm.argument(3))); // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards. // This does not change the exposed behavior as the call to CreateTemporalDate will immediately check that these values are valid @@ -70,38 +69,38 @@ ThrowCompletionOr PlainDateConstructor::construct(FunctionObject& new_t return vm.throw_completion(ErrorType::TemporalInvalidPlainDate); // 6. Return ? CreateTemporalDate(y, m, d, calendar, NewTarget). - return TRY(create_temporal_date(global_object, y, m, d, *calendar, &new_target)); + return TRY(create_temporal_date(vm, y, m, d, *calendar, &new_target)); } // 3.2.2 Temporal.PlainDate.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.from JS_DEFINE_NATIVE_FUNCTION(PlainDateConstructor::from) { // 1. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); auto item = vm.argument(0); // 2. If Type(item) is Object and item has an [[InitializedTemporalDate]] internal slot, then if (item.is_object() && is(item.as_object())) { auto& plain_date_item = static_cast(item.as_object()); // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // b. Return ! CreateTemporalDate(item.[[ISOYear]], item.[[ISOMonth]], item.[[ISODay]], item.[[Calendar]]). - return MUST(create_temporal_date(global_object, plain_date_item.iso_year(), plain_date_item.iso_month(), plain_date_item.iso_day(), plain_date_item.calendar())); + return MUST(create_temporal_date(vm, plain_date_item.iso_year(), plain_date_item.iso_month(), plain_date_item.iso_day(), plain_date_item.calendar())); } // 3. Return ? ToTemporalDate(item, options). - return TRY(to_temporal_date(global_object, item, options)); + return TRY(to_temporal_date(vm, item, options)); } // 3.2.3 Temporal.PlainDate.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.compare JS_DEFINE_NATIVE_FUNCTION(PlainDateConstructor::compare) { // 1. Set one to ? ToTemporalDate(one). - auto* one = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_date(vm, vm.argument(0))); // 2. Set two to ? ToTemporalDate(two). - auto* two = TRY(to_temporal_date(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_date(vm, vm.argument(1))); // 3. Return 𝔽(! CompareISODate(one.[[ISOYear]], one.[[ISOMonth]], one.[[ISODay]], two.[[ISOYear]], two.[[ISOMonth]], two.[[ISODay]])). return Value(compare_iso_date(one->iso_year(), one->iso_month(), one->iso_day(), two->iso_year(), two->iso_month(), two->iso_day())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp index 27044069ce..f02539880c 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp @@ -91,7 +91,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::year_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarYear(calendar, temporalDate). - return Value(TRY(calendar_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_year(vm, calendar, *temporal_date))); } // 3.3.5 get Temporal.PlainDate.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.month @@ -105,7 +105,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::month_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarMonth(calendar, temporalDate). - return Value(TRY(calendar_month(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_month(vm, calendar, *temporal_date))); } // 3.3.6 get Temporal.PlainDate.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthCode @@ -119,7 +119,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::month_code_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarMonthCode(calendar, temporalDate). - return js_string(vm, TRY(calendar_month_code(global_object, calendar, *temporal_date))); + return js_string(vm, TRY(calendar_month_code(vm, calendar, *temporal_date))); } // 3.3.7 get Temporal.PlainDate.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.day @@ -133,7 +133,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarDay(calendar, temporalDate). - return Value(TRY(calendar_day(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_day(vm, calendar, *temporal_date))); } // 3.3.8 get Temporal.PlainDate.prototype.dayOfWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofweek @@ -147,7 +147,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_of_week_getter) auto& calendar = temporal_date->calendar(); // Return ? CalendarDayOfWeek(calendar, temporalDate). - return Value(TRY(calendar_day_of_week(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_day_of_week(vm, calendar, *temporal_date))); } // 3.3.9 get Temporal.PlainDate.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofyear @@ -161,7 +161,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_of_year_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarDayOfYear(calendar, temporalDate). - return Value(TRY(calendar_day_of_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_day_of_year(vm, calendar, *temporal_date))); } // 3.3.10 get Temporal.PlainDate.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.weekofyear @@ -175,7 +175,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::week_of_year_getter) auto& calendar = temporal_date->calendar(); // Return ? CalendarWeekOfYear(calendar, temporalDate). - return Value(TRY(calendar_week_of_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_week_of_year(vm, calendar, *temporal_date))); } // 3.3.11 get Temporal.PlainDate.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinweek @@ -189,7 +189,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_week_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarDaysInWeek(calendar, temporalDate). - return Value(TRY(calendar_days_in_week(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_days_in_week(vm, calendar, *temporal_date))); } // 3.3.12 get Temporal.PlainDate.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinmonth @@ -203,7 +203,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_month_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarDaysInMonth(calendar, temporalDate). - return Value(TRY(calendar_days_in_month(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_days_in_month(vm, calendar, *temporal_date))); } // 3.3.13 get Temporal.PlainDate.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinyear @@ -217,7 +217,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_year_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarDaysInYear(calendar, temporalDate). - return Value(TRY(calendar_days_in_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_days_in_year(vm, calendar, *temporal_date))); } // 3.3.14 get Temporal.PlainDate.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthsinyear @@ -231,7 +231,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::months_in_year_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarMonthsInYear(calendar, temporalDate). - return Value(TRY(calendar_months_in_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_months_in_year(vm, calendar, *temporal_date))); } // 3.3.15 get Temporal.PlainDate.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.inleapyear @@ -245,7 +245,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::in_leap_year_getter) auto& calendar = temporal_date->calendar(); // 4. Return ? CalendarInLeapYear(calendar, temporalDate). - return Value(TRY(calendar_in_leap_year(global_object, calendar, *temporal_date))); + return Value(TRY(calendar_in_leap_year(vm, calendar, *temporal_date))); } // 15.6.5.2 get Temporal.PlainDate.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.era @@ -259,7 +259,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::era_getter) auto& calendar = plain_date->calendar(); // 4. Return ? CalendarEra(calendar, plainDate). - return TRY(calendar_era(global_object, calendar, *plain_date)); + return TRY(calendar_era(vm, calendar, *plain_date)); } // 15.6.5.3 get Temporal.PlainDate.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.erayear @@ -273,7 +273,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::era_year_getter) auto& calendar = plain_date->calendar(); // 4. Return ? CalendarEraYear(calendar, plainDate). - return TRY(calendar_era_year(global_object, calendar, *plain_date)); + return TRY(calendar_era_year(vm, calendar, *plain_date)); } // 3.3.16 Temporal.PlainDate.prototype.toPlainYearMonth ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainyearmonth @@ -287,13 +287,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_year_month) auto& calendar = temporal_date->calendar(); // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *temporal_date, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *temporal_date, field_names, Vector {})); // 6. Return ? CalendarYearMonthFromFields(calendar, fields). - return TRY(calendar_year_month_from_fields(global_object, calendar, *fields)); + return TRY(calendar_year_month_from_fields(vm, calendar, *fields)); } // 3.3.17 Temporal.PlainDate.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainmonthday @@ -307,13 +307,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_month_day) auto& calendar = temporal_date->calendar(); // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "monthCode"sv })); // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *temporal_date, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *temporal_date, field_names, Vector {})); // 6. Return ? CalendarMonthDayFromFields(calendar, fields). - return TRY(calendar_month_day_from_fields(global_object, calendar, *fields)); + return TRY(calendar_month_day_from_fields(vm, calendar, *fields)); } // 3.3.18 Temporal.PlainDate.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.getisofields @@ -352,13 +352,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::add) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Let duration be ? ToTemporalDuration(temporalDurationLike). - auto* duration = TRY(to_temporal_duration(global_object, vm.argument(0))); + auto* duration = TRY(to_temporal_duration(vm, vm.argument(0))); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 5. Return ? CalendarDateAdd(temporalDate.[[Calendar]], temporalDate, duration, options). - return TRY(calendar_date_add(global_object, temporal_date->calendar(), temporal_date, *duration, options)); + return TRY(calendar_date_add(vm, temporal_date->calendar(), temporal_date, *duration, options)); } // 3.3.20 Temporal.PlainDate.prototype.subtract ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.subtract @@ -369,16 +369,16 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::subtract) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Let duration be ? ToTemporalDuration(temporalDurationLike). - auto* duration = TRY(to_temporal_duration(global_object, vm.argument(0))); + auto* duration = TRY(to_temporal_duration(vm, vm.argument(0))); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 5. Let negatedDuration be ! CreateNegatedTemporalDuration(duration). - auto* negated_duration = create_negated_temporal_duration(global_object, *duration); + auto* negated_duration = create_negated_temporal_duration(vm, *duration); // 6. Return ? CalendarDateAdd(temporalDate.[[Calendar]], temporalDate, negatedDuration, options). - return TRY(calendar_date_add(global_object, temporal_date->calendar(), temporal_date, *negated_duration, options)); + return TRY(calendar_date_add(vm, temporal_date->calendar(), temporal_date, *negated_duration, options)); } // 3.3.21 Temporal.PlainDate.prototype.with ( temporalDateLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.with @@ -397,31 +397,31 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::with) } // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalDateLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_date_like.as_object())); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_date_like.as_object())); // 5. Let calendar be temporalDate.[[Calendar]]. auto& calendar = temporal_date->calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); // 7. Let partialDate be ? PrepareTemporalFields(temporalDateLike, fieldNames, partial). - auto* partial_date = TRY(prepare_temporal_fields(global_object, temporal_date_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); + auto* partial_date = TRY(prepare_temporal_fields(vm, temporal_date_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); // 8. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); // 9. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *temporal_date, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *temporal_date, field_names, Vector {})); // 10. Set fields to ? CalendarMergeFields(calendar, fields, partialDate). - fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *partial_date)); + fields = TRY(calendar_merge_fields(vm, calendar, *fields, *partial_date)); // 11. Set fields to ? PrepareTemporalFields(fields, fieldNames, «»). - fields = TRY(prepare_temporal_fields(global_object, *fields, field_names, Vector {})); + fields = TRY(prepare_temporal_fields(vm, *fields, field_names, Vector {})); // 12. Return ? CalendarDateFromFields(calendar, fields, options). - return TRY(calendar_date_from_fields(global_object, calendar, *fields, options)); + return TRY(calendar_date_from_fields(vm, calendar, *fields, options)); } // 3.3.22 Temporal.PlainDate.prototype.withCalendar ( calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.withcalendar @@ -434,10 +434,10 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::with_calendar) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar(vm, calendar_like)); // 4. Return ! CreateTemporalDate(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], calendar). - return MUST(create_temporal_date(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), *calendar)); + return MUST(create_temporal_date(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), *calendar)); } // 3.3.23 Temporal.PlainDate.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.until @@ -451,7 +451,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::until) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainDate(until, temporalDate, other, options). - return TRY(difference_temporal_plain_date(global_object, DifferenceOperation::Until, *temporal_date, other, options)); + return TRY(difference_temporal_plain_date(vm, DifferenceOperation::Until, *temporal_date, other, options)); } // 3.3.24 Temporal.PlainDate.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.since @@ -465,7 +465,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::since) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainDate(since, temporalDate, other, options). - return TRY(difference_temporal_plain_date(global_object, DifferenceOperation::Since, *temporal_date, other, options)); + return TRY(difference_temporal_plain_date(vm, DifferenceOperation::Since, *temporal_date, other, options)); } // 3.3.25 Temporal.PlainDate.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.equals @@ -476,7 +476,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalDate(other). - auto* other = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_date(vm, vm.argument(0))); // 4. If temporalDate.[[ISOYear]] ≠ other.[[ISOYear]], return false. if (temporal_date->iso_year() != other->iso_year()) @@ -488,7 +488,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals) if (temporal_date->iso_day() != other->iso_day()) return Value(false); // 7. Return ? CalendarEquals(temporalDate.[[Calendar]], other.[[Calendar]]). - return Value(TRY(calendar_equals(global_object, temporal_date->calendar(), other->calendar()))); + return Value(TRY(calendar_equals(vm, temporal_date->calendar(), other->calendar()))); } // 3.3.26 Temporal.PlainDate.prototype.toPlainDateTime ( [ temporalTime ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplaindatetime @@ -501,14 +501,14 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_date_time) // 3. If temporalTime is undefined, then if (vm.argument(0).is_undefined()) { // a. Return ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], 0, 0, 0, 0, 0, 0, temporalDate.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), 0, 0, 0, 0, 0, 0, temporal_date->calendar())); + return TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), 0, 0, 0, 0, 0, 0, temporal_date->calendar())); } // 4. Set temporalTime to ? ToTemporalTime(temporalTime). - auto* temporal_time = TRY(to_temporal_time(global_object, vm.argument(0))); + auto* temporal_time = TRY(to_temporal_time(vm, vm.argument(0))); // 5. Return ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], temporalDate.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); + return TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); } // 3.3.27 Temporal.PlainDate.prototype.toZonedDateTime ( item ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.tozoneddatetime @@ -531,14 +531,14 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_zoned_date_time) // b. If timeZoneLike is undefined, then if (time_zone_like.is_undefined()) { // i. Let timeZone be ? ToTemporalTimeZone(item). - time_zone = TRY(to_temporal_time_zone(global_object, item)); + time_zone = TRY(to_temporal_time_zone(vm, item)); // ii. Let temporalTime be undefined. } // c. Else, else { // i. Let timeZone be ? ToTemporalTimeZone(timeZoneLike). - time_zone = TRY(to_temporal_time_zone(global_object, time_zone_like)); + time_zone = TRY(to_temporal_time_zone(vm, time_zone_like)); // ii. Let temporalTime be ? Get(item, "plainTime"). temporal_time_value = TRY(item.as_object().get(vm.names.plainTime)); @@ -547,7 +547,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_zoned_date_time) // 4. Else, else { // a. Let timeZone be ? ToTemporalTimeZone(item). - time_zone = TRY(to_temporal_time_zone(global_object, item)); + time_zone = TRY(to_temporal_time_zone(vm, item)); // b. Let temporalTime be undefined. } @@ -557,22 +557,22 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_zoned_date_time) // 5. If temporalTime is undefined, then if (temporal_time_value.is_undefined()) { // a. Let temporalDateTime be ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], 0, 0, 0, 0, 0, 0, temporalDate.[[Calendar]]). - temporal_date_time = TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), 0, 0, 0, 0, 0, 0, temporal_date->calendar())); + temporal_date_time = TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), 0, 0, 0, 0, 0, 0, temporal_date->calendar())); } // 6. Else, else { // a. Set temporalTime to ? ToTemporalTime(temporalTime). - auto* temporal_time = TRY(to_temporal_time(global_object, temporal_time_value)); + auto* temporal_time = TRY(to_temporal_time(vm, temporal_time_value)); // b. Let temporalDateTime be ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], temporalDate.[[Calendar]]). - temporal_date_time = TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_time->calendar())); + temporal_date_time = TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_time->calendar())); } // 7. Let instant be ? BuiltinTimeZoneGetInstantFor(timeZone, temporalDateTime, "compatible"). - auto* instant = TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *temporal_date_time, "compatible"sv)); + auto* instant = TRY(builtin_time_zone_get_instant_for(vm, time_zone, *temporal_date_time, "compatible"sv)); // 8. Return ! CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, temporalDate.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), *time_zone, temporal_date->calendar())); + return MUST(create_temporal_zoned_date_time(vm, instant->nanoseconds(), *time_zone, temporal_date->calendar())); } // 3.3.28 Temporal.PlainDate.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.tostring @@ -583,13 +583,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_string) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let showCalendar be ? ToShowCalendarOption(options). - auto show_calendar = TRY(to_show_calendar_option(global_object, *options)); + auto show_calendar = TRY(to_show_calendar_option(vm, *options)); // 5. Return ? TemporalDateToString(temporalDate, showCalendar). - return js_string(vm, TRY(temporal_date_to_string(global_object, *temporal_date, show_calendar))); + return js_string(vm, TRY(temporal_date_to_string(vm, *temporal_date, show_calendar))); } // 3.3.29 Temporal.PlainDate.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.tolocalestring @@ -601,7 +601,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_locale_string) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Return ? TemporalDateToString(temporalDate, "auto"). - return js_string(vm, TRY(temporal_date_to_string(global_object, *temporal_date, "auto"sv))); + return js_string(vm, TRY(temporal_date_to_string(vm, *temporal_date, "auto"sv))); } // 3.3.30 Temporal.PlainDate.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.tojson @@ -612,7 +612,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_json) auto* temporal_date = TRY(typed_this_object(global_object)); // 3. Return ? TemporalDateToString(temporalDate, "auto"). - return js_string(vm, TRY(temporal_date_to_string(global_object, *temporal_date, "auto"sv))); + return js_string(vm, TRY(temporal_date_to_string(vm, *temporal_date, "auto"sv))); } // 3.3.31 Temporal.PlainDate.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.valueof diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp index 1e6302a02a..ad990518d5 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp @@ -45,10 +45,8 @@ void PlainDateTime::visit_edges(Visitor& visitor) } // 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, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) +BigInt* get_epoch_from_iso_parts(VM& vm, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) { - auto& vm = global_object.vm(); - // 1. Assert: IsValidISODate(year, month, day) is true. VERIFY(is_valid_iso_date(year, month, day)); @@ -74,13 +72,13 @@ auto const DATETIME_NANOSECONDS_MIN = "-8640000086400000000000"_sbigint; auto const DATETIME_NANOSECONDS_MAX = "8640000086400000000000"_sbigint; // 5.5.2 ISODateTimeWithinLimits ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond ), https://tc39.es/proposal-temporal/#sec-temporal-isodatetimewithinlimits -bool iso_date_time_within_limits(GlobalObject& global_object, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) +bool iso_date_time_within_limits(VM& vm, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) { // 1. Assert: IsValidISODate(year, month, day) is true. VERIFY(is_valid_iso_date(year, month, day)); // 2. Let ns be ℝ(GetEpochFromISOParts(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)). - auto ns = get_epoch_from_iso_parts(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)->big_integer(); + auto ns = get_epoch_from_iso_parts(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)->big_integer(); // 3. If ns ≤ nsMinInstant - nsPerDay, then if (ns <= DATETIME_NANOSECONDS_MIN) { @@ -98,19 +96,19 @@ bool iso_date_time_within_limits(GlobalObject& global_object, i32 year, u8 month } // 5.5.3 InterpretTemporalDateTimeFields ( calendar, fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-interprettemporaldatetimefields -ThrowCompletionOr interpret_temporal_date_time_fields(GlobalObject& global_object, Object& calendar, Object& fields, Object const& options) +ThrowCompletionOr interpret_temporal_date_time_fields(VM& vm, Object& calendar, Object& fields, Object const& options) { // 1. Let timeResult be ? ToTemporalTimeRecord(fields). - auto unregulated_time_result = TRY(to_temporal_time_record(global_object, fields)); + auto unregulated_time_result = TRY(to_temporal_time_record(vm, fields)); // 2. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, &options)); + auto overflow = TRY(to_temporal_overflow(vm, &options)); // 3. Let temporalDate be ? CalendarDateFromFields(calendar, fields, options). - auto* temporal_date = TRY(calendar_date_from_fields(global_object, calendar, fields, &options)); + auto* temporal_date = TRY(calendar_date_from_fields(vm, calendar, fields, &options)); // 4. Let timeResult be ? RegulateTime(timeResult.[[Hour]], timeResult.[[Minute]], timeResult.[[Second]], timeResult.[[Millisecond]], timeResult.[[Microsecond]], timeResult.[[Nanosecond]], overflow). - auto time_result = TRY(regulate_time(global_object, *unregulated_time_result.hour, *unregulated_time_result.minute, *unregulated_time_result.second, *unregulated_time_result.millisecond, *unregulated_time_result.microsecond, *unregulated_time_result.nanosecond, overflow)); + auto time_result = TRY(regulate_time(vm, *unregulated_time_result.hour, *unregulated_time_result.minute, *unregulated_time_result.second, *unregulated_time_result.millisecond, *unregulated_time_result.microsecond, *unregulated_time_result.nanosecond, overflow)); // 5. Return the Record { [[Year]]: temporalDate.[[ISOYear]], [[Month]]: temporalDate.[[ISOMonth]], [[Day]]: temporalDate.[[ISODay]], [[Hour]]: timeResult.[[Hour]], [[Minute]]: timeResult.[[Minute]], [[Second]]: timeResult.[[Second]], [[Millisecond]]: timeResult.[[Millisecond]], [[Microsecond]]: timeResult.[[Microsecond]], [[Nanosecond]]: timeResult.[[Nanosecond]] }. return ISODateTime { @@ -127,9 +125,10 @@ ThrowCompletionOr interpret_temporal_date_time_fields(GlobalObject& } // 5.5.4 ToTemporalDateTime ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaldatetime -ThrowCompletionOr to_temporal_date_time(GlobalObject& global_object, Value item, Object const* options) +ThrowCompletionOr to_temporal_date_time(VM& vm, Value item, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -152,13 +151,13 @@ ThrowCompletionOr to_temporal_date_time(GlobalObject& global_obj auto& zoned_date_time = static_cast(item_object); // i. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // ii. Let instant be ! CreateTemporalInstant(item.[[Nanoseconds]]). - auto* instant = create_temporal_instant(global_object, zoned_date_time.nanoseconds()).release_value(); + auto* instant = create_temporal_instant(vm, zoned_date_time.nanoseconds()).release_value(); // iii. Return ? BuiltinTimeZoneGetPlainDateTimeFor(item.[[TimeZone]], instant, item.[[Calendar]]). - return builtin_time_zone_get_plain_date_time_for(global_object, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar()); + return builtin_time_zone_get_plain_date_time_for(vm, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar()); } // c. If item has an [[InitializedTemporalDate]] internal slot, then @@ -166,34 +165,34 @@ ThrowCompletionOr to_temporal_date_time(GlobalObject& global_obj auto& plain_date = static_cast(item_object); // i. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // ii. Return ? CreateTemporalDateTime(item.[[ISOYear]], item.[[ISOMonth]], item.[[ISODay]], 0, 0, 0, 0, 0, 0, item.[[Calendar]]). - return create_temporal_date_time(global_object, plain_date.iso_year(), plain_date.iso_month(), plain_date.iso_day(), 0, 0, 0, 0, 0, 0, plain_date.calendar()); + return create_temporal_date_time(vm, plain_date.iso_year(), plain_date.iso_month(), plain_date.iso_day(), 0, 0, 0, 0, 0, 0, plain_date.calendar()); } // d. Let calendar be ? GetTemporalCalendarWithISODefault(item). - calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object)); + calendar = TRY(get_temporal_calendar_with_iso_default(vm, item_object)); // e. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, item_object, field_names, Vector {})); // g. Let result be ? InterpretTemporalDateTimeFields(calendar, fields, options). - result = TRY(interpret_temporal_date_time_fields(global_object, *calendar, *fields, *options)); + result = TRY(interpret_temporal_date_time_fields(vm, *calendar, *fields, *options)); } // 4. Else, else { // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // b. Let string be ? ToString(item). auto string = TRY(item.to_string(global_object)); // c. Let result be ? ParseTemporalDateTimeString(string). - result = TRY(parse_temporal_date_time_string(global_object, string)); + result = TRY(parse_temporal_date_time_string(vm, string)); // d. Assert: IsValidISODate(result.[[Year]], result.[[Month]], result.[[Day]]) is true. VERIFY(is_valid_iso_date(result.year, result.month, result.day)); @@ -202,11 +201,11 @@ ThrowCompletionOr to_temporal_date_time(GlobalObject& global_obj VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); // f. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). - calendar = TRY(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); + calendar = TRY(to_temporal_calendar_with_iso_default(vm, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); } // 5. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], calendar). - return create_temporal_date_time(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, *calendar); + return create_temporal_date_time(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, *calendar); } // 5.5.5 BalanceISODateTime ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond ), https://tc39.es/proposal-temporal/#sec-temporal-balanceisodatetime @@ -229,9 +228,10 @@ ISODateTime balance_iso_date_time(i32 year, u8 month, u8 day, u8 hour, u8 minute } // 5.5.6 CreateTemporalDateTime ( isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, nanosecond, calendar [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporaldatetime -ThrowCompletionOr create_temporal_date_time(GlobalObject& global_object, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_date_time(VM& vm, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, and nanosecond are integers. // 2. Assert: Type(calendar) is Object. @@ -245,7 +245,7 @@ ThrowCompletionOr create_temporal_date_time(GlobalObject& global return vm.throw_completion(ErrorType::TemporalInvalidPlainDateTime); // 5. If ISODateTimeWithinLimits(isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, nanosecond) is false, then - if (!iso_date_time_within_limits(global_object, iso_year, iso_month, iso_day, hour, minute, second, millisecond, microsecond, nanosecond)) { + if (!iso_date_time_within_limits(vm, iso_year, iso_month, iso_day, hour, minute, second, millisecond, microsecond, nanosecond)) { // a. Throw a RangeError exception. return vm.throw_completion(ErrorType::TemporalInvalidPlainDateTime); } @@ -272,8 +272,11 @@ ThrowCompletionOr create_temporal_date_time(GlobalObject& global } // 5.5.7 TemporalDateTimeToString ( isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, nanosecond, calendar, precision, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporaldatetimetostring -ThrowCompletionOr temporal_date_time_to_string(GlobalObject& global_object, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Value calendar, Variant const& precision, StringView show_calendar) +ThrowCompletionOr temporal_date_time_to_string(VM& vm, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Value calendar, Variant const& precision, StringView show_calendar) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, and nanosecond are integers. // 2. Let year be ! PadISOYear(isoYear). @@ -314,34 +317,34 @@ i8 compare_iso_date_time(i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 } // 5.5.9 AddDateTime ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, calendar, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds, options ), https://tc39.es/proposal-temporal/#sec-temporal-adddatetime -ThrowCompletionOr add_date_time(GlobalObject& global_object, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options) +ThrowCompletionOr add_date_time(VM& vm, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options) { // 1. Assert: ISODateTimeWithinLimits(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond) is true. - VERIFY(iso_date_time_within_limits(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); + VERIFY(iso_date_time_within_limits(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); // 2. Let timeResult be ! AddTime(hour, minute, second, millisecond, microsecond, nanosecond, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). auto time_result = add_time(hour, minute, second, millisecond, microsecond, nanosecond, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); // 3. Let datePart be ! CreateTemporalDate(year, month, day, calendar). - auto* date_part = MUST(create_temporal_date(global_object, year, month, day, calendar)); + auto* date_part = MUST(create_temporal_date(vm, year, month, day, calendar)); // 4. Let dateDuration be ? CreateTemporalDuration(years, months, weeks, days + timeResult.[[Days]], 0, 0, 0, 0, 0, 0). - auto* date_duration = TRY(create_temporal_duration(global_object, years, months, weeks, days + time_result.days, 0, 0, 0, 0, 0, 0)); + auto* date_duration = TRY(create_temporal_duration(vm, years, months, weeks, days + time_result.days, 0, 0, 0, 0, 0, 0)); // 5. Let addedDate be ? CalendarDateAdd(calendar, datePart, dateDuration, options). - auto* added_date = TRY(calendar_date_add(global_object, calendar, date_part, *date_duration, options)); + auto* added_date = TRY(calendar_date_add(vm, calendar, date_part, *date_duration, options)); // 6. Return the Record { [[Year]]: addedDate.[[ISOYear]], [[Month]]: addedDate.[[ISOMonth]], [[Day]]: addedDate.[[ISODay]], [[Hour]]: timeResult.[[Hour]], [[Minute]]: timeResult.[[Minute]], [[Second]]: timeResult.[[Second]], [[Millisecond]]: timeResult.[[Millisecond]], [[Microsecond]]: timeResult.[[Microsecond]], [[Nanosecond]]: timeResult.[[Nanosecond]] }. return TemporalPlainDateTime { .year = added_date->iso_year(), .month = added_date->iso_month(), .day = added_date->iso_day(), .hour = time_result.hour, .minute = time_result.minute, .second = time_result.second, .millisecond = time_result.millisecond, .microsecond = time_result.microsecond, .nanosecond = time_result.nanosecond }; } // 5.5.10 RoundISODateTime ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, increment, unit, roundingMode [ , dayLength ] ), https://tc39.es/proposal-temporal/#sec-temporal-roundisodatetime -ISODateTime round_iso_date_time(GlobalObject& global_object, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, u64 increment, StringView unit, StringView rounding_mode, Optional day_length) +ISODateTime round_iso_date_time(VM& vm, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, u64 increment, StringView unit, StringView rounding_mode, Optional day_length) { // 1. Assert: year, month, day, hour, minute, second, millisecond, microsecond, and nanosecond are integers. // 2. Assert: ISODateTimeWithinLimits(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond) is true. - VERIFY(iso_date_time_within_limits(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); + VERIFY(iso_date_time_within_limits(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); // 3. If dayLength is not present, set dayLength to nsPerDay. if (!day_length.has_value()) @@ -358,16 +361,16 @@ ISODateTime round_iso_date_time(GlobalObject& global_object, i32 year, u8 month, } // 5.5.11 DifferenceISODateTime ( y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1, y2, mon2, d2, h2, min2, s2, ms2, mus2, ns2, calendar, largestUnit, options ), https://tc39.es/proposal-temporal/#sec-temporal-differenceisodatetime -ThrowCompletionOr difference_iso_date_time(GlobalObject& global_object, i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, i32 year2, u8 month2, u8 day2, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2, Object& calendar, StringView largest_unit, Object const& options) +ThrowCompletionOr difference_iso_date_time(VM& vm, i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, i32 year2, u8 month2, u8 day2, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2, Object& calendar, StringView largest_unit, Object const& options) { // 1. Assert: ISODateTimeWithinLimits(y1, mon1, d1, h1, min1, s1, ms1, mus1, ns1) is true. - VERIFY(iso_date_time_within_limits(global_object, year1, month1, day1, hour1, minute1, second1, millisecond1, microsecond1, nanosecond1)); + VERIFY(iso_date_time_within_limits(vm, year1, month1, day1, hour1, minute1, second1, millisecond1, microsecond1, nanosecond1)); // 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2, ns2) is true. - VERIFY(iso_date_time_within_limits(global_object, year2, month2, day2, hour2, minute2, second2, millisecond2, microsecond2, nanosecond2)); + VERIFY(iso_date_time_within_limits(vm, year2, month2, day2, hour2, minute2, second2, millisecond2, microsecond2, nanosecond2)); // 3. Let timeDifference be ! DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2, min2, s2, ms2, mus2, ns2). - auto time_difference = difference_time(global_object, hour1, minute1, second1, millisecond1, microsecond1, nanosecond1, hour2, minute2, second2, millisecond2, microsecond2, nanosecond2); + auto time_difference = difference_time(vm, hour1, minute1, second1, millisecond1, microsecond1, nanosecond1, hour2, minute2, second2, millisecond2, microsecond2, nanosecond2); // 4. Let timeSign be ! DurationSign(0, 0, 0, 0, timeDifference.[[Hours]], timeDifference.[[Minutes]], timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]]). auto time_sign = duration_sign(0, 0, 0, 0, time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, time_difference.nanoseconds); @@ -384,80 +387,78 @@ ThrowCompletionOr difference_iso_date_time(GlobalObject& global_ adjusted_date = balance_iso_date(adjusted_date.year, adjusted_date.month, adjusted_date.day - time_sign); // b. Set timeDifference to ! BalanceDuration(-timeSign, timeDifference.[[Hours]], timeDifference.[[Minutes]], timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]], largestUnit). - time_difference = MUST(balance_duration(global_object, -time_sign, time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, Crypto::SignedBigInteger { (i32)time_difference.nanoseconds }, largest_unit)); + time_difference = MUST(balance_duration(vm, -time_sign, time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, Crypto::SignedBigInteger { (i32)time_difference.nanoseconds }, largest_unit)); } // 8. Let date1 be ! CreateTemporalDate(adjustedDate.[[Year]], adjustedDate.[[Month]], adjustedDate.[[Day]], calendar). - auto* date1 = MUST(create_temporal_date(global_object, adjusted_date.year, adjusted_date.month, adjusted_date.day, calendar)); + auto* date1 = MUST(create_temporal_date(vm, adjusted_date.year, adjusted_date.month, adjusted_date.day, calendar)); // 9. Let date2 be ! CreateTemporalDate(y2, mon2, d2, calendar). - auto* date2 = MUST(create_temporal_date(global_object, year2, month2, day2, calendar)); + auto* date2 = MUST(create_temporal_date(vm, year2, month2, day2, calendar)); // 10. Let dateLargestUnit be ! LargerOfTwoTemporalUnits("day", largestUnit). auto date_largest_unit = larger_of_two_temporal_units("day"sv, largest_unit); // 11. Let untilOptions be ? MergeLargestUnitOption(options, dateLargestUnit). - auto* until_options = TRY(merge_largest_unit_option(global_object, options, date_largest_unit)); + auto* until_options = TRY(merge_largest_unit_option(vm, options, date_largest_unit)); // 12. Let dateDifference be ? CalendarDateUntil(calendar, date1, date2, untilOptions). - auto* date_difference = TRY(calendar_date_until(global_object, calendar, date1, date2, *until_options)); + auto* date_difference = TRY(calendar_date_until(vm, calendar, date1, date2, *until_options)); // 13. Let balanceResult be ? BalanceDuration(dateDifference.[[Days]], timeDifference.[[Hours]], timeDifference.[[Minutes]], timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]], largestUnit). - auto balance_result = TRY(balance_duration(global_object, date_difference->days(), time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, Crypto::SignedBigInteger { (i32)time_difference.nanoseconds }, largest_unit)); + auto balance_result = TRY(balance_duration(vm, date_difference->days(), time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, Crypto::SignedBigInteger { (i32)time_difference.nanoseconds }, largest_unit)); // 14. Return ! CreateDurationRecord(dateDifference.[[Years]], dateDifference.[[Months]], dateDifference.[[Weeks]], balanceResult.[[Days]], balanceResult.[[Hours]], balanceResult.[[Minutes]], balanceResult.[[Seconds]], balanceResult.[[Milliseconds]], balanceResult.[[Microseconds]], balanceResult.[[Nanoseconds]]). return create_duration_record(date_difference->years(), date_difference->months(), date_difference->weeks(), balance_result.days, balance_result.hours, balance_result.minutes, balance_result.seconds, balance_result.milliseconds, balance_result.microseconds, balance_result.nanoseconds); } // 5.5.12 DifferenceTemporalPlainDateTime ( operation, dateTime, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplaindatetime -ThrowCompletionOr difference_temporal_plain_date_time(GlobalObject& global_object, DifferenceOperation operation, PlainDateTime& date_time, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_plain_date_time(VM& vm, DifferenceOperation operation, PlainDateTime& date_time, Value other_value, Value options_value) { - auto& vm = global_object.vm(); - // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalDateTime(other). - auto* other = TRY(to_temporal_date_time(global_object, other_value)); + auto* other = TRY(to_temporal_date_time(vm, other_value)); // 3. If ? CalendarEquals(dateTime.[[Calendar]], other.[[Calendar]]) is false, throw a RangeError exception. - if (!TRY(calendar_equals(global_object, date_time.calendar(), other->calendar()))) + if (!TRY(calendar_equals(vm, date_time.calendar(), other->calendar()))) return vm.throw_completion(ErrorType::TemporalDifferentCalendars); // 4. Let settings be ? GetDifferenceSettings(operation, options, datetime, « », "nanosecond", "day"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::DateTime, {}, { "nanosecond"sv }, "day"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::DateTime, {}, { "nanosecond"sv }, "day"sv)); // 5. Let diff be ? DifferenceISODateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], other.[[ISOYear]], other.[[ISOMonth]], other.[[ISODay]], other.[[ISOHour]], other.[[ISOMinute]], other.[[ISOSecond]], other.[[ISOMillisecond]], other.[[ISOMicrosecond]], other.[[ISONanosecond]], dateTime.[[Calendar]], settings.[[LargestUnit]], settings.[[Options]]). - auto diff = TRY(difference_iso_date_time(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), other->iso_year(), other->iso_month(), other->iso_day(), other->iso_hour(), other->iso_minute(), other->iso_second(), other->iso_millisecond(), other->iso_microsecond(), other->iso_nanosecond(), date_time.calendar(), settings.largest_unit, settings.options)); + auto diff = TRY(difference_iso_date_time(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), other->iso_year(), other->iso_month(), other->iso_day(), other->iso_hour(), other->iso_minute(), other->iso_second(), other->iso_millisecond(), other->iso_microsecond(), other->iso_nanosecond(), date_time.calendar(), settings.largest_unit, settings.options)); // 6. Let relativeTo be ! CreateTemporalDate(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[Calendar]]). - auto* relative_to = MUST(create_temporal_date(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.calendar())); + auto* relative_to = MUST(create_temporal_date(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.calendar())); // 7. Let roundResult be (? RoundDuration(diff.[[Years]], diff.[[Months]], diff.[[Weeks]], diff.[[Days]], diff.[[Hours]], diff.[[Minutes]], diff.[[Seconds]], diff.[[Milliseconds]], diff.[[Microseconds]], diff.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]], relativeTo)).[[DurationRecord]]. - auto round_result = TRY(round_duration(global_object, diff.years, diff.months, diff.weeks, diff.days, diff.hours, diff.minutes, diff.seconds, diff.milliseconds, diff.microseconds, diff.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, relative_to)).duration_record; + auto round_result = TRY(round_duration(vm, diff.years, diff.months, diff.weeks, diff.days, diff.hours, diff.minutes, diff.seconds, diff.milliseconds, diff.microseconds, diff.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, relative_to)).duration_record; // 8. Let result be ? BalanceDuration(roundResult.[[Days]], roundResult.[[Hours]], roundResult.[[Minutes]], roundResult.[[Seconds]], roundResult.[[Milliseconds]], roundResult.[[Microseconds]], roundResult.[[Nanoseconds]], settings.[[LargestUnit]]). // FIXME: Narrowing conversion from 'double' to 'i64' - auto result = MUST(balance_duration(global_object, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, Crypto::SignedBigInteger::create_from((i64)round_result.nanoseconds), settings.largest_unit)); + auto result = MUST(balance_duration(vm, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, Crypto::SignedBigInteger::create_from((i64)round_result.nanoseconds), settings.largest_unit)); // 9. Return ! CreateTemporalDuration(sign × roundResult.[[Years]], sign × roundResult.[[Months]], sign × roundResult.[[Weeks]], sign × result.[[Days]], sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, sign * round_result.years, sign * round_result.months, sign * round_result.weeks, sign * result.days, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); + return MUST(create_temporal_duration(vm, sign * round_result.years, sign * round_result.months, sign * round_result.weeks, sign * result.days, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); } // 5.5.13 AddDurationToOrSubtractDurationFromPlainDateTime ( operation, dateTime, temporalDurationLike, options ), https://tc39.es/proposal-temporal/#sec-temporal-adddurationtoorsubtractdurationfromplaindatetime -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_date_time(GlobalObject& global_object, ArithmeticOperation operation, PlainDateTime& date_time, Value temporal_duration_like, Value options_value) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_date_time(VM& vm, ArithmeticOperation operation, PlainDateTime& date_time, Value temporal_duration_like, Value options_value) { // 1. If operation is subtract, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == ArithmeticOperation::Subtract ? -1 : 1; // 2. Let duration be ? ToTemporalDurationRecord(temporalDurationLike). - auto duration = TRY(to_temporal_duration_record(global_object, temporal_duration_like)); + auto duration = TRY(to_temporal_duration_record(vm, temporal_duration_like)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, options_value)); + auto* options = TRY(get_options_object(vm, options_value)); // 4. Let result be ? AddDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], dateTime.[[Calendar]], sign × duration.[[Years]], sign × duration.[[Months]], sign × duration.[[Weeks]], sign × duration.[[Days]], sign × duration.[[Hours]], sign × duration.[[Minutes]], sign × duration.[[Seconds]], sign × duration.[[Milliseconds]], sign × duration.[[Microseconds]], sign × duration.[[Nanoseconds]], options). - auto result = TRY(add_date_time(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), sign * duration.years, sign * duration.months, sign * duration.weeks, sign * duration.days, sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds, options)); + auto result = TRY(add_date_time(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), sign * duration.years, sign * duration.months, sign * duration.weeks, sign * duration.days, sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds, options)); // 5. Assert: IsValidISODate(result.[[Year]], result.[[Month]], result.[[Day]]) is true. VERIFY(is_valid_iso_date(result.year, result.month, result.day)); @@ -466,7 +467,7 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_plai VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); // 7. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], dateTime.[[Calendar]]). - return create_temporal_date_time(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, date_time.calendar()); + return create_temporal_date_time(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, date_time.calendar()); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.h index 0f24c9dc96..1192724d2b 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.h @@ -63,18 +63,18 @@ struct TemporalPlainDateTime { u16 nanosecond; }; -BigInt* get_epoch_from_iso_parts(GlobalObject&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); -bool iso_date_time_within_limits(GlobalObject&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); -ThrowCompletionOr interpret_temporal_date_time_fields(GlobalObject&, Object& calendar, Object& fields, Object const& options); -ThrowCompletionOr to_temporal_date_time(GlobalObject&, Value item, Object const* options = nullptr); +BigInt* get_epoch_from_iso_parts(VM&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); +bool iso_date_time_within_limits(VM&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); +ThrowCompletionOr interpret_temporal_date_time_fields(VM&, Object& calendar, Object& fields, Object const& options); +ThrowCompletionOr to_temporal_date_time(VM&, Value item, Object const* options = nullptr); ISODateTime balance_iso_date_time(i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, i64 nanosecond); -ThrowCompletionOr create_temporal_date_time(GlobalObject&, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, FunctionObject const* new_target = nullptr); -ThrowCompletionOr temporal_date_time_to_string(GlobalObject&, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Value calendar, Variant const& precision, StringView show_calendar); +ThrowCompletionOr create_temporal_date_time(VM&, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, FunctionObject const* new_target = nullptr); +ThrowCompletionOr temporal_date_time_to_string(VM&, i32 iso_year, u8 iso_month, u8 iso_day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Value calendar, Variant const& precision, StringView show_calendar); i8 compare_iso_date_time(i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, i32 year2, u8 month2, u8 day2, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2); -ThrowCompletionOr add_date_time(GlobalObject&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options); -ISODateTime round_iso_date_time(GlobalObject&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, u64 increment, StringView unit, StringView rounding_mode, Optional day_length = {}); -ThrowCompletionOr difference_iso_date_time(GlobalObject&, i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, i32 year2, u8 month2, u8 day2, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2, Object& calendar, StringView largest_unit, Object const& options); -ThrowCompletionOr difference_temporal_plain_date_time(GlobalObject&, DifferenceOperation, PlainDateTime&, Value other, Value options); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_date_time(GlobalObject&, ArithmeticOperation, PlainDateTime&, Value temporal_duration_like, Value options_value); +ThrowCompletionOr add_date_time(VM&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options); +ISODateTime round_iso_date_time(VM&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, u64 increment, StringView unit, StringView rounding_mode, Optional day_length = {}); +ThrowCompletionOr difference_iso_date_time(VM&, i32 year1, u8 month1, u8 day1, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, i32 year2, u8 month2, u8 day2, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2, Object& calendar, StringView largest_unit, Object const& options); +ThrowCompletionOr difference_temporal_plain_date_time(VM&, DifferenceOperation, PlainDateTime&, Value other, Value options); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_date_time(VM&, ArithmeticOperation, PlainDateTime&, Value temporal_duration_like, Value options_value); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp index e2d3e0b97b..0e4d1147f8 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp @@ -49,37 +49,36 @@ ThrowCompletionOr PlainDateTimeConstructor::call() ThrowCompletionOr PlainDateTimeConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); // 2. Let isoYear be ? ToIntegerThrowOnInfinity(isoYear). - auto iso_year = TRY(to_integer_throw_on_infinity(global_object, vm.argument(0), ErrorType::TemporalInvalidPlainDateTime)); + auto iso_year = TRY(to_integer_throw_on_infinity(vm, vm.argument(0), ErrorType::TemporalInvalidPlainDateTime)); // 3. Let isoMonth be ? ToIntegerThrowOnInfinity(isoMonth). - auto iso_month = TRY(to_integer_throw_on_infinity(global_object, vm.argument(1), ErrorType::TemporalInvalidPlainDateTime)); + auto iso_month = TRY(to_integer_throw_on_infinity(vm, vm.argument(1), ErrorType::TemporalInvalidPlainDateTime)); // 4. Let isoDay be ? ToIntegerThrowOnInfinity(isoDay). - auto iso_day = TRY(to_integer_throw_on_infinity(global_object, vm.argument(2), ErrorType::TemporalInvalidPlainDateTime)); + auto iso_day = TRY(to_integer_throw_on_infinity(vm, vm.argument(2), ErrorType::TemporalInvalidPlainDateTime)); // 5. Let hour be ? ToIntegerThrowOnInfinity(hour). - auto hour = TRY(to_integer_throw_on_infinity(global_object, vm.argument(3), ErrorType::TemporalInvalidPlainDateTime)); + auto hour = TRY(to_integer_throw_on_infinity(vm, vm.argument(3), ErrorType::TemporalInvalidPlainDateTime)); // 6. Let minute be ? ToIntegerThrowOnInfinity(minute). - auto minute = TRY(to_integer_throw_on_infinity(global_object, vm.argument(4), ErrorType::TemporalInvalidPlainDateTime)); + auto minute = TRY(to_integer_throw_on_infinity(vm, vm.argument(4), ErrorType::TemporalInvalidPlainDateTime)); // 7. Let second be ? ToIntegerThrowOnInfinity(second). - auto second = TRY(to_integer_throw_on_infinity(global_object, vm.argument(5), ErrorType::TemporalInvalidPlainDateTime)); + auto second = TRY(to_integer_throw_on_infinity(vm, vm.argument(5), ErrorType::TemporalInvalidPlainDateTime)); // 8. Let millisecond be ? ToIntegerThrowOnInfinity(millisecond). - auto millisecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(6), ErrorType::TemporalInvalidPlainDateTime)); + auto millisecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(6), ErrorType::TemporalInvalidPlainDateTime)); // 9. Let microsecond be ? ToIntegerThrowOnInfinity(microsecond). - auto microsecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(7), ErrorType::TemporalInvalidPlainDateTime)); + auto microsecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(7), ErrorType::TemporalInvalidPlainDateTime)); // 10. Let nanosecond be ? ToIntegerThrowOnInfinity(nanosecond). - auto nanosecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(8), ErrorType::TemporalInvalidPlainDateTime)); + auto nanosecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(8), ErrorType::TemporalInvalidPlainDateTime)); // 11. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, vm.argument(9))); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, vm.argument(9))); // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards. // This does not change the exposed behavior as the call to CreateTemporalDateTime will immediately check that these values are valid @@ -89,7 +88,7 @@ ThrowCompletionOr PlainDateTimeConstructor::construct(FunctionObject& n return vm.throw_completion(ErrorType::TemporalInvalidPlainDateTime); // 12. Return ? CreateTemporalDateTime(isoYear, isoMonth, isoDay, hour, minute, second, millisecond, microsecond, nanosecond, calendar, NewTarget). - return TRY(create_temporal_date_time(global_object, iso_year, iso_month, iso_day, hour, minute, second, millisecond, microsecond, nanosecond, *calendar, &new_target)); + return TRY(create_temporal_date_time(vm, iso_year, iso_month, iso_day, hour, minute, second, millisecond, microsecond, nanosecond, *calendar, &new_target)); } // 5.2.2 Temporal.PlainDateTime.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.from @@ -98,31 +97,31 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimeConstructor::from) auto item = vm.argument(0); // 1. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 2. If Type(item) is Object and item has an [[InitializedTemporalDateTime]] internal slot, then if (item.is_object() && is(item.as_object())) { auto& plain_date_time = static_cast(item.as_object()); // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // b. Return ! CreateTemporalDateTime(item.[[ISOYear]], item.[[ISOMonth]], item.[[ISODay]], item.[[ISOHour]], item.[[ISOMinute]], item.[[ISOSecond]], item.[[ISOMillisecond]], item.[[ISOMicrosecond]], item.[[ISONanosecond]], item.[[Calendar]]). - return MUST(create_temporal_date_time(global_object, plain_date_time.iso_year(), plain_date_time.iso_month(), plain_date_time.iso_day(), plain_date_time.iso_hour(), plain_date_time.iso_minute(), plain_date_time.iso_second(), plain_date_time.iso_millisecond(), plain_date_time.iso_microsecond(), plain_date_time.iso_nanosecond(), plain_date_time.calendar())); + return MUST(create_temporal_date_time(vm, plain_date_time.iso_year(), plain_date_time.iso_month(), plain_date_time.iso_day(), plain_date_time.iso_hour(), plain_date_time.iso_minute(), plain_date_time.iso_second(), plain_date_time.iso_millisecond(), plain_date_time.iso_microsecond(), plain_date_time.iso_nanosecond(), plain_date_time.calendar())); } // 3. Return ? ToTemporalDateTime(item, options). - return TRY(to_temporal_date_time(global_object, item, options)); + return TRY(to_temporal_date_time(vm, item, options)); } // 5.2.3 Temporal.PlainDateTime.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.compare JS_DEFINE_NATIVE_FUNCTION(PlainDateTimeConstructor::compare) { // 1. Set one to ? ToTemporalDateTime(one). - auto* one = TRY(to_temporal_date_time(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_date_time(vm, vm.argument(0))); // 2. Set two to ? ToTemporalDateTime(two). - auto* two = TRY(to_temporal_date_time(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_date_time(vm, vm.argument(1))); // 3. Return 𝔽(! CompareISODateTime(one.[[ISOYear]], one.[[ISOMonth]], one.[[ISODay]], one.[[ISOHour]], one.[[ISOMinute]], one.[[ISOSecond]], one.[[ISOMillisecond]], one.[[ISOMicrosecond]], one.[[ISONanosecond]], two.[[ISOYear]], two.[[ISOMonth]], two.[[ISODay]], two.[[ISOHour]], two.[[ISOMinute]], two.[[ISOSecond]], two.[[ISOMillisecond]], two.[[ISOMicrosecond]], two.[[ISONanosecond]])). return Value(compare_iso_date_time(one->iso_year(), one->iso_month(), one->iso_day(), one->iso_hour(), one->iso_minute(), one->iso_second(), one->iso_millisecond(), one->iso_microsecond(), one->iso_nanosecond(), two->iso_year(), two->iso_month(), two->iso_day(), two->iso_hour(), two->iso_minute(), two->iso_second(), two->iso_millisecond(), two->iso_microsecond(), two->iso_nanosecond())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp index 0e77a336ec..1fbb781941 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp @@ -102,7 +102,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarYear(calendar, dateTime). - return Value(TRY(calendar_year(global_object, calendar, *date_time))); + return Value(TRY(calendar_year(vm, calendar, *date_time))); } // 5.3.5 get Temporal.PlainDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.month @@ -116,7 +116,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::month_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarMonth(calendar, dateTime). - return Value(TRY(calendar_month(global_object, calendar, *date_time))); + return Value(TRY(calendar_month(vm, calendar, *date_time))); } // 5.3.6 get Temporal.PlainDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthcode @@ -130,7 +130,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::month_code_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarMonthCode(calendar, dateTime). - return js_string(vm, TRY(calendar_month_code(global_object, calendar, *date_time))); + return js_string(vm, TRY(calendar_month_code(vm, calendar, *date_time))); } // 5.3.7 get Temporal.PlainDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.day @@ -144,7 +144,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDay(calendar, dateTime). - return Value(TRY(calendar_day(global_object, calendar, *date_time))); + return Value(TRY(calendar_day(vm, calendar, *date_time))); } // 5.3.8 get Temporal.PlainDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.hour @@ -224,7 +224,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_of_week_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDayOfWeek(calendar, dateTime). - return TRY(calendar_day_of_week(global_object, calendar, *date_time)); + return TRY(calendar_day_of_week(vm, calendar, *date_time)); } // 5.3.15 get Temporal.PlainDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.dayofyear @@ -238,7 +238,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_of_year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDayOfYear(calendar, dateTime). - return TRY(calendar_day_of_year(global_object, calendar, *date_time)); + return TRY(calendar_day_of_year(vm, calendar, *date_time)); } // 5.3.16 get Temporal.PlainDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.weekofyear @@ -252,7 +252,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::week_of_year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarWeekOfYear(calendar, dateTime). - return TRY(calendar_week_of_year(global_object, calendar, *date_time)); + return TRY(calendar_week_of_year(vm, calendar, *date_time)); } // 5.3.17 get Temporal.PlainDateTime.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinweek @@ -266,7 +266,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_week_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDaysInWeek(calendar, dateTime). - return TRY(calendar_days_in_week(global_object, calendar, *date_time)); + return TRY(calendar_days_in_week(vm, calendar, *date_time)); } // 5.3.18 get Temporal.PlainDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinmonth @@ -280,7 +280,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_month_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDaysInMonth(calendar, dateTime). - return TRY(calendar_days_in_month(global_object, calendar, *date_time)); + return TRY(calendar_days_in_month(vm, calendar, *date_time)); } // 5.3.19 get Temporal.PlainDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinyear @@ -294,7 +294,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarDaysInYear(calendar, dateTime). - return TRY(calendar_days_in_year(global_object, calendar, *date_time)); + return TRY(calendar_days_in_year(vm, calendar, *date_time)); } // 5.3.20 get Temporal.PlainDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthsinyear @@ -308,7 +308,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::months_in_year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarMonthsInYear(calendar, dateTime). - return TRY(calendar_months_in_year(global_object, calendar, *date_time)); + return TRY(calendar_months_in_year(vm, calendar, *date_time)); } // 5.3.21 get Temporal.PlainDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.inleapyear @@ -322,7 +322,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::in_leap_year_getter) auto& calendar = date_time->calendar(); // 4. Return ? CalendarInLeapYear(calendar, dateTime). - return TRY(calendar_in_leap_year(global_object, calendar, *date_time)); + return TRY(calendar_in_leap_year(vm, calendar, *date_time)); } // 15.6.6.2 get Temporal.PlainDateTime.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.era @@ -336,7 +336,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::era_getter) auto& calendar = plain_date_time->calendar(); // 4. Return ? CalendarEra(calendar, plainDateTime). - return TRY(calendar_era(global_object, calendar, *plain_date_time)); + return TRY(calendar_era(vm, calendar, *plain_date_time)); } // 15.6.6.3 get Temporal.PlainDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.erayear @@ -350,7 +350,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::era_year_getter) auto& calendar = plain_date_time->calendar(); // 4. Return ? CalendarEraYear(calendar, plainDateTime). - return TRY(calendar_era_year(global_object, calendar, *plain_date_time)); + return TRY(calendar_era_year(vm, calendar, *plain_date_time)); } // 5.3.22 Temporal.PlainDateTime.prototype.with ( temporalDateTimeLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.with @@ -369,31 +369,31 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with) } // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalDateTimeLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_date_time_like.as_object())); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_date_time_like.as_object())); // 5. Let calendar be dateTime.[[Calendar]]. auto& calendar = date_time->calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); // 7. Let partialDateTime be ? PrepareTemporalFields(temporalDateTimeLike, fieldNames, partial). - auto* partial_date_time = TRY(prepare_temporal_fields(global_object, temporal_date_time_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); + auto* partial_date_time = TRY(prepare_temporal_fields(vm, temporal_date_time_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); // 8. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 9. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *date_time, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *date_time, field_names, Vector {})); // 10. Set fields to ? CalendarMergeFields(calendar, fields, partialDateTime). - fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *partial_date_time)); + fields = TRY(calendar_merge_fields(vm, calendar, *fields, *partial_date_time)); // 11. Set fields to ? PrepareTemporalFields(fields, fieldNames, «»). - fields = TRY(prepare_temporal_fields(global_object, *fields, field_names, Vector {})); + fields = TRY(prepare_temporal_fields(vm, *fields, field_names, Vector {})); // 12. Let result be ? InterpretTemporalDateTimeFields(calendar, fields, options). - auto result = TRY(interpret_temporal_date_time_fields(global_object, calendar, *fields, *options)); + auto result = TRY(interpret_temporal_date_time_fields(vm, calendar, *fields, *options)); // 13. Assert: IsValidISODate(result.[[Year]], result.[[Month]], result.[[Day]]) is true. VERIFY(is_valid_iso_date(result.year, result.month, result.day)); @@ -402,7 +402,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with) VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); // 15. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], calendar). - return TRY(create_temporal_date_time(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, calendar)); + return TRY(create_temporal_date_time(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, calendar)); } // 5.3.23 Temporal.PlainDateTime.prototype.withPlainTime ( [ plainTimeLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaintime @@ -415,14 +415,14 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with_plain_time) // 3. If plainTimeLike is undefined, then if (vm.argument(0).is_undefined()) { // a. Return ? CreateTemporalDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], 0, 0, 0, 0, 0, 0, dateTime.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), 0, 0, 0, 0, 0, 0, date_time->calendar())); + return TRY(create_temporal_date_time(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), 0, 0, 0, 0, 0, 0, date_time->calendar())); } // 4. Let plainTime be ? ToTemporalTime(plainTimeLike). - auto* plain_time = TRY(to_temporal_time(global_object, vm.argument(0))); + auto* plain_time = TRY(to_temporal_time(vm, vm.argument(0))); // 5. Return ? CreateTemporalDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], plainTime.[[ISOHour]], plainTime.[[ISOMinute]], plainTime.[[ISOSecond]], plainTime.[[ISOMillisecond]], plainTime.[[ISOMicrosecond]], plainTime.[[ISONanosecond]], dateTime.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), plain_time->iso_hour(), plain_time->iso_minute(), plain_time->iso_second(), plain_time->iso_millisecond(), plain_time->iso_microsecond(), plain_time->iso_nanosecond(), date_time->calendar())); + return TRY(create_temporal_date_time(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), plain_time->iso_hour(), plain_time->iso_minute(), plain_time->iso_second(), plain_time->iso_millisecond(), plain_time->iso_microsecond(), plain_time->iso_nanosecond(), date_time->calendar())); } // 5.3.24 Temporal.PlainDateTime.prototype.withPlainDate ( plainDateLike ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaindate @@ -433,13 +433,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with_plain_date) auto* date_time = TRY(typed_this_object(global_object)); // 3. Let plainDate be ? ToTemporalDate(plainDateLike). - auto* plain_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* plain_date = TRY(to_temporal_date(vm, vm.argument(0))); // 4. Let calendar be ? ConsolidateCalendars(dateTime.[[Calendar]], plainDate.[[Calendar]]). - auto* calendar = TRY(consolidate_calendars(global_object, date_time->calendar(), plain_date->calendar())); + auto* calendar = TRY(consolidate_calendars(vm, date_time->calendar(), plain_date->calendar())); // 5. Return ? CreateTemporalDateTime(plainDate.[[ISOYear]], plainDate.[[ISOMonth]], plainDate.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], calendar). - return TRY(create_temporal_date_time(global_object, plain_date->iso_year(), plain_date->iso_month(), plain_date->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), *calendar)); + return TRY(create_temporal_date_time(vm, plain_date->iso_year(), plain_date->iso_month(), plain_date->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), *calendar)); } // 5.3.25 Temporal.PlainDateTime.prototype.withCalendar ( calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withcalendar @@ -452,10 +452,10 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with_calendar) auto* date_time = TRY(typed_this_object(global_object)); // 3. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar(vm, calendar_like)); // 4. Return ? CreateTemporalDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], calendar). - return TRY(create_temporal_date_time(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), *calendar)); + return TRY(create_temporal_date_time(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), *calendar)); } // 5.3.26 Temporal.PlainDateTime.prototype.add ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.add @@ -469,7 +469,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::add) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainDateTime(add, dateTime, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_plain_date_time(global_object, ArithmeticOperation::Add, *date_time, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_plain_date_time(vm, ArithmeticOperation::Add, *date_time, temporal_duration_like, options)); } // 5.3.27 Temporal.PlainDateTime.prototype.subtract ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.subtract @@ -483,7 +483,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::subtract) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainDateTime(subtract, dateTime, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_plain_date_time(global_object, ArithmeticOperation::Subtract, *date_time, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_plain_date_time(vm, ArithmeticOperation::Subtract, *date_time, temporal_duration_like, options)); } // 5.3.28 Temporal.PlainDateTime.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.since @@ -497,7 +497,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::until) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainDateTime(until, dateTime, other, options). - return TRY(difference_temporal_plain_date_time(global_object, DifferenceOperation::Until, *date_time, other, options)); + return TRY(difference_temporal_plain_date_time(vm, DifferenceOperation::Until, *date_time, other, options)); } // 5.3.29 Temporal.PlainDateTime.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.since @@ -511,7 +511,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::since) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainDateTime(since, dateTime, other, options). - return TRY(difference_temporal_plain_date_time(global_object, DifferenceOperation::Since, *date_time, other, options)); + return TRY(difference_temporal_plain_date_time(vm, DifferenceOperation::Since, *date_time, other, options)); } // 5.3.30 Temporal.PlainDateTime.prototype.round ( roundTo ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.round @@ -544,23 +544,23 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::round) // 5. Else, else { // a. Set roundTo to ? GetOptionsObject(roundTo). - round_to = TRY(get_options_object(global_object, vm.argument(0))); + round_to = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let smallestUnit be ? GetTemporalUnit(roundTo, "smallestUnit", time, required, « "day" »). - auto smallest_unit = TRY(get_temporal_unit(global_object, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {}, { "day"sv })); + auto smallest_unit = TRY(get_temporal_unit(vm, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {}, { "day"sv })); // 7. Let roundingMode be ? ToTemporalRoundingMode(roundTo, "halfExpand"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *round_to, "halfExpand")); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *round_to, "halfExpand")); // 8. Let roundingIncrement be ? ToTemporalDateTimeRoundingIncrement(roundTo, smallestUnit). - auto rounding_increment = TRY(to_temporal_date_time_rounding_increment(global_object, *round_to, *smallest_unit)); + auto rounding_increment = TRY(to_temporal_date_time_rounding_increment(vm, *round_to, *smallest_unit)); // 9. Let result be ! RoundISODateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], roundingIncrement, smallestUnit, roundingMode). - auto result = round_iso_date_time(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), rounding_increment, *smallest_unit, rounding_mode); + auto result = round_iso_date_time(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), rounding_increment, *smallest_unit, rounding_mode); // 10. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], dateTime.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, date_time->calendar())); + return TRY(create_temporal_date_time(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, date_time->calendar())); } // 5.3.31 Temporal.PlainDateTime.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.equals @@ -571,7 +571,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::equals) auto* date_time = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalDateTime(other). - auto* other = TRY(to_temporal_date_time(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_date_time(vm, vm.argument(0))); // 4. Let result be ! CompareISODateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], other.[[ISOYear]], other.[[ISOMonth]], other.[[ISODay]], other.[[ISOHour]], other.[[ISOMinute]], other.[[ISOSecond]], other.[[ISOMillisecond]], other.[[ISOMicrosecond]], other.[[ISONanosecond]]). auto result = compare_iso_date_time(date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), other->iso_year(), other->iso_month(), other->iso_day(), other->iso_hour(), other->iso_minute(), other->iso_second(), other->iso_millisecond(), other->iso_microsecond(), other->iso_nanosecond()); @@ -581,7 +581,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::equals) return Value(false); // 6. Return ? CalendarEquals(dateTime.[[Calendar]], other.[[Calendar]]). - return Value(TRY(calendar_equals(global_object, date_time->calendar(), other->calendar()))); + return Value(TRY(calendar_equals(vm, date_time->calendar(), other->calendar()))); } // 5.3.32 Temporal.PlainDateTime.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.tostring @@ -592,22 +592,22 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_string) auto* date_time = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let precision be ? ToSecondsStringPrecision(options). - auto precision = TRY(to_seconds_string_precision(global_object, *options)); + auto precision = TRY(to_seconds_string_precision(vm, *options)); // 5. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc"sv)); // 6. Let showCalendar be ? ToShowCalendarOption(options). - auto show_calendar = TRY(to_show_calendar_option(global_object, *options)); + auto show_calendar = TRY(to_show_calendar_option(vm, *options)); // 7. Let result be ! RoundISODateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], precision.[[Increment]], precision.[[Unit]], roundingMode). - auto result = round_iso_date_time(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), precision.increment, precision.unit, rounding_mode); + auto result = round_iso_date_time(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), precision.increment, precision.unit, rounding_mode); // 8. Return ? TemporalDateTimeToString(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], dateTime.[[Calendar]], precision.[[Precision]], showCalendar). - return js_string(vm, TRY(temporal_date_time_to_string(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, &date_time->calendar(), precision.precision, show_calendar))); + return js_string(vm, TRY(temporal_date_time_to_string(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, &date_time->calendar(), precision.precision, show_calendar))); } // 5.3.33 Temporal.PlainDateTime.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.tolocalestring @@ -619,7 +619,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_locale_string) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? TemporalDateTimeToString(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], dateTime.[[Calendar]], "auto", "auto"). - return js_string(vm, TRY(temporal_date_time_to_string(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), &date_time->calendar(), "auto"sv, "auto"sv))); + return js_string(vm, TRY(temporal_date_time_to_string(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), &date_time->calendar(), "auto"sv, "auto"sv))); } // 5.3.34 Temporal.PlainDateTime.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.tojson @@ -630,7 +630,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_json) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ? TemporalDateTimeToString(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], dateTime.[[Calendar]], "auto", "auto"). - return js_string(vm, TRY(temporal_date_time_to_string(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), &date_time->calendar(), "auto"sv, "auto"sv))); + return js_string(vm, TRY(temporal_date_time_to_string(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond(), &date_time->calendar(), "auto"sv, "auto"sv))); } // 5.3.35 Temporal.PlainDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.valueof @@ -648,19 +648,19 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_zoned_date_time) auto* date_time = TRY(typed_this_object(global_object)); // 3. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike). - auto* time_zone = TRY(to_temporal_time_zone(global_object, vm.argument(0))); + auto* time_zone = TRY(to_temporal_time_zone(vm, vm.argument(0))); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 5. Let disambiguation be ? ToTemporalDisambiguation(options). - auto disambiguation = TRY(to_temporal_disambiguation(global_object, options)); + auto disambiguation = TRY(to_temporal_disambiguation(vm, options)); // 6. Let instant be ? BuiltinTimeZoneGetInstantFor(timeZone, dateTime, disambiguation). - auto* instant = TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *date_time, disambiguation)); + auto* instant = TRY(builtin_time_zone_get_instant_for(vm, time_zone, *date_time, disambiguation)); // 7. Return ! CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, dateTime.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), *time_zone, date_time->calendar())); + return MUST(create_temporal_zoned_date_time(vm, instant->nanoseconds(), *time_zone, date_time->calendar())); } // 5.3.37 Temporal.PlainDateTime.prototype.toPlainDate ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaindate @@ -671,7 +671,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_date) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ! CreateTemporalDate(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[Calendar]]). - return MUST(create_temporal_date(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); + return MUST(create_temporal_date(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->calendar())); } // 5.3.38 Temporal.PlainDateTime.prototype.toPlainYearMonth ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplainyearmonth @@ -685,13 +685,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_year_month) auto& calendar = date_time->calendar(); // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *date_time, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *date_time, field_names, Vector {})); // 6. Return ? CalendarYearMonthFromFields(calendar, fields). - return TRY(calendar_year_month_from_fields(global_object, calendar, *fields)); + return TRY(calendar_year_month_from_fields(vm, calendar, *fields)); } // 5.3.39 Temporal.PlainDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplainmonthday @@ -705,13 +705,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_month_day) auto& calendar = date_time->calendar(); // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "monthCode"sv })); // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *date_time, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *date_time, field_names, Vector {})); // 6. Return ? CalendarMonthDayFromFields(calendar, fields). - return TRY(calendar_month_day_from_fields(global_object, calendar, *fields)); + return TRY(calendar_month_day_from_fields(vm, calendar, *fields)); } // 5.3.40 Temporal.PlainDateTime.prototype.toPlainTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaintime @@ -722,7 +722,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_time) auto* date_time = TRY(typed_this_object(global_object)); // 3. Return ! CreateTemporalTime(dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]]). - return MUST(create_temporal_time(global_object, date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond())); + return MUST(create_temporal_time(vm, date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond())); } // 5.3.41 Temporal.PlainDateTime.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.getisofields diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp index 1642f71884..a7208ff07c 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp @@ -34,9 +34,10 @@ void PlainMonthDay::visit_edges(Visitor& visitor) } // 10.5.1 ToTemporalMonthDay ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalmonthday -ThrowCompletionOr to_temporal_month_day(GlobalObject& global_object, Value item, Object const* options) +ThrowCompletionOr to_temporal_month_day(VM& vm, Value item, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -89,14 +90,14 @@ ThrowCompletionOr to_temporal_month_day(GlobalObject& global_obj calendar_absent = calendar_like.is_undefined(); // iv. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - calendar = TRY(to_temporal_calendar_with_iso_default(global_object, calendar_like)); + calendar = TRY(to_temporal_calendar_with_iso_default(vm, calendar_like)); } // d. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); // e. Let fields be ? PrepareTemporalFields(item, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, item_object, field_names, Vector {})); // f. Let month be ? Get(fields, "month"). auto month = TRY(fields->get(vm.names.month)); @@ -114,39 +115,40 @@ ThrowCompletionOr to_temporal_month_day(GlobalObject& global_obj } // j. Return ? CalendarMonthDayFromFields(calendar, fields, options). - return calendar_month_day_from_fields(global_object, *calendar, *fields, options); + return calendar_month_day_from_fields(vm, *calendar, *fields, options); } // 5. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // 6. Let string be ? ToString(item). auto string = TRY(item.to_string(global_object)); // 7. Let result be ? ParseTemporalMonthDayString(string). - auto result = TRY(parse_temporal_month_day_string(global_object, string)); + auto result = TRY(parse_temporal_month_day_string(vm, string)); // 8. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, move(*result.calendar)) : js_undefined())); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, result.calendar.has_value() ? js_string(vm, move(*result.calendar)) : js_undefined())); // 9. If result.[[Year]] is undefined, then if (!result.year.has_value()) { // a. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, referenceISOYear). - return TRY(create_temporal_month_day(global_object, result.month, result.day, *calendar, reference_iso_year)); + return TRY(create_temporal_month_day(vm, result.month, result.day, *calendar, reference_iso_year)); } // 10. Set result to ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, referenceISOYear). - auto* plain_month_day = TRY(create_temporal_month_day(global_object, result.month, result.day, *calendar, reference_iso_year)); + auto* plain_month_day = TRY(create_temporal_month_day(vm, result.month, result.day, *calendar, reference_iso_year)); // 11. NOTE: The following operation is called without options, in order for the calendar to store a canonical value in the [[ISOYear]] internal slot of the result. // 12. Return ? CalendarMonthDayFromFields(calendar, result). - return TRY(calendar_month_day_from_fields(global_object, *calendar, *plain_month_day)); + return TRY(calendar_month_day_from_fields(vm, *calendar, *plain_month_day)); } // 10.5.2 CreateTemporalMonthDay ( isoMonth, isoDay, calendar, referenceISOYear [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalmonthday -ThrowCompletionOr create_temporal_month_day(GlobalObject& global_object, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_month_day(VM& vm, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: isoMonth, isoDay, and referenceISOYear are integers. // 2. Assert: Type(calendar) is Object. @@ -156,7 +158,7 @@ ThrowCompletionOr create_temporal_month_day(GlobalObject& global return vm.throw_completion(ErrorType::TemporalInvalidPlainMonthDay); // 4. If ISODateTimeWithinLimits(referenceISOYear, isoMonth, isoDay, 12, 0, 0, 0, 0, 0) is false, throw a RangeError exception. - if (!iso_date_time_within_limits(global_object, reference_iso_year, iso_month, iso_day, 12, 0, 0, 0, 0, 0)) + if (!iso_date_time_within_limits(vm, reference_iso_year, iso_month, iso_day, 12, 0, 0, 0, 0, 0)) return vm.throw_completion(ErrorType::TemporalInvalidPlainMonthDay); // 5. If newTarget is not present, set newTarget to %Temporal.PlainMonthDay%. @@ -175,8 +177,11 @@ ThrowCompletionOr create_temporal_month_day(GlobalObject& global } // 10.5.3 TemporalMonthDayToString ( monthDay, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporalmonthdaytostring -ThrowCompletionOr temporal_month_day_to_string(GlobalObject& global_object, PlainMonthDay& month_day, StringView show_calendar) +ThrowCompletionOr temporal_month_day_to_string(VM& vm, PlainMonthDay& month_day, StringView show_calendar) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(monthDay) is Object. // 2. Assert: monthDay has an [[InitializedTemporalMonthDay]] internal slot. diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.h index b3fa0401bf..9182d82a97 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Linus Groh + * Copyright (c) 2021-2022, Linus Groh * * SPDX-License-Identifier: BSD-2-Clause */ @@ -39,8 +39,8 @@ struct ISOMonthDay { i32 reference_iso_year; }; -ThrowCompletionOr to_temporal_month_day(GlobalObject&, Value item, Object const* options = nullptr); -ThrowCompletionOr create_temporal_month_day(GlobalObject&, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target = nullptr); -ThrowCompletionOr temporal_month_day_to_string(GlobalObject&, PlainMonthDay&, StringView show_calendar); +ThrowCompletionOr to_temporal_month_day(VM&, Value item, Object const* options = nullptr); +ThrowCompletionOr create_temporal_month_day(VM&, u8 iso_month, u8 iso_day, Object& calendar, i32 reference_iso_year, FunctionObject const* new_target = nullptr); +ThrowCompletionOr temporal_month_day_to_string(VM&, PlainMonthDay&, StringView show_calendar); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp index 581249b176..807e1017b5 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp @@ -47,7 +47,6 @@ ThrowCompletionOr PlainMonthDayConstructor::call() ThrowCompletionOr PlainMonthDayConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); auto iso_month = vm.argument(0); auto iso_day = vm.argument(1); @@ -61,16 +60,16 @@ ThrowCompletionOr PlainMonthDayConstructor::construct(FunctionObject& n } // 3. Let m be ? ToIntegerThrowOnInfinity(isoMonth). - auto m = TRY(to_integer_throw_on_infinity(global_object, iso_month, ErrorType::TemporalInvalidPlainMonthDay)); + auto m = TRY(to_integer_throw_on_infinity(vm, iso_month, ErrorType::TemporalInvalidPlainMonthDay)); // 4. Let d be ? ToIntegerThrowOnInfinity(isoDay). - auto d = TRY(to_integer_throw_on_infinity(global_object, iso_day, ErrorType::TemporalInvalidPlainMonthDay)); + auto d = TRY(to_integer_throw_on_infinity(vm, iso_day, ErrorType::TemporalInvalidPlainMonthDay)); // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, calendar_like)); // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISOYear). - auto ref = TRY(to_integer_throw_on_infinity(global_object, reference_iso_year, ErrorType::TemporalInvalidPlainMonthDay)); + auto ref = TRY(to_integer_throw_on_infinity(vm, reference_iso_year, ErrorType::TemporalInvalidPlainMonthDay)); // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards. // This does not change the exposed behavior as the call to CreateTemporalMonthDay will immediately check that these values are valid @@ -79,7 +78,7 @@ ThrowCompletionOr PlainMonthDayConstructor::construct(FunctionObject& n return vm.throw_completion(ErrorType::TemporalInvalidPlainMonthDay); // 7. Return ? CreateTemporalMonthDay(m, d, calendar, ref, NewTarget). - return TRY(create_temporal_month_day(global_object, m, d, *calendar, ref, &new_target)); + return TRY(create_temporal_month_day(vm, m, d, *calendar, ref, &new_target)); } // 10.2.2 Temporal.PlainMonthDay.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.from @@ -88,21 +87,21 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayConstructor::from) auto item = vm.argument(0); // 1. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); // 2. If Type(item) is Object and item has an [[InitializedTemporalMonthDay]] internal slot, then if (item.is_object() && is(item.as_object())) { // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); auto& plain_month_day_object = static_cast(item.as_object()); // b. Return ! CreateTemporalMonthDay(item.[[ISOMonth]], item.[[ISODay]], item.[[Calendar]], item.[[ISOYear]]). - return MUST(create_temporal_month_day(global_object, plain_month_day_object.iso_month(), plain_month_day_object.iso_day(), plain_month_day_object.calendar(), plain_month_day_object.iso_year())); + return MUST(create_temporal_month_day(vm, plain_month_day_object.iso_month(), plain_month_day_object.iso_day(), plain_month_day_object.calendar(), plain_month_day_object.iso_year())); } // 3. Return ? ToTemporalMonthDay(item, options). - return TRY(to_temporal_month_day(global_object, item, options)); + return TRY(to_temporal_month_day(vm, item, options)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp index 3a775b77ca..34cb5ec9ba 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp @@ -66,7 +66,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::month_code_getter) auto& calendar = month_day->calendar(); // 4. Return ? CalendarMonthCode(calendar, monthDay). - return js_string(vm, TRY(calendar_month_code(global_object, calendar, *month_day))); + return js_string(vm, TRY(calendar_month_code(vm, calendar, *month_day))); } // 10.3.5 get Temporal.PlainMonthDay.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plainmonthday.prototype.day @@ -80,7 +80,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::day_getter) auto& calendar = month_day->calendar(); // 4. Return 𝔽(? CalendarDay(calendar, monthDay)). - return Value(TRY(calendar_day(global_object, calendar, *month_day))); + return Value(TRY(calendar_day(vm, calendar, *month_day))); } // 10.3.6 Temporal.PlainMonthDay.prototype.with ( temporalMonthDayLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.with @@ -99,31 +99,31 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::with) } // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalMonthDayLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_month_day_like.as_object())); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_month_day_like.as_object())); // 5. Let calendar be monthDay.[[Calendar]]. auto& calendar = month_day->calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv })); // 7. Let partialMonthDay be ? PrepareTemporalFields(temporalMonthDayLike, fieldNames, partial). - auto* partial_month_day = TRY(prepare_temporal_fields(global_object, temporal_month_day_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); + auto* partial_month_day = TRY(prepare_temporal_fields(vm, temporal_month_day_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); // 8. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 9. Let fields be ? PrepareTemporalFields(monthDay, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *month_day, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *month_day, field_names, Vector {})); // 10. Set fields to ? CalendarMergeFields(calendar, fields, partialMonthDay). - fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *partial_month_day)); + fields = TRY(calendar_merge_fields(vm, calendar, *fields, *partial_month_day)); // 11. Set fields to ? PrepareTemporalFields(fields, fieldNames, «»). - fields = TRY(prepare_temporal_fields(global_object, *fields, field_names, Vector {})); + fields = TRY(prepare_temporal_fields(vm, *fields, field_names, Vector {})); // 12. Return ? CalendarMonthDayFromFields(calendar, fields, options). - return TRY(calendar_month_day_from_fields(global_object, calendar, *fields, options)); + return TRY(calendar_month_day_from_fields(vm, calendar, *fields, options)); } // 10.3.7 Temporal.PlainMonthDay.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.equals @@ -134,7 +134,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::equals) auto* month_day = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalMonthDay(other). - auto* other = TRY(to_temporal_month_day(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_month_day(vm, vm.argument(0))); // 4. If monthDay.[[ISOMonth]] ≠ other.[[ISOMonth]], return false. if (month_day->iso_month() != other->iso_month()) @@ -149,7 +149,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::equals) return Value(false); // 7. Return ? CalendarEquals(monthDay.[[Calendar]], other.[[Calendar]]). - return Value(TRY(calendar_equals(global_object, month_day->calendar(), other->calendar()))); + return Value(TRY(calendar_equals(vm, month_day->calendar(), other->calendar()))); } // 10.3.8 Temporal.PlainMonthDay.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tostring @@ -160,13 +160,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_string) auto* month_day = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let showCalendar be ? ToShowCalendarOption(options). - auto show_calendar = TRY(to_show_calendar_option(global_object, *options)); + auto show_calendar = TRY(to_show_calendar_option(vm, *options)); // 5. Return ? TemporalMonthDayToString(monthDay, showCalendar). - return js_string(vm, TRY(temporal_month_day_to_string(global_object, *month_day, show_calendar))); + return js_string(vm, TRY(temporal_month_day_to_string(vm, *month_day, show_calendar))); } // 10.3.9 Temporal.PlainMonthDay.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tolocalestring @@ -178,7 +178,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_locale_string) auto* month_day = TRY(typed_this_object(global_object)); // 3. Return ? TemporalMonthDayToString(monthDay, "auto"). - return js_string(vm, TRY(temporal_month_day_to_string(global_object, *month_day, "auto"sv))); + return js_string(vm, TRY(temporal_month_day_to_string(vm, *month_day, "auto"sv))); } // 10.3.10 Temporal.PlainMonthDay.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tojson @@ -189,7 +189,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_json) auto* month_day = TRY(typed_this_object(global_object)); // 3. Return ? TemporalMonthDayToString(monthDay, "auto"). - return js_string(vm, TRY(temporal_month_day_to_string(global_object, *month_day, "auto"sv))); + return js_string(vm, TRY(temporal_month_day_to_string(vm, *month_day, "auto"sv))); } // 10.3.11 Temporal.PlainMonthDay.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.valueof @@ -220,25 +220,25 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_plain_date) auto& calendar = month_day->calendar(); // 5. Let receiverFieldNames be ? CalendarFields(calendar, « "day", "monthCode" »). - auto receiver_field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv })); + auto receiver_field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "monthCode"sv })); // 6. Let fields be ? PrepareTemporalFields(monthDay, receiverFieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *month_day, receiver_field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *month_day, receiver_field_names, Vector {})); // 7. Let inputFieldNames be ? CalendarFields(calendar, « "year" »). - auto input_field_names = TRY(calendar_fields(global_object, calendar, { "year"sv })); + auto input_field_names = TRY(calendar_fields(vm, calendar, { "year"sv })); // 8. Let inputFields be ? PrepareTemporalFields(item, inputFieldNames, «»). - auto* input_fields = TRY(prepare_temporal_fields(global_object, item.as_object(), input_field_names, Vector {})); + auto* input_fields = TRY(prepare_temporal_fields(vm, item.as_object(), input_field_names, Vector {})); // 9. Let mergedFields be ? CalendarMergeFields(calendar, fields, inputFields). - auto* merged_fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *input_fields)); + auto* merged_fields = TRY(calendar_merge_fields(vm, calendar, *fields, *input_fields)); // 10. Let mergedFieldNames be MergeLists(receiverFieldNames, inputFieldNames). auto merged_field_names = merge_lists(receiver_field_names, input_field_names); // 11. Set mergedFields to ? PrepareTemporalFields(mergedFields, mergedFieldNames, «»). - merged_fields = TRY(prepare_temporal_fields(global_object, *merged_fields, merged_field_names, Vector {})); + merged_fields = TRY(prepare_temporal_fields(vm, *merged_fields, merged_field_names, Vector {})); // 12. Let options be OrdinaryObjectCreate(null). auto* options = Object::create(realm, nullptr); @@ -247,7 +247,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::to_plain_date) MUST(options->create_data_property_or_throw(vm.names.overflow, js_string(vm, vm.names.reject.as_string()))); // 14. Return ? CalendarDateFromFields(calendar, mergedFields, options). - return TRY(calendar_date_from_fields(global_object, calendar, *merged_fields, options)); + return TRY(calendar_date_from_fields(vm, calendar, *merged_fields, options)); } // 10.3.13 Temporal.PlainMonthDay.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.getisofields diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp index 309fb75d84..928f87ab1a 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp @@ -41,7 +41,7 @@ void PlainTime::visit_edges(Visitor& visitor) } // 4.5.1 DifferenceTime ( h1, min1, s1, ms1, mus1, ns1, h2, min2, s2, ms2, mus2, ns2 ), https://tc39.es/proposal-temporal/#sec-temporal-differencetime -TimeDurationRecord difference_time(GlobalObject& global_object, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2) +TimeDurationRecord difference_time(VM& vm, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2) { // 1. Let hours be h2 - h1. auto hours = hour2 - hour1; @@ -71,13 +71,14 @@ TimeDurationRecord difference_time(GlobalObject& global_object, u8 hour1, u8 min VERIFY(bt.days == 0); // 10. Return ! CreateTimeDurationRecord(0, bt.[[Hour]] × sign, bt.[[Minute]] × sign, bt.[[Second]] × sign, bt.[[Millisecond]] × sign, bt.[[Microsecond]] × sign, bt.[[Nanosecond]] × sign). - return MUST(create_time_duration_record(global_object, 0, static_cast(bt.hour * sign), static_cast(bt.minute * sign), static_cast(bt.second * sign), static_cast(bt.millisecond * sign), static_cast(bt.microsecond * sign), static_cast(bt.nanosecond * sign))); + return MUST(create_time_duration_record(vm, 0, static_cast(bt.hour * sign), static_cast(bt.minute * sign), static_cast(bt.second * sign), static_cast(bt.millisecond * sign), static_cast(bt.microsecond * sign), static_cast(bt.nanosecond * sign))); } // 4.5.2 ToTemporalTime ( item [ , overflow ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaltime -ThrowCompletionOr to_temporal_time(GlobalObject& global_object, Value item, Optional overflow) +ThrowCompletionOr to_temporal_time(VM& vm, Value item, Optional overflow) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If overflow is not present, set overflow to "constrain". if (!overflow.has_value()) @@ -101,23 +102,26 @@ ThrowCompletionOr to_temporal_time(GlobalObject& global_object, Valu // b. If item has an [[InitializedTemporalZonedDateTime]] internal slot, then if (is(item_object)) { auto& zoned_date_time = static_cast(item_object); + // i. Let instant be ! CreateTemporalInstant(item.[[Nanoseconds]]). - auto* instant = create_temporal_instant(global_object, zoned_date_time.nanoseconds()).release_value(); + auto* instant = create_temporal_instant(vm, zoned_date_time.nanoseconds()).release_value(); + // ii. Set plainDateTime to ? BuiltinTimeZoneGetPlainDateTimeFor(item.[[TimeZone]], instant, item.[[Calendar]]). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar())); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar())); + // iii. Return ! CreateTemporalTime(plainDateTime.[[ISOHour]], plainDateTime.[[ISOMinute]], plainDateTime.[[ISOSecond]], plainDateTime.[[ISOMillisecond]], plainDateTime.[[ISOMicrosecond]], plainDateTime.[[ISONanosecond]]). - return TRY(create_temporal_time(global_object, plain_date_time->iso_hour(), plain_date_time->iso_minute(), plain_date_time->iso_second(), plain_date_time->iso_millisecond(), plain_date_time->iso_microsecond(), plain_date_time->iso_nanosecond())); + return TRY(create_temporal_time(vm, plain_date_time->iso_hour(), plain_date_time->iso_minute(), plain_date_time->iso_second(), plain_date_time->iso_millisecond(), plain_date_time->iso_microsecond(), plain_date_time->iso_nanosecond())); } // c. If item has an [[InitializedTemporalDateTime]] internal slot, then if (is(item_object)) { auto& plain_date_time = static_cast(item_object); // i. Return ! CreateTemporalTime(item.[[ISOHour]], item.[[ISOMinute]], item.[[ISOSecond]], item.[[ISOMillisecond]], item.[[ISOMicrosecond]], item.[[ISONanosecond]]). - return TRY(create_temporal_time(global_object, plain_date_time.iso_hour(), plain_date_time.iso_minute(), plain_date_time.iso_second(), plain_date_time.iso_millisecond(), plain_date_time.iso_microsecond(), plain_date_time.iso_nanosecond())); + return TRY(create_temporal_time(vm, plain_date_time.iso_hour(), plain_date_time.iso_minute(), plain_date_time.iso_second(), plain_date_time.iso_millisecond(), plain_date_time.iso_microsecond(), plain_date_time.iso_nanosecond())); } // d. Let calendar be ? GetTemporalCalendarWithISODefault(item). - auto* calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object)); + auto* calendar = TRY(get_temporal_calendar_with_iso_default(vm, item_object)); // e. If ? ToString(calendar) is not "iso8601", then auto calendar_identifier = TRY(Value(calendar).to_string(global_object)); @@ -127,10 +131,10 @@ ThrowCompletionOr to_temporal_time(GlobalObject& global_object, Valu } // f. Let result be ? ToTemporalTimeRecord(item). - auto unregulated_result = TRY(to_temporal_time_record(global_object, item_object)); + auto unregulated_result = TRY(to_temporal_time_record(vm, item_object)); // g. Set result to ? RegulateTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], overflow). - result = TRY(regulate_time(global_object, *unregulated_result.hour, *unregulated_result.minute, *unregulated_result.second, *unregulated_result.millisecond, *unregulated_result.microsecond, *unregulated_result.nanosecond, *overflow)); + result = TRY(regulate_time(vm, *unregulated_result.hour, *unregulated_result.minute, *unregulated_result.second, *unregulated_result.millisecond, *unregulated_result.microsecond, *unregulated_result.nanosecond, *overflow)); } // 4. Else, else { @@ -138,7 +142,7 @@ ThrowCompletionOr to_temporal_time(GlobalObject& global_object, Valu auto string = TRY(item.to_string(global_object)); // b. Let result be ? ParseTemporalTimeString(string). - result = TRY(parse_temporal_time_string(global_object, string)); + result = TRY(parse_temporal_time_string(vm, string)); // c. Assert: IsValidTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]) is true. VERIFY(is_valid_time(result->hour, result->minute, result->second, result->millisecond, result->microsecond, result->nanosecond)); @@ -151,14 +155,12 @@ ThrowCompletionOr to_temporal_time(GlobalObject& global_object, Valu } // 5. Return ! CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]). - return MUST(create_temporal_time(global_object, result->hour, result->minute, result->second, result->millisecond, result->microsecond, result->nanosecond)); + return MUST(create_temporal_time(vm, result->hour, result->minute, result->second, result->millisecond, result->microsecond, result->nanosecond)); } // 4.5.3 RegulateTime ( hour, minute, second, millisecond, microsecond, nanosecond, overflow ), https://tc39.es/proposal-temporal/#sec-temporal-regulatetime -ThrowCompletionOr regulate_time(GlobalObject& global_object, double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, StringView overflow) +ThrowCompletionOr regulate_time(VM& vm, double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, StringView overflow) { - auto& vm = global_object.vm(); - // 1. Assert: hour, minute, second, millisecond, microsecond and nanosecond are integers. VERIFY(trunc(hour) == hour && trunc(minute) == minute && trunc(second) == second && trunc(millisecond) == millisecond && trunc(microsecond) == microsecond && trunc(nanosecond) == nanosecond); @@ -309,9 +311,10 @@ TemporalTime constrain_time(double hour, double minute, double second, double mi } // 4.5.7 CreateTemporalTime ( hour, minute, second, millisecond, microsecond, nanosecond [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporaltime -ThrowCompletionOr create_temporal_time(GlobalObject& global_object, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_time(VM& vm, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: hour, minute, second, millisecond, microsecond and nanosecond are integers. @@ -331,21 +334,19 @@ ThrowCompletionOr create_temporal_time(GlobalObject& global_object, // 9. Set object.[[ISOMicrosecond]] to microsecond. // 10. Set object.[[ISONanosecond]] to nanosecond. // 11. Set object.[[Calendar]] to ! GetISO8601Calendar(). - auto* object = TRY(ordinary_create_from_constructor(global_object, *new_target, &GlobalObject::temporal_plain_time_prototype, hour, minute, second, millisecond, microsecond, nanosecond, *get_iso8601_calendar(global_object))); + auto* object = TRY(ordinary_create_from_constructor(global_object, *new_target, &GlobalObject::temporal_plain_time_prototype, hour, minute, second, millisecond, microsecond, nanosecond, *get_iso8601_calendar(vm))); // 12. Return object. return object; } // 4.5.8 ToTemporalTimeRecord ( temporalTimeLike [ , completeness ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaltimerecord -ThrowCompletionOr to_temporal_time_record(GlobalObject& global_object, Object const& temporal_time_like, ToTemporalTimeRecordCompleteness completeness) +ThrowCompletionOr to_temporal_time_record(VM& vm, Object const& temporal_time_like, ToTemporalTimeRecordCompleteness completeness) { - auto& vm = global_object.vm(); - // 1. If completeness is not present, set completeness to complete. // 2. Let partial be ? PrepareTemporalFields(temporalTimeLike, « "hour", "microsecond", "millisecond", "minute", "nanosecond", "second" », partial). - auto* partial = TRY(prepare_temporal_fields(global_object, temporal_time_like, { "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "nanosecond"sv, "second"sv }, PrepareTemporalFieldsPartial {})); + auto* partial = TRY(prepare_temporal_fields(vm, temporal_time_like, { "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "nanosecond"sv, "second"sv }, PrepareTemporalFieldsPartial {})); // 3. Let result be a new TemporalTimeLike Record with each field set to undefined. auto result = TemporalTimeLikeRecord {}; @@ -579,38 +580,38 @@ DaysAndTime round_time(u8 hour, u8 minute, u8 second, u16 millisecond, u16 micro } // 4.5.13 DifferenceTemporalPlainTime ( operation, temporalTime, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplaintime -ThrowCompletionOr difference_temporal_plain_time(GlobalObject& global_object, DifferenceOperation operation, PlainTime const& temporal_time, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_plain_time(VM& vm, DifferenceOperation operation, PlainTime const& temporal_time, Value other_value, Value options_value) { // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalTime(other). - auto* other = TRY(to_temporal_time(global_object, other_value)); + auto* other = TRY(to_temporal_time(vm, other_value)); // 3. Let settings be ? GetDifferenceSettings(operation, options, time, « », "nanosecond", "hour"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::Time, {}, { "nanosecond"sv }, "hour"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::Time, {}, { "nanosecond"sv }, "hour"sv)); // 4. Let result be ! DifferenceTime(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], other.[[ISOHour]], other.[[ISOMinute]], other.[[ISOSecond]], other.[[ISOMillisecond]], other.[[ISOMicrosecond]], other.[[ISONanosecond]]). - auto result = difference_time(global_object, temporal_time.iso_hour(), temporal_time.iso_minute(), temporal_time.iso_second(), temporal_time.iso_millisecond(), temporal_time.iso_microsecond(), temporal_time.iso_nanosecond(), other->iso_hour(), other->iso_minute(), other->iso_second(), other->iso_millisecond(), other->iso_microsecond(), other->iso_nanosecond()); + auto result = difference_time(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(), other->iso_hour(), other->iso_minute(), other->iso_second(), other->iso_millisecond(), other->iso_microsecond(), other->iso_nanosecond()); // 5. Set result to (! RoundDuration(0, 0, 0, 0, result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]])).[[DurationRecord]]. - auto rounded_result = MUST(round_duration(global_object, 0, 0, 0, 0, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode)).duration_record; + auto rounded_result = MUST(round_duration(vm, 0, 0, 0, 0, result.hours, result.minutes, result.seconds, result.milliseconds, result.microseconds, result.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode)).duration_record; // 6. Set result to ! BalanceDuration(0, result.[[Hours]], result.[[Minutes]], result.[[Seconds]], result.[[Milliseconds]], result.[[Microseconds]], result.[[Nanoseconds]], settings.[[LargestUnit]]). - result = MUST(balance_duration(global_object, 0, rounded_result.hours, rounded_result.minutes, rounded_result.seconds, rounded_result.milliseconds, rounded_result.microseconds, Crypto::SignedBigInteger { (i32)rounded_result.nanoseconds }, settings.largest_unit)); + result = MUST(balance_duration(vm, 0, rounded_result.hours, rounded_result.minutes, rounded_result.seconds, rounded_result.milliseconds, rounded_result.microseconds, Crypto::SignedBigInteger { (i32)rounded_result.nanoseconds }, settings.largest_unit)); // 7. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, 0, 0, 0, 0, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); + return MUST(create_temporal_duration(vm, 0, 0, 0, 0, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); } // 4.5.14 AddDurationToOrSubtractDurationFromPlainTime ( operation, temporalTime, temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal-adddurationtoorsubtractdurationfromplaintime -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_time(GlobalObject& global_object, ArithmeticOperation operation, PlainTime const& temporal_time, Value temporal_duration_like) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_time(VM& vm, ArithmeticOperation operation, PlainTime const& temporal_time, Value temporal_duration_like) { // 1. If operation is subtract, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == ArithmeticOperation::Subtract ? -1 : 1; // 2. Let duration be ? ToTemporalDurationRecord(temporalDurationLike). - auto duration = TRY(to_temporal_duration_record(global_object, temporal_duration_like)); + auto duration = TRY(to_temporal_duration_record(vm, temporal_duration_like)); // 3. Let result be ! AddTime(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], sign × duration.[[Hours]], sign × duration.[[Minutes]], sign × duration.[[Seconds]], sign × duration.[[Milliseconds]], sign × duration.[[Microseconds]], sign × duration.[[Nanoseconds]]). auto result = add_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(), sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds); @@ -619,7 +620,7 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_ti VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); // 5. Return ! CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]). - return MUST(create_temporal_time(global_object, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); + return MUST(create_temporal_time(vm, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h index ba52978ee1..073adec047 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.h @@ -89,19 +89,19 @@ enum class ToTemporalTimeRecordCompleteness { Complete, }; -TimeDurationRecord difference_time(GlobalObject&, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2); -ThrowCompletionOr to_temporal_time(GlobalObject&, Value item, Optional overflow = {}); -ThrowCompletionOr regulate_time(GlobalObject&, double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, StringView overflow); +TimeDurationRecord difference_time(VM&, u8 hour1, u8 minute1, u8 second1, u16 millisecond1, u16 microsecond1, u16 nanosecond1, u8 hour2, u8 minute2, u8 second2, u16 millisecond2, u16 microsecond2, u16 nanosecond2); +ThrowCompletionOr to_temporal_time(VM&, Value item, Optional overflow = {}); +ThrowCompletionOr regulate_time(VM&, double hour, double minute, double second, double millisecond, double microsecond, double nanosecond, StringView overflow); bool is_valid_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond); DaysAndTime balance_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond); TemporalTime constrain_time(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond); -ThrowCompletionOr create_temporal_time(GlobalObject&, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, FunctionObject const* new_target = nullptr); -ThrowCompletionOr to_temporal_time_record(GlobalObject&, Object const& temporal_time_like, ToTemporalTimeRecordCompleteness = ToTemporalTimeRecordCompleteness::Complete); +ThrowCompletionOr create_temporal_time(VM&, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, FunctionObject const* new_target = nullptr); +ThrowCompletionOr to_temporal_time_record(VM&, Object const& temporal_time_like, ToTemporalTimeRecordCompleteness = ToTemporalTimeRecordCompleteness::Complete); String temporal_time_to_string(u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant 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 day_length_ns = {}); -ThrowCompletionOr difference_temporal_plain_time(GlobalObject&, DifferenceOperation, PlainTime const&, Value other, Value options); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_time(GlobalObject&, ArithmeticOperation, PlainTime const&, Value temporal_duration_like); +ThrowCompletionOr difference_temporal_plain_time(VM&, DifferenceOperation, PlainTime const&, Value other, Value options); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_time(VM&, ArithmeticOperation, PlainTime const&, Value temporal_duration_like); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimeConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimeConstructor.cpp index 34f5feda96..e4586962c8 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimeConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimeConstructor.cpp @@ -47,25 +47,24 @@ ThrowCompletionOr PlainTimeConstructor::call() ThrowCompletionOr PlainTimeConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); // 2. Let hour be ? ToIntegerThrowOnInfinity(hour). - auto hour = TRY(to_integer_throw_on_infinity(global_object, vm.argument(0), ErrorType::TemporalInvalidPlainTime)); + auto hour = TRY(to_integer_throw_on_infinity(vm, vm.argument(0), ErrorType::TemporalInvalidPlainTime)); // 3. Let minute be ? ToIntegerThrowOnInfinity(hour). - auto minute = TRY(to_integer_throw_on_infinity(global_object, vm.argument(1), ErrorType::TemporalInvalidPlainTime)); + auto minute = TRY(to_integer_throw_on_infinity(vm, vm.argument(1), ErrorType::TemporalInvalidPlainTime)); // 4. Let second be ? ToIntegerThrowOnInfinity(hour). - auto second = TRY(to_integer_throw_on_infinity(global_object, vm.argument(2), ErrorType::TemporalInvalidPlainTime)); + auto second = TRY(to_integer_throw_on_infinity(vm, vm.argument(2), ErrorType::TemporalInvalidPlainTime)); // 5. Let millisecond be ? ToIntegerThrowOnInfinity(hour). - auto millisecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(3), ErrorType::TemporalInvalidPlainTime)); + auto millisecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(3), ErrorType::TemporalInvalidPlainTime)); // 6. Let microsecond be ? ToIntegerThrowOnInfinity(hour). - auto microsecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(4), ErrorType::TemporalInvalidPlainTime)); + auto microsecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(4), ErrorType::TemporalInvalidPlainTime)); // 7. Let nanosecond be ? ToIntegerThrowOnInfinity(hour). - auto nanosecond = TRY(to_integer_throw_on_infinity(global_object, vm.argument(5), ErrorType::TemporalInvalidPlainTime)); + auto nanosecond = TRY(to_integer_throw_on_infinity(vm, vm.argument(5), ErrorType::TemporalInvalidPlainTime)); // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards. // This does not change the exposed behavior as the call to CreateTemporalTime will immediately check that these values are valid @@ -75,17 +74,17 @@ ThrowCompletionOr PlainTimeConstructor::construct(FunctionObject& new_t return vm.throw_completion(ErrorType::TemporalInvalidPlainTime); // 8. Return ? CreateTemporalTime(hour, minute, second, millisecond, microsecond, nanosecond, NewTarget). - return TRY(create_temporal_time(global_object, hour, minute, second, millisecond, microsecond, nanosecond, &new_target)); + return TRY(create_temporal_time(vm, hour, minute, second, millisecond, microsecond, nanosecond, &new_target)); } // 4.2.2 Temporal.PlainTime.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.from JS_DEFINE_NATIVE_FUNCTION(PlainTimeConstructor::from) { // 1. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 2. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, options)); + auto overflow = TRY(to_temporal_overflow(vm, options)); auto item = vm.argument(0); @@ -93,21 +92,21 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimeConstructor::from) if (item.is_object() && is(item.as_object())) { auto& plain_time = static_cast(item.as_object()); // a. Return ! CreateTemporalTime(item.[[ISOHour]], item.[[ISOMinute]], item.[[ISOSecond]], item.[[ISOMillisecond]], item.[[ISOMicrosecond]], item.[[ISONanosecond]]). - return MUST(create_temporal_time(global_object, plain_time.iso_hour(), plain_time.iso_minute(), plain_time.iso_second(), plain_time.iso_millisecond(), plain_time.iso_microsecond(), plain_time.iso_nanosecond())); + return MUST(create_temporal_time(vm, plain_time.iso_hour(), plain_time.iso_minute(), plain_time.iso_second(), plain_time.iso_millisecond(), plain_time.iso_microsecond(), plain_time.iso_nanosecond())); } // 4. Return ? ToTemporalTime(item, overflow). - return TRY(to_temporal_time(global_object, item, overflow)); + return TRY(to_temporal_time(vm, item, overflow)); } // 4.2.3 Temporal.PlainTime.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.compare JS_DEFINE_NATIVE_FUNCTION(PlainTimeConstructor::compare) { // 1. Set one to ? ToTemporalTime(one). - auto* one = TRY(to_temporal_time(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_time(vm, vm.argument(0))); // 2. Set two to ? ToTemporalTime(two). - auto* two = TRY(to_temporal_time(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_time(vm, vm.argument(1))); // 3. Return 𝔽(! CompareTemporalTime(one.[[ISOHour]], one.[[ISOMinute]], one.[[ISOSecond]], one.[[ISOMillisecond]], one.[[ISOMicrosecond]], one.[[ISONanosecond]], two.[[ISOHour]], two.[[ISOMinute]], two.[[ISOSecond]], two.[[ISOMillisecond]], two.[[ISOMicrosecond]], two.[[ISONanosecond]])). return Value(compare_temporal_time(one->iso_hour(), one->iso_minute(), one->iso_second(), one->iso_millisecond(), one->iso_microsecond(), one->iso_nanosecond(), two->iso_hour(), two->iso_minute(), two->iso_second(), two->iso_millisecond(), two->iso_microsecond(), two->iso_nanosecond())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp index 1e196f8349..84776608d6 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainTimePrototype.cpp @@ -146,7 +146,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::add) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainTime(add, temporalTime, temporalDurationLike). - return TRY(add_duration_to_or_subtract_duration_from_plain_time(global_object, ArithmeticOperation::Add, *temporal_time, temporal_duration_like)); + return TRY(add_duration_to_or_subtract_duration_from_plain_time(vm, ArithmeticOperation::Add, *temporal_time, temporal_duration_like)); } // 4.3.11 Temporal.PlainTime.prototype.subtract ( temporalDurationLike ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.subtract @@ -159,7 +159,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::subtract) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainTime(subtract, temporalTime, temporalDurationLike). - return TRY(add_duration_to_or_subtract_duration_from_plain_time(global_object, ArithmeticOperation::Subtract, *temporal_time, temporal_duration_like)); + return TRY(add_duration_to_or_subtract_duration_from_plain_time(vm, ArithmeticOperation::Subtract, *temporal_time, temporal_duration_like)); } // 4.3.12 Temporal.PlainTime.prototype.with ( temporalTimeLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.with @@ -180,16 +180,16 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::with) auto& temporal_time_like = temporal_time_like_argument.as_object(); // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalTimeLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_time_like)); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_time_like)); // 5. Let partialTime be ? ToTemporalTimeRecord(temporalTimeLike, partial). - auto partial_time = TRY(to_temporal_time_record(global_object, temporal_time_like, ToTemporalTimeRecordCompleteness::Partial)); + auto partial_time = TRY(to_temporal_time_record(vm, temporal_time_like, ToTemporalTimeRecordCompleteness::Partial)); // 6. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 7. Let overflow be ? ToTemporalOverflow(options). - auto overflow = TRY(to_temporal_overflow(global_object, options)); + auto overflow = TRY(to_temporal_overflow(vm, options)); // 8. If partialTime.[[Hour]] is not undefined, then // a. Let hour be partialTime.[[Hour]]. @@ -228,10 +228,10 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::with) auto nanosecond = partial_time.nanosecond.value_or(temporal_time->iso_nanosecond()); // 20. Let result be ? RegulateTime(hour, minute, second, millisecond, microsecond, nanosecond, overflow). - auto result = TRY(regulate_time(global_object, hour, minute, second, millisecond, microsecond, nanosecond, overflow)); + auto result = TRY(regulate_time(vm, hour, minute, second, millisecond, microsecond, nanosecond, overflow)); // 21. Return ! CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]). - return MUST(create_temporal_time(global_object, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); + return MUST(create_temporal_time(vm, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); } // 4.3.13 Temporal.PlainTime.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.until @@ -245,7 +245,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::until) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainTime(until, temporalTime, other, options). - return TRY(difference_temporal_plain_time(global_object, DifferenceOperation::Until, *temporal_time, other, options)); + return TRY(difference_temporal_plain_time(vm, DifferenceOperation::Until, *temporal_time, other, options)); } // 4.3.14 Temporal.PlainTime.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.since @@ -259,7 +259,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::since) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainTime(since, temporalTime, other, options). - return TRY(difference_temporal_plain_time(global_object, DifferenceOperation::Since, *temporal_time, other, options)); + return TRY(difference_temporal_plain_time(vm, DifferenceOperation::Since, *temporal_time, other, options)); } // 4.3.15 Temporal.PlainTime.prototype.round ( roundTo ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.round @@ -292,26 +292,26 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::round) // 5. Else, else { // a. Set roundTo to ? GetOptionsObject(roundTo). - round_to = TRY(get_options_object(global_object, vm.argument(0))); + round_to = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let smallestUnit be ? GetTemporalUnit(roundTo, "smallestUnit", time, required). - auto smallest_unit = TRY(get_temporal_unit(global_object, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {})); + auto smallest_unit = TRY(get_temporal_unit(vm, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {})); // 7. Let roundingMode be ? ToTemporalRoundingMode(roundTo, "halfExpand"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *round_to, "halfExpand")); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *round_to, "halfExpand")); // 8. Let maximum be ! MaximumTemporalDurationRoundingIncrement(smallestUnit). auto maximum = maximum_temporal_duration_rounding_increment(*smallest_unit); // 9. Let roundingIncrement be ? ToTemporalRoundingIncrement(roundTo, maximum, false). - auto rounding_increment = TRY(to_temporal_rounding_increment(global_object, *round_to, *maximum, false)); + auto rounding_increment = TRY(to_temporal_rounding_increment(vm, *round_to, *maximum, false)); // 10. Let result be ! RoundTime(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], roundingIncrement, smallestUnit, roundingMode). auto 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(), rounding_increment, *smallest_unit, rounding_mode); // 11. Return ! CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]). - return MUST(create_temporal_time(global_object, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); + return MUST(create_temporal_time(vm, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond)); } // 4.3.16 Temporal.PlainTime.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.equals @@ -322,7 +322,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::equals) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalTime(other). - auto* other = TRY(to_temporal_time(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_time(vm, vm.argument(0))); // 4. If temporalTime.[[ISOHour]] ≠ other.[[ISOHour]], return false. if (temporal_time->iso_hour() != other->iso_hour()) @@ -360,10 +360,10 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_plain_date_time) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Set temporalDate to ? ToTemporalDate(temporalDate). - auto* temporal_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* temporal_date = TRY(to_temporal_date(vm, vm.argument(0))); // 4. Return ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], temporalDate.[[Calendar]]). - return TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); + return TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); } // 4.3.18 Temporal.PlainTime.prototype.toZonedDateTime ( item ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.tozoneddatetime @@ -391,7 +391,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_zoned_date_time) } // 6. Let temporalDate be ? ToTemporalDate(temporalDateLike). - auto* temporal_date = TRY(to_temporal_date(global_object, temporal_date_like)); + auto* temporal_date = TRY(to_temporal_date(vm, temporal_date_like)); // 7. Let temporalTimeZoneLike be ? Get(item, "timeZone"). auto temporal_time_zone_like = TRY(item.as_object().get(vm.names.timeZone)); @@ -403,16 +403,16 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_zoned_date_time) } // 9. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike). - auto* time_zone = TRY(to_temporal_time_zone(global_object, temporal_time_zone_like)); + auto* time_zone = TRY(to_temporal_time_zone(vm, temporal_time_zone_like)); // 10. Let temporalDateTime be ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], temporalDate.[[Calendar]]). - auto* temporal_date_time = TRY(create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); + auto* temporal_date_time = TRY(create_temporal_date_time(vm, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar())); // 11. Let instant be ? BuiltinTimeZoneGetInstantFor(timeZone, temporalDateTime, "compatible"). - auto* instant = TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *temporal_date_time, "compatible"sv)); + auto* instant = TRY(builtin_time_zone_get_instant_for(vm, time_zone, *temporal_date_time, "compatible"sv)); // 12. Return ! CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, temporalDate.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), *time_zone, temporal_date->calendar())); + return MUST(create_temporal_zoned_date_time(vm, instant->nanoseconds(), *time_zone, temporal_date->calendar())); } // 4.3.19 Temporal.PlainTime.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.getisofields @@ -460,13 +460,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::to_string) auto* temporal_time = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let precision be ? ToSecondsStringPrecision(options). - auto precision = TRY(to_seconds_string_precision(global_object, *options)); + auto precision = TRY(to_seconds_string_precision(vm, *options)); // 5. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc"sv)); // 6. Let roundResult be ! RoundTime(temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], precision.[[Increment]], precision.[[Unit]], roundingMode). 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); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp index 62b8064cd8..50af6adb23 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp @@ -33,9 +33,10 @@ void PlainYearMonth::visit_edges(Visitor& visitor) } // 9.5.1 ToTemporalYearMonth ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalyearmonth -ThrowCompletionOr to_temporal_year_month(GlobalObject& global_object, Value item, Object const* options) +ThrowCompletionOr to_temporal_year_month(VM& vm, Value item, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -51,43 +52,41 @@ ThrowCompletionOr to_temporal_year_month(GlobalObject& global_o } // b. Let calendar be ? GetTemporalCalendarWithISODefault(item). - auto* calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object)); + auto* calendar = TRY(get_temporal_calendar_with_iso_default(vm, item_object)); // c. Let fieldNames be ? CalendarFields(calendar, « "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "month"sv, "monthCode"sv, "year"sv })); // d. Let fields be ? PrepareTemporalFields(item, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, item_object, field_names, Vector {})); // e. Return ? CalendarYearMonthFromFields(calendar, fields, options). - return calendar_year_month_from_fields(global_object, *calendar, *fields, options); + return calendar_year_month_from_fields(vm, *calendar, *fields, options); } // 4. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // 5. Let string be ? ToString(item). auto string = TRY(item.to_string(global_object)); // 6. Let result be ? ParseTemporalYearMonthString(string). - auto result = TRY(parse_temporal_year_month_string(global_object, string)); + auto result = TRY(parse_temporal_year_month_string(vm, string)); // 7. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined())); // 8. Set result to ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[Day]]). - auto* creation_result = TRY(create_temporal_year_month(global_object, result.year, result.month, *calendar, result.day)); + auto* creation_result = TRY(create_temporal_year_month(vm, result.year, result.month, *calendar, result.day)); // 9. NOTE: The following operation is called without options, in order for the calendar to store a canonical value in the [[ISODay]] internal slot of the result. // 10. Return ? CalendarYearMonthFromFields(calendar, result). - return calendar_year_month_from_fields(global_object, *calendar, *creation_result); + return calendar_year_month_from_fields(vm, *calendar, *creation_result); } // 9.5.2 RegulateISOYearMonth ( year, month, overflow ), https://tc39.es/proposal-temporal/#sec-temporal-regulateisoyearmonth -ThrowCompletionOr regulate_iso_year_month(GlobalObject& global_object, double year, double month, StringView overflow) +ThrowCompletionOr regulate_iso_year_month(VM& vm, double year, double month, StringView overflow) { - auto& vm = global_object.vm(); - // 1. Assert: year and month are integers. VERIFY(year == trunc(year) && month == trunc(month)); @@ -187,9 +186,10 @@ ISOYearMonth balance_iso_year_month(double year, double month) } // 9.5.6 CreateTemporalYearMonth ( isoYear, isoMonth, calendar, referenceISODay [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalyearmonth -ThrowCompletionOr create_temporal_year_month(GlobalObject& global_object, i32 iso_year, u8 iso_month, Object& calendar, u8 reference_iso_day, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_year_month(VM& vm, i32 iso_year, u8 iso_month, Object& calendar, u8 reference_iso_day, FunctionObject const* new_target) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: isoYear, isoMonth, and referenceISODay are integers. // 2. Assert: Type(calendar) is Object. @@ -218,8 +218,11 @@ ThrowCompletionOr create_temporal_year_month(GlobalObject& glob } // 9.5.7 TemporalYearMonthToString ( yearMonth, showCalendar ), https://tc39.es/proposal-temporal/#sec-temporal-temporalyearmonthtostring -ThrowCompletionOr temporal_year_month_to_string(GlobalObject& global_object, PlainYearMonth& year_month, StringView show_calendar) +ThrowCompletionOr temporal_year_month_to_string(VM& vm, PlainYearMonth& year_month, StringView show_calendar) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: Type(yearMonth) is Object. // 2. Assert: yearMonth has an [[InitializedTemporalYearMonth]] internal slot. @@ -247,94 +250,92 @@ ThrowCompletionOr temporal_year_month_to_string(GlobalObject& global_obj } // 9.5.8 DifferenceTemporalPlainYearMonth ( operation, yearMonth, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplainyearmonth -ThrowCompletionOr difference_temporal_plain_year_month(GlobalObject& global_object, DifferenceOperation operation, PlainYearMonth& year_month, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_plain_year_month(VM& vm, DifferenceOperation operation, PlainYearMonth& year_month, Value other_value, Value options_value) { - auto& vm = global_object.vm(); - // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalYearMonth(other). - auto* other = TRY(to_temporal_year_month(global_object, other_value)); + auto* other = TRY(to_temporal_year_month(vm, other_value)); // 3. Let calendar be yearMonth.[[Calendar]]. auto& calendar = year_month.calendar(); // 4. If ? CalendarEquals(calendar, other.[[Calendar]]) is false, throw a RangeError exception. - if (!TRY(calendar_equals(global_object, calendar, other->calendar()))) + if (!TRY(calendar_equals(vm, calendar, other->calendar()))) return vm.throw_completion(ErrorType::TemporalDifferentCalendars); // 5. Let settings be ? GetDifferenceSettings(operation, options, date, « "week", "day" », "month", "year"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::Date, { "week"sv, "day"sv }, { "month"sv }, "year"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::Date, { "week"sv, "day"sv }, { "month"sv }, "year"sv)); // 6. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 7. Let otherFields be ? PrepareTemporalFields(other, fieldNames, «»). - auto* other_fields = TRY(prepare_temporal_fields(global_object, *other, field_names, Vector {})); + auto* other_fields = TRY(prepare_temporal_fields(vm, *other, field_names, Vector {})); // 8. Perform ! CreateDataPropertyOrThrow(otherFields, "day", 1𝔽). MUST(other_fields->create_data_property_or_throw(vm.names.day, Value(1))); // 9. Let otherDate be ? CalendarDateFromFields(calendar, otherFields). - auto* other_date = TRY(calendar_date_from_fields(global_object, calendar, *other_fields)); + auto* other_date = TRY(calendar_date_from_fields(vm, calendar, *other_fields)); // 10. Let thisFields be ? PrepareTemporalFields(yearMonth, fieldNames, «»). - auto* this_fields = TRY(prepare_temporal_fields(global_object, year_month, field_names, Vector {})); + auto* this_fields = TRY(prepare_temporal_fields(vm, year_month, field_names, Vector {})); // 11. Perform ! CreateDataPropertyOrThrow(thisFields, "day", 1𝔽). MUST(this_fields->create_data_property_or_throw(vm.names.day, Value(1))); // 12. Let thisDate be ? CalendarDateFromFields(calendar, thisFields). - auto* this_date = TRY(calendar_date_from_fields(global_object, calendar, *this_fields)); + auto* this_date = TRY(calendar_date_from_fields(vm, calendar, *this_fields)); // 13. Let untilOptions be ? MergeLargestUnitOption(settings.[[Options]], settings.[[LargestUnit]]). - auto* until_options = TRY(merge_largest_unit_option(global_object, settings.options, settings.largest_unit)); + auto* until_options = TRY(merge_largest_unit_option(vm, settings.options, settings.largest_unit)); // 14. Let result be ? CalendarDateUntil(calendar, thisDate, otherDate, untilOptions). - auto* duration = TRY(calendar_date_until(global_object, calendar, this_date, other_date, *until_options)); + auto* duration = TRY(calendar_date_until(vm, calendar, this_date, other_date, *until_options)); auto result = DurationRecord { duration->years(), duration->months(), 0, 0, 0, 0, 0, 0, 0, 0 }; // 15. If settings.[[SmallestUnit]] is not "month" or settings.[[RoundingIncrement]] ≠ 1, then if (settings.smallest_unit != "month"sv || settings.rounding_increment != 1) { // a. Set result to (? RoundDuration(result.[[Years]], result.[[Months]], 0, 0, 0, 0, 0, 0, 0, 0, settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]], thisDate)).[[DurationRecord]]. - result = TRY(round_duration(global_object, result.years, result.months, 0, 0, 0, 0, 0, 0, 0, 0, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, this_date)).duration_record; + result = TRY(round_duration(vm, result.years, result.months, 0, 0, 0, 0, 0, 0, 0, 0, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, this_date)).duration_record; } // 16. Return ! CreateTemporalDuration(sign × result.[[Years]], sign × result.[[Months]], 0, 0, 0, 0, 0, 0, 0, 0). - return MUST(create_temporal_duration(global_object, sign * result.years, sign * result.months, 0, 0, 0, 0, 0, 0, 0, 0)); + return MUST(create_temporal_duration(vm, sign * result.years, sign * result.months, 0, 0, 0, 0, 0, 0, 0, 0)); } // 9.5.9 AddDurationToOrSubtractDurationFromPlainYearMonth ( operation, yearMonth, temporalDurationLike, options ), https://tc39.es/proposal-temporal/#sec-temporal-addtemporalplainyearmonth -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_year_month(GlobalObject& global_object, ArithmeticOperation operation, PlainYearMonth& year_month, Value temporal_duration_like, Value options_value) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_year_month(VM& vm, ArithmeticOperation operation, PlainYearMonth& year_month, Value temporal_duration_like, Value options_value) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let duration be ? ToTemporalDuration(temporalDurationLike). - auto* duration = TRY(to_temporal_duration(global_object, temporal_duration_like)); + auto* duration = TRY(to_temporal_duration(vm, temporal_duration_like)); // 2. If operation is subtract, then if (operation == ArithmeticOperation::Subtract) { // a. Set duration to ! CreateNegatedTemporalDuration(duration). - duration = create_negated_temporal_duration(global_object, *duration); + duration = create_negated_temporal_duration(vm, *duration); } // 3. Let balanceResult be ? BalanceDuration(duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], "day"). - auto balance_result = TRY(balance_duration(global_object, duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from((i64)duration->nanoseconds()), "day"sv)); + auto balance_result = TRY(balance_duration(vm, duration->days(), duration->hours(), duration->minutes(), duration->seconds(), duration->milliseconds(), duration->microseconds(), Crypto::SignedBigInteger::create_from((i64)duration->nanoseconds()), "day"sv)); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, options_value)); + auto* options = TRY(get_options_object(vm, options_value)); // 5. Let calendar be yearMonth.[[Calendar]]. auto& calendar = year_month.calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 7. Let fields be ? PrepareTemporalFields(yearMonth, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, year_month, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, year_month, field_names, Vector {})); // 8. Set sign to ! DurationSign(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], balanceResult.[[Days]], 0, 0, 0, 0, 0, 0). auto sign = duration_sign(duration->years(), duration->months(), duration->weeks(), balance_result.days, 0, 0, 0, 0, 0, 0); @@ -344,10 +345,10 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_pla // 9. If sign < 0, then if (sign < 0) { // a. Let dayFromCalendar be ? CalendarDaysInMonth(calendar, yearMonth). - auto day_from_calendar = TRY(calendar_days_in_month(global_object, calendar, year_month)); + auto day_from_calendar = TRY(calendar_days_in_month(vm, calendar, year_month)); // b. Let day be ? ToPositiveInteger(dayFromCalendar). - day = TRY(to_positive_integer(global_object, day_from_calendar)); + day = TRY(to_positive_integer(vm, day_from_calendar)); } // 10. Else, else { @@ -359,10 +360,10 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_pla MUST(fields->create_data_property_or_throw(vm.names.day, Value(day))); // 12. Let date be ? CalendarDateFromFields(calendar, fields). - auto* date = TRY(calendar_date_from_fields(global_object, calendar, *fields)); + auto* date = TRY(calendar_date_from_fields(vm, calendar, *fields)); // 13. Let durationToAdd be ! CreateTemporalDuration(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], balanceResult.[[Days]], 0, 0, 0, 0, 0, 0). - auto* duration_to_add = MUST(create_temporal_duration(global_object, duration->years(), duration->months(), duration->weeks(), balance_result.days, 0, 0, 0, 0, 0, 0)); + auto* duration_to_add = MUST(create_temporal_duration(vm, duration->years(), duration->months(), duration->weeks(), balance_result.days, 0, 0, 0, 0, 0, 0)); // 14. Let optionsCopy be OrdinaryObjectCreate(null). auto* options_copy = Object::create(realm, nullptr); @@ -380,13 +381,13 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_pla } // 17. Let addedDate be ? CalendarDateAdd(calendar, date, durationToAdd, options). - auto* added_date = TRY(calendar_date_add(global_object, calendar, date, *duration_to_add, options)); + auto* added_date = TRY(calendar_date_add(vm, calendar, date, *duration_to_add, options)); // 18. Let addedDateFields be ? PrepareTemporalFields(addedDate, fieldNames, «»). - auto* added_date_fields = TRY(prepare_temporal_fields(global_object, *added_date, field_names, Vector {})); + auto* added_date_fields = TRY(prepare_temporal_fields(vm, *added_date, field_names, Vector {})); // 19. Return ? CalendarYearMonthFromFields(calendar, addedDateFields, optionsCopy). - return calendar_year_month_from_fields(global_object, calendar, *added_date_fields, options_copy); + return calendar_year_month_from_fields(vm, calendar, *added_date_fields, options_copy); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.h index 55d66ca83d..0e3a8b792a 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.h @@ -40,14 +40,14 @@ struct ISOYearMonth { u8 reference_iso_day; }; -ThrowCompletionOr to_temporal_year_month(GlobalObject& global_object, Value item, Object const* options = nullptr); -ThrowCompletionOr regulate_iso_year_month(GlobalObject&, double year, double month, StringView overflow); +ThrowCompletionOr to_temporal_year_month(VM&, Value item, Object const* options = nullptr); +ThrowCompletionOr regulate_iso_year_month(VM&, double year, double month, StringView overflow); bool is_valid_iso_month(u8 month); bool iso_year_month_within_limits(i32 year, u8 month); ISOYearMonth balance_iso_year_month(double year, double month); -ThrowCompletionOr create_temporal_year_month(GlobalObject&, i32 iso_year, u8 iso_month, Object& calendar, u8 reference_iso_day, FunctionObject const* new_target = nullptr); -ThrowCompletionOr temporal_year_month_to_string(GlobalObject&, PlainYearMonth&, StringView show_calendar); -ThrowCompletionOr difference_temporal_plain_year_month(GlobalObject&, DifferenceOperation, PlainYearMonth&, Value other, Value options); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_year_month(GlobalObject&, ArithmeticOperation, PlainYearMonth&, Value temporal_duration_like, Value options_value); +ThrowCompletionOr create_temporal_year_month(VM&, i32 iso_year, u8 iso_month, Object& calendar, u8 reference_iso_day, FunctionObject const* new_target = nullptr); +ThrowCompletionOr temporal_year_month_to_string(VM&, PlainYearMonth&, StringView show_calendar); +ThrowCompletionOr difference_temporal_plain_year_month(VM&, DifferenceOperation, PlainYearMonth&, Value other, Value options); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_plain_year_month(VM&, ArithmeticOperation, PlainYearMonth&, Value temporal_duration_like, Value options_value); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp index f355ea6701..ad4da09218 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp @@ -49,7 +49,6 @@ ThrowCompletionOr PlainYearMonthConstructor::call() ThrowCompletionOr PlainYearMonthConstructor::construct(FunctionObject& new_target) { auto& vm = this->vm(); - auto& global_object = this->global_object(); auto iso_year = vm.argument(0); auto iso_month = vm.argument(1); @@ -63,16 +62,16 @@ ThrowCompletionOr PlainYearMonthConstructor::construct(FunctionObject& } // 3. Let y be ? ToIntegerThrowOnInfinity(isoYear). - auto y = TRY(to_integer_throw_on_infinity(global_object, iso_year, ErrorType::TemporalInvalidPlainYearMonth)); + auto y = TRY(to_integer_throw_on_infinity(vm, iso_year, ErrorType::TemporalInvalidPlainYearMonth)); // 4. Let m be ? ToIntegerThrowOnInfinity(isoMonth). - auto m = TRY(to_integer_throw_on_infinity(global_object, iso_month, ErrorType::TemporalInvalidPlainYearMonth)); + auto m = TRY(to_integer_throw_on_infinity(vm, iso_month, ErrorType::TemporalInvalidPlainYearMonth)); // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, calendar_like)); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, calendar_like)); // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISODay). - auto ref = TRY(to_integer_throw_on_infinity(global_object, reference_iso_day, ErrorType::TemporalInvalidPlainYearMonth)); + auto ref = TRY(to_integer_throw_on_infinity(vm, reference_iso_day, ErrorType::TemporalInvalidPlainYearMonth)); // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards. // This does not change the exposed behavior as the call to CreateTemporalYearMonth will immediately check that these values are valid @@ -81,40 +80,40 @@ ThrowCompletionOr PlainYearMonthConstructor::construct(FunctionObject& return vm.throw_completion(ErrorType::TemporalInvalidPlainYearMonth); // 7. Return ? CreateTemporalYearMonth(y, m, calendar, ref, NewTarget). - return TRY(create_temporal_year_month(global_object, y, m, *calendar, ref, &new_target)); + return TRY(create_temporal_year_month(vm, y, m, *calendar, ref, &new_target)); } // 9.2.2 Temporal.PlainYearMonth.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.from JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthConstructor::from) { // 1. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); auto item = vm.argument(0); // 2. If Type(item) is Object and item has an [[InitializedTemporalYearMonth]] internal slot, then if (item.is_object() && is(item.as_object())) { // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); auto& plain_year_month_object = static_cast(item.as_object()); // b. Return ! CreateTemporalYearMonth(item.[[ISOYear]], item.[[ISOMonth]], item.[[Calendar]], item.[[ISODay]]). - return MUST(create_temporal_year_month(global_object, plain_year_month_object.iso_year(), plain_year_month_object.iso_month(), plain_year_month_object.calendar(), plain_year_month_object.iso_day())); + return MUST(create_temporal_year_month(vm, plain_year_month_object.iso_year(), plain_year_month_object.iso_month(), plain_year_month_object.calendar(), plain_year_month_object.iso_day())); } // 3. Return ? ToTemporalYearMonth(item, options). - return TRY(to_temporal_year_month(global_object, item, options)); + return TRY(to_temporal_year_month(vm, item, options)); } // 9.2.3 Temporal.PlainYearMonth.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.compare JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthConstructor::compare) { // 1. Set one to ? ToTemporalYearMonth(one). - auto* one = TRY(to_temporal_year_month(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_year_month(vm, vm.argument(0))); // 2. Set two to ? ToTemporalYearMonth(one). - auto* two = TRY(to_temporal_year_month(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_year_month(vm, vm.argument(1))); // 3. Return 𝔽(! CompareISODate(one.[[ISOYear]], one.[[ISOMonth]], one.[[ISODay]], two.[[ISOYear]], two.[[ISOMonth]], two.[[ISODay]])). return Value(compare_iso_date(one->iso_year(), one->iso_month(), one->iso_day(), two->iso_year(), two->iso_month(), two->iso_day())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp index 9a02780cbc..b62467064e 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp @@ -79,7 +79,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::year_getter) auto& calendar = year_month->calendar(); // 4. Return 𝔽(? CalendarYear(calendar, yearMonth)). - return Value(TRY(calendar_year(global_object, calendar, *year_month))); + return Value(TRY(calendar_year(vm, calendar, *year_month))); } // 9.3.5 get Temporal.PlainYearMonth.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.month @@ -93,7 +93,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::month_getter) auto& calendar = year_month->calendar(); // 4. Return 𝔽(? CalendarMonth(calendar, yearMonth)). - return Value(TRY(calendar_month(global_object, calendar, *year_month))); + return Value(TRY(calendar_month(vm, calendar, *year_month))); } // 9.3.6 get Temporal.PlainYearMonth.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthCode @@ -107,7 +107,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::month_code_getter) auto& calendar = year_month->calendar(); // 4. Return ? CalendarMonthCode(calendar, yearMonth). - return js_string(vm, TRY(calendar_month_code(global_object, calendar, *year_month))); + return js_string(vm, TRY(calendar_month_code(vm, calendar, *year_month))); } // 9.3.7 get Temporal.PlainYearMonth.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinyear @@ -121,7 +121,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::days_in_year_getter) auto& calendar = year_month->calendar(); // 4. Return ? CalendarDaysInYear(calendar, yearMonth). - return Value(TRY(calendar_days_in_year(global_object, calendar, *year_month))); + return Value(TRY(calendar_days_in_year(vm, calendar, *year_month))); } // 9.3.8 get Temporal.PlainYearMonth.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinmonth @@ -135,7 +135,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::days_in_month_getter) auto& calendar = year_month->calendar(); // 4. Return ? CalendarDaysInMonth(calendar, yearMonth). - return Value(TRY(calendar_days_in_month(global_object, calendar, *year_month))); + return Value(TRY(calendar_days_in_month(vm, calendar, *year_month))); } // 9.3.9 get Temporal.PlainYearMonth.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthsinyear @@ -149,7 +149,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::months_in_year_getter) auto& calendar = year_month->calendar(); // 4. Return ? CalendarMonthsInYear(calendar, yearMonth). - return Value(TRY(calendar_months_in_year(global_object, calendar, *year_month))); + return Value(TRY(calendar_months_in_year(vm, calendar, *year_month))); } // 9.3.10 get Temporal.PlainYearMonth.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.inleapyear @@ -163,7 +163,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::in_leap_year_getter) auto& calendar = year_month->calendar(); // 4. Return ? CalendarInLeapYear(calendar, yearMonth). - return Value(TRY(calendar_in_leap_year(global_object, calendar, *year_month))); + return Value(TRY(calendar_in_leap_year(vm, calendar, *year_month))); } // 15.6.9.2 get Temporal.PlainYearMonth.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.era @@ -177,7 +177,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::era_getter) auto& calendar = plain_year_month->calendar(); // 4. Return ? CalendarEra(calendar, plainYearMonth). - return TRY(calendar_era(global_object, calendar, *plain_year_month)); + return TRY(calendar_era(vm, calendar, *plain_year_month)); } // 15.6.9.3 get Temporal.PlainYearMonth.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.erayear @@ -191,7 +191,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::era_year_getter) auto& calendar = plain_year_month->calendar(); // 4. Return ? CalendarEraYear(calendar, plainYearMonth). - return TRY(calendar_era_year(global_object, calendar, *plain_year_month)); + return TRY(calendar_era_year(vm, calendar, *plain_year_month)); } // 9.3.11 Temporal.PlainYearMonth.prototype.with ( temporalYearMonthLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.with @@ -210,31 +210,31 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::with) } // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalYearMonthLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_year_month_like.as_object())); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_year_month_like.as_object())); // 5. Let calendar be yearMonth.[[Calendar]]. auto& calendar = year_month->calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "month", "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "month"sv, "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "month"sv, "monthCode"sv, "year"sv })); // 7. Let partialYearMonth be ? PrepareTemporalFields(temporalYearMonthLike, fieldNames, partial). - auto* partial_year_month = TRY(prepare_temporal_fields(global_object, temporal_year_month_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); + auto* partial_year_month = TRY(prepare_temporal_fields(vm, temporal_year_month_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); // 8. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 9. Let fields be ? PrepareTemporalFields(yearMonth, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *year_month, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *year_month, field_names, Vector {})); // 10. Set fields to ? CalendarMergeFields(calendar, fields, partialYearMonth). - fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *partial_year_month)); + fields = TRY(calendar_merge_fields(vm, calendar, *fields, *partial_year_month)); // 11. Set fields to ? PrepareTemporalFields(fields, fieldNames, «»). - fields = TRY(prepare_temporal_fields(global_object, *fields, field_names, Vector {})); + fields = TRY(prepare_temporal_fields(vm, *fields, field_names, Vector {})); // 12. Return ? CalendarYearMonthFromFields(calendar, fields, options). - return TRY(calendar_year_month_from_fields(global_object, calendar, *fields, options)); + return TRY(calendar_year_month_from_fields(vm, calendar, *fields, options)); } // 9.3.12 Temporal.PlainYearMonth.prototype.add ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.add @@ -248,7 +248,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::add) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainYearMonth(add, yearMonth, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_plain_year_month(global_object, ArithmeticOperation::Add, *year_month, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_plain_year_month(vm, ArithmeticOperation::Add, *year_month, temporal_duration_like, options)); } // 9.3.13 Temporal.PlainYearMonth.prototype.subtract ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.subtract @@ -262,7 +262,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::subtract) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromPlainYearMonth(add, yearMonth, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_plain_year_month(global_object, ArithmeticOperation::Subtract, *year_month, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_plain_year_month(vm, ArithmeticOperation::Subtract, *year_month, temporal_duration_like, options)); } // 9.3.14 Temporal.PlainYearMonth.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.until @@ -276,7 +276,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::until) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainYearMonth(until, yearMonth, other, options). - return TRY(difference_temporal_plain_year_month(global_object, DifferenceOperation::Until, *year_month, other, options)); + return TRY(difference_temporal_plain_year_month(vm, DifferenceOperation::Until, *year_month, other, options)); } // 9.3.15 Temporal.PlainYearMonth.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.since @@ -290,7 +290,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::since) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalPlainYearMonth(since, yearMonth, other, options). - return TRY(difference_temporal_plain_year_month(global_object, DifferenceOperation::Since, *year_month, other, options)); + return TRY(difference_temporal_plain_year_month(vm, DifferenceOperation::Since, *year_month, other, options)); } // 9.3.16 Temporal.PlainYearMonth.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.equals @@ -301,7 +301,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::equals) auto* year_month = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalYearMonth(other). - auto* other = TRY(to_temporal_year_month(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_year_month(vm, vm.argument(0))); // 4. If yearMonth.[[ISOYear]] ≠ other.[[ISOYear]], return false. if (year_month->iso_year() != other->iso_year()) @@ -316,7 +316,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::equals) return Value(false); // 7. Return ? CalendarEquals(yearMonth.[[Calendar]], other.[[Calendar]]). - return Value(TRY(calendar_equals(global_object, year_month->calendar(), other->calendar()))); + return Value(TRY(calendar_equals(vm, year_month->calendar(), other->calendar()))); } // 9.3.17 Temporal.PlainYearMonth.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.tostring @@ -327,13 +327,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::to_string) auto* year_month = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let showCalendar be ? ToShowCalendarOption(options). - auto show_calendar = TRY(to_show_calendar_option(global_object, *options)); + auto show_calendar = TRY(to_show_calendar_option(vm, *options)); // 5. Return ? TemporalYearMonthToString(yearMonth, showCalendar). - return js_string(vm, TRY(temporal_year_month_to_string(global_object, *year_month, show_calendar))); + return js_string(vm, TRY(temporal_year_month_to_string(vm, *year_month, show_calendar))); } // 9.3.18 Temporal.PlainYearMonth.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.tolocalestring @@ -345,7 +345,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::to_locale_string) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? TemporalYearMonthToString(yearMonth, "auto"). - return js_string(vm, TRY(temporal_year_month_to_string(global_object, *year_month, "auto"sv))); + return js_string(vm, TRY(temporal_year_month_to_string(vm, *year_month, "auto"sv))); } // 9.3.19 Temporal.PlainYearMonth.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.tojson @@ -356,7 +356,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::to_json) auto* year_month = TRY(typed_this_object(global_object)); // 3. Return ? TemporalYearMonthToString(yearMonth, "auto"). - return js_string(vm, TRY(temporal_year_month_to_string(global_object, *year_month, "auto"sv))); + return js_string(vm, TRY(temporal_year_month_to_string(vm, *year_month, "auto"sv))); } // 9.3.20 Temporal.PlainYearMonth.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.valueof @@ -387,25 +387,25 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::to_plain_date) auto& calendar = year_month->calendar(); // 5. Let receiverFieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto receiver_field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto receiver_field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 6. Let fields be ? PrepareTemporalFields(yearMonth, receiverFieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *year_month, receiver_field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *year_month, receiver_field_names, Vector {})); // 7. Let inputFieldNames be ? CalendarFields(calendar, « "day" »). - auto input_field_names = TRY(calendar_fields(global_object, calendar, { "day"sv })); + auto input_field_names = TRY(calendar_fields(vm, calendar, { "day"sv })); // 8. Let inputFields be ? PrepareTemporalFields(item, inputFieldNames, «»). - auto* input_fields = TRY(prepare_temporal_fields(global_object, item.as_object(), input_field_names, Vector {})); + auto* input_fields = TRY(prepare_temporal_fields(vm, item.as_object(), input_field_names, Vector {})); // 9. Let mergedFields be ? CalendarMergeFields(calendar, fields, inputFields). - auto* merged_fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *input_fields)); + auto* merged_fields = TRY(calendar_merge_fields(vm, calendar, *fields, *input_fields)); // 10. Let mergedFieldNames be MergeLists(receiverFieldNames, inputFieldNames). auto merged_field_names = merge_lists(receiver_field_names, input_field_names); // 11. Set mergedFields to ? PrepareTemporalFields(mergedFields, mergedFieldNames, «»). - merged_fields = TRY(prepare_temporal_fields(global_object, *merged_fields, merged_field_names, Vector {})); + merged_fields = TRY(prepare_temporal_fields(vm, *merged_fields, merged_field_names, Vector {})); // 12. Let options be OrdinaryObjectCreate(null). auto* options = Object::create(realm, nullptr); @@ -414,7 +414,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::to_plain_date) MUST(options->create_data_property_or_throw(vm.names.overflow, js_string(vm, vm.names.reject.as_string()))); // 14. Return ? CalendarDateFromFields(calendar, mergedFields, options). - return TRY(calendar_date_from_fields(global_object, calendar, *merged_fields, options)); + return TRY(calendar_date_from_fields(vm, calendar, *merged_fields, options)); } // 9.3.22 Temporal.PlainYearMonth.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.getisofields diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp index f54965a802..3035b24724 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp @@ -63,8 +63,11 @@ String default_time_zone() } // 11.6.1 CreateTemporalTimeZone ( identifier [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporaltimezone -ThrowCompletionOr create_temporal_time_zone(GlobalObject& global_object, String const& identifier, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_time_zone(VM& vm, String const& identifier, FunctionObject const* new_target) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If newTarget is not present, set newTarget to %Temporal.TimeZone%. if (!new_target) new_target = global_object.temporal_time_zone_constructor(); @@ -73,7 +76,7 @@ ThrowCompletionOr create_temporal_time_zone(GlobalObject& global_obje auto* object = TRY(ordinary_create_from_constructor(global_object, *new_target, &GlobalObject::temporal_time_zone_prototype)); // 3. Let offsetNanosecondsResult be Completion(ParseTimeZoneOffsetString(identifier)). - auto offset_nanoseconds_result = parse_time_zone_offset_string(global_object, identifier); + auto offset_nanoseconds_result = parse_time_zone_offset_string(vm, identifier); // 4. If offsetNanosecondsResult is an abrupt completion, then if (offset_nanoseconds_result.is_throw_completion()) { @@ -100,10 +103,8 @@ ThrowCompletionOr create_temporal_time_zone(GlobalObject& global_obje } // 11.6.2 GetISOPartsFromEpoch ( epochNanoseconds ), https://tc39.es/proposal-temporal/#sec-temporal-getisopartsfromepoch -ISODateTime get_iso_parts_from_epoch(GlobalObject& global_object, Crypto::SignedBigInteger const& epoch_nanoseconds) +ISODateTime get_iso_parts_from_epoch(VM& vm, Crypto::SignedBigInteger const& epoch_nanoseconds) { - auto& vm = global_object.vm(); - // 1. Assert: ! IsValidEpochNanoseconds(ℤ(epochNanoseconds)) is true. VERIFY(is_valid_epoch_nanoseconds(*js_bigint(vm, epoch_nanoseconds))); @@ -150,7 +151,7 @@ ISODateTime get_iso_parts_from_epoch(GlobalObject& global_object, Crypto::Signed } // 11.6.3 GetIANATimeZoneEpochValue ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond ), https://tc39.es/proposal-temporal/#sec-temporal-getianatimezoneepochvalue -MarkedVector get_iana_time_zone_epoch_value(GlobalObject& global_object, [[maybe_unused]] StringView time_zone_identifier, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) +MarkedVector get_iana_time_zone_epoch_value(VM& vm, [[maybe_unused]] StringView time_zone_identifier, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond) { // The implementation-defined abstract operation GetIANATimeZoneEpochValue takes arguments timeZoneIdentifier (a String), year (an integer), month (an integer between 1 and 12 inclusive), day (an integer between 1 and 31 inclusive), hour (an integer between 0 and 23 inclusive), minute (an integer between 0 and 59 inclusive), second (an integer between 0 and 59 inclusive), millisecond (an integer between 0 and 999 inclusive), microsecond (an integer between 0 and 999 inclusive), and nanosecond (an integer between 0 and 999 inclusive) and returns a List of BigInts. // Each value in the returned List represents a number of nanoseconds since the Unix epoch in UTC that corresponds to the given ISO 8601 calendar date and wall-clock time in the IANA time zone identified by timeZoneIdentifier. @@ -158,9 +159,8 @@ MarkedVector get_iana_time_zone_epoch_value(GlobalObject& global_object // It is an error to call GetIANATimeZoneEpochValue with arguments such that IsValidISODate(year, month, day) is false. // FIXME: Implement this properly for non-UTC timezones. - auto& vm = global_object.vm(); auto list = MarkedVector { vm.heap() }; - list.append(get_epoch_from_iso_parts(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); + list.append(get_epoch_from_iso_parts(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)); return list; } @@ -197,7 +197,7 @@ i64 get_iana_time_zone_offset_nanoseconds(BigInt const& epoch_nanoseconds, Strin } // 11.6.5 GetIANATimeZoneNextTransition ( epochNanoseconds, timeZoneIdentifier ), https://tc39.es/proposal-temporal/#sec-temporal-getianatimezonenexttransition -BigInt* get_iana_time_zone_next_transition(GlobalObject&, [[maybe_unused]] BigInt const& epoch_nanoseconds, [[maybe_unused]] StringView time_zone_identifier) +BigInt* get_iana_time_zone_next_transition(VM&, [[maybe_unused]] BigInt const& epoch_nanoseconds, [[maybe_unused]] StringView time_zone_identifier) { // The implementation-defined abstract operation GetIANATimeZoneNextTransition takes arguments epochNanoseconds (a BigInt) and timeZoneIdentifier (a String) and returns a BigInt or null. // The returned value t represents the number of nanoseconds since the Unix epoch in UTC that corresponds to the first time zone transition after epochNanoseconds in the IANA time zone identified by timeZoneIdentifier. The operation returns null if no such transition exists for which t ≤ ℤ(nsMaxInstant). @@ -208,7 +208,7 @@ BigInt* get_iana_time_zone_next_transition(GlobalObject&, [[maybe_unused]] BigIn } // 11.6.6 GetIANATimeZonePreviousTransition ( epochNanoseconds, timeZoneIdentifier ), https://tc39.es/proposal-temporal/#sec-temporal-getianatimezoneprevioustransition -BigInt* get_iana_time_zone_previous_transition(GlobalObject&, [[maybe_unused]] BigInt const& epoch_nanoseconds, [[maybe_unused]] StringView time_zone_identifier) +BigInt* get_iana_time_zone_previous_transition(VM&, [[maybe_unused]] BigInt const& epoch_nanoseconds, [[maybe_unused]] StringView time_zone_identifier) { // The implementation-defined abstract operation GetIANATimeZonePreviousTransition takes arguments epochNanoseconds (a BigInt) and timeZoneIdentifier (a String) and returns a BigInt or null. // The returned value t represents the number of nanoseconds since the Unix epoch in UTC that corresponds to the last time zone transition before epochNanoseconds in the IANA time zone identified by timeZoneIdentifier. The operation returns null if no such transition exists for which t ≥ ℤ(nsMinInstant). @@ -262,10 +262,8 @@ bool is_valid_time_zone_numeric_utc_offset_syntax(String const& offset_string) } // 11.6.7 ParseTimeZoneOffsetString ( offsetString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetimezoneoffsetstring -ThrowCompletionOr parse_time_zone_offset_string(GlobalObject& global_object, String const& offset_string) +ThrowCompletionOr parse_time_zone_offset_string(VM& vm, String const& offset_string) { - auto& vm = global_object.vm(); - // 1. Let parseResult be ParseText(StringToCodePoints(offsetString), TimeZoneNumericUTCOffset). auto parse_result = parse_iso8601(Production::TimeZoneNumericUTCOffset, offset_string); @@ -418,9 +416,10 @@ String format_iso_time_zone_offset_string(double offset_nanoseconds) } // 11.6.10 ToTemporalTimeZone ( temporalTimeZoneLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporaltimezone -ThrowCompletionOr to_temporal_time_zone(GlobalObject& global_object, Value temporal_time_zone_like) +ThrowCompletionOr to_temporal_time_zone(VM& vm, Value temporal_time_zone_like) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If Type(temporalTimeZoneLike) is Object, then if (temporal_time_zone_like.is_object()) { @@ -448,7 +447,7 @@ ThrowCompletionOr to_temporal_time_zone(GlobalObject& global_object, Va auto identifier = TRY(temporal_time_zone_like.to_string(global_object)); // 3. Let parseResult be ? ParseTemporalTimeZoneString(identifier). - auto parse_result = TRY(parse_temporal_time_zone_string(global_object, identifier)); + auto parse_result = TRY(parse_temporal_time_zone_string(vm, identifier)); // 4. If parseResult.[[Name]] is not undefined, then if (parse_result.name.has_value()) { @@ -466,21 +465,22 @@ ThrowCompletionOr to_temporal_time_zone(GlobalObject& global_object, Va } // c. Return ! CreateTemporalTimeZone(name). - return MUST(create_temporal_time_zone(global_object, name)); + return MUST(create_temporal_time_zone(vm, name)); } // 5. If parseResult.[[Z]] is true, return ! CreateTemporalTimeZone("UTC"). if (parse_result.z) - return MUST(create_temporal_time_zone(global_object, "UTC"sv)); + return MUST(create_temporal_time_zone(vm, "UTC"sv)); // 6. Return ! CreateTemporalTimeZone(parseResult.[[OffsetString]]). - return MUST(create_temporal_time_zone(global_object, *parse_result.offset_string)); + return MUST(create_temporal_time_zone(vm, *parse_result.offset_string)); } // 11.6.11 GetOffsetNanosecondsFor ( timeZone, instant ), https://tc39.es/proposal-temporal/#sec-temporal-getoffsetnanosecondsfor -ThrowCompletionOr get_offset_nanoseconds_for(GlobalObject& global_object, Value time_zone, Instant& instant) +ThrowCompletionOr get_offset_nanoseconds_for(VM& vm, Value time_zone, Instant& instant) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let getOffsetNanosecondsFor be ? GetMethod(timeZone, "getOffsetNanosecondsFor"). auto* get_offset_nanoseconds_for = TRY(time_zone.get_method(global_object, vm.names.getOffsetNanosecondsFor)); @@ -508,50 +508,48 @@ ThrowCompletionOr get_offset_nanoseconds_for(GlobalObject& global_object } // 11.6.12 BuiltinTimeZoneGetOffsetStringFor ( timeZone, instant ), https://tc39.es/proposal-temporal/#sec-temporal-builtintimezonegetoffsetstringfor -ThrowCompletionOr builtin_time_zone_get_offset_string_for(GlobalObject& global_object, Value time_zone, Instant& instant) +ThrowCompletionOr builtin_time_zone_get_offset_string_for(VM& vm, Value time_zone, Instant& instant) { // 1. Let offsetNanoseconds be ? GetOffsetNanosecondsFor(timeZone, instant). - auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(global_object, time_zone, instant)); + auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(vm, time_zone, instant)); // 2. Return ! FormatTimeZoneOffsetString(offsetNanoseconds). return format_time_zone_offset_string(offset_nanoseconds); } // 11.6.13 BuiltinTimeZoneGetPlainDateTimeFor ( timeZone, instant, calendar ), https://tc39.es/proposal-temporal/#sec-temporal-builtintimezonegetplaindatetimefor -ThrowCompletionOr builtin_time_zone_get_plain_date_time_for(GlobalObject& global_object, Value time_zone, Instant& instant, Object& calendar) +ThrowCompletionOr builtin_time_zone_get_plain_date_time_for(VM& vm, Value time_zone, Instant& instant, Object& calendar) { // 1. Assert: instant has an [[InitializedTemporalInstant]] internal slot. // 2. Let offsetNanoseconds be ? GetOffsetNanosecondsFor(timeZone, instant). - auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(global_object, time_zone, instant)); + auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(vm, time_zone, instant)); // 3. Let result be ! GetISOPartsFromEpoch(ℝ(instant.[[Nanoseconds]])). - auto result = get_iso_parts_from_epoch(global_object, instant.nanoseconds().big_integer()); + auto result = get_iso_parts_from_epoch(vm, instant.nanoseconds().big_integer()); // 4. Set result to BalanceISODateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]] + offsetNanoseconds). result = balance_iso_date_time(result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond + offset_nanoseconds); // 5. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], calendar). - return create_temporal_date_time(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, calendar); + return create_temporal_date_time(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, calendar); } // 11.6.14 BuiltinTimeZoneGetInstantFor ( timeZone, dateTime, disambiguation ), https://tc39.es/proposal-temporal/#sec-temporal-builtintimezonegetinstantfor -ThrowCompletionOr builtin_time_zone_get_instant_for(GlobalObject& global_object, Value time_zone, PlainDateTime& date_time, StringView disambiguation) +ThrowCompletionOr builtin_time_zone_get_instant_for(VM& vm, Value time_zone, PlainDateTime& date_time, StringView disambiguation) { // 1. Assert: dateTime has an [[InitializedTemporalDateTime]] internal slot. // 2. Let possibleInstants be ? GetPossibleInstantsFor(timeZone, dateTime). - auto possible_instants = TRY(get_possible_instants_for(global_object, time_zone, date_time)); + auto possible_instants = TRY(get_possible_instants_for(vm, time_zone, date_time)); // 3. Return ? DisambiguatePossibleInstants(possibleInstants, timeZone, dateTime, disambiguation). - return disambiguate_possible_instants(global_object, possible_instants, time_zone, date_time, disambiguation); + return disambiguate_possible_instants(vm, possible_instants, time_zone, date_time, disambiguation); } // 11.6.15 DisambiguatePossibleInstants ( possibleInstants, timeZone, dateTime, disambiguation ), https://tc39.es/proposal-temporal/#sec-temporal-disambiguatepossibleinstants -ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_object, MarkedVector const& possible_instants, Value time_zone, PlainDateTime& date_time, StringView disambiguation) +ThrowCompletionOr disambiguate_possible_instants(VM& vm, MarkedVector const& possible_instants, Value time_zone, PlainDateTime& date_time, StringView disambiguation) { - auto& vm = global_object.vm(); - // 1. Assert: dateTime has an [[InitializedTemporalDateTime]] internal slot. // 2. Let n be possibleInstants's length. @@ -594,7 +592,7 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ } // 7. Let epochNanoseconds be GetEpochFromISOParts(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]]). - auto* epoch_nanoseconds = get_epoch_from_iso_parts(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond()); + auto* epoch_nanoseconds = get_epoch_from_iso_parts(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond()); // 8. Let dayBeforeNs be epochNanoseconds - ℤ(nsPerDay). auto* day_before_ns = js_bigint(vm, epoch_nanoseconds->big_integer().minus(ns_per_day_bigint)); @@ -604,7 +602,7 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 10. Let dayBefore be ! CreateTemporalInstant(dayBeforeNs). - auto* day_before = MUST(create_temporal_instant(global_object, *day_before_ns)); + auto* day_before = MUST(create_temporal_instant(vm, *day_before_ns)); // 11. Let dayAfterNs be epochNanoseconds + ℤ(nsPerDay). auto* day_after_ns = js_bigint(vm, epoch_nanoseconds->big_integer().plus(ns_per_day_bigint)); @@ -614,13 +612,13 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 13. Let dayAfter be ! CreateTemporalInstant(dayAfterNs). - auto* day_after = MUST(create_temporal_instant(global_object, *day_after_ns)); + auto* day_after = MUST(create_temporal_instant(vm, *day_after_ns)); // 14. Let offsetBefore be ? GetOffsetNanosecondsFor(timeZone, dayBefore). - auto offset_before = TRY(get_offset_nanoseconds_for(global_object, time_zone, *day_before)); + auto offset_before = TRY(get_offset_nanoseconds_for(vm, time_zone, *day_before)); // 15. Let offsetAfter be ? GetOffsetNanosecondsFor(timeZone, dayAfter). - auto offset_after = TRY(get_offset_nanoseconds_for(global_object, time_zone, *day_after)); + auto offset_after = TRY(get_offset_nanoseconds_for(vm, time_zone, *day_after)); // 16. Let nanoseconds be offsetAfter - offsetBefore. auto nanoseconds = offset_after - offset_before; @@ -628,13 +626,13 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ // 17. If disambiguation is "earlier", then if (disambiguation == "earlier"sv) { // a. Let earlier be ? AddDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], dateTime.[[Calendar]], 0, 0, 0, 0, 0, 0, 0, 0, 0, -nanoseconds, undefined). - auto earlier = TRY(add_date_time(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), 0, 0, 0, 0, 0, 0, 0, 0, 0, -nanoseconds, nullptr)); + auto earlier = TRY(add_date_time(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), 0, 0, 0, 0, 0, 0, 0, 0, 0, -nanoseconds, nullptr)); // b. Let earlierDateTime be ! CreateTemporalDateTime(earlier.[[Year]], earlier.[[Month]], earlier.[[Day]], earlier.[[Hour]], earlier.[[Minute]], earlier.[[Second]], earlier.[[Millisecond]], earlier.[[Microsecond]], earlier.[[Nanosecond]], dateTime.[[Calendar]]). - auto* earlier_date_time = MUST(create_temporal_date_time(global_object, earlier.year, earlier.month, earlier.day, earlier.hour, earlier.minute, earlier.second, earlier.millisecond, earlier.microsecond, earlier.nanosecond, date_time.calendar())); + auto* earlier_date_time = MUST(create_temporal_date_time(vm, earlier.year, earlier.month, earlier.day, earlier.hour, earlier.minute, earlier.second, earlier.millisecond, earlier.microsecond, earlier.nanosecond, date_time.calendar())); // c. Set possibleInstants to ? GetPossibleInstantsFor(timeZone, earlierDateTime). - auto possible_instants_ = TRY(get_possible_instants_for(global_object, time_zone, *earlier_date_time)); + auto possible_instants_ = TRY(get_possible_instants_for(vm, time_zone, *earlier_date_time)); // d. If possibleInstants is empty, throw a RangeError exception. if (possible_instants_.is_empty()) @@ -648,13 +646,13 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ VERIFY(disambiguation.is_one_of("compatible"sv, "later"sv)); // 19. Let later be ? AddDateTime(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], dateTime.[[Calendar]], 0, 0, 0, 0, 0, 0, 0, 0, 0, nanoseconds, undefined). - auto later = TRY(add_date_time(global_object, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), 0, 0, 0, 0, 0, 0, 0, 0, 0, nanoseconds, nullptr)); + auto later = TRY(add_date_time(vm, date_time.iso_year(), date_time.iso_month(), date_time.iso_day(), date_time.iso_hour(), date_time.iso_minute(), date_time.iso_second(), date_time.iso_millisecond(), date_time.iso_microsecond(), date_time.iso_nanosecond(), date_time.calendar(), 0, 0, 0, 0, 0, 0, 0, 0, 0, nanoseconds, nullptr)); // 20. Let laterDateTime be ! CreateTemporalDateTime(later.[[Year]], later.[[Month]], later.[[Day]], later.[[Hour]], later.[[Minute]], later.[[Second]], later.[[Millisecond]], later.[[Microsecond]], later.[[Nanosecond]], dateTime.[[Calendar]]). - auto* later_date_time = MUST(create_temporal_date_time(global_object, later.year, later.month, later.day, later.hour, later.minute, later.second, later.millisecond, later.microsecond, later.nanosecond, date_time.calendar())); + auto* later_date_time = MUST(create_temporal_date_time(vm, later.year, later.month, later.day, later.hour, later.minute, later.second, later.millisecond, later.microsecond, later.nanosecond, date_time.calendar())); // 21. Set possibleInstants to ? GetPossibleInstantsFor(timeZone, laterDateTime). - auto possible_instants_ = TRY(get_possible_instants_for(global_object, time_zone, *later_date_time)); + auto possible_instants_ = TRY(get_possible_instants_for(vm, time_zone, *later_date_time)); // 22. Set n to possibleInstants's length. n = possible_instants_.size(); @@ -668,9 +666,10 @@ ThrowCompletionOr disambiguate_possible_instants(GlobalObject& global_ } // 11.6.16 GetPossibleInstantsFor ( timeZone, dateTime ), https://tc39.es/proposal-temporal/#sec-temporal-getpossibleinstantsfor -ThrowCompletionOr> get_possible_instants_for(GlobalObject& global_object, Value time_zone, PlainDateTime& date_time) +ThrowCompletionOr> get_possible_instants_for(VM& vm, Value time_zone, PlainDateTime& date_time) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Assert: dateTime has an [[InitializedTemporalDateTime]] internal slot. @@ -715,8 +714,11 @@ ThrowCompletionOr> get_possible_instants_for(GlobalObject } // 11.6.17 TimeZoneEquals ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-timezoneequals -ThrowCompletionOr time_zone_equals(GlobalObject& global_object, Object& one, Object& two) +ThrowCompletionOr time_zone_equals(VM& vm, Object& one, Object& two) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If one and two are the same Object value, return true. if (&one == &two) return true; diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.h b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.h index 42732d1aa3..74987776a7 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.h @@ -38,23 +38,23 @@ private: bool is_valid_time_zone_name(String const& time_zone); String canonicalize_time_zone_name(String const& time_zone); String default_time_zone(); -ThrowCompletionOr create_temporal_time_zone(GlobalObject&, String const& identifier, FunctionObject const* new_target = nullptr); -ISODateTime get_iso_parts_from_epoch(GlobalObject&, Crypto::SignedBigInteger const& epoch_nanoseconds); -MarkedVector get_iana_time_zone_epoch_value(GlobalObject&, StringView time_zone_identifier, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); +ThrowCompletionOr create_temporal_time_zone(VM&, String const& identifier, FunctionObject const* new_target = nullptr); +ISODateTime get_iso_parts_from_epoch(VM&, Crypto::SignedBigInteger const& epoch_nanoseconds); +MarkedVector get_iana_time_zone_epoch_value(VM&, StringView time_zone_identifier, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond); i64 get_iana_time_zone_offset_nanoseconds(BigInt const& epoch_nanoseconds, String const& time_zone_identifier); -BigInt* get_iana_time_zone_next_transition(GlobalObject&, BigInt const& epoch_nanoseconds, StringView time_zone_identifier); -BigInt* get_iana_time_zone_previous_transition(GlobalObject&, BigInt const& epoch_nanoseconds, StringView time_zone_identifier); -ThrowCompletionOr parse_time_zone_offset_string(GlobalObject&, String const&); +BigInt* get_iana_time_zone_next_transition(VM&, BigInt const& epoch_nanoseconds, StringView time_zone_identifier); +BigInt* get_iana_time_zone_previous_transition(VM&, BigInt const& epoch_nanoseconds, StringView time_zone_identifier); +ThrowCompletionOr parse_time_zone_offset_string(VM&, String const&); String format_time_zone_offset_string(double offset_nanoseconds); String format_iso_time_zone_offset_string(double offset_nanoseconds); -ThrowCompletionOr to_temporal_time_zone(GlobalObject&, Value temporal_time_zone_like); -ThrowCompletionOr get_offset_nanoseconds_for(GlobalObject&, Value time_zone, Instant&); -ThrowCompletionOr builtin_time_zone_get_offset_string_for(GlobalObject&, Value time_zone, Instant&); -ThrowCompletionOr builtin_time_zone_get_plain_date_time_for(GlobalObject&, Value time_zone, Instant&, Object& calendar); -ThrowCompletionOr builtin_time_zone_get_instant_for(GlobalObject&, Value time_zone, PlainDateTime&, StringView disambiguation); -ThrowCompletionOr disambiguate_possible_instants(GlobalObject&, MarkedVector const& possible_instants, Value time_zone, PlainDateTime&, StringView disambiguation); -ThrowCompletionOr> get_possible_instants_for(GlobalObject&, Value time_zone, PlainDateTime&); -ThrowCompletionOr time_zone_equals(GlobalObject&, Object& one, Object& two); +ThrowCompletionOr to_temporal_time_zone(VM&, Value temporal_time_zone_like); +ThrowCompletionOr get_offset_nanoseconds_for(VM&, Value time_zone, Instant&); +ThrowCompletionOr builtin_time_zone_get_offset_string_for(VM&, Value time_zone, Instant&); +ThrowCompletionOr builtin_time_zone_get_plain_date_time_for(VM&, Value time_zone, Instant&, Object& calendar); +ThrowCompletionOr builtin_time_zone_get_instant_for(VM&, Value time_zone, PlainDateTime&, StringView disambiguation); +ThrowCompletionOr disambiguate_possible_instants(VM&, MarkedVector const& possible_instants, Value time_zone, PlainDateTime&, StringView disambiguation); +ThrowCompletionOr> get_possible_instants_for(VM&, Value time_zone, PlainDateTime&); +ThrowCompletionOr time_zone_equals(VM&, Object& one, Object& two); bool is_valid_time_zone_numeric_utc_offset_syntax(String const&); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZoneConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZoneConstructor.cpp index e733475a0f..26e9c85f5e 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZoneConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZoneConstructor.cpp @@ -64,7 +64,7 @@ ThrowCompletionOr TimeZoneConstructor::construct(FunctionObject& new_ta } // 5. Return ? CreateTemporalTimeZone(identifier, NewTarget). - return TRY(create_temporal_time_zone(global_object, identifier, &new_target)); + return TRY(create_temporal_time_zone(vm, identifier, &new_target)); } // 11.3.2 Temporal.TimeZone.from ( item ), https://tc39.es/proposal-temporal/#sec-temporal.timezone.from @@ -73,7 +73,7 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZoneConstructor::from) auto item = vm.argument(0); // 1. Return ? ToTemporalTimeZone(item). - return TRY(to_temporal_time_zone(global_object, item)); + return TRY(to_temporal_time_zone(vm, item)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp index 5366748203..5cf7a6629d 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp @@ -63,7 +63,7 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_offset_nanoseconds_for) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set instant to ? ToTemporalInstant(instant). - auto* instant = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* instant = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. If timeZone.[[OffsetNanoseconds]] is not undefined, return 𝔽(timeZone.[[OffsetNanoseconds]]). if (time_zone->offset_nanoseconds().has_value()) @@ -81,10 +81,10 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_offset_string_for) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set instant to ? ToTemporalInstant(instant). - auto* instant = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* instant = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. Return ? BuiltinTimeZoneGetOffsetStringFor(timeZone, instant). - auto offset_string = TRY(builtin_time_zone_get_offset_string_for(global_object, time_zone, *instant)); + auto offset_string = TRY(builtin_time_zone_get_offset_string_for(vm, time_zone, *instant)); return js_string(vm, move(offset_string)); } @@ -96,13 +96,13 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_plain_date_time_for) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set instant to ? ToTemporalInstant(instant). - auto* instant = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* instant = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, vm.argument(1))); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, vm.argument(1))); // 5. Return ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - return TRY(builtin_time_zone_get_plain_date_time_for(global_object, time_zone, *instant, *calendar)); + return TRY(builtin_time_zone_get_plain_date_time_for(vm, time_zone, *instant, *calendar)); } // 11.4.7 Temporal.TimeZone.prototype.getInstantFor ( dateTime [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.timezone.prototype.getinstantfor @@ -113,16 +113,16 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_instant_for) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set dateTime to ? ToTemporalDateTime(dateTime). - auto* date_time = TRY(to_temporal_date_time(global_object, vm.argument(0))); + auto* date_time = TRY(to_temporal_date_time(vm, vm.argument(0))); // 4. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 5. Let disambiguation be ? ToTemporalDisambiguation(options). - auto disambiguation = TRY(to_temporal_disambiguation(global_object, options)); + auto disambiguation = TRY(to_temporal_disambiguation(vm, options)); // 6. Return ? BuiltinTimeZoneGetInstantFor(timeZone, dateTime, disambiguation). - return TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *date_time, disambiguation)); + return TRY(builtin_time_zone_get_instant_for(vm, time_zone, *date_time, disambiguation)); } // 11.4.8 Temporal.TimeZone.prototype.getPossibleInstantsFor ( dateTime ), https://tc39.es/proposal-temporal/#sec-temporal.timezone.prototype.getpossibleinstantsfor @@ -135,14 +135,14 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_possible_instants_for) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set dateTime to ? ToTemporalDateTime(dateTime). - auto* date_time = TRY(to_temporal_date_time(global_object, vm.argument(0))); + auto* date_time = TRY(to_temporal_date_time(vm, vm.argument(0))); auto possible_epoch_nanoseconds = MarkedVector { vm.heap() }; // 4. If timeZone.[[OffsetNanoseconds]] is not undefined, then if (time_zone->offset_nanoseconds().has_value()) { // a. Let epochNanoseconds be GetEpochFromISOParts(dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]]). - auto* epoch_nanoseconds = get_epoch_from_iso_parts(global_object, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond()); + auto* epoch_nanoseconds = get_epoch_from_iso_parts(vm, date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond()); // b. Let possibleEpochNanoseconds be « epochNanoseconds - ℤ(timeZone.[[OffsetNanoseconds]]) ». // FIXME: Narrowing conversion from 'double' to 'i64' @@ -151,7 +151,7 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_possible_instants_for) // 5. Else, else { // a. Let possibleEpochNanoseconds be GetIANATimeZoneEpochValue(timeZone.[[Identifier]], dateTime.[[ISOYear]], dateTime.[[ISOMonth]], dateTime.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]]). - possible_epoch_nanoseconds = get_iana_time_zone_epoch_value(global_object, time_zone->identifier(), date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond()); + possible_epoch_nanoseconds = get_iana_time_zone_epoch_value(vm, time_zone->identifier(), date_time->iso_year(), date_time->iso_month(), date_time->iso_day(), date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(), date_time->iso_millisecond(), date_time->iso_microsecond(), date_time->iso_nanosecond()); } // 6. Let possibleInstants be a new empty List. @@ -164,7 +164,7 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_possible_instants_for) return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // b. Let instant be ! CreateTemporalInstant(epochNanoseconds). - auto* instant = MUST(create_temporal_instant(global_object, *epoch_nanoseconds)); + auto* instant = MUST(create_temporal_instant(vm, *epoch_nanoseconds)); // c. Append instant to possibleInstants. possible_instants.append(instant); @@ -182,21 +182,21 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_next_transition) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set startingPoint to ? ToTemporalInstant(startingPoint). - auto* starting_point = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* starting_point = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. If timeZone.[[OffsetNanoseconds]] is not undefined, return null. if (!time_zone->offset_nanoseconds().has_value()) return js_null(); // 5. Let transition be GetIANATimeZoneNextTransition(startingPoint.[[Nanoseconds]], timeZone.[[Identifier]]). - auto* transition = get_iana_time_zone_next_transition(global_object, starting_point->nanoseconds(), time_zone->identifier()); + auto* transition = get_iana_time_zone_next_transition(vm, starting_point->nanoseconds(), time_zone->identifier()); // 6. If transition is null, return null. if (!transition) return js_null(); // 7. Return ! CreateTemporalInstant(transition). - return MUST(create_temporal_instant(global_object, *transition)); + return MUST(create_temporal_instant(vm, *transition)); } // 11.4.10 Temporal.TimeZone.prototype.getPreviousTransition ( startingPoint ), https://tc39.es/proposal-temporal/#sec-temporal.timezone.prototype.getprevioustransition @@ -207,21 +207,21 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_previous_transition) auto* time_zone = TRY(typed_this_object(global_object)); // 3. Set startingPoint to ? ToTemporalInstant(startingPoint). - auto* starting_point = TRY(to_temporal_instant(global_object, vm.argument(0))); + auto* starting_point = TRY(to_temporal_instant(vm, vm.argument(0))); // 4. If timeZone.[[OffsetNanoseconds]] is not undefined, return null. if (!time_zone->offset_nanoseconds().has_value()) return js_null(); // 5. Let transition be GetIANATimeZonePreviousTransition(startingPoint.[[Nanoseconds]], timeZone.[[Identifier]]). - auto* transition = get_iana_time_zone_previous_transition(global_object, starting_point->nanoseconds(), time_zone->identifier()); + auto* transition = get_iana_time_zone_previous_transition(vm, starting_point->nanoseconds(), time_zone->identifier()); // 6. If transition is null, return null. if (!transition) return js_null(); // 7. Return ! CreateTemporalInstant(transition). - return MUST(create_temporal_instant(global_object, *transition)); + return MUST(create_temporal_instant(vm, *transition)); } // 11.4.11 Temporal.TimeZone.prototype.toString ( ), https://tc39.es/proposal-temporal/#sec-temporal.timezone.prototype.tostring diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.cpp index f4293acc4d..52909b13e1 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.cpp @@ -38,20 +38,18 @@ void ZonedDateTime::visit_edges(Cell::Visitor& visitor) } // 6.5.1 InterpretISODateTimeOffset ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, offsetBehaviour, offsetNanoseconds, timeZone, disambiguation, offsetOption, matchBehaviour ), https://tc39.es/proposal-temporal/#sec-temporal-interpretisodatetimeoffset -ThrowCompletionOr interpret_iso_date_time_offset(GlobalObject& global_object, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, OffsetBehavior offset_behavior, double offset_nanoseconds, Value time_zone, StringView disambiguation, StringView offset_option, MatchBehavior match_behavior) +ThrowCompletionOr interpret_iso_date_time_offset(VM& vm, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, OffsetBehavior offset_behavior, double offset_nanoseconds, Value time_zone, StringView disambiguation, StringView offset_option, MatchBehavior match_behavior) { - auto& vm = global_object.vm(); - // 1. Let calendar be ! GetISO8601Calendar(). - auto* calendar = get_iso8601_calendar(global_object); + auto* calendar = get_iso8601_calendar(vm); // 2. Let dateTime be ? CreateTemporalDateTime(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, calendar). - auto* date_time = TRY(create_temporal_date_time(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, *calendar)); + auto* date_time = TRY(create_temporal_date_time(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond, *calendar)); // 3. If offsetBehaviour is wall or offsetOption is "ignore", then if (offset_behavior == OffsetBehavior::Wall || offset_option == "ignore"sv) { // a. Let instant be ? BuiltinTimeZoneGetInstantFor(timeZone, dateTime, disambiguation). - auto* instant = TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *date_time, disambiguation)); + auto* instant = TRY(builtin_time_zone_get_instant_for(vm, time_zone, *date_time, disambiguation)); // b. Return instant.[[Nanoseconds]]. return &instant->nanoseconds(); @@ -60,7 +58,7 @@ ThrowCompletionOr interpret_iso_date_time_offset(GlobalObject& gl // 4. If offsetBehaviour is exact or offsetOption is "use", then if (offset_behavior == OffsetBehavior::Exact || offset_option == "use"sv) { // a. Let epochNanoseconds be GetEpochFromISOParts(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond). - auto* epoch_nanoseconds = get_epoch_from_iso_parts(global_object, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond); + auto* epoch_nanoseconds = get_epoch_from_iso_parts(vm, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond); // b. Set epochNanoseconds to epochNanoseconds - ℤ(offsetNanoseconds). // FIXME: Narrowing conversion from 'double' to 'i64' @@ -82,12 +80,12 @@ ThrowCompletionOr interpret_iso_date_time_offset(GlobalObject& gl VERIFY(offset_option.is_one_of("prefer"sv, "reject"sv)); // 7. Let possibleInstants be ? GetPossibleInstantsFor(timeZone, dateTime). - auto possible_instants = TRY(get_possible_instants_for(global_object, time_zone, *date_time)); + auto possible_instants = TRY(get_possible_instants_for(vm, time_zone, *date_time)); // 8. For each element candidate of possibleInstants, do for (auto* candidate : possible_instants) { // a. Let candidateNanoseconds be ? GetOffsetNanosecondsFor(timeZone, candidate). - auto candidate_nanoseconds = TRY(get_offset_nanoseconds_for(global_object, time_zone, *candidate)); + auto candidate_nanoseconds = TRY(get_offset_nanoseconds_for(vm, time_zone, *candidate)); // b. If candidateNanoseconds = offsetNanoseconds, then if (candidate_nanoseconds == offset_nanoseconds) { @@ -113,16 +111,17 @@ ThrowCompletionOr interpret_iso_date_time_offset(GlobalObject& gl return vm.throw_completion(ErrorType::TemporalInvalidZonedDateTimeOffset); // 10. Let instant be ? DisambiguatePossibleInstants(possibleInstants, timeZone, dateTime, disambiguation). - auto* instant = TRY(disambiguate_possible_instants(global_object, possible_instants, time_zone, *date_time, disambiguation)); + auto* instant = TRY(disambiguate_possible_instants(vm, possible_instants, time_zone, *date_time, disambiguation)); // 11. Return instant.[[Nanoseconds]]. return &instant->nanoseconds(); } // 6.5.2 ToTemporalZonedDateTime ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalzoneddatetime -ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& global_object, Value item, Object const* options) +ThrowCompletionOr to_temporal_zoned_date_time(VM& vm, Value item, Object const* options) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -149,10 +148,10 @@ ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& glob } // b. Let calendar be ? GetTemporalCalendarWithISODefault(item). - calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object)); + calendar = TRY(get_temporal_calendar_with_iso_default(vm, item_object)); // c. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »). - auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, *calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); // d. Append "timeZone" to fieldNames. field_names.append("timeZone"); @@ -161,13 +160,13 @@ ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& glob field_names.append("offset"); // f. Let fields be ? PrepareTemporalFields(item, fieldNames, « "timeZone" »). - auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, Vector { "timeZone"sv })); + auto* fields = TRY(prepare_temporal_fields(vm, item_object, field_names, Vector { "timeZone"sv })); // g. Let timeZone be ! Get(fields, "timeZone"). auto time_zone_value = MUST(fields->get(vm.names.timeZone)); // h. Set timeZone to ? ToTemporalTimeZone(timeZone). - time_zone = TRY(to_temporal_time_zone(global_object, time_zone_value)); + time_zone = TRY(to_temporal_time_zone(vm, time_zone_value)); // i. Let offsetString be ! Get(fields, "offset"). auto offset_string_value = MUST(fields->get(vm.names.offset)); @@ -184,18 +183,18 @@ ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& glob } // l. Let result be ? InterpretTemporalDateTimeFields(calendar, fields, options). - result = TRY(interpret_temporal_date_time_fields(global_object, *calendar, *fields, *options)); + result = TRY(interpret_temporal_date_time_fields(vm, *calendar, *fields, *options)); } // 6. Else, else { // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // b. Let string be ? ToString(item). auto string = TRY(item.to_string(global_object)); // c. Let result be ? ParseTemporalZonedDateTimeString(string). - auto parsed_result = TRY(parse_temporal_zoned_date_time_string(global_object, string)); + auto parsed_result = TRY(parse_temporal_zoned_date_time_string(vm, string)); // NOTE: The ISODateTime struct inside parsed_result will be moved into `result` at the end of this path to avoid mismatching names. // Thus, all remaining references to `result` in this path actually refers to `parsed_result`. @@ -231,13 +230,13 @@ ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& glob } // j. Let timeZone be ! CreateTemporalTimeZone(timeZoneName). - time_zone = MUST(create_temporal_time_zone(global_object, *time_zone_name)); + time_zone = MUST(create_temporal_time_zone(vm, *time_zone_name)); // k. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]). auto temporal_calendar_like = parsed_result.date_time.calendar.has_value() ? js_string(vm, parsed_result.date_time.calendar.value()) : js_undefined(); - calendar = TRY(to_temporal_calendar_with_iso_default(global_object, temporal_calendar_like)); + calendar = TRY(to_temporal_calendar_with_iso_default(vm, temporal_calendar_like)); // l. Set matchBehaviour to match minutes. match_behavior = MatchBehavior::MatchMinutes; @@ -252,25 +251,28 @@ ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject& glob // 8. If offsetBehaviour is option, then if (offset_behavior == OffsetBehavior::Option) { // a. Set offsetNanoseconds to ? ParseTimeZoneOffsetString(offsetString). - offset_nanoseconds = TRY(parse_time_zone_offset_string(global_object, *offset_string)); + offset_nanoseconds = TRY(parse_time_zone_offset_string(vm, *offset_string)); } // 9. Let disambiguation be ? ToTemporalDisambiguation(options). - auto disambiguation = TRY(to_temporal_disambiguation(global_object, options)); + auto disambiguation = TRY(to_temporal_disambiguation(vm, options)); // 10. Let offsetOption be ? ToTemporalOffset(options, "reject"). - auto offset_option = TRY(to_temporal_offset(global_object, options, "reject")); + auto offset_option = TRY(to_temporal_offset(vm, options, "reject")); // 11. Let epochNanoseconds be ? InterpretISODateTimeOffset(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], offsetBehaviour, offsetNanoseconds, timeZone, disambiguation, offsetOption, matchBehaviour). - auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(global_object, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, offset_behavior, offset_nanoseconds, time_zone, disambiguation, offset_option, match_behavior)); + auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(vm, result.year, result.month, result.day, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond, offset_behavior, offset_nanoseconds, time_zone, disambiguation, offset_option, match_behavior)); // 12. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, *time_zone, *calendar)); + return MUST(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, *time_zone, *calendar)); } // 6.5.3 CreateTemporalZonedDateTime ( epochNanoseconds, timeZone, calendar [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalzoneddatetime -ThrowCompletionOr create_temporal_zoned_date_time(GlobalObject& global_object, BigInt const& epoch_nanoseconds, Object& time_zone, Object& calendar, FunctionObject const* new_target) +ThrowCompletionOr create_temporal_zoned_date_time(VM& vm, BigInt const& epoch_nanoseconds, Object& time_zone, Object& calendar, FunctionObject const* new_target) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. Assert: ! IsValidEpochNanoseconds(epochNanoseconds) is true. VERIFY(is_valid_epoch_nanoseconds(epoch_nanoseconds)); @@ -289,8 +291,11 @@ ThrowCompletionOr create_temporal_zoned_date_time(GlobalObject& } // 6.5.4 TemporalZonedDateTimeToString ( zonedDateTime, precision, showCalendar, showTimeZone, showOffset [ , increment, unit, roundingMode ] ), https://tc39.es/proposal-temporal/#sec-temporal-temporalzoneddatetimetostring -ThrowCompletionOr temporal_zoned_date_time_to_string(GlobalObject& global_object, ZonedDateTime& zoned_date_time, Variant const& precision, StringView show_calendar, StringView show_time_zone, StringView show_offset, Optional increment, Optional unit, Optional rounding_mode) +ThrowCompletionOr temporal_zoned_date_time_to_string(VM& vm, ZonedDateTime& zoned_date_time, Variant const& precision, StringView show_calendar, StringView show_time_zone, StringView show_offset, Optional increment, Optional unit, Optional rounding_mode) { + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); + // 1. If increment is not present, set increment to 1. if (!increment.has_value()) increment = 1; @@ -304,22 +309,22 @@ ThrowCompletionOr temporal_zoned_date_time_to_string(GlobalObject& globa rounding_mode = "trunc"sv; // 4. Let ns be ! RoundTemporalInstant(zonedDateTime.[[Nanoseconds]], increment, unit, roundingMode). - auto* ns = round_temporal_instant(global_object, zoned_date_time.nanoseconds(), *increment, *unit, *rounding_mode); + auto* ns = round_temporal_instant(vm, zoned_date_time.nanoseconds(), *increment, *unit, *rounding_mode); // 5. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time.time_zone(); // 6. Let instant be ! CreateTemporalInstant(ns). - auto* instant = MUST(create_temporal_instant(global_object, *ns)); + auto* instant = MUST(create_temporal_instant(vm, *ns)); // 7. Let isoCalendar be ! GetISO8601Calendar(). - auto* iso_calendar = get_iso8601_calendar(global_object); + auto* iso_calendar = get_iso8601_calendar(vm); // 8. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, isoCalendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, *iso_calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, *iso_calendar)); // 9. Let dateTimeString be ? TemporalDateTimeToString(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], temporalDateTime.[[ISOHour]], temporalDateTime.[[ISOMinute]], temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]], temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]], isoCalendar, precision, "never"). - auto date_time_string = TRY(temporal_date_time_to_string(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), iso_calendar, precision, "never"sv)); + auto date_time_string = TRY(temporal_date_time_to_string(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), iso_calendar, precision, "never"sv)); String offset_string; @@ -331,7 +336,7 @@ ThrowCompletionOr temporal_zoned_date_time_to_string(GlobalObject& globa // 11. Else, else { // a. Let offsetNs be ? GetOffsetNanosecondsFor(timeZone, instant). - auto offset_ns = TRY(get_offset_nanoseconds_for(global_object, &time_zone, *instant)); + auto offset_ns = TRY(get_offset_nanoseconds_for(vm, &time_zone, *instant)); // b. Let offsetString be ! FormatISOTimeZoneOffsetString(offsetNs). offset_string = format_iso_time_zone_offset_string(offset_ns); @@ -364,7 +369,7 @@ ThrowCompletionOr temporal_zoned_date_time_to_string(GlobalObject& globa } // 6.5.5 AddZonedDateTime ( epochNanoseconds, timeZone, calendar, years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-addzoneddatetime -ThrowCompletionOr add_zoned_date_time(GlobalObject& global_object, BigInt const& epoch_nanoseconds, Value time_zone, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options) +ThrowCompletionOr add_zoned_date_time(VM& vm, BigInt const& epoch_nanoseconds, Value time_zone, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options) { // 1. If options is not present, set options to undefined. // 2. Assert: Type(options) is Object or Undefined. @@ -372,36 +377,36 @@ ThrowCompletionOr add_zoned_date_time(GlobalObject& global_object, BigI // 3. If all of years, months, weeks, and days are 0, then if (years == 0 && months == 0 && weeks == 0 && days == 0) { // a. Return ? AddInstant(epochNanoseconds, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). - return add_instant(global_object, epoch_nanoseconds, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); + return add_instant(vm, epoch_nanoseconds, hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } // 4. Let instant be ! CreateTemporalInstant(epochNanoseconds). - auto* instant = MUST(create_temporal_instant(global_object, epoch_nanoseconds)); + auto* instant = MUST(create_temporal_instant(vm, epoch_nanoseconds)); // 5. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, time_zone, *instant, calendar)); // 6. Let datePart be ! CreateTemporalDate(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], calendar). - auto* date_part = MUST(create_temporal_date(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), calendar)); + auto* date_part = MUST(create_temporal_date(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), calendar)); // 7. Let dateDuration be ! CreateTemporalDuration(years, months, weeks, days, 0, 0, 0, 0, 0, 0). - auto* date_duration = MUST(create_temporal_duration(global_object, years, months, weeks, days, 0, 0, 0, 0, 0, 0)); + auto* date_duration = MUST(create_temporal_duration(vm, years, months, weeks, days, 0, 0, 0, 0, 0, 0)); // 8. Let addedDate be ? CalendarDateAdd(calendar, datePart, dateDuration, options). - auto* added_date = TRY(calendar_date_add(global_object, calendar, date_part, *date_duration, options)); + auto* added_date = TRY(calendar_date_add(vm, calendar, date_part, *date_duration, options)); // 9. Let intermediateDateTime be ? CreateTemporalDateTime(addedDate.[[ISOYear]], addedDate.[[ISOMonth]], addedDate.[[ISODay]], temporalDateTime.[[ISOHour]], temporalDateTime.[[ISOMinute]], temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]], temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]], calendar). - auto* intermediate_date_time = TRY(create_temporal_date_time(global_object, added_date->iso_year(), added_date->iso_month(), added_date->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), calendar)); + auto* intermediate_date_time = TRY(create_temporal_date_time(vm, added_date->iso_year(), added_date->iso_month(), added_date->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), calendar)); // 10. Let intermediateInstant be ? BuiltinTimeZoneGetInstantFor(timeZone, intermediateDateTime, "compatible"). - auto* intermediate_instant = TRY(builtin_time_zone_get_instant_for(global_object, time_zone, *intermediate_date_time, "compatible"sv)); + auto* intermediate_instant = TRY(builtin_time_zone_get_instant_for(vm, time_zone, *intermediate_date_time, "compatible"sv)); // 11. Return ? AddInstant(intermediateInstant.[[Nanoseconds]], hours, minutes, seconds, milliseconds, microseconds, nanoseconds). - return add_instant(global_object, intermediate_instant->nanoseconds(), hours, minutes, seconds, milliseconds, microseconds, nanoseconds); + return add_instant(vm, intermediate_instant->nanoseconds(), hours, minutes, seconds, milliseconds, microseconds, nanoseconds); } // 6.5.6 DifferenceZonedDateTime ( ns1, ns2, timeZone, calendar, largestUnit, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencezoneddatetime -ThrowCompletionOr difference_zoned_date_time(GlobalObject& global_object, BigInt const& nanoseconds1, BigInt const& nanoseconds2, Object& time_zone, Object& calendar, StringView largest_unit, Object const& options) +ThrowCompletionOr difference_zoned_date_time(VM& vm, BigInt const& nanoseconds1, BigInt const& nanoseconds2, Object& time_zone, Object& calendar, StringView largest_unit, Object const& options) { // 1. If ns1 is ns2, then if (nanoseconds1.big_integer() == nanoseconds2.big_integer()) { @@ -410,44 +415,43 @@ ThrowCompletionOr difference_zoned_date_time(GlobalObject& globa } // 2. Let startInstant be ! CreateTemporalInstant(ns1). - auto* start_instant = MUST(create_temporal_instant(global_object, nanoseconds1)); + auto* start_instant = MUST(create_temporal_instant(vm, nanoseconds1)); // 3. Let startDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, startInstant, calendar). - auto* start_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *start_instant, calendar)); + auto* start_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *start_instant, calendar)); // 4. Let endInstant be ! CreateTemporalInstant(ns2). - auto* end_instant = MUST(create_temporal_instant(global_object, nanoseconds2)); + auto* end_instant = MUST(create_temporal_instant(vm, nanoseconds2)); // 5. Let endDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, endInstant, calendar). - auto* end_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *end_instant, calendar)); + auto* end_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *end_instant, calendar)); // 6. Let dateDifference be ? DifferenceISODateTime(startDateTime.[[ISOYear]], startDateTime.[[ISOMonth]], startDateTime.[[ISODay]], startDateTime.[[ISOHour]], startDateTime.[[ISOMinute]], startDateTime.[[ISOSecond]], startDateTime.[[ISOMillisecond]], startDateTime.[[ISOMicrosecond]], startDateTime.[[ISONanosecond]], endDateTime.[[ISOYear]], endDateTime.[[ISOMonth]], endDateTime.[[ISODay]], endDateTime.[[ISOHour]], endDateTime.[[ISOMinute]], endDateTime.[[ISOSecond]], endDateTime.[[ISOMillisecond]], endDateTime.[[ISOMicrosecond]], endDateTime.[[ISONanosecond]], calendar, largestUnit, options). - auto date_difference = TRY(difference_iso_date_time(global_object, start_date_time->iso_year(), start_date_time->iso_month(), start_date_time->iso_day(), start_date_time->iso_hour(), start_date_time->iso_minute(), start_date_time->iso_second(), start_date_time->iso_millisecond(), start_date_time->iso_microsecond(), start_date_time->iso_nanosecond(), end_date_time->iso_year(), end_date_time->iso_month(), end_date_time->iso_day(), end_date_time->iso_hour(), end_date_time->iso_minute(), end_date_time->iso_second(), end_date_time->iso_millisecond(), end_date_time->iso_microsecond(), end_date_time->iso_nanosecond(), calendar, largest_unit, options)); + auto date_difference = TRY(difference_iso_date_time(vm, start_date_time->iso_year(), start_date_time->iso_month(), start_date_time->iso_day(), start_date_time->iso_hour(), start_date_time->iso_minute(), start_date_time->iso_second(), start_date_time->iso_millisecond(), start_date_time->iso_microsecond(), start_date_time->iso_nanosecond(), end_date_time->iso_year(), end_date_time->iso_month(), end_date_time->iso_day(), end_date_time->iso_hour(), end_date_time->iso_minute(), end_date_time->iso_second(), end_date_time->iso_millisecond(), end_date_time->iso_microsecond(), end_date_time->iso_nanosecond(), calendar, largest_unit, options)); // 7. Let intermediateNs be ? AddZonedDateTime(ns1, timeZone, calendar, dateDifference.[[Years]], dateDifference.[[Months]], dateDifference.[[Weeks]], 0, 0, 0, 0, 0, 0, 0). - auto* intermediate_ns = TRY(add_zoned_date_time(global_object, nanoseconds1, &time_zone, calendar, date_difference.years, date_difference.months, date_difference.weeks, 0, 0, 0, 0, 0, 0, 0)); + auto* intermediate_ns = TRY(add_zoned_date_time(vm, nanoseconds1, &time_zone, calendar, date_difference.years, date_difference.months, date_difference.weeks, 0, 0, 0, 0, 0, 0, 0)); // 8. Let timeRemainderNs be ns2 - intermediateNs. auto time_remainder_ns = nanoseconds2.big_integer().minus(intermediate_ns->big_integer()); // 9. Let intermediate be ! CreateTemporalZonedDateTime(intermediateNs, timeZone, calendar). - auto* intermediate = MUST(create_temporal_zoned_date_time(global_object, *intermediate_ns, time_zone, calendar)); + auto* intermediate = MUST(create_temporal_zoned_date_time(vm, *intermediate_ns, time_zone, calendar)); // 10. Let result be ? NanosecondsToDays(timeRemainderNs, intermediate). - auto result = TRY(nanoseconds_to_days(global_object, time_remainder_ns, intermediate)); + auto result = TRY(nanoseconds_to_days(vm, time_remainder_ns, intermediate)); // 11. Let timeDifference be ! BalanceDuration(0, 0, 0, 0, 0, 0, result.[[Nanoseconds]], "hour"). - auto time_difference = MUST(balance_duration(global_object, 0, 0, 0, 0, 0, 0, result.nanoseconds, "hour"sv)); + auto time_difference = MUST(balance_duration(vm, 0, 0, 0, 0, 0, 0, result.nanoseconds, "hour"sv)); // 12. Return ! CreateDurationRecord(dateDifference.[[Years]], dateDifference.[[Months]], dateDifference.[[Weeks]], result.[[Days]], timeDifference.[[Hours]], timeDifference.[[Minutes]], timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]]). return create_duration_record(date_difference.years, date_difference.months, date_difference.weeks, result.days, time_difference.hours, time_difference.minutes, time_difference.seconds, time_difference.milliseconds, time_difference.microseconds, time_difference.nanoseconds); } // 6.5.7 NanosecondsToDays ( nanoseconds, relativeTo ), https://tc39.es/proposal-temporal/#sec-temporal-nanosecondstodays -ThrowCompletionOr nanoseconds_to_days(GlobalObject& global_object, Crypto::SignedBigInteger nanoseconds, Value relative_to_value) +ThrowCompletionOr nanoseconds_to_days(VM& vm, Crypto::SignedBigInteger nanoseconds, Value relative_to_value) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); // 1. Let dayLengthNs be nsPerDay. auto day_length_ns = ns_per_day_bigint; @@ -477,10 +481,10 @@ ThrowCompletionOr nanoseconds_to_days(GlobalObject& glo auto& start_ns = relative_to.nanoseconds().big_integer(); // 6. Let startInstant be ! CreateTemporalInstant(ℤ(startNs)). - auto* start_instant = MUST(create_temporal_instant(global_object, *js_bigint(vm, start_ns))); + auto* start_instant = MUST(create_temporal_instant(vm, *js_bigint(vm, start_ns))); // 7. Let startDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(relativeTo.[[TimeZone]], startInstant, relativeTo.[[Calendar]]). - auto* start_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &relative_to.time_zone(), *start_instant, relative_to.calendar())); + auto* start_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &relative_to.time_zone(), *start_instant, relative_to.calendar())); // 8. Let endNs be startNs + nanoseconds. auto end_ns = start_ns.plus(nanoseconds); @@ -492,19 +496,19 @@ ThrowCompletionOr nanoseconds_to_days(GlobalObject& glo return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 10. Let endInstant be ! CreateTemporalInstant(ℤ(endNs)). - auto* end_instant = MUST(create_temporal_instant(global_object, *end_ns_bigint)); + auto* end_instant = MUST(create_temporal_instant(vm, *end_ns_bigint)); // 11. Let endDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(relativeTo.[[TimeZone]], endInstant, relativeTo.[[Calendar]]). - auto* end_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &relative_to.time_zone(), *end_instant, relative_to.calendar())); + auto* end_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &relative_to.time_zone(), *end_instant, relative_to.calendar())); // 12. Let dateDifference be ? DifferenceISODateTime(startDateTime.[[ISOYear]], startDateTime.[[ISOMonth]], startDateTime.[[ISODay]], startDateTime.[[ISOHour]], startDateTime.[[ISOMinute]], startDateTime.[[ISOSecond]], startDateTime.[[ISOMillisecond]], startDateTime.[[ISOMicrosecond]], startDateTime.[[ISONanosecond]], endDateTime.[[ISOYear]], endDateTime.[[ISOMonth]], endDateTime.[[ISODay]], endDateTime.[[ISOHour]], endDateTime.[[ISOMinute]], endDateTime.[[ISOSecond]], endDateTime.[[ISOMillisecond]], endDateTime.[[ISOMicrosecond]], endDateTime.[[ISONanosecond]], relativeTo.[[Calendar]], "day", OrdinaryObjectCreate(null)). - auto date_difference = TRY(difference_iso_date_time(global_object, start_date_time->iso_year(), start_date_time->iso_month(), start_date_time->iso_day(), start_date_time->iso_hour(), start_date_time->iso_minute(), start_date_time->iso_second(), start_date_time->iso_millisecond(), start_date_time->iso_microsecond(), start_date_time->iso_nanosecond(), end_date_time->iso_year(), end_date_time->iso_month(), end_date_time->iso_day(), end_date_time->iso_hour(), end_date_time->iso_minute(), end_date_time->iso_second(), end_date_time->iso_millisecond(), end_date_time->iso_microsecond(), end_date_time->iso_nanosecond(), relative_to.calendar(), "day"sv, *Object::create(realm, nullptr))); + auto date_difference = TRY(difference_iso_date_time(vm, start_date_time->iso_year(), start_date_time->iso_month(), start_date_time->iso_day(), start_date_time->iso_hour(), start_date_time->iso_minute(), start_date_time->iso_second(), start_date_time->iso_millisecond(), start_date_time->iso_microsecond(), start_date_time->iso_nanosecond(), end_date_time->iso_year(), end_date_time->iso_month(), end_date_time->iso_day(), end_date_time->iso_hour(), end_date_time->iso_minute(), end_date_time->iso_second(), end_date_time->iso_millisecond(), end_date_time->iso_microsecond(), end_date_time->iso_nanosecond(), relative_to.calendar(), "day"sv, *Object::create(realm, nullptr))); // 13. Let days be dateDifference.[[Days]]. auto days = date_difference.days; // 14. Let intermediateNs be ℝ(? AddZonedDateTime(ℤ(startNs), relativeTo.[[TimeZone]], relativeTo.[[Calendar]], 0, 0, 0, days, 0, 0, 0, 0, 0, 0)). - auto intermediate_ns = TRY(add_zoned_date_time(global_object, *js_bigint(vm, start_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, days, 0, 0, 0, 0, 0, 0))->big_integer(); + auto intermediate_ns = TRY(add_zoned_date_time(vm, *js_bigint(vm, start_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, days, 0, 0, 0, 0, 0, 0))->big_integer(); // 15. If sign is 1, then if (sign == 1) { @@ -514,7 +518,7 @@ ThrowCompletionOr nanoseconds_to_days(GlobalObject& glo days--; // ii. Set intermediateNs to ℝ(? AddZonedDateTime(ℤ(startNs), relativeTo.[[TimeZone]], relativeTo.[[Calendar]], 0, 0, 0, days, 0, 0, 0, 0, 0, 0)). - intermediate_ns = TRY(add_zoned_date_time(global_object, *js_bigint(vm, start_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, days, 0, 0, 0, 0, 0, 0))->big_integer(); + intermediate_ns = TRY(add_zoned_date_time(vm, *js_bigint(vm, start_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, days, 0, 0, 0, 0, 0, 0))->big_integer(); } } @@ -525,7 +529,7 @@ ThrowCompletionOr nanoseconds_to_days(GlobalObject& glo // 18. Repeat, while done is false, while (true) { // a. Let oneDayFartherNs be ℝ(? AddZonedDateTime(ℤ(intermediateNs), relativeTo.[[TimeZone]], relativeTo.[[Calendar]], 0, 0, 0, sign, 0, 0, 0, 0, 0, 0)). - auto one_day_farther_ns = TRY(add_zoned_date_time(global_object, *js_bigint(vm, intermediate_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, sign, 0, 0, 0, 0, 0, 0))->big_integer(); + auto one_day_farther_ns = TRY(add_zoned_date_time(vm, *js_bigint(vm, intermediate_ns), &relative_to.time_zone(), relative_to.calendar(), 0, 0, 0, sign, 0, 0, 0, 0, 0, 0))->big_integer(); // b. Set dayLengthNs to oneDayFartherNs - intermediateNs. day_length_ns = one_day_farther_ns.minus(intermediate_ns); @@ -553,72 +557,70 @@ ThrowCompletionOr nanoseconds_to_days(GlobalObject& glo } // 6.5.8 DifferenceTemporalZonedDateTime ( operation, zonedDateTime, other, options ), https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalzoneddatetime -ThrowCompletionOr difference_temporal_zoned_date_time(GlobalObject& global_object, DifferenceOperation operation, ZonedDateTime& zoned_date_time, Value other_value, Value options_value) +ThrowCompletionOr difference_temporal_zoned_date_time(VM& vm, DifferenceOperation operation, ZonedDateTime& zoned_date_time, Value other_value, Value options_value) { - auto& vm = global_object.vm(); - // 1. If operation is since, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == DifferenceOperation::Since ? -1 : 1; // 2. Set other to ? ToTemporalZonedDateTime(other). - auto* other = TRY(to_temporal_zoned_date_time(global_object, other_value)); + auto* other = TRY(to_temporal_zoned_date_time(vm, other_value)); // 3. If ? CalendarEquals(zonedDateTime.[[Calendar]], other.[[Calendar]]) is false, then - if (!TRY(calendar_equals(global_object, zoned_date_time.calendar(), other->calendar()))) { + if (!TRY(calendar_equals(vm, zoned_date_time.calendar(), other->calendar()))) { // a. Throw a RangeError exception. return vm.throw_completion(ErrorType::TemporalDifferentCalendars); } // 4. Let settings be ? GetDifferenceSettings(operation, options, datetime, « », "nanosecond", "hour"). - auto settings = TRY(get_difference_settings(global_object, operation, options_value, UnitGroup::DateTime, {}, { "nanosecond"sv }, "hour"sv)); + auto settings = TRY(get_difference_settings(vm, operation, options_value, UnitGroup::DateTime, {}, { "nanosecond"sv }, "hour"sv)); // 5. If settings.[[LargestUnit]] is not one of "year", "month", "week", or "day", then if (!settings.largest_unit.is_one_of("year"sv, "month"sv, "week"sv, "day"sv)) { // a. Let differenceNs be ! DifferenceInstant(zonedDateTime.[[Nanoseconds]], other.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]]). - auto* difference_ns = difference_instant(global_object, zoned_date_time.nanoseconds(), other->nanoseconds(), settings.rounding_increment, settings.smallest_unit, settings.rounding_mode); + auto* difference_ns = difference_instant(vm, zoned_date_time.nanoseconds(), other->nanoseconds(), settings.rounding_increment, settings.smallest_unit, settings.rounding_mode); // b. Assert: The following steps cannot fail due to overflow in the Number domain because abs(differenceNs) ≤ 2 × nsMaxInstant. // c. Let balanceResult be ! BalanceDuration(0, 0, 0, 0, 0, 0, differenceNs, settings.[[LargestUnit]]). - auto balance_result = MUST(balance_duration(global_object, 0, 0, 0, 0, 0, 0, difference_ns->big_integer(), settings.largest_unit)); + auto balance_result = MUST(balance_duration(vm, 0, 0, 0, 0, 0, 0, difference_ns->big_integer(), settings.largest_unit)); // d. Return ! CreateTemporalDuration(0, 0, 0, 0, sign × balanceResult.[[Hours]], sign × balanceResult.[[Minutes]], sign × balanceResult.[[Seconds]], sign × balanceResult.[[Milliseconds]], sign × balanceResult.[[Microseconds]], sign × balanceResult.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, 0, 0, 0, 0, sign * balance_result.hours, sign * balance_result.minutes, sign * balance_result.seconds, sign * balance_result.milliseconds, sign * balance_result.microseconds, sign * balance_result.nanoseconds)); + return MUST(create_temporal_duration(vm, 0, 0, 0, 0, sign * balance_result.hours, sign * balance_result.minutes, sign * balance_result.seconds, sign * balance_result.milliseconds, sign * balance_result.microseconds, sign * balance_result.nanoseconds)); } // 6. If ? TimeZoneEquals(zonedDateTime.[[TimeZone]], other.[[TimeZone]]) is false, then - if (!TRY(time_zone_equals(global_object, zoned_date_time.time_zone(), other->time_zone()))) { + if (!TRY(time_zone_equals(vm, zoned_date_time.time_zone(), other->time_zone()))) { // a. Throw a RangeError exception. return vm.throw_completion(ErrorType::TemporalDifferentTimeZones); } // 7. Let untilOptions be ? MergeLargestUnitOption(settings.[[Options]], settings.[[LargestUnit]]). - auto* until_options = TRY(merge_largest_unit_option(global_object, settings.options, settings.largest_unit)); + auto* until_options = TRY(merge_largest_unit_option(vm, settings.options, settings.largest_unit)); // 8. Let difference be ? DifferenceZonedDateTime(zonedDateTime.[[Nanoseconds]], other.[[Nanoseconds]], zonedDateTime.[[TimeZone]], zonedDateTime.[[Calendar]], settings.[[LargestUnit]], untilOptions). - auto difference = TRY(difference_zoned_date_time(global_object, zoned_date_time.nanoseconds(), other->nanoseconds(), zoned_date_time.time_zone(), zoned_date_time.calendar(), settings.largest_unit, *until_options)); + auto difference = TRY(difference_zoned_date_time(vm, zoned_date_time.nanoseconds(), other->nanoseconds(), zoned_date_time.time_zone(), zoned_date_time.calendar(), settings.largest_unit, *until_options)); // 9. Let roundResult be (? RoundDuration(difference.[[Years]], difference.[[Months]], difference.[[Weeks]], difference.[[Days]], difference.[[Hours]], difference.[[Minutes]], difference.[[Seconds]], difference.[[Milliseconds]], difference.[[Microseconds]], difference.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]], zonedDateTime)).[[DurationRecord]]. - auto round_result = TRY(round_duration(global_object, difference.years, difference.months, difference.weeks, difference.days, difference.hours, difference.minutes, difference.seconds, difference.milliseconds, difference.microseconds, difference.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &zoned_date_time)).duration_record; + auto round_result = TRY(round_duration(vm, difference.years, difference.months, difference.weeks, difference.days, difference.hours, difference.minutes, difference.seconds, difference.milliseconds, difference.microseconds, difference.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &zoned_date_time)).duration_record; // 10. Let result be ? AdjustRoundedDurationDays(roundResult.[[Years]], roundResult.[[Months]], roundResult.[[Weeks]], roundResult.[[Days]], roundResult.[[Hours]], roundResult.[[Minutes]], roundResult.[[Seconds]], roundResult.[[Milliseconds]], roundResult.[[Microseconds]], roundResult.[[Nanoseconds]], settings.[[RoundingIncrement]], settings.[[SmallestUnit]], settings.[[RoundingMode]], zonedDateTime). - auto result = TRY(adjust_rounded_duration_days(global_object, round_result.years, round_result.months, round_result.weeks, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, round_result.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &zoned_date_time)); + auto result = TRY(adjust_rounded_duration_days(vm, round_result.years, round_result.months, round_result.weeks, round_result.days, round_result.hours, round_result.minutes, round_result.seconds, round_result.milliseconds, round_result.microseconds, round_result.nanoseconds, settings.rounding_increment, settings.smallest_unit, settings.rounding_mode, &zoned_date_time)); // 11. Return ! CreateTemporalDuration(sign × result.[[Years]], sign × result.[[Months]], sign × result.[[Weeks]], sign × result.[[Days]], sign × result.[[Hours]], sign × result.[[Minutes]], sign × result.[[Seconds]], sign × result.[[Milliseconds]], sign × result.[[Microseconds]], sign × result.[[Nanoseconds]]). - return MUST(create_temporal_duration(global_object, sign * result.years, sign * result.months, sign * result.weeks, sign * result.days, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); + return MUST(create_temporal_duration(vm, sign * result.years, sign * result.months, sign * result.weeks, sign * result.days, sign * result.hours, sign * result.minutes, sign * result.seconds, sign * result.milliseconds, sign * result.microseconds, sign * result.nanoseconds)); } // 6.5.9 AddDurationToOrSubtractDurationFromZonedDateTime ( operation, zonedDateTime, temporalDurationLike, options ), https://tc39.es/proposal-temporal/#sec-temporal-adddurationtoOrsubtractdurationfromzoneddatetime -ThrowCompletionOr add_duration_to_or_subtract_duration_from_zoned_date_time(GlobalObject& global_object, ArithmeticOperation operation, ZonedDateTime& zoned_date_time, Value temporal_duration_like, Value options_value) +ThrowCompletionOr add_duration_to_or_subtract_duration_from_zoned_date_time(VM& vm, ArithmeticOperation operation, ZonedDateTime& zoned_date_time, Value temporal_duration_like, Value options_value) { // 1. If operation is subtract, let sign be -1. Otherwise, let sign be 1. i8 sign = operation == ArithmeticOperation::Subtract ? -1 : 1; // 2. Let duration be ? ToTemporalDurationRecord(temporalDurationLike). - auto duration = TRY(to_temporal_duration_record(global_object, temporal_duration_like)); + auto duration = TRY(to_temporal_duration_record(vm, temporal_duration_like)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, options_value)); + auto* options = TRY(get_options_object(vm, options_value)); // 4. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time.time_zone(); @@ -627,10 +629,10 @@ ThrowCompletionOr add_duration_to_or_subtract_duration_from_zone auto& calendar = zoned_date_time.calendar(); // 6. Let epochNanoseconds be ? AddZonedDateTime(zonedDateTime.[[Nanoseconds]], timeZone, calendar, sign × duration.[[Years]], sign × duration.[[Months]], sign × duration.[[Weeks]], sign × duration.[[Days]], sign × duration.[[Hours]], sign × duration.[[Minutes]], sign × duration.[[Seconds]], sign × duration.[[Milliseconds]], sign × duration.[[Microseconds]], sign × duration.[[Nanoseconds]], options). - auto* epoch_nanoseconds = TRY(add_zoned_date_time(global_object, zoned_date_time.nanoseconds(), &time_zone, calendar, sign * duration.years, sign * duration.months, sign * duration.weeks, sign * duration.days, sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds, options)); + auto* epoch_nanoseconds = TRY(add_zoned_date_time(vm, zoned_date_time.nanoseconds(), &time_zone, calendar, sign * duration.years, sign * duration.months, sign * duration.weeks, sign * duration.days, sign * duration.hours, sign * duration.minutes, sign * duration.seconds, sign * duration.milliseconds, sign * duration.microseconds, sign * duration.nanoseconds, options)); // 7. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, time_zone, calendar)); + return MUST(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, time_zone, calendar)); } } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.h b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.h index 5e421b25db..fb2f02f4c0 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTime.h @@ -50,14 +50,14 @@ enum class MatchBehavior { MatchMinutes, }; -ThrowCompletionOr interpret_iso_date_time_offset(GlobalObject&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, OffsetBehavior offset_behavior, double offset_nanoseconds, Value time_zone, StringView disambiguation, StringView offset_option, MatchBehavior match_behavior); -ThrowCompletionOr to_temporal_zoned_date_time(GlobalObject&, Value item, Object const* options = nullptr); -ThrowCompletionOr create_temporal_zoned_date_time(GlobalObject&, BigInt const& epoch_nanoseconds, Object& time_zone, Object& calendar, FunctionObject const* new_target = nullptr); -ThrowCompletionOr temporal_zoned_date_time_to_string(GlobalObject&, ZonedDateTime& zoned_date_time, Variant const& precision, StringView show_calendar, StringView show_time_zone, StringView show_offset, Optional increment = {}, Optional unit = {}, Optional rounding_mode = {}); -ThrowCompletionOr add_zoned_date_time(GlobalObject&, BigInt const& epoch_nanoseconds, Value time_zone, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options = nullptr); -ThrowCompletionOr difference_zoned_date_time(GlobalObject&, BigInt const& nanoseconds1, BigInt const& nanoseconds2, Object& time_zone, Object& calendar, StringView largest_unit, Object const& options); -ThrowCompletionOr nanoseconds_to_days(GlobalObject&, Crypto::SignedBigInteger nanoseconds, Value relative_to); -ThrowCompletionOr difference_temporal_zoned_date_time(GlobalObject&, DifferenceOperation, ZonedDateTime&, Value other, Value options); -ThrowCompletionOr add_duration_to_or_subtract_duration_from_zoned_date_time(GlobalObject&, ArithmeticOperation, ZonedDateTime&, Value temporal_duration_like, Value options_value); +ThrowCompletionOr interpret_iso_date_time_offset(VM&, i32 year, u8 month, u8 day, u8 hour, u8 minute, u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, OffsetBehavior offset_behavior, double offset_nanoseconds, Value time_zone, StringView disambiguation, StringView offset_option, MatchBehavior match_behavior); +ThrowCompletionOr to_temporal_zoned_date_time(VM&, Value item, Object const* options = nullptr); +ThrowCompletionOr create_temporal_zoned_date_time(VM&, BigInt const& epoch_nanoseconds, Object& time_zone, Object& calendar, FunctionObject const* new_target = nullptr); +ThrowCompletionOr temporal_zoned_date_time_to_string(VM&, ZonedDateTime& zoned_date_time, Variant const& precision, StringView show_calendar, StringView show_time_zone, StringView show_offset, Optional increment = {}, Optional unit = {}, Optional rounding_mode = {}); +ThrowCompletionOr add_zoned_date_time(VM&, BigInt const& epoch_nanoseconds, Value time_zone, Object& calendar, double years, double months, double weeks, double days, double hours, double minutes, double seconds, double milliseconds, double microseconds, double nanoseconds, Object* options = nullptr); +ThrowCompletionOr difference_zoned_date_time(VM&, BigInt const& nanoseconds1, BigInt const& nanoseconds2, Object& time_zone, Object& calendar, StringView largest_unit, Object const& options); +ThrowCompletionOr nanoseconds_to_days(VM&, Crypto::SignedBigInteger nanoseconds, Value relative_to); +ThrowCompletionOr difference_temporal_zoned_date_time(VM&, DifferenceOperation, ZonedDateTime&, Value other, Value options); +ThrowCompletionOr add_duration_to_or_subtract_duration_from_zoned_date_time(VM&, ArithmeticOperation, ZonedDateTime&, Value temporal_duration_like, Value options_value); } diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp index 0ffd136e0f..f06fdd851f 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp @@ -61,20 +61,20 @@ ThrowCompletionOr ZonedDateTimeConstructor::construct(FunctionObject& n return vm.throw_completion(ErrorType::TemporalInvalidEpochNanoseconds); // 4. Let timeZone be ? ToTemporalTimeZone(timeZoneLike). - auto* time_zone = TRY(to_temporal_time_zone(global_object, vm.argument(1))); + auto* time_zone = TRY(to_temporal_time_zone(vm, vm.argument(1))); // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike). - auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, vm.argument(2))); + auto* calendar = TRY(to_temporal_calendar_with_iso_default(vm, vm.argument(2))); // 6. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar, NewTarget). - return TRY(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, *time_zone, *calendar, &new_target)); + return TRY(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, *time_zone, *calendar, &new_target)); } // 6.2.2 Temporal.ZonedDateTime.from ( item [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.from JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimeConstructor::from) { // 1. Set options to ? GetOptionsObject(options). - auto const* options = TRY(get_options_object(global_object, vm.argument(1))); + auto const* options = TRY(get_options_object(vm, vm.argument(1))); auto item = vm.argument(0); @@ -83,30 +83,30 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimeConstructor::from) auto& item_object = static_cast(item.as_object()); // a. Perform ? ToTemporalOverflow(options). - (void)TRY(to_temporal_overflow(global_object, options)); + (void)TRY(to_temporal_overflow(vm, options)); // b. Perform ? ToTemporalDisambiguation(options). - (void)TRY(to_temporal_disambiguation(global_object, options)); + (void)TRY(to_temporal_disambiguation(vm, options)); // c. Perform ? ToTemporalOffset(options, "reject"). - (void)TRY(to_temporal_offset(global_object, options, "reject")); + (void)TRY(to_temporal_offset(vm, options, "reject")); // d. Return ! CreateTemporalZonedDateTime(item.[[Nanoseconds]], item.[[TimeZone]], item.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, item_object.nanoseconds(), item_object.time_zone(), item_object.calendar())); + return MUST(create_temporal_zoned_date_time(vm, item_object.nanoseconds(), item_object.time_zone(), item_object.calendar())); } // 3. Return ? ToTemporalZonedDateTime(item, options). - return TRY(to_temporal_zoned_date_time(global_object, item, options)); + return TRY(to_temporal_zoned_date_time(vm, item, options)); } // 6.2.3 Temporal.ZonedDateTime.compare ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.compare JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimeConstructor::compare) { // 1. Set one to ? ToTemporalZonedDateTime(one). - auto* one = TRY(to_temporal_zoned_date_time(global_object, vm.argument(0))); + auto* one = TRY(to_temporal_zoned_date_time(vm, vm.argument(0))); // 2. Set two to ? ToTemporalZonedDateTime(two). - auto* two = TRY(to_temporal_zoned_date_time(global_object, vm.argument(1))); + auto* two = TRY(to_temporal_zoned_date_time(vm, vm.argument(1))); // 3. Return 𝔽(! CompareEpochNanoseconds(one.[[Nanoseconds]], two.[[Nanoseconds]])). return Value(compare_epoch_nanoseconds(one->nanoseconds(), two->nanoseconds())); diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp index 75696d997c..9d685bb7f1 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp @@ -123,16 +123,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarYear(calendar, temporalDateTime). - return Value(TRY(calendar_year(global_object, calendar, *temporal_date_time))); + return Value(TRY(calendar_year(vm, calendar, *temporal_date_time))); } // 6.3.6 get Temporal.ZonedDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.month @@ -146,16 +146,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::month_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarMonth(calendar, temporalDateTime). - return Value(TRY(calendar_month(global_object, calendar, *temporal_date_time))); + return Value(TRY(calendar_month(vm, calendar, *temporal_date_time))); } // 6.3.7 get Temporal.ZonedDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthcode @@ -169,16 +169,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::month_code_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarMonthCode(calendar, temporalDateTime). - return js_string(vm, TRY(calendar_month_code(global_object, calendar, *temporal_date_time))); + return js_string(vm, TRY(calendar_month_code(vm, calendar, *temporal_date_time))); } // 6.3.8 get Temporal.ZonedDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.day @@ -192,16 +192,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDay(calendar, temporalDateTime). - return Value(TRY(calendar_day(global_object, calendar, *temporal_date_time))); + return Value(TRY(calendar_day(vm, calendar, *temporal_date_time))); } // 6.3.9 get Temporal.ZonedDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.hour @@ -215,13 +215,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::hour_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISOHour]]). return Value(temporal_date_time->iso_hour()); @@ -238,13 +238,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::minute_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISOMinute]]). return Value(temporal_date_time->iso_minute()); @@ -261,13 +261,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::second_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISOSecond]]). return Value(temporal_date_time->iso_second()); @@ -284,13 +284,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::millisecond_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISOMillisecond]]). return Value(temporal_date_time->iso_millisecond()); @@ -307,13 +307,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::microsecond_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISOMicrosecond]]). return Value(temporal_date_time->iso_microsecond()); @@ -330,13 +330,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::nanosecond_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return 𝔽(temporalDateTime.[[ISONanosecond]]). return Value(temporal_date_time->iso_nanosecond()); @@ -415,16 +415,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_of_week_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDayOfWeek(calendar, temporalDateTime). - return TRY(calendar_day_of_week(global_object, calendar, *temporal_date_time)); + return TRY(calendar_day_of_week(vm, calendar, *temporal_date_time)); } // 6.3.20 get Temporal.ZonedDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.dayofyear @@ -438,16 +438,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_of_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDayOfYear(calendar, temporalDateTime). - return TRY(calendar_day_of_year(global_object, calendar, *temporal_date_time)); + return TRY(calendar_day_of_year(vm, calendar, *temporal_date_time)); } // 6.3.21 get Temporal.ZonedDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.weekofyear @@ -461,16 +461,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::week_of_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarWeekOfYear(calendar, temporalDateTime). - return TRY(calendar_week_of_year(global_object, calendar, *temporal_date_time)); + return TRY(calendar_week_of_year(vm, calendar, *temporal_date_time)); } // 6.3.22 get Temporal.ZonedDateTime.prototype.hoursInDay, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.hoursinday @@ -484,13 +484,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::hours_in_day_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let isoCalendar be ! GetISO8601Calendar(). - auto* iso_calendar = get_iso8601_calendar(global_object); + auto* iso_calendar = get_iso8601_calendar(vm); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, isoCalendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, *iso_calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, *iso_calendar)); // 7. Let year be temporalDateTime.[[ISOYear]]. auto year = temporal_date_time->iso_year(); @@ -502,19 +502,19 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::hours_in_day_getter) auto day = temporal_date_time->iso_day(); // 10. Let today be ? CreateTemporalDateTime(year, month, day, 0, 0, 0, 0, 0, 0, isoCalendar). - auto* today = TRY(create_temporal_date_time(global_object, year, month, day, 0, 0, 0, 0, 0, 0, *iso_calendar)); + auto* today = TRY(create_temporal_date_time(vm, year, month, day, 0, 0, 0, 0, 0, 0, *iso_calendar)); // 11. Let tomorrowFields be BalanceISODate(year, month, day + 1). auto tomorrow_fields = balance_iso_date(year, month, day + 1); // 12. Let tomorrow be ? CreateTemporalDateTime(tomorrowFields.[[Year]], tomorrowFields.[[Month]], tomorrowFields.[[Day]], 0, 0, 0, 0, 0, 0, isoCalendar). - auto* tomorrow = TRY(create_temporal_date_time(global_object, tomorrow_fields.year, tomorrow_fields.month, tomorrow_fields.day, 0, 0, 0, 0, 0, 0, *iso_calendar)); + auto* tomorrow = TRY(create_temporal_date_time(vm, tomorrow_fields.year, tomorrow_fields.month, tomorrow_fields.day, 0, 0, 0, 0, 0, 0, *iso_calendar)); // 13. Let todayInstant be ? BuiltinTimeZoneGetInstantFor(timeZone, today, "compatible"). - auto* today_instant = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *today, "compatible"sv)); + auto* today_instant = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *today, "compatible"sv)); // 14. Let tomorrowInstant be ? BuiltinTimeZoneGetInstantFor(timeZone, tomorrow, "compatible"). - auto* tomorrow_instant = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *tomorrow, "compatible"sv)); + auto* tomorrow_instant = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *tomorrow, "compatible"sv)); // 15. Let diffNs be tomorrowInstant.[[Nanoseconds]] - todayInstant.[[Nanoseconds]]. auto diff_ns = tomorrow_instant->nanoseconds().big_integer().minus(today_instant->nanoseconds().big_integer()); @@ -535,16 +535,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_week_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDaysInWeek(calendar, temporalDateTime). - return TRY(calendar_days_in_week(global_object, calendar, *temporal_date_time)); + return TRY(calendar_days_in_week(vm, calendar, *temporal_date_time)); } // 6.3.24 get Temporal.ZonedDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinmonth @@ -558,16 +558,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_month_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDaysInMonth(calendar, temporalDateTime). - return TRY(calendar_days_in_month(global_object, calendar, *temporal_date_time)); + return TRY(calendar_days_in_month(vm, calendar, *temporal_date_time)); } // 6.3.25 get Temporal.ZonedDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinyear @@ -581,16 +581,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarDaysInYear(calendar, temporalDateTime). - return TRY(calendar_days_in_year(global_object, calendar, *temporal_date_time)); + return TRY(calendar_days_in_year(vm, calendar, *temporal_date_time)); } // 6.3.26 get Temporal.ZonedDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthsinyear @@ -604,16 +604,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::months_in_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarMonthsInYear(calendar, temporalDateTime). - return TRY(calendar_months_in_year(global_object, calendar, *temporal_date_time)); + return TRY(calendar_months_in_year(vm, calendar, *temporal_date_time)); } // 6.3.27 get Temporal.ZonedDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.inleapyear @@ -627,16 +627,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::in_leap_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarInLeapYear(calendar, temporalDateTime). - return TRY(calendar_in_leap_year(global_object, calendar, *temporal_date_time)); + return TRY(calendar_in_leap_year(vm, calendar, *temporal_date_time)); } // 6.3.28 get Temporal.ZonedDateTime.prototype.offsetNanoseconds, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.offsetnanoseconds @@ -650,10 +650,10 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::offset_nanoseconds_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Return 𝔽(? GetOffsetNanosecondsFor(timeZone, instant)). - return Value(TRY(get_offset_nanoseconds_for(global_object, &time_zone, *instant))); + return Value(TRY(get_offset_nanoseconds_for(vm, &time_zone, *instant))); } // 6.3.29 get Temporal.ZonedDateTime.prototype.offset, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.offset @@ -664,10 +664,10 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::offset_getter) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 4. Return ? BuiltinTimeZoneGetOffsetStringFor(zonedDateTime.[[TimeZone]], instant). - auto offset_string = TRY(builtin_time_zone_get_offset_string_for(global_object, &zoned_date_time->time_zone(), *instant)); + auto offset_string = TRY(builtin_time_zone_get_offset_string_for(vm, &zoned_date_time->time_zone(), *instant)); return js_string(vm, move(offset_string)); } @@ -682,16 +682,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::era_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarEra(calendar, plainDateTime). - return TRY(calendar_era(global_object, calendar, *plain_date_time)); + return TRY(calendar_era(vm, calendar, *plain_date_time)); } // 15.6.10.3 get Temporal.ZonedDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.erayear @@ -705,16 +705,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::era_year_getter) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ? CalendarEraYear(calendar, plainDateTime). - return TRY(calendar_era_year(global_object, calendar, *plain_date_time)); + return TRY(calendar_era_year(vm, calendar, *plain_date_time)); } // 6.3.30 Temporal.ZonedDateTime.prototype.with ( temporalZonedDateTimeLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.with @@ -733,28 +733,28 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with) } // 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalZonedDateTimeLike). - TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_zoned_date_time_like.as_object())); + TRY(reject_object_with_calendar_or_time_zone(vm, temporal_zoned_date_time_like.as_object())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "hour"sv, "microsecond"sv, "millisecond"sv, "minute"sv, "month"sv, "monthCode"sv, "nanosecond"sv, "second"sv, "year"sv })); // 7. Append "offset" to fieldNames. field_names.append("offset"sv); // 8. Let partialZonedDateTime be ? PrepareTemporalFields(temporalZonedDateTimeLike, fieldNames, partial). - auto* partial_zoned_date_time = TRY(prepare_temporal_fields(global_object, temporal_zoned_date_time_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); + auto* partial_zoned_date_time = TRY(prepare_temporal_fields(vm, temporal_zoned_date_time_like.as_object(), field_names, PrepareTemporalFieldsPartial {})); // 9. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(1))); + auto* options = TRY(get_options_object(vm, vm.argument(1))); // 10. Let disambiguation be ? ToTemporalDisambiguation(options). - auto disambiguation = TRY(to_temporal_disambiguation(global_object, options)); + auto disambiguation = TRY(to_temporal_disambiguation(vm, options)); // 11. Let offset be ? ToTemporalOffset(options, "prefer"). - auto offset = TRY(to_temporal_offset(global_object, options, "prefer"sv)); + auto offset = TRY(to_temporal_offset(vm, options, "prefer"sv)); // 12. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time->time_zone(); @@ -763,13 +763,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with) field_names.append("timeZone"sv); // 14. Let fields be ? PrepareTemporalFields(zonedDateTime, fieldNames, « "timeZone", "offset" »). - auto* fields = TRY(prepare_temporal_fields(global_object, *zoned_date_time, field_names, Vector { "timeZone"sv, "offset"sv })); + auto* fields = TRY(prepare_temporal_fields(vm, *zoned_date_time, field_names, Vector { "timeZone"sv, "offset"sv })); // 15. Set fields to ? CalendarMergeFields(calendar, fields, partialZonedDateTime). - fields = TRY(calendar_merge_fields(global_object, calendar, *fields, *partial_zoned_date_time)); + fields = TRY(calendar_merge_fields(vm, calendar, *fields, *partial_zoned_date_time)); // 16. Set fields to ? PrepareTemporalFields(fields, fieldNames, « "timeZone", "offset" »). - fields = TRY(prepare_temporal_fields(global_object, *fields, field_names, Vector { "timeZone"sv, "offset"sv })); + fields = TRY(prepare_temporal_fields(vm, *fields, field_names, Vector { "timeZone"sv, "offset"sv })); // 17. Let offsetString be ! Get(fields, "offset"). auto offset_string = MUST(fields->get(vm.names.offset)); @@ -778,16 +778,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with) VERIFY(offset_string.is_string()); // 19. Let dateTimeResult be ? InterpretTemporalDateTimeFields(calendar, fields, options). - auto date_time_result = TRY(interpret_temporal_date_time_fields(global_object, calendar, *fields, *options)); + auto date_time_result = TRY(interpret_temporal_date_time_fields(vm, calendar, *fields, *options)); // 20. Let offsetNanoseconds be ? ParseTimeZoneOffsetString(offsetString). - auto offset_nanoseconds = TRY(parse_time_zone_offset_string(global_object, offset_string.as_string().string())); + auto offset_nanoseconds = TRY(parse_time_zone_offset_string(vm, offset_string.as_string().string())); // 21. Let epochNanoseconds be ? InterpretISODateTimeOffset(dateTimeResult.[[Year]], dateTimeResult.[[Month]], dateTimeResult.[[Day]], dateTimeResult.[[Hour]], dateTimeResult.[[Minute]], dateTimeResult.[[Second]], dateTimeResult.[[Millisecond]], dateTimeResult.[[Microsecond]], dateTimeResult.[[Nanosecond]], option, offsetNanoseconds, timeZone, disambiguation, offset, match exactly). - auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(global_object, date_time_result.year, date_time_result.month, date_time_result.day, date_time_result.hour, date_time_result.minute, date_time_result.second, date_time_result.millisecond, date_time_result.microsecond, date_time_result.nanosecond, OffsetBehavior::Option, offset_nanoseconds, &time_zone, disambiguation, offset, MatchBehavior::MatchExactly)); + auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(vm, date_time_result.year, date_time_result.month, date_time_result.day, date_time_result.hour, date_time_result.minute, date_time_result.second, date_time_result.millisecond, date_time_result.microsecond, date_time_result.nanosecond, OffsetBehavior::Option, offset_nanoseconds, &time_zone, disambiguation, offset, MatchBehavior::MatchExactly)); // 22. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, time_zone, calendar)); + return MUST(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, time_zone, calendar)); } // 6.3.31 Temporal.ZonedDateTime.prototype.withPlainTime ( [ plainTimeLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.withplaintime @@ -802,34 +802,34 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with_plain_time) // 3. If plainTimeLike is undefined, then if (vm.argument(0).is_undefined()) { // a. Let plainTime be ! CreateTemporalTime(0, 0, 0, 0, 0, 0). - plain_time = MUST(create_temporal_time(global_object, 0, 0, 0, 0, 0, 0)); + plain_time = MUST(create_temporal_time(vm, 0, 0, 0, 0, 0, 0)); } // 4. Else, else { // a. Let plainTime be ? ToTemporalTime(plainTimeLike). - plain_time = TRY(to_temporal_time(global_object, vm.argument(0))); + plain_time = TRY(to_temporal_time(vm, vm.argument(0))); } // 5. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time->time_zone(); // 6. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 7. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 8. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 9. Let resultPlainDateTime be ? CreateTemporalDateTime(plainDateTime.[[ISOYear]], plainDateTime.[[ISOMonth]], plainDateTime.[[ISODay]], plainTime.[[ISOHour]], plainTime.[[ISOMinute]], plainTime.[[ISOSecond]], plainTime.[[ISOMillisecond]], plainTime.[[ISOMicrosecond]], plainTime.[[ISONanosecond]], calendar). - auto* result_plain_date_time = TRY(create_temporal_date_time(global_object, plain_date_time->iso_year(), plain_date_time->iso_month(), plain_date_time->iso_day(), plain_time->iso_hour(), plain_time->iso_minute(), plain_time->iso_second(), plain_time->iso_millisecond(), plain_time->iso_microsecond(), plain_time->iso_nanosecond(), calendar)); + auto* result_plain_date_time = TRY(create_temporal_date_time(vm, plain_date_time->iso_year(), plain_date_time->iso_month(), plain_date_time->iso_day(), plain_time->iso_hour(), plain_time->iso_minute(), plain_time->iso_second(), plain_time->iso_millisecond(), plain_time->iso_microsecond(), plain_time->iso_nanosecond(), calendar)); // 10. Set instant to ? BuiltinTimeZoneGetInstantFor(timeZone, resultPlainDateTime, "compatible"). - instant = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *result_plain_date_time, "compatible"sv)); + instant = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *result_plain_date_time, "compatible"sv)); // 11. Return ! CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), time_zone, calendar)); + return MUST(create_temporal_zoned_date_time(vm, instant->nanoseconds(), time_zone, calendar)); } // 6.3.32 Temporal.ZonedDateTime.prototype.withPlainDate ( plainDateLike ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.withplaindate @@ -840,28 +840,28 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with_plain_date) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Let plainDate be ? ToTemporalDate(plainDateLike). - auto* plain_date = TRY(to_temporal_date(global_object, vm.argument(0))); + auto* plain_date = TRY(to_temporal_date(vm, vm.argument(0))); // 4. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time->time_zone(); // 5. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 6. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, zonedDateTime.[[Calendar]]). - auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, zoned_date_time->calendar())); + auto* plain_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, zoned_date_time->calendar())); // 7. Let calendar be ? ConsolidateCalendars(zonedDateTime.[[Calendar]], plainDate.[[Calendar]]). - auto* calendar = TRY(consolidate_calendars(global_object, zoned_date_time->calendar(), plain_date->calendar())); + auto* calendar = TRY(consolidate_calendars(vm, zoned_date_time->calendar(), plain_date->calendar())); // 8. Let resultPlainDateTime be ? CreateTemporalDateTime(plainDate.[[ISOYear]], plainDate.[[ISOMonth]], plainDate.[[ISODay]], plainDateTime.[[ISOHour]], plainDateTime.[[ISOMinute]], plainDateTime.[[ISOSecond]], plainDateTime.[[ISOMillisecond]], plainDateTime.[[ISOMicrosecond]], plainDateTime.[[ISONanosecond]], calendar). - auto* result_plain_date_time = TRY(create_temporal_date_time(global_object, plain_date->iso_year(), plain_date->iso_month(), plain_date->iso_day(), plain_date_time->iso_hour(), plain_date_time->iso_minute(), plain_date_time->iso_second(), plain_date_time->iso_millisecond(), plain_date_time->iso_microsecond(), plain_date_time->iso_nanosecond(), *calendar)); + auto* result_plain_date_time = TRY(create_temporal_date_time(vm, plain_date->iso_year(), plain_date->iso_month(), plain_date->iso_day(), plain_date_time->iso_hour(), plain_date_time->iso_minute(), plain_date_time->iso_second(), plain_date_time->iso_millisecond(), plain_date_time->iso_microsecond(), plain_date_time->iso_nanosecond(), *calendar)); // 9. Set instant to ? BuiltinTimeZoneGetInstantFor(timeZone, resultPlainDateTime, "compatible"). - instant = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *result_plain_date_time, "compatible"sv)); + instant = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *result_plain_date_time, "compatible"sv)); // 10. Return ! CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, instant->nanoseconds(), time_zone, *calendar)); + return MUST(create_temporal_zoned_date_time(vm, instant->nanoseconds(), time_zone, *calendar)); } // 6.3.33 Temporal.ZonedDateTime.prototype.withTimeZone ( timeZoneLike ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.withtimezone @@ -872,10 +872,10 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with_time_zone) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Let timeZone be ? ToTemporalTimeZone(timeZoneLike). - auto* time_zone = TRY(to_temporal_time_zone(global_object, vm.argument(0))); + auto* time_zone = TRY(to_temporal_time_zone(vm, vm.argument(0))); // 4. Return ! CreateTemporalZonedDateTime(zonedDateTime.[[Nanoseconds]], timeZone, zonedDateTime.[[Calendar]]). - return MUST(create_temporal_zoned_date_time(global_object, zoned_date_time->nanoseconds(), *time_zone, zoned_date_time->calendar())); + return MUST(create_temporal_zoned_date_time(vm, zoned_date_time->nanoseconds(), *time_zone, zoned_date_time->calendar())); } // 6.3.34 Temporal.ZonedDateTime.prototype.withCalendar ( calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.withcalendar @@ -886,10 +886,10 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::with_calendar) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Let calendar be ? ToTemporalCalendar(calendarLike). - auto* calendar = TRY(to_temporal_calendar(global_object, vm.argument(0))); + auto* calendar = TRY(to_temporal_calendar(vm, vm.argument(0))); // 4. Return ! CreateTemporalZonedDateTime(zonedDateTime.[[Nanoseconds]], zonedDateTime.[[TimeZone]], calendar). - return MUST(create_temporal_zoned_date_time(global_object, zoned_date_time->nanoseconds(), zoned_date_time->time_zone(), *calendar)); + return MUST(create_temporal_zoned_date_time(vm, zoned_date_time->nanoseconds(), zoned_date_time->time_zone(), *calendar)); } // 6.3.35 Temporal.ZonedDateTime.prototype.add ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.add @@ -903,7 +903,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::add) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromZonedDateTime(add, zonedDateTime, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_zoned_date_time(global_object, ArithmeticOperation::Add, *zoned_date_time, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_zoned_date_time(vm, ArithmeticOperation::Add, *zoned_date_time, temporal_duration_like, options)); } // 6.3.36 Temporal.ZonedDateTime.prototype.subtract ( temporalDurationLike [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.subtract @@ -917,7 +917,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::subtract) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? AddDurationToOrSubtractDurationFromZonedDateTime(subtract, zonedDateTime, temporalDurationLike, options). - return TRY(add_duration_to_or_subtract_duration_from_zoned_date_time(global_object, ArithmeticOperation::Subtract, *zoned_date_time, temporal_duration_like, options)); + return TRY(add_duration_to_or_subtract_duration_from_zoned_date_time(vm, ArithmeticOperation::Subtract, *zoned_date_time, temporal_duration_like, options)); } // 6.3.37 Temporal.ZonedDateTime.prototype.until ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.until @@ -931,7 +931,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::until) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalZonedDateTime(until, zonedDateTime, other, options). - return TRY(difference_temporal_zoned_date_time(global_object, DifferenceOperation::Until, *zoned_date_time, other, options)); + return TRY(difference_temporal_zoned_date_time(vm, DifferenceOperation::Until, *zoned_date_time, other, options)); } // 6.3.38 Temporal.ZonedDateTime.prototype.since ( other [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.since @@ -945,7 +945,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::since) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? DifferenceTemporalZonedDateTime(since, zonedDateTime, other, options). - return TRY(difference_temporal_zoned_date_time(global_object, DifferenceOperation::Since, *zoned_date_time, other, options)); + return TRY(difference_temporal_zoned_date_time(vm, DifferenceOperation::Since, *zoned_date_time, other, options)); } // 6.3.39 Temporal.ZonedDateTime.prototype.round ( roundTo ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.round @@ -978,44 +978,44 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::round) // 5. Else, else { // a. Set roundTo to ? GetOptionsObject(roundTo). - round_to = TRY(get_options_object(global_object, vm.argument(0))); + round_to = TRY(get_options_object(vm, vm.argument(0))); } // 6. Let smallestUnit be ? GetTemporalUnit(roundTo, "smallestUnit", time, required, « "day" »). - auto smallest_unit = TRY(get_temporal_unit(global_object, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {}, { "day"sv })); + auto smallest_unit = TRY(get_temporal_unit(vm, *round_to, vm.names.smallestUnit, UnitGroup::Time, TemporalUnitRequired {}, { "day"sv })); // 7. Let roundingMode be ? ToTemporalRoundingMode(roundTo, "halfExpand"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *round_to, "halfExpand"sv)); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *round_to, "halfExpand"sv)); // 8. Let roundingIncrement be ? ToTemporalDateTimeRoundingIncrement(options, smallestUnit). - auto rounding_increment = TRY(to_temporal_date_time_rounding_increment(global_object, *round_to, *smallest_unit)); + auto rounding_increment = TRY(to_temporal_date_time_rounding_increment(vm, *round_to, *smallest_unit)); // 9. Let timeZone be zonedDateTime.[[TimeZone]]. auto& time_zone = zoned_date_time->time_zone(); // 10. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 11. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 12. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 13. Let isoCalendar be ! GetISO8601Calendar(). - auto* iso_calendar = get_iso8601_calendar(global_object); + auto* iso_calendar = get_iso8601_calendar(vm); // 14. Let dtStart be ? CreateTemporalDateTime(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], 0, 0, 0, 0, 0, 0, isoCalendar). - auto* dt_start = TRY(create_temporal_date_time(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), 0, 0, 0, 0, 0, 0, *iso_calendar)); + auto* dt_start = TRY(create_temporal_date_time(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), 0, 0, 0, 0, 0, 0, *iso_calendar)); // 15. Let instantStart be ? BuiltinTimeZoneGetInstantFor(timeZone, dtStart, "compatible"). - auto* instant_start = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *dt_start, "compatible"sv)); + auto* instant_start = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *dt_start, "compatible"sv)); // 16. Let startNs be instantStart.[[Nanoseconds]]. auto& start_ns = instant_start->nanoseconds(); // 17. Let endNs be ? AddZonedDateTime(startNs, timeZone, calendar, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0). - auto* end_ns = TRY(add_zoned_date_time(global_object, start_ns, &time_zone, calendar, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0)); + auto* end_ns = TRY(add_zoned_date_time(vm, start_ns, &time_zone, calendar, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0)); // 18. Let dayLengthNs be ℝ(endNs - startNs). auto day_length_ns = end_ns->big_integer().minus(start_ns.big_integer()).to_double(); @@ -1027,16 +1027,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::round) } // 20. Let roundResult be ! RoundISODateTime(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], temporalDateTime.[[ISOHour]], temporalDateTime.[[ISOMinute]], temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]], temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]], roundingIncrement, smallestUnit, roundingMode, dayLengthNs). - auto round_result = round_iso_date_time(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), rounding_increment, *smallest_unit, rounding_mode, day_length_ns); + auto round_result = round_iso_date_time(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond(), rounding_increment, *smallest_unit, rounding_mode, day_length_ns); // 21. Let offsetNanoseconds be ? GetOffsetNanosecondsFor(timeZone, instant). - auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(global_object, &time_zone, *instant)); + auto offset_nanoseconds = TRY(get_offset_nanoseconds_for(vm, &time_zone, *instant)); // 22. Let epochNanoseconds be ? InterpretISODateTimeOffset(roundResult.[[Year]], roundResult.[[Month]], roundResult.[[Day]], roundResult.[[Hour]], roundResult.[[Minute]], roundResult.[[Second]], roundResult.[[Millisecond]], roundResult.[[Microsecond]], roundResult.[[Nanosecond]], option, offsetNanoseconds, timeZone, "compatible", "prefer", match exactly). - auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(global_object, round_result.year, round_result.month, round_result.day, round_result.hour, round_result.minute, round_result.second, round_result.millisecond, round_result.microsecond, round_result.nanosecond, OffsetBehavior::Option, offset_nanoseconds, &time_zone, "compatible"sv, "prefer"sv, MatchBehavior::MatchExactly)); + auto* epoch_nanoseconds = TRY(interpret_iso_date_time_offset(vm, round_result.year, round_result.month, round_result.day, round_result.hour, round_result.minute, round_result.second, round_result.millisecond, round_result.microsecond, round_result.nanosecond, OffsetBehavior::Option, offset_nanoseconds, &time_zone, "compatible"sv, "prefer"sv, MatchBehavior::MatchExactly)); // 23. Return ! CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, time_zone, calendar)); + return MUST(create_temporal_zoned_date_time(vm, *epoch_nanoseconds, time_zone, calendar)); } // 6.3.40 Temporal.ZonedDateTime.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.equals @@ -1047,18 +1047,18 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::equals) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Set other to ? ToTemporalZonedDateTime(other). - auto* other = TRY(to_temporal_zoned_date_time(global_object, vm.argument(0))); + auto* other = TRY(to_temporal_zoned_date_time(vm, vm.argument(0))); // 4. If zonedDateTime.[[Nanoseconds]] ≠ other.[[Nanoseconds]], return false. if (zoned_date_time->nanoseconds().big_integer() != other->nanoseconds().big_integer()) return Value(false); // 5. If ? TimeZoneEquals(zonedDateTime.[[TimeZone]], other.[[TimeZone]]) is false, return false. - if (!TRY(time_zone_equals(global_object, zoned_date_time->time_zone(), other->time_zone()))) + if (!TRY(time_zone_equals(vm, zoned_date_time->time_zone(), other->time_zone()))) return Value(false); // 6. Return ? CalendarEquals(zonedDateTime.[[Calendar]], other.[[Calendar]]). - return Value(TRY(calendar_equals(global_object, zoned_date_time->calendar(), other->calendar()))); + return Value(TRY(calendar_equals(vm, zoned_date_time->calendar(), other->calendar()))); } // 6.3.41 Temporal.ZonedDateTime.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.tostring @@ -1069,25 +1069,25 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_string) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Set options to ? GetOptionsObject(options). - auto* options = TRY(get_options_object(global_object, vm.argument(0))); + auto* options = TRY(get_options_object(vm, vm.argument(0))); // 4. Let precision be ? ToSecondsStringPrecision(options). - auto precision = TRY(to_seconds_string_precision(global_object, *options)); + auto precision = TRY(to_seconds_string_precision(vm, *options)); // 5. Let roundingMode be ? ToTemporalRoundingMode(options, "trunc"). - auto rounding_mode = TRY(to_temporal_rounding_mode(global_object, *options, "trunc")); + auto rounding_mode = TRY(to_temporal_rounding_mode(vm, *options, "trunc")); // 6. Let showCalendar be ? ToShowCalendarOption(options). - auto show_calendar = TRY(to_show_calendar_option(global_object, *options)); + auto show_calendar = TRY(to_show_calendar_option(vm, *options)); // 7. Let showTimeZone be ? ToShowTimeZoneNameOption(options). - auto show_time_zone = TRY(to_show_time_zone_name_option(global_object, *options)); + auto show_time_zone = TRY(to_show_time_zone_name_option(vm, *options)); // 8. Let showOffset be ? ToShowOffsetOption(options). - auto show_offset = TRY(to_show_offset_option(global_object, *options)); + auto show_offset = TRY(to_show_offset_option(vm, *options)); // 9. Return ? TemporalZonedDateTimeToString(zonedDateTime, precision.[[Precision]], showCalendar, showTimeZone, showOffset, precision.[[Increment]], precision.[[Unit]], roundingMode). - return js_string(vm, TRY(temporal_zoned_date_time_to_string(global_object, *zoned_date_time, precision.precision, show_calendar, show_time_zone, show_offset, precision.increment, precision.unit, rounding_mode))); + return js_string(vm, TRY(temporal_zoned_date_time_to_string(vm, *zoned_date_time, precision.precision, show_calendar, show_time_zone, show_offset, precision.increment, precision.unit, rounding_mode))); } // 6.3.42 Temporal.ZonedDateTime.prototype.toLocaleString ( [ locales [ , options ] ] ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.tolocalestring @@ -1099,7 +1099,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_locale_string) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? TemporalZonedDateTimeToString(zonedDateTime, "auto", "auto", "auto", "auto"). - return js_string(vm, TRY(temporal_zoned_date_time_to_string(global_object, *zoned_date_time, "auto"sv, "auto"sv, "auto"sv, "auto"sv))); + return js_string(vm, TRY(temporal_zoned_date_time_to_string(vm, *zoned_date_time, "auto"sv, "auto"sv, "auto"sv, "auto"sv))); } // 6.3.43 Temporal.ZonedDateTime.prototype.toJSON ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.tojson @@ -1110,7 +1110,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_json) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ? TemporalZonedDateTimeToString(zonedDateTime, "auto", "auto", "auto", "auto"). - return js_string(vm, TRY(temporal_zoned_date_time_to_string(global_object, *zoned_date_time, "auto"sv, "auto"sv, "auto"sv, "auto"sv))); + return js_string(vm, TRY(temporal_zoned_date_time_to_string(vm, *zoned_date_time, "auto"sv, "auto"sv, "auto"sv, "auto"sv))); } // 6.3.44 Temporal.ZonedDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.valueof @@ -1134,19 +1134,19 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::start_of_day) auto& calendar = zoned_date_time->calendar(); // 5. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Let startDateTime be ? CreateTemporalDateTime(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], 0, 0, 0, 0, 0, 0, calendar). - auto* start_date_time = TRY(create_temporal_date_time(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), 0, 0, 0, 0, 0, 0, calendar)); + auto* start_date_time = TRY(create_temporal_date_time(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), 0, 0, 0, 0, 0, 0, calendar)); // 8. Let startInstant be ? BuiltinTimeZoneGetInstantFor(timeZone, startDateTime, "compatible"). - auto* start_instant = TRY(builtin_time_zone_get_instant_for(global_object, &time_zone, *start_date_time, "compatible"sv)); + auto* start_instant = TRY(builtin_time_zone_get_instant_for(vm, &time_zone, *start_date_time, "compatible"sv)); // 9. Return ! CreateTemporalZonedDateTime(startInstant.[[Nanoseconds]], timeZone, calendar). - return MUST(create_temporal_zoned_date_time(global_object, start_instant->nanoseconds(), time_zone, calendar)); + return MUST(create_temporal_zoned_date_time(vm, start_instant->nanoseconds(), time_zone, calendar)); } // 6.3.46 Temporal.ZonedDateTime.prototype.toInstant ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toinstant @@ -1157,7 +1157,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_instant) auto* zoned_date_time = TRY(typed_this_object(global_object)); // 3. Return ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - return MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + return MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); } // 6.3.47 Temporal.ZonedDateTime.prototype.toPlainDate ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplaindate @@ -1171,16 +1171,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_date) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ! CreateTemporalDate(temporalDateTime.[[ISOYear]], temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], calendar). - return MUST(create_temporal_date(global_object, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), calendar)); + return MUST(create_temporal_date(vm, temporal_date_time->iso_year(), temporal_date_time->iso_month(), temporal_date_time->iso_day(), calendar)); } // 6.3.48 Temporal.ZonedDateTime.prototype.toPlainTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplaintime @@ -1194,16 +1194,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_time) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, zonedDateTime.[[Calendar]]). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Return ! CreateTemporalTime(temporalDateTime.[[ISOHour]], temporalDateTime.[[ISOMinute]], temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]], temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]]). - return MUST(create_temporal_time(global_object, temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond())); + return MUST(create_temporal_time(vm, temporal_date_time->iso_hour(), temporal_date_time->iso_minute(), temporal_date_time->iso_second(), temporal_date_time->iso_millisecond(), temporal_date_time->iso_microsecond(), temporal_date_time->iso_nanosecond())); } // 6.3.49 Temporal.ZonedDateTime.prototype.toPlainDateTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplaindatetime @@ -1217,10 +1217,10 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_date_time) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Return ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, zonedDateTime.[[Calendar]]). - return TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, zoned_date_time->calendar())); + return TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, zoned_date_time->calendar())); } // 6.3.50 Temporal.ZonedDateTime.prototype.toPlainYearMonth ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplainyearmonth @@ -1234,22 +1234,22 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_year_month) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "monthCode"sv, "year"sv })); // 8. Let fields be ? PrepareTemporalFields(temporalDateTime, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *temporal_date_time, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *temporal_date_time, field_names, Vector {})); // 9. Return ? CalendarYearMonthFromFields(calendar, fields). - return TRY(calendar_year_month_from_fields(global_object, calendar, *fields)); + return TRY(calendar_year_month_from_fields(vm, calendar, *fields)); } // 6.3.51 Temporal.ZonedDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplainmonthday @@ -1263,22 +1263,22 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_month_day) auto& time_zone = zoned_date_time->time_zone(); // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 5. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* temporal_date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 7. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »). - auto field_names = TRY(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv })); + auto field_names = TRY(calendar_fields(vm, calendar, { "day"sv, "monthCode"sv })); // 8. Let fields be ? PrepareTemporalFields(temporalDateTime, fieldNames, «»). - auto* fields = TRY(prepare_temporal_fields(global_object, *temporal_date_time, field_names, Vector {})); + auto* fields = TRY(prepare_temporal_fields(vm, *temporal_date_time, field_names, Vector {})); // 9. Return ? CalendarMonthDayFromFields(calendar, fields). - return TRY(calendar_month_day_from_fields(global_object, calendar, *fields)); + return TRY(calendar_month_day_from_fields(vm, calendar, *fields)); } // 6.3.52 Temporal.ZonedDateTime.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.getisofields @@ -1297,16 +1297,16 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::get_iso_fields) auto& time_zone = zoned_date_time->time_zone(); // 5. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]). - auto* instant = MUST(create_temporal_instant(global_object, zoned_date_time->nanoseconds())); + auto* instant = MUST(create_temporal_instant(vm, zoned_date_time->nanoseconds())); // 6. Let calendar be zonedDateTime.[[Calendar]]. auto& calendar = zoned_date_time->calendar(); // 7. Let dateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar). - auto* date_time = TRY(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar)); + auto* date_time = TRY(builtin_time_zone_get_plain_date_time_for(vm, &time_zone, *instant, calendar)); // 8. Let offset be ? BuiltinTimeZoneGetOffsetStringFor(timeZone, instant). - auto offset = TRY(builtin_time_zone_get_offset_string_for(global_object, &time_zone, *instant)); + auto offset = TRY(builtin_time_zone_get_offset_string_for(vm, &time_zone, *instant)); // 9. Perform ! CreateDataPropertyOrThrow(fields, "calendar", calendar). MUST(fields->create_data_property_or_throw(vm.names.calendar, Value(&calendar)));