瀏覽代碼

LibJS: Convert Calendar AOs to ThrowCompletionOr

Linus Groh 3 年之前
父節點
當前提交
f8d92232c8
共有 22 個文件被更改,包括 349 次插入416 次删除
  1. 214 214
      Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp
  2. 31 30
      Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h
  3. 2 2
      Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp
  4. 7 13
      Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp
  5. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp
  6. 2 8
      Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp
  7. 4 10
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp
  8. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp
  9. 20 26
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp
  10. 4 14
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp
  11. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp
  12. 21 27
      Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp
  13. 2 6
      Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp
  14. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp
  15. 3 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp
  16. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp
  17. 3 9
      Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp
  18. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp
  19. 10 10
      Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp
  20. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp
  21. 1 3
      Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp
  22. 18 20
      Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp

+ 214 - 214
Userland/Libraries/LibJS/Runtime/Temporal/Calendar.cpp

@@ -7,6 +7,7 @@
 
 
 #include <LibJS/Runtime/AbstractOperations.h>
 #include <LibJS/Runtime/AbstractOperations.h>
 #include <LibJS/Runtime/Array.h>
 #include <LibJS/Runtime/Array.h>
+#include <LibJS/Runtime/Completion.h>
 #include <LibJS/Runtime/GlobalObject.h>
 #include <LibJS/Runtime/GlobalObject.h>
 #include <LibJS/Runtime/Temporal/AbstractOperations.h>
 #include <LibJS/Runtime/Temporal/AbstractOperations.h>
 #include <LibJS/Runtime/Temporal/Calendar.h>
 #include <LibJS/Runtime/Temporal/Calendar.h>
@@ -29,7 +30,7 @@ Calendar::Calendar(String identifier, Object& prototype)
 }
 }
 
 
 // 12.1.1 CreateTemporalCalendar ( identifier [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalcalendar
 // 12.1.1 CreateTemporalCalendar ( identifier [ , newTarget ] ), https://tc39.es/proposal-temporal/#sec-temporal-createtemporalcalendar
-Calendar* create_temporal_calendar(GlobalObject& global_object, String const& identifier, FunctionObject const* new_target)
+ThrowCompletionOr<Calendar*> create_temporal_calendar(GlobalObject& global_object, String const& identifier, FunctionObject const* new_target)
 {
 {
     // 1. Assert: ! IsBuiltinCalendar(identifier) is true.
     // 1. Assert: ! IsBuiltinCalendar(identifier) is true.
     VERIFY(is_builtin_calendar(identifier));
     VERIFY(is_builtin_calendar(identifier));
@@ -40,7 +41,7 @@ Calendar* create_temporal_calendar(GlobalObject& global_object, String const& id
 
 
     // 3. Let object be ? OrdinaryCreateFromConstructor(newTarget, "%Temporal.Calendar.prototype%", « [[InitializedTemporalCalendar]], [[Identifier]] »).
     // 3. Let object be ? OrdinaryCreateFromConstructor(newTarget, "%Temporal.Calendar.prototype%", « [[InitializedTemporalCalendar]], [[Identifier]] »).
     // 4. Set object.[[Identifier]] to identifier.
     // 4. Set object.[[Identifier]] to identifier.
-    auto* object = TRY_OR_DISCARD(ordinary_create_from_constructor<Calendar>(global_object, *new_target, &GlobalObject::temporal_calendar_prototype, identifier));
+    auto* object = TRY(ordinary_create_from_constructor<Calendar>(global_object, *new_target, &GlobalObject::temporal_calendar_prototype, identifier));
 
 
     // 5. Return object.
     // 5. Return object.
     return object;
     return object;
@@ -59,22 +60,20 @@ bool is_builtin_calendar(String const& identifier)
 }
 }
 
 
 // 12.1.3 GetBuiltinCalendar ( id ), https://tc39.es/proposal-temporal/#sec-temporal-getbuiltincalendar
 // 12.1.3 GetBuiltinCalendar ( id ), https://tc39.es/proposal-temporal/#sec-temporal-getbuiltincalendar
-Calendar* get_builtin_calendar(GlobalObject& global_object, String const& identifier)
+ThrowCompletionOr<Calendar*> get_builtin_calendar(GlobalObject& global_object, String const& identifier)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. If ! IsBuiltinCalendar(id) is false, throw a RangeError exception.
     // 1. If ! IsBuiltinCalendar(id) is false, throw a RangeError exception.
-    if (!is_builtin_calendar(identifier)) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendarIdentifier, identifier);
-        return {};
-    }
+    if (!is_builtin_calendar(identifier))
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendarIdentifier, identifier);
 
 
     // 2. Return ? Construct(%Temporal.Calendar%, « id »).
     // 2. Return ? Construct(%Temporal.Calendar%, « id »).
     MarkedValueList arguments(vm.heap());
     MarkedValueList arguments(vm.heap());
     arguments.append(js_string(vm, identifier));
     arguments.append(js_string(vm, identifier));
     auto calendar = vm.construct(*global_object.temporal_calendar_constructor(), *global_object.temporal_calendar_constructor(), move(arguments));
     auto calendar = vm.construct(*global_object.temporal_calendar_constructor(), *global_object.temporal_calendar_constructor(), move(arguments));
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
     return static_cast<Calendar*>(&calendar.as_object());
     return static_cast<Calendar*>(&calendar.as_object());
 }
 }
 
 
@@ -82,18 +81,18 @@ Calendar* get_builtin_calendar(GlobalObject& global_object, String const& identi
 Calendar* get_iso8601_calendar(GlobalObject& global_object)
 Calendar* get_iso8601_calendar(GlobalObject& global_object)
 {
 {
     // 1. Return ! GetBuiltinCalendar("iso8601").
     // 1. Return ! GetBuiltinCalendar("iso8601").
-    return get_builtin_calendar(global_object, "iso8601");
+    return get_builtin_calendar(global_object, "iso8601").release_value();
 }
 }
 
 
 // 12.1.5 CalendarFields ( calendar, fieldNames ), https://tc39.es/proposal-temporal/#sec-temporal-calendarfields
 // 12.1.5 CalendarFields ( calendar, fieldNames ), https://tc39.es/proposal-temporal/#sec-temporal-calendarfields
-Vector<String> calendar_fields(GlobalObject& global_object, Object& calendar, Vector<StringView> const& field_names)
+ThrowCompletionOr<Vector<String>> calendar_fields(GlobalObject& global_object, Object& calendar, Vector<StringView> const& field_names)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. Let fields be ? GetMethod(calendar, "fields").
     // 1. Let fields be ? GetMethod(calendar, "fields").
     auto fields = Value(&calendar).get_method(global_object, vm.names.fields);
     auto fields = Value(&calendar).get_method(global_object, vm.names.fields);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 2. Let fieldsArray be ! CreateArrayFromList(fieldNames).
     // 2. Let fieldsArray be ! CreateArrayFromList(fieldNames).
     auto field_names_values = MarkedValueList { vm.heap() };
     auto field_names_values = MarkedValueList { vm.heap() };
@@ -105,12 +104,12 @@ Vector<String> calendar_fields(GlobalObject& global_object, Object& calendar, Ve
     if (fields) {
     if (fields) {
         // a. Set fieldsArray to ? Call(fields, calendar, « fieldsArray »).
         // a. Set fieldsArray to ? Call(fields, calendar, « fieldsArray »).
         fields_array = vm.call(*fields, &calendar, fields_array);
         fields_array = vm.call(*fields, &calendar, fields_array);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
     }
     }
 
 
     // 4. Return ? IterableToListOfType(fieldsArray, « String »).
     // 4. Return ? IterableToListOfType(fieldsArray, « String »).
-    auto list = TRY_OR_DISCARD(iterable_to_list_of_type(global_object, fields_array, { OptionType::String }));
+    auto list = TRY(iterable_to_list_of_type(global_object, fields_array, { OptionType::String }));
 
 
     Vector<String> result;
     Vector<String> result;
     for (auto& value : list)
     for (auto& value : list)
@@ -119,171 +118,187 @@ Vector<String> calendar_fields(GlobalObject& global_object, Object& calendar, Ve
 }
 }
 
 
 // 12.1.9 CalendarYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendaryear
 // 12.1.9 CalendarYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendaryear
-double calendar_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<double> calendar_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Let result be ? Invoke(calendar, "year", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "year", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.year, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.year, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is undefined, throw a RangeError exception.
     // 3. If result is undefined, throw a RangeError exception.
-    if (result.is_undefined()) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.undefined.as_string());
-        return {};
-    }
+    if (result.is_undefined())
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.undefined.as_string());
 
 
     // 4. Return ? ToIntegerThrowOnInfinity(result).
     // 4. Return ? ToIntegerThrowOnInfinity(result).
-    return TRY_OR_DISCARD(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(global_object, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.year.as_string(), vm.names.Infinity.as_string()));
 }
 }
 
 
 // 12.1.10 CalendarMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonth
 // 12.1.10 CalendarMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonth
-double calendar_month(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<double> calendar_month(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Let result be ? Invoke(calendar, "month", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "month", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.month, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.month, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is undefined, throw a RangeError exception.
     // 3. If result is undefined, throw a RangeError exception.
-    if (result.is_undefined()) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.month.as_string(), vm.names.undefined.as_string());
-        return {};
-    }
+    if (result.is_undefined())
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.month.as_string(), vm.names.undefined.as_string());
 
 
     // 4. Return ? ToPositiveInteger(result).
     // 4. Return ? ToPositiveInteger(result).
-    return TRY_OR_DISCARD(to_positive_integer(global_object, result));
+    return TRY(to_positive_integer(global_object, result));
 }
 }
 
 
 // 12.1.11 CalendarMonthCode ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthcode
 // 12.1.11 CalendarMonthCode ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthcode
-String calendar_month_code(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<String> calendar_month_code(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Let result be ? Invoke(calendar, "monthCode", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "monthCode", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.monthCode, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.monthCode, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is undefined, throw a RangeError exception.
     // 3. If result is undefined, throw a RangeError exception.
-    if (result.is_undefined()) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.monthCode.as_string(), vm.names.undefined.as_string());
-        return {};
-    }
+    if (result.is_undefined())
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.monthCode.as_string(), vm.names.undefined.as_string());
 
 
     // 4. Return ? ToString(result).
     // 4. Return ? ToString(result).
     return result.to_string(global_object);
     return result.to_string(global_object);
 }
 }
 
 
 // 12.1.12 CalendarDay ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarday
 // 12.1.12 CalendarDay ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarday
-double calendar_day(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<double> calendar_day(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Let result be ? Invoke(calendar, "day", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "day", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.day, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.day, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is undefined, throw a RangeError exception.
     // 3. If result is undefined, throw a RangeError exception.
-    if (result.is_undefined()) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.day.as_string(), vm.names.undefined.as_string());
-        return {};
-    }
+    if (result.is_undefined())
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.day.as_string(), vm.names.undefined.as_string());
 
 
     // 4. Return ? ToPositiveInteger(result).
     // 4. Return ? ToPositiveInteger(result).
-    return TRY_OR_DISCARD(to_positive_integer(global_object, result));
+    return TRY(to_positive_integer(global_object, result));
 }
 }
 
 
 // 12.1.13 CalendarDayOfWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofweek
 // 12.1.13 CalendarDayOfWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofweek
-Value calendar_day_of_week(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_day_of_week(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "dayOfWeek", « dateLike »).
     // 2. Return ? Invoke(calendar, "dayOfWeek", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.dayOfWeek, &date_like);
+    auto day_of_week = Value(&calendar).invoke(global_object, vm.names.dayOfWeek, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return day_of_week;
 }
 }
 
 
 // 12.1.14 CalendarDayOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofyear
 // 12.1.14 CalendarDayOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardayofyear
-Value calendar_day_of_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_day_of_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "dayOfYear", « dateLike »).
     // 2. Return ? Invoke(calendar, "dayOfYear", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.dayOfYear, &date_like);
+    auto day_of_year = Value(&calendar).invoke(global_object, vm.names.dayOfYear, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return day_of_year;
 }
 }
 
 
 // 12.1.15 CalendarWeekOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarweekofyear
 // 12.1.15 CalendarWeekOfYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarweekofyear
-Value calendar_week_of_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_week_of_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "weekOfYear", « dateLike »).
     // 2. Return ? Invoke(calendar, "weekOfYear", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.weekOfYear, &date_like);
+    auto week_of_year = Value(&calendar).invoke(global_object, vm.names.weekOfYear, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return week_of_year;
 }
 }
 
 
 // 12.1.16 CalendarDaysInWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinweek
 // 12.1.16 CalendarDaysInWeek ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinweek
-Value calendar_days_in_week(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_days_in_week(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "daysInWeek", « dateLike »).
     // 2. Return ? Invoke(calendar, "daysInWeek", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.daysInWeek, &date_like);
+    auto days_in_week = Value(&calendar).invoke(global_object, vm.names.daysInWeek, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return days_in_week;
 }
 }
 
 
 // 12.1.17 CalendarDaysInMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinmonth
 // 12.1.17 CalendarDaysInMonth ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinmonth
-Value calendar_days_in_month(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_days_in_month(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "daysInMonth", « dateLike »).
     // 2. Return ? Invoke(calendar, "daysInMonth", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.daysInMonth, &date_like);
+    auto days_in_month = Value(&calendar).invoke(global_object, vm.names.daysInMonth, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return days_in_month;
 }
 }
 
 
 // 12.1.18 CalendarDaysInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinyear
 // 12.1.18 CalendarDaysInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendardaysinyear
-Value calendar_days_in_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_days_in_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "daysInYear", « dateLike »).
     // 2. Return ? Invoke(calendar, "daysInYear", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.daysInYear, &date_like);
+    auto days_in_year = Value(&calendar).invoke(global_object, vm.names.daysInYear, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return days_in_year;
 }
 }
 
 
 // 12.1.19 CalendarMonthsInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthsinyear
 // 12.1.19 CalendarMonthsInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthsinyear
-Value calendar_months_in_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_months_in_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "monthsInYear", « dateLike »).
     // 2. Return ? Invoke(calendar, "monthsInYear", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.monthsInYear, &date_like);
+    auto months_in_year = Value(&calendar).invoke(global_object, vm.names.monthsInYear, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return months_in_year;
 }
 }
 
 
 // 12.1.20 CalendarInLeapYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarinleapyear
 // 12.1.20 CalendarInLeapYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarinleapyear
-Value calendar_in_leap_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_in_leap_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. Assert: Type(calendar) is Object.
     // 1. Assert: Type(calendar) is Object.
 
 
     // 2. Return ? Invoke(calendar, "inLeapYear", « dateLike »).
     // 2. Return ? Invoke(calendar, "inLeapYear", « dateLike »).
-    return Value(&calendar).invoke(global_object, vm.names.inLeapYear, &date_like);
+    auto in_leap_year = Value(&calendar).invoke(global_object, vm.names.inLeapYear, &date_like);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return in_leap_year;
 }
 }
 
 
 // 15.6.1.2 CalendarEra ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarera
 // 15.6.1.2 CalendarEra ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarera
-Value calendar_era(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_era(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -291,14 +306,14 @@ Value calendar_era(GlobalObject& global_object, Object& calendar, Object& date_l
 
 
     // 2. Let result be ? Invoke(calendar, "era", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "era", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.era, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.era, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is not undefined, set result to ? ToString(result).
     // 3. If result is not undefined, set result to ? ToString(result).
     if (!result.is_undefined()) {
     if (!result.is_undefined()) {
         auto result_string = result.to_string(global_object);
         auto result_string = result.to_string(global_object);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
         result = js_string(vm, move(result_string));
         result = js_string(vm, move(result_string));
     }
     }
 
 
@@ -307,7 +322,7 @@ Value calendar_era(GlobalObject& global_object, Object& calendar, Object& date_l
 }
 }
 
 
 // 15.6.1.3 CalendarEraYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarerayear
 // 15.6.1.3 CalendarEraYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarerayear
-Value calendar_era_year(GlobalObject& global_object, Object& calendar, Object& date_like)
+ThrowCompletionOr<Value> calendar_era_year(GlobalObject& global_object, Object& calendar, Object& date_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -315,19 +330,19 @@ Value calendar_era_year(GlobalObject& global_object, Object& calendar, Object& d
 
 
     // 2. Let result be ? Invoke(calendar, "eraYear", « dateLike »).
     // 2. Let result be ? Invoke(calendar, "eraYear", « dateLike »).
     auto result = Value(&calendar).invoke(global_object, vm.names.eraYear, &date_like);
     auto result = Value(&calendar).invoke(global_object, vm.names.eraYear, &date_like);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If result is not undefined, set result to ? ToIntegerThrowOnInfinity(result).
     // 3. If result is not undefined, set result to ? ToIntegerThrowOnInfinity(result).
     if (!result.is_undefined())
     if (!result.is_undefined())
-        result = Value(TRY_OR_DISCARD(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(global_object, result, ErrorType::TemporalInvalidCalendarFunctionResult, vm.names.eraYear.as_string(), "Infinity"sv)));
 
 
     // 4. Return result.
     // 4. Return result.
     return result;
     return result;
 }
 }
 
 
 // 12.1.21 ToTemporalCalendar ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendar
 // 12.1.21 ToTemporalCalendar ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendar
-Object* to_temporal_calendar(GlobalObject& global_object, Value temporal_calendar_like)
+ThrowCompletionOr<Object*> to_temporal_calendar(GlobalObject& global_object, Value temporal_calendar_like)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -351,20 +366,21 @@ Object* to_temporal_calendar(GlobalObject& global_object, Value temporal_calenda
 
 
         // b. If ? HasProperty(temporalCalendarLike, "calendar") is false, return temporalCalendarLike.
         // b. If ? HasProperty(temporalCalendarLike, "calendar") is false, return temporalCalendarLike.
         auto has_property = temporal_calendar_like_object.has_property(vm.names.calendar);
         auto has_property = temporal_calendar_like_object.has_property(vm.names.calendar);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
         if (!has_property)
         if (!has_property)
             return &temporal_calendar_like_object;
             return &temporal_calendar_like_object;
 
 
         // c. Set temporalCalendarLike to ? Get(temporalCalendarLike, "calendar").
         // c. Set temporalCalendarLike to ? Get(temporalCalendarLike, "calendar").
         temporal_calendar_like = temporal_calendar_like_object.get(vm.names.calendar);
         temporal_calendar_like = temporal_calendar_like_object.get(vm.names.calendar);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
+
         // d. If Type(temporalCalendarLike) is Object and ? HasProperty(temporalCalendarLike, "calendar") is false, return temporalCalendarLike.
         // d. If Type(temporalCalendarLike) is Object and ? HasProperty(temporalCalendarLike, "calendar") is false, return temporalCalendarLike.
         if (temporal_calendar_like.is_object()) {
         if (temporal_calendar_like.is_object()) {
             has_property = temporal_calendar_like.as_object().has_property(vm.names.calendar);
             has_property = temporal_calendar_like.as_object().has_property(vm.names.calendar);
-            if (vm.exception())
-                return {};
+            if (auto* exception = vm.exception())
+                return throw_completion(exception->value());
             if (!has_property)
             if (!has_property)
                 return &temporal_calendar_like.as_object();
                 return &temporal_calendar_like.as_object();
         }
         }
@@ -372,21 +388,21 @@ Object* to_temporal_calendar(GlobalObject& global_object, Value temporal_calenda
 
 
     // 2. Let identifier be ? ToString(temporalCalendarLike).
     // 2. Let identifier be ? ToString(temporalCalendarLike).
     auto identifier = temporal_calendar_like.to_string(global_object);
     auto identifier = temporal_calendar_like.to_string(global_object);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If ! IsBuiltinCalendar(identifier) is false, then
     // 3. If ! IsBuiltinCalendar(identifier) is false, then
     if (!is_builtin_calendar(identifier)) {
     if (!is_builtin_calendar(identifier)) {
         // a. Let identifier be ? ParseTemporalCalendarString(identifier).
         // a. Let identifier be ? ParseTemporalCalendarString(identifier).
-        identifier = TRY_OR_DISCARD(parse_temporal_calendar_string(global_object, identifier));
+        identifier = TRY(parse_temporal_calendar_string(global_object, identifier));
     }
     }
 
 
     // 4. Return ! CreateTemporalCalendar(identifier).
     // 4. Return ! CreateTemporalCalendar(identifier).
-    return create_temporal_calendar(global_object, identifier);
+    return create_temporal_calendar(global_object, identifier).release_value();
 }
 }
 
 
 // 12.1.22 ToTemporalCalendarWithISODefault ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendarwithisodefault
 // 12.1.22 ToTemporalCalendarWithISODefault ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendarwithisodefault
-Object* to_temporal_calendar_with_iso_default(GlobalObject& global_object, Value temporal_calendar_like)
+ThrowCompletionOr<Object*> to_temporal_calendar_with_iso_default(GlobalObject& global_object, Value temporal_calendar_like)
 {
 {
     // 1. If temporalCalendarLike is undefined, then
     // 1. If temporalCalendarLike is undefined, then
     if (temporal_calendar_like.is_undefined()) {
     if (temporal_calendar_like.is_undefined()) {
@@ -398,7 +414,7 @@ Object* to_temporal_calendar_with_iso_default(GlobalObject& global_object, Value
 }
 }
 
 
 // 12.1.23 GetTemporalCalendarWithISODefault ( item ), https://tc39.es/proposal-temporal/#sec-temporal-gettemporalcalendarwithisodefault
 // 12.1.23 GetTemporalCalendarWithISODefault ( item ), https://tc39.es/proposal-temporal/#sec-temporal-gettemporalcalendarwithisodefault
-Object* get_temporal_calendar_with_iso_default(GlobalObject& global_object, Object& item)
+ThrowCompletionOr<Object*> get_temporal_calendar_with_iso_default(GlobalObject& global_object, Object& item)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -419,15 +435,15 @@ Object* get_temporal_calendar_with_iso_default(GlobalObject& global_object, Obje
 
 
     // 2. Let calendar be ? Get(item, "calendar").
     // 2. Let calendar be ? Get(item, "calendar").
     auto calendar = item.get(vm.names.calendar);
     auto calendar = item.get(vm.names.calendar);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. Return ? ToTemporalCalendarWithISODefault(calendar).
     // 3. Return ? ToTemporalCalendarWithISODefault(calendar).
     return to_temporal_calendar_with_iso_default(global_object, calendar);
     return to_temporal_calendar_with_iso_default(global_object, calendar);
 }
 }
 
 
 // 12.1.24 DateFromFields ( calendar, fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-datefromfields
 // 12.1.24 DateFromFields ( calendar, fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-datefromfields
-PlainDate* date_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const& options)
+ThrowCompletionOr<PlainDate*> date_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const& options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -436,24 +452,22 @@ PlainDate* date_from_fields(GlobalObject& global_object, Object& calendar, Objec
 
 
     // 3. Let date be ? Invoke(calendar, "dateFromFields", « fields, options »).
     // 3. Let date be ? Invoke(calendar, "dateFromFields", « fields, options »).
     auto date = Value(&calendar).invoke(global_object, vm.names.dateFromFields, &fields, &options);
     auto date = Value(&calendar).invoke(global_object, vm.names.dateFromFields, &fields, &options);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 4. Perform ? RequireInternalSlot(date, [[InitializedTemporalDate]]).
     // 4. Perform ? RequireInternalSlot(date, [[InitializedTemporalDate]]).
     auto* date_object = date.to_object(global_object);
     auto* date_object = date.to_object(global_object);
-    if (!date_object)
-        return {};
-    if (!is<PlainDate>(date_object)) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainDate");
-        return {};
-    }
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    if (!is<PlainDate>(date_object))
+        return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainDate");
 
 
     // 5. Return date.
     // 5. Return date.
     return static_cast<PlainDate*>(date_object);
     return static_cast<PlainDate*>(date_object);
 }
 }
 
 
 // 12.1.25 YearMonthFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-yearmonthfromfields
 // 12.1.25 YearMonthFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-yearmonthfromfields
-PlainYearMonth* year_month_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options)
+ThrowCompletionOr<PlainYearMonth*> year_month_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -466,24 +480,22 @@ PlainYearMonth* year_month_from_fields(GlobalObject& global_object, Object& cale
 
 
     // 5. Let yearMonth be ? Invoke(calendar, "yearMonthFromFields", « fields, options »).
     // 5. Let yearMonth be ? Invoke(calendar, "yearMonthFromFields", « fields, options »).
     auto year_month = Value(&calendar).invoke(global_object, vm.names.yearMonthFromFields, &fields, options ?: js_undefined());
     auto year_month = Value(&calendar).invoke(global_object, vm.names.yearMonthFromFields, &fields, options ?: js_undefined());
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 6. Perform ? RequireInternalSlot(yearMonth, [[InitializedTemporalYearMonth]]).
     // 6. Perform ? RequireInternalSlot(yearMonth, [[InitializedTemporalYearMonth]]).
     auto* year_month_object = year_month.to_object(global_object);
     auto* year_month_object = year_month.to_object(global_object);
-    if (!year_month_object)
-        return {};
-    if (!is<PlainYearMonth>(year_month_object)) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainYearMonth");
-        return {};
-    }
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    if (!is<PlainYearMonth>(year_month_object))
+        return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainYearMonth");
 
 
     // 7. Return yearMonth.
     // 7. Return yearMonth.
     return static_cast<PlainYearMonth*>(year_month_object);
     return static_cast<PlainYearMonth*>(year_month_object);
 }
 }
 
 
 // 12.1.26 MonthDayFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-monthdayfromfields
 // 12.1.26 MonthDayFromFields ( calendar, fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal-monthdayfromfields
-PlainMonthDay* month_day_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options)
+ThrowCompletionOr<PlainMonthDay*> month_day_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -496,17 +508,15 @@ PlainMonthDay* month_day_from_fields(GlobalObject& global_object, Object& calend
 
 
     // 5. Let monthDay be ? Invoke(calendar, "monthDayFromFields", « fields, options »).
     // 5. Let monthDay be ? Invoke(calendar, "monthDayFromFields", « fields, options »).
     auto month_day = Value(&calendar).invoke(global_object, vm.names.monthDayFromFields, &fields, options ?: js_undefined());
     auto month_day = Value(&calendar).invoke(global_object, vm.names.monthDayFromFields, &fields, options ?: js_undefined());
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 6. Perform ? RequireInternalSlot(monthDay, [[InitializedTemporalMonthDay]]).
     // 6. Perform ? RequireInternalSlot(monthDay, [[InitializedTemporalMonthDay]]).
     auto* month_day_object = month_day.to_object(global_object);
     auto* month_day_object = month_day.to_object(global_object);
-    if (!month_day_object)
-        return {};
-    if (!is<PlainMonthDay>(month_day_object)) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainMonthDay");
-        return {};
-    }
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    if (!is<PlainMonthDay>(month_day_object))
+        return vm.throw_completion<TypeError>(global_object, ErrorType::NotAnObjectOfType, "Temporal.PlainMonthDay");
 
 
     // 7. Return monthDay.
     // 7. Return monthDay.
     return static_cast<PlainMonthDay*>(month_day_object);
     return static_cast<PlainMonthDay*>(month_day_object);
@@ -531,7 +541,7 @@ String format_calendar_annotation(StringView id, StringView show_calendar)
 }
 }
 
 
 // 12.1.28 CalendarEquals ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-calendarequals
 // 12.1.28 CalendarEquals ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-calendarequals
-bool calendar_equals(GlobalObject& global_object, Object& one, Object& two)
+ThrowCompletionOr<bool> calendar_equals(GlobalObject& global_object, Object& one, Object& two)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -541,22 +551,24 @@ bool calendar_equals(GlobalObject& global_object, Object& one, Object& two)
 
 
     // 2. Let calendarOne be ? ToString(one).
     // 2. Let calendarOne be ? ToString(one).
     auto calendar_one = Value(&one).to_string(global_object);
     auto calendar_one = Value(&one).to_string(global_object);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+
     // 3. Let calendarTwo be ? ToString(two).
     // 3. Let calendarTwo be ? ToString(two).
     auto calendar_two = Value(&two).to_string(global_object);
     auto calendar_two = Value(&two).to_string(global_object);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 4. If calendarOne is calendarTwo, return true.
     // 4. If calendarOne is calendarTwo, return true.
     if (calendar_one == calendar_two)
     if (calendar_one == calendar_two)
         return true;
         return true;
+
     // 5. Return false.
     // 5. Return false.
     return false;
     return false;
 }
 }
 
 
 // 12.1.29 ConsolidateCalendars ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-consolidatecalendars
 // 12.1.29 ConsolidateCalendars ( one, two ), https://tc39.es/proposal-temporal/#sec-temporal-consolidatecalendars
-Object* consolidate_calendars(GlobalObject& global_object, Object& one, Object& two)
+ThrowCompletionOr<Object*> consolidate_calendars(GlobalObject& global_object, Object& one, Object& two)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
     // 1. If one and two are the same Object value, return two.
     // 1. If one and two are the same Object value, return two.
@@ -565,13 +577,13 @@ Object* consolidate_calendars(GlobalObject& global_object, Object& one, Object&
 
 
     // 2. Let calendarOne be ? ToString(one).
     // 2. Let calendarOne be ? ToString(one).
     auto calendar_one = Value(&one).to_string(global_object);
     auto calendar_one = Value(&one).to_string(global_object);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. Let calendarTwo be ? ToString(two).
     // 3. Let calendarTwo be ? ToString(two).
     auto calendar_two = Value(&two).to_string(global_object);
     auto calendar_two = Value(&two).to_string(global_object);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 4. If calendarOne is calendarTwo, return two.
     // 4. If calendarOne is calendarTwo, return two.
     if (calendar_one == calendar_two)
     if (calendar_one == calendar_two)
@@ -586,8 +598,7 @@ Object* consolidate_calendars(GlobalObject& global_object, Object& one, Object&
         return &one;
         return &one;
 
 
     // 7. Throw a RangeError exception.
     // 7. Throw a RangeError exception.
-    vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidCalendar);
-    return {};
+    return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidCalendar);
 }
 }
 
 
 // 12.1.30 IsISOLeapYear ( year ), https://tc39.es/proposal-temporal/#sec-temporal-isisoleapyear
 // 12.1.30 IsISOLeapYear ( year ), https://tc39.es/proposal-temporal/#sec-temporal-isisoleapyear
@@ -720,27 +731,26 @@ String build_iso_month_code(u8 month)
 }
 }
 
 
 // 12.1.37 ResolveISOMonth ( fields ), https://tc39.es/proposal-temporal/#sec-temporal-resolveisomonth
 // 12.1.37 ResolveISOMonth ( fields ), https://tc39.es/proposal-temporal/#sec-temporal-resolveisomonth
-double resolve_iso_month(GlobalObject& global_object, Object const& fields)
+ThrowCompletionOr<double> resolve_iso_month(GlobalObject& global_object, Object const& fields)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. Let month be ? Get(fields, "month").
     // 1. Let month be ? Get(fields, "month").
     auto month = fields.get(vm.names.month);
     auto month = fields.get(vm.names.month);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 2. Let monthCode be ? Get(fields, "monthCode").
     // 2. Let monthCode be ? Get(fields, "monthCode").
     auto month_code = fields.get(vm.names.monthCode);
     auto month_code = fields.get(vm.names.monthCode);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. If monthCode is undefined, then
     // 3. If monthCode is undefined, then
     if (month_code.is_undefined()) {
     if (month_code.is_undefined()) {
         // a. If month is undefined, throw a TypeError exception.
         // a. If month is undefined, throw a TypeError exception.
-        if (month.is_undefined()) {
-            vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.month.as_string());
-            return {};
-        }
+        if (month.is_undefined())
+            return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.month.as_string());
+
         // b. Return month.
         // b. Return month.
         return month.as_double();
         return month.as_double();
     }
     }
@@ -748,168 +758,158 @@ double resolve_iso_month(GlobalObject& global_object, Object const& fields)
     // 4. Assert: Type(monthCode) is String.
     // 4. Assert: Type(monthCode) is String.
     VERIFY(month_code.is_string());
     VERIFY(month_code.is_string());
     auto& month_code_string = month_code.as_string().string();
     auto& month_code_string = month_code.as_string().string();
+
     // 5. Let monthLength be the length of monthCode.
     // 5. Let monthLength be the length of monthCode.
     auto month_length = month_code_string.length();
     auto month_length = month_code_string.length();
+
     // 6. If monthLength is not 3, throw a RangeError exception.
     // 6. If monthLength is not 3, throw a RangeError exception.
-    if (month_length != 3) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
-        return {};
-    }
+    if (month_length != 3)
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
+
     // 7. Let numberPart be the substring of monthCode from 1.
     // 7. Let numberPart be the substring of monthCode from 1.
     auto number_part = month_code_string.substring(1);
     auto number_part = month_code_string.substring(1);
+
     // 8. Set numberPart to ! ToIntegerOrInfinity(numberPart).
     // 8. Set numberPart to ! ToIntegerOrInfinity(numberPart).
     auto number_part_integer = Value(js_string(vm, move(number_part))).to_integer_or_infinity(global_object);
     auto number_part_integer = Value(js_string(vm, move(number_part))).to_integer_or_infinity(global_object);
+
     // 9. If numberPart < 1 or numberPart > 12, throw a RangeError exception.
     // 9. If numberPart < 1 or numberPart > 12, throw a RangeError exception.
-    if (number_part_integer < 1 || number_part_integer > 12) {
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
-        return {};
-    }
+    if (number_part_integer < 1 || number_part_integer > 12)
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
+
     // 10. If month is not undefined, and month ≠ numberPart, then
     // 10. If month is not undefined, and month ≠ numberPart, then
     if (!month.is_undefined() && month.as_double() != number_part_integer) {
     if (!month.is_undefined() && month.as_double() != number_part_integer) {
         // a. Throw a RangeError exception.
         // a. Throw a RangeError exception.
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
-        return {};
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
     }
     }
+
     // 11. If ! SameValueNonNumeric(monthCode, ! BuildISOMonthCode(numberPart)) is false, then
     // 11. If ! SameValueNonNumeric(monthCode, ! BuildISOMonthCode(numberPart)) is false, then
     if (month_code_string != build_iso_month_code(number_part_integer)) {
     if (month_code_string != build_iso_month_code(number_part_integer)) {
         // a. Throw a RangeError exception.
         // a. Throw a RangeError exception.
-        vm.throw_exception<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
-        return {};
+        return vm.throw_completion<RangeError>(global_object, ErrorType::TemporalInvalidMonthCode);
     }
     }
+
     // 12. Return numberPart.
     // 12. Return numberPart.
     return number_part_integer;
     return number_part_integer;
 }
 }
 
 
 // 12.1.38 ISODateFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isodatefromfields
 // 12.1.38 ISODateFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isodatefromfields
-Optional<ISODate> iso_date_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
+ThrowCompletionOr<ISODate> iso_date_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. Assert: Type(fields) is Object.
     // 1. Assert: Type(fields) is Object.
 
 
     // 2. Let overflow be ? ToTemporalOverflow(options).
     // 2. Let overflow be ? ToTemporalOverflow(options).
-    auto overflow = TRY_OR_DISCARD(to_temporal_overflow(global_object, options));
+    auto overflow = TRY(to_temporal_overflow(global_object, options));
 
 
     // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », «»).
     // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », «»).
-    auto* prepared_fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, fields, { "day", "month", "monthCode", "year" }, {}));
+    auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "day", "month", "monthCode", "year" }, {}));
 
 
     // 4. Let year be ? Get(fields, "year").
     // 4. Let year be ? Get(fields, "year").
     auto year = prepared_fields->get(vm.names.year);
     auto year = prepared_fields->get(vm.names.year);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 5. If year is undefined, throw a TypeError exception.
     // 5. If year is undefined, throw a TypeError exception.
-    if (year.is_undefined()) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.year.as_string());
-        return {};
-    }
+    if (year.is_undefined())
+        return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.year.as_string());
 
 
     // 6. Let month be ? ResolveISOMonth(fields).
     // 6. Let month be ? ResolveISOMonth(fields).
-    auto month = resolve_iso_month(global_object, *prepared_fields);
-    if (vm.exception())
-        return {};
+    auto month = TRY(resolve_iso_month(global_object, *prepared_fields));
 
 
     // 7. Let day be ? Get(fields, "day").
     // 7. Let day be ? Get(fields, "day").
     auto day = prepared_fields->get(vm.names.day);
     auto day = prepared_fields->get(vm.names.day);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 8. If day is undefined, throw a TypeError exception.
     // 8. If day is undefined, throw a TypeError exception.
-    if (day.is_undefined()) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.day.as_string());
-        return {};
-    }
+    if (day.is_undefined())
+        return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.day.as_string());
 
 
     // 9. Return ? RegulateISODate(year, month, day, overflow).
     // 9. Return ? RegulateISODate(year, month, day, overflow).
-    return regulate_iso_date(global_object, year.as_double(), month, day.as_double(), overflow);
+    auto iso_date = regulate_iso_date(global_object, year.as_double(), month, day.as_double(), overflow);
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
+    return *iso_date;
 }
 }
 
 
 // 12.1.39 ISOYearMonthFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isoyearmonthfromfields
 // 12.1.39 ISOYearMonthFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isoyearmonthfromfields
-Optional<ISOYearMonth> iso_year_month_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
+ThrowCompletionOr<ISOYearMonth> iso_year_month_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. Assert: Type(fields) is Object.
     // 1. Assert: Type(fields) is Object.
 
 
     // 2. Let overflow be ? ToTemporalOverflow(options).
     // 2. Let overflow be ? ToTemporalOverflow(options).
-    auto overflow = TRY_OR_DISCARD(to_temporal_overflow(global_object, options));
+    auto overflow = TRY(to_temporal_overflow(global_object, options));
 
 
     // 3. Set fields to ? PrepareTemporalFields(fields, « "month", "monthCode", "year" », «»).
     // 3. Set fields to ? PrepareTemporalFields(fields, « "month", "monthCode", "year" », «»).
-    auto* prepared_fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, fields, { "month"sv, "monthCode"sv, "year"sv }, {}));
+    auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "month"sv, "monthCode"sv, "year"sv }, {}));
 
 
     // 4. Let year be ? Get(fields, "year").
     // 4. Let year be ? Get(fields, "year").
     auto year = prepared_fields->get(vm.names.year);
     auto year = prepared_fields->get(vm.names.year);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 5. If year is undefined, throw a TypeError exception.
     // 5. If year is undefined, throw a TypeError exception.
-    if (year.is_undefined()) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.year.as_string());
-        return {};
-    }
+    if (year.is_undefined())
+        return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.year.as_string());
 
 
     // 6. Let month be ? ResolveISOMonth(fields).
     // 6. Let month be ? ResolveISOMonth(fields).
-    auto month = resolve_iso_month(global_object, *prepared_fields);
-    if (vm.exception())
-        return {};
+    auto month = TRY(resolve_iso_month(global_object, *prepared_fields));
 
 
     // 7. Let result be ? RegulateISOYearMonth(year, month, overflow).
     // 7. Let result be ? RegulateISOYearMonth(year, month, overflow).
-    auto result = TRY_OR_DISCARD(regulate_iso_year_month(global_object, year.as_double(), month, overflow));
+    auto result = TRY(regulate_iso_year_month(global_object, year.as_double(), month, overflow));
 
 
     // 8. Return the Record { [[Year]]: result.[[Year]], [[Month]]: result.[[Month]], [[ReferenceISODay]]: 1 }.
     // 8. Return the Record { [[Year]]: result.[[Year]], [[Month]]: result.[[Month]], [[ReferenceISODay]]: 1 }.
     return ISOYearMonth { .year = result.year, .month = result.month, .reference_iso_day = 1 };
     return ISOYearMonth { .year = result.year, .month = result.month, .reference_iso_day = 1 };
 }
 }
 
 
 // 12.1.40 ISOMonthDayFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isomonthdayfromfields
 // 12.1.40 ISOMonthDayFromFields ( fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-isomonthdayfromfields
-Optional<ISOMonthDay> iso_month_day_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
+ThrowCompletionOr<ISOMonthDay> iso_month_day_from_fields(GlobalObject& global_object, Object const& fields, Object const& options)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
     // 1. Assert: Type(fields) is Object.
     // 1. Assert: Type(fields) is Object.
 
 
     // 2. Let overflow be ? ToTemporalOverflow(options).
     // 2. Let overflow be ? ToTemporalOverflow(options).
-    auto overflow = TRY_OR_DISCARD(to_temporal_overflow(global_object, options));
+    auto overflow = TRY(to_temporal_overflow(global_object, options));
 
 
     // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », «»).
     // 3. Set fields to ? PrepareTemporalFields(fields, « "day", "month", "monthCode", "year" », «»).
-    auto* prepared_fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, fields, { "day"sv, "month"sv, "monthCode"sv, "year"sv }, {}));
+    auto* prepared_fields = TRY(prepare_temporal_fields(global_object, fields, { "day"sv, "month"sv, "monthCode"sv, "year"sv }, {}));
 
 
     // 4. Let month be ? Get(fields, "month").
     // 4. Let month be ? Get(fields, "month").
     auto month_value = prepared_fields->get(vm.names.month);
     auto month_value = prepared_fields->get(vm.names.month);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 5. Let monthCode be ? Get(fields, "monthCode").
     // 5. Let monthCode be ? Get(fields, "monthCode").
     auto month_code = prepared_fields->get(vm.names.monthCode);
     auto month_code = prepared_fields->get(vm.names.monthCode);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 6. Let year be ? Get(fields, "year").
     // 6. Let year be ? Get(fields, "year").
     auto year = prepared_fields->get(vm.names.year);
     auto year = prepared_fields->get(vm.names.year);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 7. If month is not undefined, and monthCode and year are both undefined, then
     // 7. If month is not undefined, and monthCode and year are both undefined, then
     if (!month_value.is_undefined() && month_code.is_undefined() && year.is_undefined()) {
     if (!month_value.is_undefined() && month_code.is_undefined() && year.is_undefined()) {
         // a. Throw a TypeError exception.
         // a. Throw a TypeError exception.
-        vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, "monthCode or year");
-        return {};
+        return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, "monthCode or year");
     }
     }
 
 
     // 8. Set month to ? ResolveISOMonth(fields).
     // 8. Set month to ? ResolveISOMonth(fields).
-    auto month = resolve_iso_month(global_object, *prepared_fields);
-    if (vm.exception())
-        return {};
+    auto month = TRY(resolve_iso_month(global_object, *prepared_fields));
 
 
     // 9. Let day be ? Get(fields, "day").
     // 9. Let day be ? Get(fields, "day").
     auto day = prepared_fields->get(vm.names.day);
     auto day = prepared_fields->get(vm.names.day);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 10. If day is undefined, throw a TypeError exception.
     // 10. If day is undefined, throw a TypeError exception.
-    if (day.is_undefined()) {
-        vm.throw_exception<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.day.as_string());
-        return {};
-    }
+    if (day.is_undefined())
+        return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalMissingRequiredProperty, vm.names.day.as_string());
 
 
     // 11. Let referenceISOYear be 1972 (the first leap year after the Unix epoch).
     // 11. Let referenceISOYear be 1972 (the first leap year after the Unix epoch).
     i32 reference_iso_year = 1972;
     i32 reference_iso_year = 1972;
@@ -926,8 +926,8 @@ Optional<ISOMonthDay> iso_month_day_from_fields(GlobalObject& global_object, Obj
         // a. Let result be ? RegulateISODate(referenceISOYear, month, day, overflow).
         // a. Let result be ? RegulateISODate(referenceISOYear, month, day, overflow).
         result = regulate_iso_date(global_object, reference_iso_year, month, day.as_double(), overflow);
         result = regulate_iso_date(global_object, reference_iso_year, month, day.as_double(), overflow);
     }
     }
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 14. Return the Record { [[Month]]: result.[[Month]], [[Day]]: result.[[Day]], [[ReferenceISOYear]]: referenceISOYear }.
     // 14. Return the Record { [[Month]]: result.[[Month]], [[Day]]: result.[[Day]], [[ReferenceISOYear]]: referenceISOYear }.
     return ISOMonthDay { .month = result->month, .day = result->day, .reference_iso_year = reference_iso_year };
     return ISOMonthDay { .month = result->month, .day = result->day, .reference_iso_year = reference_iso_year };
@@ -1006,7 +1006,7 @@ u8 iso_day(Object& temporal_object)
 }
 }
 
 
 // 12.1.45 DefaultMergeFields ( fields, additionalFields ), https://tc39.es/proposal-temporal/#sec-temporal-defaultmergefields
 // 12.1.45 DefaultMergeFields ( fields, additionalFields ), https://tc39.es/proposal-temporal/#sec-temporal-defaultmergefields
-Object* default_merge_fields(GlobalObject& global_object, Object const& fields, Object const& additional_fields)
+ThrowCompletionOr<Object*> default_merge_fields(GlobalObject& global_object, Object const& fields, Object const& additional_fields)
 {
 {
     auto& vm = global_object.vm();
     auto& vm = global_object.vm();
 
 
@@ -1015,8 +1015,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
 
 
     // 2. Let originalKeys be ? EnumerableOwnPropertyNames(fields, key).
     // 2. Let originalKeys be ? EnumerableOwnPropertyNames(fields, key).
     auto original_keys = fields.enumerable_own_property_names(Object::PropertyKind::Key);
     auto original_keys = fields.enumerable_own_property_names(Object::PropertyKind::Key);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // 3. For each element nextKey of originalKeys, do
     // 3. For each element nextKey of originalKeys, do
     for (auto& next_key : original_keys) {
     for (auto& next_key : original_keys) {
@@ -1026,8 +1026,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
 
 
             // i. Let propValue be ? Get(fields, nextKey).
             // i. Let propValue be ? Get(fields, nextKey).
             auto prop_value = fields.get(property_name);
             auto prop_value = fields.get(property_name);
-            if (vm.exception())
-                return {};
+            if (auto* exception = vm.exception())
+                return throw_completion(exception->value());
 
 
             // ii. If propValue is not undefined, then
             // ii. If propValue is not undefined, then
             if (!prop_value.is_undefined()) {
             if (!prop_value.is_undefined()) {
@@ -1039,8 +1039,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
 
 
     // 4. Let newKeys be ? EnumerableOwnPropertyNames(additionalFields, key).
     // 4. Let newKeys be ? EnumerableOwnPropertyNames(additionalFields, key).
     auto new_keys = additional_fields.enumerable_own_property_names(Object::PropertyKind::Key);
     auto new_keys = additional_fields.enumerable_own_property_names(Object::PropertyKind::Key);
-    if (vm.exception())
-        return {};
+    if (auto* exception = vm.exception())
+        return throw_completion(exception->value());
 
 
     // IMPLEMENTATION DEFINED: This is an optimization, so we don't have to iterate new_keys three times (worst case), but only once.
     // IMPLEMENTATION DEFINED: This is an optimization, so we don't have to iterate new_keys three times (worst case), but only once.
     bool new_keys_contains_month_or_month_code_property = false;
     bool new_keys_contains_month_or_month_code_property = false;
@@ -1051,8 +1051,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
 
 
         // a. Let propValue be ? Get(additionalFields, nextKey).
         // a. Let propValue be ? Get(additionalFields, nextKey).
         auto prop_value = additional_fields.get(property_name);
         auto prop_value = additional_fields.get(property_name);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
 
 
         // b. If propValue is not undefined, then
         // b. If propValue is not undefined, then
         if (!prop_value.is_undefined()) {
         if (!prop_value.is_undefined()) {
@@ -1068,8 +1068,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
     if (!new_keys_contains_month_or_month_code_property) {
     if (!new_keys_contains_month_or_month_code_property) {
         // a. Let month be ? Get(fields, "month").
         // a. Let month be ? Get(fields, "month").
         auto month = fields.get(vm.names.month);
         auto month = fields.get(vm.names.month);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
 
 
         // b. If month is not undefined, then
         // b. If month is not undefined, then
         if (!month.is_undefined()) {
         if (!month.is_undefined()) {
@@ -1079,8 +1079,8 @@ Object* default_merge_fields(GlobalObject& global_object, Object const& fields,
 
 
         // c. Let monthCode be ? Get(fields, "monthCode").
         // c. Let monthCode be ? Get(fields, "monthCode").
         auto month_code = fields.get(vm.names.monthCode);
         auto month_code = fields.get(vm.names.monthCode);
-        if (vm.exception())
-            return {};
+        if (auto* exception = vm.exception())
+            return throw_completion(exception->value());
 
 
         // d. If monthCode is not undefined, then
         // d. If monthCode is not undefined, then
         if (!month_code.is_undefined()) {
         if (!month_code.is_undefined()) {

+ 31 - 30
Userland/Libraries/LibJS/Runtime/Temporal/Calendar.h

@@ -7,6 +7,7 @@
 
 
 #pragma once
 #pragma once
 
 
+#include <LibJS/Runtime/Completion.h>
 #include <LibJS/Runtime/Object.h>
 #include <LibJS/Runtime/Object.h>
 #include <LibJS/Runtime/Temporal/PlainDate.h>
 #include <LibJS/Runtime/Temporal/PlainDate.h>
 #include <LibJS/Runtime/Temporal/PlainMonthDay.h>
 #include <LibJS/Runtime/Temporal/PlainMonthDay.h>
@@ -29,34 +30,34 @@ private:
     String m_identifier; // [[Identifier]]
     String m_identifier; // [[Identifier]]
 };
 };
 
 
-Calendar* create_temporal_calendar(GlobalObject&, String const& identifier, FunctionObject const* new_target = nullptr);
+ThrowCompletionOr<Calendar*> create_temporal_calendar(GlobalObject&, String const& identifier, FunctionObject const* new_target = nullptr);
 bool is_builtin_calendar(String const& identifier);
 bool is_builtin_calendar(String const& identifier);
-Calendar* get_builtin_calendar(GlobalObject&, String const& identifier);
+ThrowCompletionOr<Calendar*> get_builtin_calendar(GlobalObject&, String const& identifier);
 Calendar* get_iso8601_calendar(GlobalObject&);
 Calendar* get_iso8601_calendar(GlobalObject&);
-Vector<String> calendar_fields(GlobalObject&, Object& calendar, Vector<StringView> const& field_names);
-double calendar_year(GlobalObject&, Object& calendar, Object& date_like);
-double calendar_month(GlobalObject&, Object& calendar, Object& date_like);
-String calendar_month_code(GlobalObject&, Object& calendar, Object& date_like);
-double calendar_day(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_day_of_week(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_day_of_year(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_week_of_year(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_days_in_week(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_days_in_month(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_days_in_year(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_months_in_year(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_in_leap_year(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_era(GlobalObject&, Object& calendar, Object& date_like);
-Value calendar_era_year(GlobalObject&, Object& calendar, Object& date_like);
-Object* to_temporal_calendar(GlobalObject&, Value);
-Object* to_temporal_calendar_with_iso_default(GlobalObject&, Value);
-Object* get_temporal_calendar_with_iso_default(GlobalObject&, Object&);
-PlainDate* date_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const& options);
-PlainYearMonth* year_month_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const* options = nullptr);
-PlainMonthDay* month_day_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options = nullptr);
+ThrowCompletionOr<Vector<String>> calendar_fields(GlobalObject&, Object& calendar, Vector<StringView> const& field_names);
+ThrowCompletionOr<double> calendar_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<double> calendar_month(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<String> calendar_month_code(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<double> calendar_day(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_day_of_week(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_day_of_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_week_of_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_days_in_week(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_days_in_month(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_days_in_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_months_in_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_in_leap_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_era(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Value> calendar_era_year(GlobalObject&, Object& calendar, Object& date_like);
+ThrowCompletionOr<Object*> to_temporal_calendar(GlobalObject&, Value);
+ThrowCompletionOr<Object*> to_temporal_calendar_with_iso_default(GlobalObject&, Value);
+ThrowCompletionOr<Object*> get_temporal_calendar_with_iso_default(GlobalObject&, Object&);
+ThrowCompletionOr<PlainDate*> date_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const& options);
+ThrowCompletionOr<PlainYearMonth*> year_month_from_fields(GlobalObject&, Object& calendar, Object const& fields, Object const* options = nullptr);
+ThrowCompletionOr<PlainMonthDay*> month_day_from_fields(GlobalObject& global_object, Object& calendar, Object const& fields, Object const* options = nullptr);
 String format_calendar_annotation(StringView id, StringView show_calendar);
 String format_calendar_annotation(StringView id, StringView show_calendar);
-bool calendar_equals(GlobalObject&, Object& one, Object& two);
-Object* consolidate_calendars(GlobalObject&, Object& one, Object& two);
+ThrowCompletionOr<bool> calendar_equals(GlobalObject&, Object& one, Object& two);
+ThrowCompletionOr<Object*> consolidate_calendars(GlobalObject&, Object& one, Object& two);
 bool is_iso_leap_year(i32 year);
 bool is_iso_leap_year(i32 year);
 u16 iso_days_in_year(i32 year);
 u16 iso_days_in_year(i32 year);
 u8 iso_days_in_month(i32 year, u8 month);
 u8 iso_days_in_month(i32 year, u8 month);
@@ -64,14 +65,14 @@ u8 to_iso_day_of_week(i32 year, u8 month, u8 day);
 u16 to_iso_day_of_year(i32 year, u8 month, u8 day);
 u16 to_iso_day_of_year(i32 year, u8 month, u8 day);
 u8 to_iso_week_of_year(i32 year, u8 month, u8 day);
 u8 to_iso_week_of_year(i32 year, u8 month, u8 day);
 String build_iso_month_code(u8 month);
 String build_iso_month_code(u8 month);
-double resolve_iso_month(GlobalObject&, Object const& fields);
-Optional<ISODate> iso_date_from_fields(GlobalObject&, Object const& fields, Object const& options);
-Optional<ISOYearMonth> iso_year_month_from_fields(GlobalObject&, Object const& fields, Object const& options);
-Optional<ISOMonthDay> iso_month_day_from_fields(GlobalObject&, Object const& fields, Object const& options);
+ThrowCompletionOr<double> resolve_iso_month(GlobalObject&, Object const& fields);
+ThrowCompletionOr<ISODate> iso_date_from_fields(GlobalObject&, Object const& fields, Object const& options);
+ThrowCompletionOr<ISOYearMonth> iso_year_month_from_fields(GlobalObject&, Object const& fields, Object const& options);
+ThrowCompletionOr<ISOMonthDay> iso_month_day_from_fields(GlobalObject&, Object const& fields, Object const& options);
 i32 iso_year(Object& temporal_object);
 i32 iso_year(Object& temporal_object);
 u8 iso_month(Object& temporal_object);
 u8 iso_month(Object& temporal_object);
 String iso_month_code(Object& temporal_object);
 String iso_month_code(Object& temporal_object);
 u8 iso_day(Object& temporal_object);
 u8 iso_day(Object& temporal_object);
-Object* default_merge_fields(GlobalObject&, Object const& fields, Object const& additional_fields);
+ThrowCompletionOr<Object*> default_merge_fields(GlobalObject&, Object const& fields, Object const& additional_fields);
 
 
 }
 }

+ 2 - 2
Userland/Libraries/LibJS/Runtime/Temporal/CalendarConstructor.cpp

@@ -61,7 +61,7 @@ Value CalendarConstructor::construct(FunctionObject& new_target)
     }
     }
 
 
     // 4. Return ? CreateTemporalCalendar(id, NewTarget).
     // 4. Return ? CreateTemporalCalendar(id, NewTarget).
-    return create_temporal_calendar(global_object, identifier, &new_target);
+    return TRY_OR_DISCARD(create_temporal_calendar(global_object, identifier, &new_target));
 }
 }
 
 
 // 12.3.2 Temporal.Calendar.from ( item ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.from
 // 12.3.2 Temporal.Calendar.from ( item ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.from
@@ -70,7 +70,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarConstructor::from)
     auto item = vm.argument(0);
     auto item = vm.argument(0);
 
 
     // 1. Return ? ToTemporalCalendar(item).
     // 1. Return ? ToTemporalCalendar(item).
-    return to_temporal_calendar(global_object, item);
+    return TRY_OR_DISCARD(to_temporal_calendar(global_object, item));
 }
 }
 
 
 }
 }

+ 7 - 13
Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp

@@ -95,12 +95,10 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::date_from_fields)
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
 
 
     // 6. Let result be ? ISODateFromFields(fields, options).
     // 6. Let result be ? ISODateFromFields(fields, options).
-    auto result = iso_date_from_fields(global_object, fields.as_object(), *options);
-    if (vm.exception())
-        return {};
+    auto result = TRY_OR_DISCARD(iso_date_from_fields(global_object, fields.as_object(), *options));
 
 
     // 7. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar).
     // 7. 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(global_object, 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
 // 12.4.5 Temporal.Calendar.prototype.yearMonthFromFields ( fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.yearmonthfromfields
@@ -127,12 +125,10 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::year_month_from_fields)
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
 
 
     // 6. Let result be ? ISOYearMonthFromFields(fields, options).
     // 6. Let result be ? ISOYearMonthFromFields(fields, options).
-    auto result = iso_year_month_from_fields(global_object, fields.as_object(), *options);
-    if (vm.exception())
-        return {};
+    auto result = TRY_OR_DISCARD(iso_year_month_from_fields(global_object, fields.as_object(), *options));
 
 
     // 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]).
     // 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]).
-    return TRY_OR_DISCARD(create_temporal_year_month(global_object, result->year, result->month, *calendar, result->reference_iso_day));
+    return TRY_OR_DISCARD(create_temporal_year_month(global_object, 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
 // 12.4.6 Temporal.Calendar.prototype.monthDayFromFields ( fields [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.monthdayfromfields
@@ -159,12 +155,10 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::month_day_from_fields)
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
     auto* options = TRY_OR_DISCARD(get_options_object(global_object, vm.argument(1)));
 
 
     // 6. Let result be ? ISOMonthDayFromFields(fields, options).
     // 6. Let result be ? ISOMonthDayFromFields(fields, options).
-    auto result = iso_month_day_from_fields(global_object, fields.as_object(), *options);
-    if (vm.exception())
-        return {};
+    auto result = TRY_OR_DISCARD(iso_month_day_from_fields(global_object, fields.as_object(), *options));
 
 
     // 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]).
     // 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]).
-    return TRY_OR_DISCARD(create_temporal_month_day(global_object, result->month, result->day, *calendar, result->reference_iso_year));
+    return TRY_OR_DISCARD(create_temporal_month_day(global_object, 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
 // 12.4.7 Temporal.Calendar.prototype.dateAdd ( date, duration [ , options ] ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.dateadd
@@ -617,7 +611,7 @@ JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::merge_fields)
         return {};
         return {};
 
 
     // 6. Return ? DefaultMergeFields(fields, additionalFields).
     // 6. Return ? DefaultMergeFields(fields, additionalFields).
-    return default_merge_fields(global_object, *fields, *additional_fields);
+    return TRY_OR_DISCARD(default_merge_fields(global_object, *fields, *additional_fields));
 }
 }
 
 
 // 12.4.23 Temporal.Calendar.prototype.toString ( ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.tostring
 // 12.4.23 Temporal.Calendar.prototype.toString ( ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.tostring

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/InstantPrototype.cpp

@@ -491,9 +491,7 @@ JS_DEFINE_NATIVE_FUNCTION(InstantPrototype::to_zoned_date_time)
     }
     }
 
 
     // 6. Let calendar be ? ToTemporalCalendar(calendarLike).
     // 6. Let calendar be ? ToTemporalCalendar(calendarLike).
-    auto* calendar = to_temporal_calendar(global_object, calendar_like);
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar(global_object, calendar_like));
 
 
     // 7. Let temporalTimeZoneLike be ? Get(item, "timeZone").
     // 7. Let temporalTimeZoneLike be ? Get(item, "timeZone").
     auto temporal_time_zone_like = item.as_object().get(vm.names.timeZone);
     auto temporal_time_zone_like = item.as_object().get(vm.names.timeZone);

+ 2 - 8
Userland/Libraries/LibJS/Runtime/Temporal/Now.cpp

@@ -198,7 +198,6 @@ Instant* system_instant(GlobalObject& global_object)
 // 2.3.4 SystemDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemdatetime
 // 2.3.4 SystemDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemdatetime
 PlainDateTime* system_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like)
 PlainDateTime* system_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like)
 {
 {
-    auto& vm = global_object.vm();
     Object* time_zone;
     Object* time_zone;
 
 
     // 1. If temporalTimeZoneLike is undefined, then
     // 1. If temporalTimeZoneLike is undefined, then
@@ -213,9 +212,7 @@ PlainDateTime* system_date_time(GlobalObject& global_object, Value temporal_time
     }
     }
 
 
     // 3. Let calendar be ? ToTemporalCalendar(calendarLike).
     // 3. Let calendar be ? ToTemporalCalendar(calendarLike).
-    auto* calendar = to_temporal_calendar(global_object, calendar_like);
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar(global_object, calendar_like));
 
 
     // 4. Let instant be ! SystemInstant().
     // 4. Let instant be ! SystemInstant().
     auto* instant = system_instant(global_object);
     auto* instant = system_instant(global_object);
@@ -227,7 +224,6 @@ PlainDateTime* system_date_time(GlobalObject& global_object, Value temporal_time
 // 2.3.5 SystemZonedDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemzoneddatetime
 // 2.3.5 SystemZonedDateTime ( temporalTimeZoneLike, calendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-systemzoneddatetime
 ZonedDateTime* system_zoned_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like)
 ZonedDateTime* system_zoned_date_time(GlobalObject& global_object, Value temporal_time_zone_like, Value calendar_like)
 {
 {
-    auto& vm = global_object.vm();
     Object* time_zone;
     Object* time_zone;
 
 
     // 1. If temporalTimeZoneLike is undefined, then
     // 1. If temporalTimeZoneLike is undefined, then
@@ -242,9 +238,7 @@ ZonedDateTime* system_zoned_date_time(GlobalObject& global_object, Value tempora
     }
     }
 
 
     // 3. Let calendar be ? ToTemporalCalendar(calendarLike).
     // 3. Let calendar be ? ToTemporalCalendar(calendarLike).
-    auto* calendar = to_temporal_calendar(global_object, calendar_like);
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar(global_object, calendar_like));
 
 
     // 4. Let ns be ! SystemUTCEpochNanoseconds().
     // 4. Let ns be ! SystemUTCEpochNanoseconds().
     auto* ns = system_utc_epoch_nanoseconds(global_object);
     auto* ns = system_utc_epoch_nanoseconds(global_object);

+ 4 - 10
Userland/Libraries/LibJS/Runtime/Temporal/PlainDate.cpp

@@ -112,20 +112,16 @@ PlainDate* to_temporal_date(GlobalObject& global_object, Value item, Object* opt
         }
         }
 
 
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
-        auto* calendar = get_temporal_calendar_with_iso_default(global_object, item_object);
-        if (vm.exception())
-            return {};
+        auto* calendar = TRY_OR_DISCARD(get_temporal_calendar_with_iso_default(global_object, item_object));
 
 
         // e. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »).
         // e. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »).
-        auto field_names = calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv });
-        if (vm.exception())
-            return {};
+        auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv }));
 
 
         // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, item_object, field_names, {}));
         auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, item_object, field_names, {}));
 
 
         // g. Return ? DateFromFields(calendar, fields, options).
         // g. Return ? DateFromFields(calendar, fields, options).
-        return date_from_fields(global_object, *calendar, *fields, *options);
+        return TRY_OR_DISCARD(date_from_fields(global_object, *calendar, *fields, *options));
     }
     }
 
 
     // 4. Perform ? ToTemporalOverflow(options).
     // 4. Perform ? ToTemporalOverflow(options).
@@ -143,9 +139,7 @@ PlainDate* to_temporal_date(GlobalObject& global_object, Value item, Object* opt
     VERIFY(is_valid_iso_date(result.year, result.month, result.day));
     VERIFY(is_valid_iso_date(result.year, result.month, result.day));
 
 
     // 8. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
     // 8. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
-    auto calendar = to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined());
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined()));
 
 
     // 9. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar).
     // 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(global_object, result.year, result.month, result.day, *calendar);

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainDateConstructor.cpp

@@ -62,9 +62,7 @@ Value PlainDateConstructor::construct(FunctionObject& new_target)
     auto d = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, vm.argument(2), ErrorType::TemporalInvalidPlainDate));
     auto d = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, vm.argument(2), ErrorType::TemporalInvalidPlainDate));
 
 
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, vm.argument(3));
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, vm.argument(3)));
 
 
     // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards.
     // 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
     // This does not change the exposed behavior as the call to CreateTemporalDate will immediately check that these values are valid

+ 20 - 26
Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp

@@ -88,7 +88,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarYear(calendar, temporalDate).
     // 4. Return ? CalendarYear(calendar, temporalDate).
-    return Value(calendar_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.5 get Temporal.PlainDate.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.month
 // 3.3.5 get Temporal.PlainDate.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.month
@@ -104,7 +104,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::month_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarMonth(calendar, temporalDate).
     // 4. Return ? CalendarMonth(calendar, temporalDate).
-    return Value(calendar_month(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_month(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.6 get Temporal.PlainDate.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthCode
 // 3.3.6 get Temporal.PlainDate.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthCode
@@ -120,7 +120,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::month_code_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarMonthCode(calendar, temporalDate).
     // 4. Return ? CalendarMonthCode(calendar, temporalDate).
-    return js_string(vm, calendar_month_code(global_object, calendar, *temporal_date));
+    return js_string(vm, TRY_OR_DISCARD(calendar_month_code(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.7 get Temporal.PlainDate.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.day
 // 3.3.7 get Temporal.PlainDate.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.day
@@ -136,7 +136,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarDay(calendar, temporalDate).
     // 4. Return ? CalendarDay(calendar, temporalDate).
-    return Value(calendar_day(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_day(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.8 get Temporal.PlainDate.prototype.dayOfWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofweek
 // 3.3.8 get Temporal.PlainDate.prototype.dayOfWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofweek
@@ -152,7 +152,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_of_week_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // Return ? CalendarDayOfWeek(calendar, temporalDate).
     // Return ? CalendarDayOfWeek(calendar, temporalDate).
-    return Value(calendar_day_of_week(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_day_of_week(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.9 get Temporal.PlainDate.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofyear
 // 3.3.9 get Temporal.PlainDate.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.dayofyear
@@ -168,7 +168,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::day_of_year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarDayOfYear(calendar, temporalDate).
     // 4. Return ? CalendarDayOfYear(calendar, temporalDate).
-    return Value(calendar_day_of_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_day_of_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.10 get Temporal.PlainDate.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.weekofyear
 // 3.3.10 get Temporal.PlainDate.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.weekofyear
@@ -184,7 +184,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::week_of_year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // Return ? CalendarWeekOfYear(calendar, temporalDate).
     // Return ? CalendarWeekOfYear(calendar, temporalDate).
-    return Value(calendar_week_of_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_week_of_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.11 get Temporal.PlainDate.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinweek
 // 3.3.11 get Temporal.PlainDate.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinweek
@@ -200,7 +200,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_week_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarDaysInWeek(calendar, temporalDate).
     // 4. Return ? CalendarDaysInWeek(calendar, temporalDate).
-    return Value(calendar_days_in_week(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_days_in_week(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.12 get Temporal.PlainDate.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinmonth
 // 3.3.12 get Temporal.PlainDate.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinmonth
@@ -216,7 +216,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_month_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarDaysInMonth(calendar, temporalDate).
     // 4. Return ? CalendarDaysInMonth(calendar, temporalDate).
-    return Value(calendar_days_in_month(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_days_in_month(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.13 get Temporal.PlainDate.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinyear
 // 3.3.13 get Temporal.PlainDate.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.daysinyear
@@ -232,7 +232,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarDaysInYear(calendar, temporalDate).
     // 4. Return ? CalendarDaysInYear(calendar, temporalDate).
-    return Value(calendar_days_in_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_days_in_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.14 get Temporal.PlainDate.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthsinyear
 // 3.3.14 get Temporal.PlainDate.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthsinyear
@@ -248,7 +248,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::months_in_year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarMonthsInYear(calendar, temporalDate).
     // 4. Return ? CalendarMonthsInYear(calendar, temporalDate).
-    return Value(calendar_months_in_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_months_in_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 3.3.15 get Temporal.PlainDate.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.inleapyear
 // 3.3.15 get Temporal.PlainDate.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.inleapyear
@@ -264,7 +264,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::in_leap_year_getter)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Return ? CalendarInLeapYear(calendar, temporalDate).
     // 4. Return ? CalendarInLeapYear(calendar, temporalDate).
-    return Value(calendar_in_leap_year(global_object, calendar, *temporal_date));
+    return Value(TRY_OR_DISCARD(calendar_in_leap_year(global_object, calendar, *temporal_date)));
 }
 }
 
 
 // 15.6.5.2 get Temporal.PlainDate.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.era
 // 15.6.5.2 get Temporal.PlainDate.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.era
@@ -280,7 +280,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::era_getter)
     auto& calendar = plain_date->calendar();
     auto& calendar = plain_date->calendar();
 
 
     // 4. Return ? CalendarEra(calendar, plainDate).
     // 4. Return ? CalendarEra(calendar, plainDate).
-    return calendar_era(global_object, calendar, *plain_date);
+    return TRY_OR_DISCARD(calendar_era(global_object, calendar, *plain_date));
 }
 }
 
 
 // 15.6.5.3 get Temporal.PlainDate.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.erayear
 // 15.6.5.3 get Temporal.PlainDate.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.erayear
@@ -296,7 +296,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::era_year_getter)
     auto& calendar = plain_date->calendar();
     auto& calendar = plain_date->calendar();
 
 
     // 4. Return ? CalendarEraYear(calendar, plainDate).
     // 4. Return ? CalendarEraYear(calendar, plainDate).
-    return calendar_era_year(global_object, calendar, *plain_date);
+    return TRY_OR_DISCARD(calendar_era_year(global_object, calendar, *plain_date));
 }
 }
 
 
 // 3.3.16 Temporal.PlainDate.prototype.toPlainYearMonth ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainyearmonth
 // 3.3.16 Temporal.PlainDate.prototype.toPlainYearMonth ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainyearmonth
@@ -312,15 +312,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_year_month)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
     // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
-    auto field_names = calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv });
-    if (vm.exception())
-        return {};
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv }));
 
 
     // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»).
     // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»).
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date, field_names, {}));
 
 
     // 6. Return ? YearMonthFromFields(calendar, fields).
     // 6. Return ? YearMonthFromFields(calendar, fields).
-    return year_month_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(year_month_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 3.3.17 Temporal.PlainDate.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainmonthday
 // 3.3.17 Temporal.PlainDate.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplainmonthday
@@ -336,15 +334,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_month_day)
     auto& calendar = temporal_date->calendar();
     auto& calendar = temporal_date->calendar();
 
 
     // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
     // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
-    auto field_names = calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv });
-    if (vm.exception())
-        return {};
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv }));
 
 
     // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»).
     // 5. Let fields be ? PrepareTemporalFields(temporalDate, fieldNames, «»).
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date, field_names, {}));
 
 
     // 6. Return ? MonthDayFromFields(calendar, fields).
     // 6. Return ? MonthDayFromFields(calendar, fields).
-    return month_day_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(month_day_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 3.3.18 Temporal.PlainDate.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.getisofields
 // 3.3.18 Temporal.PlainDate.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.getisofields
@@ -385,9 +381,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::with_calendar)
         return {};
         return {};
 
 
     // 3. Let calendar be ? ToTemporalCalendar(calendar).
     // 3. Let calendar be ? ToTemporalCalendar(calendar).
-    auto calendar = to_temporal_calendar(global_object, vm.argument(0));
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar(global_object, vm.argument(0)));
 
 
     // 4. Return ? CreateTemporalDate(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], calendar).
     // 4. Return ? CreateTemporalDate(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], calendar).
     return create_temporal_date(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), *calendar);
     return create_temporal_date(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), *calendar);
@@ -417,7 +411,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals)
     if (temporal_date->iso_day() != other->iso_day())
     if (temporal_date->iso_day() != other->iso_day())
         return Value(false);
         return Value(false);
     // 7. Return ? CalendarEquals(temporalDate.[[Calendar]], other.[[Calendar]]).
     // 7. Return ? CalendarEquals(temporalDate.[[Calendar]], other.[[Calendar]]).
-    return Value(calendar_equals(global_object, temporal_date->calendar(), other->calendar()));
+    return Value(TRY_OR_DISCARD(calendar_equals(global_object, temporal_date->calendar(), other->calendar())));
 }
 }
 
 
 // 3.3.26 Temporal.PlainDate.prototype.toPlainDateTime ( [ temporalTime ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplaindatetime
 // 3.3.26 Temporal.PlainDate.prototype.toPlainDateTime ( [ temporalTime ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplaindatetime

+ 4 - 14
Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTime.cpp

@@ -101,15 +101,11 @@ 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
 // 5.5.3 InterpretTemporalDateTimeFields ( calendar, fields, options ), https://tc39.es/proposal-temporal/#sec-temporal-interprettemporaldatetimefields
 Optional<ISODateTime> interpret_temporal_date_time_fields(GlobalObject& global_object, Object& calendar, Object& fields, Object& options)
 Optional<ISODateTime> interpret_temporal_date_time_fields(GlobalObject& global_object, Object& calendar, Object& fields, Object& options)
 {
 {
-    auto& vm = global_object.vm();
-
     // 1. Let timeResult be ? ToTemporalTimeRecord(fields).
     // 1. Let timeResult be ? ToTemporalTimeRecord(fields).
     auto unregulated_time_result = TRY_OR_DISCARD(to_temporal_time_record(global_object, fields));
     auto unregulated_time_result = TRY_OR_DISCARD(to_temporal_time_record(global_object, fields));
 
 
     // 2. Let temporalDate be ? DateFromFields(calendar, fields, options).
     // 2. Let temporalDate be ? DateFromFields(calendar, fields, options).
-    auto* temporal_date = date_from_fields(global_object, calendar, fields, options);
-    if (vm.exception())
-        return {};
+    auto* temporal_date = TRY_OR_DISCARD(date_from_fields(global_object, calendar, fields, options));
 
 
     // 3. Let overflow be ? ToTemporalOverflow(options).
     // 3. Let overflow be ? ToTemporalOverflow(options).
     auto overflow = TRY_OR_DISCARD(to_temporal_overflow(global_object, options));
     auto overflow = TRY_OR_DISCARD(to_temporal_overflow(global_object, options));
@@ -173,14 +169,10 @@ PlainDateTime* to_temporal_date_time(GlobalObject& global_object, Value item, Ob
         }
         }
 
 
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
-        calendar = get_temporal_calendar_with_iso_default(global_object, item_object);
-        if (vm.exception())
-            return {};
+        calendar = TRY_OR_DISCARD(get_temporal_calendar_with_iso_default(global_object, item_object));
 
 
         // e. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »).
         // e. Let fieldNames be ? CalendarFields(calendar, « "day", "hour", "microsecond", "millisecond", "minute", "month", "monthCode", "nanosecond", "second", "year" »).
-        auto field_names = 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 });
-        if (vm.exception())
-            return {};
+        auto field_names = TRY_OR_DISCARD(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 }));
 
 
         // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         // f. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, item_object, field_names, {}));
         auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, item_object, field_names, {}));
@@ -211,9 +203,7 @@ PlainDateTime* to_temporal_date_time(GlobalObject& global_object, Value item, Ob
         VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond));
         VERIFY(is_valid_time(result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond));
 
 
         // f. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
         // f. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
-        calendar = to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined());
-        if (vm.exception())
-            return {};
+        calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined()));
     }
     }
 
 
     // 4. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], calendar).
     // 4. Return ? CreateTemporalDateTime(result.[[Year]], result.[[Month]], result.[[Day]], result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]], calendar).

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimeConstructor.cpp

@@ -80,9 +80,7 @@ Value PlainDateTimeConstructor::construct(FunctionObject& new_target)
     auto nanosecond = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, vm.argument(8), ErrorType::TemporalInvalidPlainDateTime));
     auto nanosecond = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, vm.argument(8), ErrorType::TemporalInvalidPlainDateTime));
 
 
     // 11. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 11. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, vm.argument(9));
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, vm.argument(9)));
 
 
     // IMPLEMENTATION DEFINED: This is an optimization that allows us to treat these doubles as normal integers from this point onwards.
     // 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
     // This does not change the exposed behavior as the call to CreateTemporalDateTime will immediately check that these values are valid

+ 21 - 27
Userland/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp

@@ -91,7 +91,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarYear(calendar, dateTime).
     // 4. Return ? CalendarYear(calendar, dateTime).
-    return Value(calendar_year(global_object, calendar, *date_time));
+    return Value(TRY_OR_DISCARD(calendar_year(global_object, calendar, *date_time)));
 }
 }
 
 
 // 5.3.5 get Temporal.PlainDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.month
 // 5.3.5 get Temporal.PlainDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.month
@@ -107,7 +107,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::month_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarMonth(calendar, dateTime).
     // 4. Return ? CalendarMonth(calendar, dateTime).
-    return Value(calendar_month(global_object, calendar, *date_time));
+    return Value(TRY_OR_DISCARD(calendar_month(global_object, calendar, *date_time)));
 }
 }
 
 
 // 5.3.6 get Temporal.PlainDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthcode
 // 5.3.6 get Temporal.PlainDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthcode
@@ -123,7 +123,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::month_code_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarMonthCode(calendar, dateTime).
     // 4. Return ? CalendarMonthCode(calendar, dateTime).
-    return js_string(vm, calendar_month_code(global_object, calendar, *date_time));
+    return js_string(vm, TRY_OR_DISCARD(calendar_month_code(global_object, calendar, *date_time)));
 }
 }
 
 
 // 5.3.7 get Temporal.PlainDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.day
 // 5.3.7 get Temporal.PlainDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.day
@@ -139,7 +139,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDay(calendar, dateTime).
     // 4. Return ? CalendarDay(calendar, dateTime).
-    return Value(calendar_day(global_object, calendar, *date_time));
+    return Value(TRY_OR_DISCARD(calendar_day(global_object, calendar, *date_time)));
 }
 }
 
 
 // 5.3.8 get Temporal.PlainDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.hour
 // 5.3.8 get Temporal.PlainDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.hour
@@ -233,7 +233,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_of_week_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDayOfWeek(calendar, dateTime).
     // 4. Return ? CalendarDayOfWeek(calendar, dateTime).
-    return calendar_day_of_week(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_day_of_week(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.15 get Temporal.PlainDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.dayofyear
 // 5.3.15 get Temporal.PlainDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.dayofyear
@@ -249,7 +249,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::day_of_year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDayOfYear(calendar, dateTime).
     // 4. Return ? CalendarDayOfYear(calendar, dateTime).
-    return calendar_day_of_year(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_day_of_year(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.16 get Temporal.PlainDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.weekofyear
 // 5.3.16 get Temporal.PlainDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.weekofyear
@@ -265,7 +265,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::week_of_year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarWeekOfYear(calendar, dateTime).
     // 4. Return ? CalendarWeekOfYear(calendar, dateTime).
-    return calendar_week_of_year(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_week_of_year(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.17 get Temporal.PlainDateTime.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinweek
 // 5.3.17 get Temporal.PlainDateTime.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinweek
@@ -281,7 +281,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_week_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDaysInWeek(calendar, dateTime).
     // 4. Return ? CalendarDaysInWeek(calendar, dateTime).
-    return calendar_days_in_week(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_days_in_week(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.18 get Temporal.PlainDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinmonth
 // 5.3.18 get Temporal.PlainDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinmonth
@@ -297,7 +297,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_month_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDaysInMonth(calendar, dateTime).
     // 4. Return ? CalendarDaysInMonth(calendar, dateTime).
-    return calendar_days_in_month(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_days_in_month(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.19 get Temporal.PlainDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinyear
 // 5.3.19 get Temporal.PlainDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.daysinyear
@@ -313,7 +313,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::days_in_year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarDaysInYear(calendar, dateTime).
     // 4. Return ? CalendarDaysInYear(calendar, dateTime).
-    return calendar_days_in_year(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_days_in_year(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.20 get Temporal.PlainDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthsinyear
 // 5.3.20 get Temporal.PlainDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.monthsinyear
@@ -329,7 +329,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::months_in_year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarMonthsInYear(calendar, dateTime).
     // 4. Return ? CalendarMonthsInYear(calendar, dateTime).
-    return calendar_months_in_year(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_months_in_year(global_object, calendar, *date_time));
 }
 }
 
 
 // 5.3.21 get Temporal.PlainDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.inleapyear
 // 5.3.21 get Temporal.PlainDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.inleapyear
@@ -345,7 +345,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::in_leap_year_getter)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Return ? CalendarInLeapYear(calendar, dateTime).
     // 4. Return ? CalendarInLeapYear(calendar, dateTime).
-    return calendar_in_leap_year(global_object, calendar, *date_time);
+    return TRY_OR_DISCARD(calendar_in_leap_year(global_object, calendar, *date_time));
 }
 }
 
 
 // 15.6.6.2 get Temporal.PlainDateTime.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.era
 // 15.6.6.2 get Temporal.PlainDateTime.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.era
@@ -361,7 +361,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::era_getter)
     auto& calendar = plain_date_time->calendar();
     auto& calendar = plain_date_time->calendar();
 
 
     // 4. Return ? CalendarEra(calendar, plainDateTime).
     // 4. Return ? CalendarEra(calendar, plainDateTime).
-    return calendar_era(global_object, calendar, *plain_date_time);
+    return TRY_OR_DISCARD(calendar_era(global_object, calendar, *plain_date_time));
 }
 }
 
 
 // 15.6.6.3 get Temporal.PlainDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.erayear
 // 15.6.6.3 get Temporal.PlainDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.erayear
@@ -377,7 +377,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::era_year_getter)
     auto& calendar = plain_date_time->calendar();
     auto& calendar = plain_date_time->calendar();
 
 
     // 4. Return ? CalendarEraYear(calendar, plainDateTime).
     // 4. Return ? CalendarEraYear(calendar, plainDateTime).
-    return calendar_era_year(global_object, calendar, *plain_date_time);
+    return TRY_OR_DISCARD(calendar_era_year(global_object, calendar, *plain_date_time));
 }
 }
 
 
 // 5.3.23 Temporal.PlainDateTime.prototype.withPlainTime ( [ plainTimeLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaintime
 // 5.3.23 Temporal.PlainDateTime.prototype.withPlainTime ( [ plainTimeLike ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaintime
@@ -417,9 +417,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with_plain_date)
         return {};
         return {};
 
 
     // 4. Let calendar be ? ConsolidateCalendars(dateTime.[[Calendar]], plainDate.[[Calendar]]).
     // 4. Let calendar be ? ConsolidateCalendars(dateTime.[[Calendar]], plainDate.[[Calendar]]).
-    auto* calendar = consolidate_calendars(global_object, date_time->calendar(), plain_date->calendar());
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(consolidate_calendars(global_object, 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).
     // 5. Return ? CreateTemporalDateTime(plainDate.[[ISOYear]], plainDate.[[ISOMonth]], plainDate.[[ISODay]], dateTime.[[ISOHour]], dateTime.[[ISOMinute]], dateTime.[[ISOSecond]], dateTime.[[ISOMillisecond]], dateTime.[[ISOMicrosecond]], dateTime.[[ISONanosecond]], calendar).
     return 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 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);
@@ -435,7 +433,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::with_calendar)
         return {};
         return {};
 
 
     // 3. Let calendar be ? ToTemporalCalendar(calendar).
     // 3. Let calendar be ? ToTemporalCalendar(calendar).
-    auto* calendar = to_temporal_calendar(global_object, vm.argument(0));
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar(global_object, vm.argument(0)));
     if (vm.exception())
     if (vm.exception())
         return {};
         return {};
 
 
@@ -465,7 +463,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::equals)
         return Value(false);
         return Value(false);
 
 
     // 6. Return ? CalendarEquals(dateTime.[[Calendar]], other.[[Calendar]]).
     // 6. Return ? CalendarEquals(dateTime.[[Calendar]], other.[[Calendar]]).
-    return Value(calendar_equals(global_object, date_time->calendar(), other->calendar()));
+    return Value(TRY_OR_DISCARD(calendar_equals(global_object, date_time->calendar(), other->calendar())));
 }
 }
 
 
 // 5.3.35 Temporal.PlainDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.valueof
 // 5.3.35 Temporal.PlainDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.valueof
@@ -502,15 +500,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_year_month)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
     // 4. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
-    auto field_names = calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv });
-    if (vm.exception())
-        return {};
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv }));
 
 
     // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»).
     // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»).
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *date_time, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *date_time, field_names, {}));
 
 
     // 6. Return ? YearMonthFromFields(calendar, fields).
     // 6. Return ? YearMonthFromFields(calendar, fields).
-    return year_month_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(year_month_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 5.3.39 Temporal.PlainDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplainmonthday
 // 5.3.39 Temporal.PlainDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplainmonthday
@@ -526,15 +522,13 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_month_day)
     auto& calendar = date_time->calendar();
     auto& calendar = date_time->calendar();
 
 
     // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
     // 4. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
-    auto field_names = calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv });
-    if (vm.exception())
-        return {};
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv }));
 
 
     // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»).
     // 5. Let fields be ? PrepareTemporalFields(dateTime, fieldNames, «»).
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *date_time, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *date_time, field_names, {}));
 
 
     // 6. Return ? MonthDayFromFields(calendar, fields).
     // 6. Return ? MonthDayFromFields(calendar, fields).
-    return month_day_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(month_day_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 5.3.40 Temporal.PlainDateTime.prototype.toPlainTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaintime
 // 5.3.40 Temporal.PlainDateTime.prototype.toPlainTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaintime

+ 2 - 6
Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDay.cpp

@@ -92,15 +92,11 @@ ThrowCompletionOr<PlainMonthDay*> to_temporal_month_day(GlobalObject& global_obj
             calendar_absent = calendar_value.is_undefined();
             calendar_absent = calendar_value.is_undefined();
 
 
             // iv. Set calendar to ? ToTemporalCalendarWithISODefault(calendar).
             // iv. Set calendar to ? ToTemporalCalendarWithISODefault(calendar).
-            calendar = to_temporal_calendar_with_iso_default(global_object, calendar_value);
-            if (auto* exception = vm.exception())
-                return throw_completion(exception->value());
+            calendar = TRY(to_temporal_calendar_with_iso_default(global_object, calendar_value));
         }
         }
 
 
         // d. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »).
         // d. Let fieldNames be ? CalendarFields(calendar, « "day", "month", "monthCode", "year" »).
-        auto field_names = calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv });
-        if (auto* exception = vm.exception())
-            return throw_completion(exception->value());
+        auto field_names = TRY(calendar_fields(global_object, *calendar, { "day"sv, "month"sv, "monthCode"sv, "year"sv }));
 
 
         // e. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         // e. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, {}));
         auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, {}));

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayConstructor.cpp

@@ -68,9 +68,7 @@ Value PlainMonthDayConstructor::construct(FunctionObject& new_target)
     auto d = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, iso_day, ErrorType::TemporalInvalidPlainMonthDay));
     auto d = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, iso_day, ErrorType::TemporalInvalidPlainMonthDay));
 
 
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, calendar_like);
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, calendar_like));
 
 
     // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISOYear).
     // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISOYear).
     auto ref = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, reference_iso_year, ErrorType::TemporalInvalidPlainMonthDay));
     auto ref = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, reference_iso_year, ErrorType::TemporalInvalidPlainMonthDay));

+ 3 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainMonthDayPrototype.cpp

@@ -67,7 +67,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::month_code_getter)
     auto& calendar = month_day->calendar();
     auto& calendar = month_day->calendar();
 
 
     // 4. Return ? CalendarMonthCode(calendar, monthDay).
     // 4. Return ? CalendarMonthCode(calendar, monthDay).
-    return js_string(vm, calendar_month_code(global_object, calendar, *month_day));
+    return js_string(vm, TRY_OR_DISCARD(calendar_month_code(global_object, calendar, *month_day)));
 }
 }
 
 
 // 10.3.5 get Temporal.PlainMonthDay.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plainmonthday.prototype.day
 // 10.3.5 get Temporal.PlainMonthDay.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.plainmonthday.prototype.day
@@ -83,7 +83,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::day_getter)
     auto& calendar = month_day->calendar();
     auto& calendar = month_day->calendar();
 
 
     // 4. Return 𝔽(? CalendarDay(calendar, monthDay)).
     // 4. Return 𝔽(? CalendarDay(calendar, monthDay)).
-    return Value(calendar_day(global_object, calendar, *month_day));
+    return Value(TRY_OR_DISCARD(calendar_day(global_object, calendar, *month_day)));
 }
 }
 
 
 // 10.3.7 Temporal.PlainMonthDay.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.equals
 // 10.3.7 Temporal.PlainMonthDay.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.equals
@@ -111,7 +111,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainMonthDayPrototype::equals)
         return Value(false);
         return Value(false);
 
 
     // 7. Return ? CalendarEquals(monthDay.[[Calendar]], other.[[Calendar]]).
     // 7. Return ? CalendarEquals(monthDay.[[Calendar]], other.[[Calendar]]).
-    return Value(calendar_equals(global_object, month_day->calendar(), other->calendar()));
+    return Value(TRY_OR_DISCARD(calendar_equals(global_object, month_day->calendar(), other->calendar())));
 }
 }
 
 
 // 10.3.8 Temporal.PlainMonthDay.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tostring
 // 10.3.8 Temporal.PlainMonthDay.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tostring

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainTime.cpp

@@ -81,9 +81,7 @@ ThrowCompletionOr<PlainTime*> to_temporal_time(GlobalObject& global_object, Valu
         }
         }
 
 
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
         // d. Let calendar be ? GetTemporalCalendarWithISODefault(item).
-        auto* calendar = get_temporal_calendar_with_iso_default(global_object, item_object);
-        if (auto* exception = vm.exception())
-            return throw_completion(exception->value());
+        auto* calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object));
 
 
         // e. If ? ToString(calendar) is not "iso8601", then
         // e. If ? ToString(calendar) is not "iso8601", then
         auto calendar_identifier = Value(calendar).to_string(global_object);
         auto calendar_identifier = Value(calendar).to_string(global_object);

+ 3 - 9
Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonth.cpp

@@ -52,14 +52,10 @@ ThrowCompletionOr<PlainYearMonth*> to_temporal_year_month(GlobalObject& global_o
         }
         }
 
 
         // b. Let calendar be ? GetTemporalCalendarWithISODefault(item).
         // b. Let calendar be ? GetTemporalCalendarWithISODefault(item).
-        auto* calendar = get_temporal_calendar_with_iso_default(global_object, item_object);
-        if (auto* exception = vm.exception())
-            return throw_completion(exception->value());
+        auto* calendar = TRY(get_temporal_calendar_with_iso_default(global_object, item_object));
 
 
         // c. Let fieldNames be ? CalendarFields(calendar, « "month", "monthCode", "year" »).
         // c. Let fieldNames be ? CalendarFields(calendar, « "month", "monthCode", "year" »).
-        auto field_names = calendar_fields(global_object, *calendar, { "month"sv, "monthCode"sv, "year"sv });
-        if (auto* exception = vm.exception())
-            return throw_completion(exception->value());
+        auto field_names = TRY(calendar_fields(global_object, *calendar, { "month"sv, "monthCode"sv, "year"sv }));
 
 
         // d. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         // d. Let fields be ? PrepareTemporalFields(item, fieldNames, «»).
         auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, {}));
         auto* fields = TRY(prepare_temporal_fields(global_object, item_object, field_names, {}));
@@ -80,9 +76,7 @@ ThrowCompletionOr<PlainYearMonth*> to_temporal_year_month(GlobalObject& global_o
     auto result = TRY(parse_temporal_year_month_string(global_object, string));
     auto result = TRY(parse_temporal_year_month_string(global_object, string));
 
 
     // 7. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
     // 7. Let calendar be ? ToTemporalCalendarWithISODefault(result.[[Calendar]]).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined());
-    if (auto* exception = vm.exception())
-        return throw_completion(exception->value());
+    auto* calendar = TRY(to_temporal_calendar_with_iso_default(global_object, result.calendar.has_value() ? js_string(vm, *result.calendar) : js_undefined()));
 
 
     // 8. Set result to ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[Day]]).
     // 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(global_object, result.year, result.month, *calendar, result.day));

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthConstructor.cpp

@@ -70,9 +70,7 @@ Value PlainYearMonthConstructor::construct(FunctionObject& new_target)
     auto m = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, iso_month, ErrorType::TemporalInvalidPlainYearMonth));
     auto m = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, iso_month, ErrorType::TemporalInvalidPlainYearMonth));
 
 
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, calendar_like);
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, calendar_like));
 
 
     // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISODay).
     // 6. Let ref be ? ToIntegerThrowOnInfinity(referenceISODay).
     auto ref = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, reference_iso_day, ErrorType::TemporalInvalidPlainYearMonth));
     auto ref = TRY_OR_DISCARD(to_integer_throw_on_infinity(global_object, reference_iso_day, ErrorType::TemporalInvalidPlainYearMonth));

+ 10 - 10
Userland/Libraries/LibJS/Runtime/Temporal/PlainYearMonthPrototype.cpp

@@ -74,7 +74,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::year_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return 𝔽(? CalendarYear(calendar, yearMonth)).
     // 4. Return 𝔽(? CalendarYear(calendar, yearMonth)).
-    return Value(calendar_year(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_year(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.5 get Temporal.PlainYearMonth.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.month
 // 9.3.5 get Temporal.PlainYearMonth.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.month
@@ -90,7 +90,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::month_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return 𝔽(? CalendarMonth(calendar, yearMonth)).
     // 4. Return 𝔽(? CalendarMonth(calendar, yearMonth)).
-    return Value(calendar_month(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_month(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.6 get Temporal.PlainYearMonth.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthCode
 // 9.3.6 get Temporal.PlainYearMonth.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthCode
@@ -106,7 +106,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::month_code_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return ? CalendarMonthCode(calendar, yearMonth).
     // 4. Return ? CalendarMonthCode(calendar, yearMonth).
-    return js_string(vm, calendar_month_code(global_object, calendar, *year_month));
+    return js_string(vm, TRY_OR_DISCARD(calendar_month_code(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.7 get Temporal.PlainYearMonth.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinyear
 // 9.3.7 get Temporal.PlainYearMonth.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinyear
@@ -122,7 +122,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::days_in_year_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return ? CalendarDaysInYear(calendar, yearMonth).
     // 4. Return ? CalendarDaysInYear(calendar, yearMonth).
-    return Value(calendar_days_in_year(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_days_in_year(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.8 get Temporal.PlainYearMonth.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinmonth
 // 9.3.8 get Temporal.PlainYearMonth.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.daysinmonth
@@ -138,7 +138,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::days_in_month_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return ? CalendarDaysInMonth(calendar, yearMonth).
     // 4. Return ? CalendarDaysInMonth(calendar, yearMonth).
-    return Value(calendar_days_in_month(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_days_in_month(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.9 get Temporal.PlainYearMonth.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthsinyear
 // 9.3.9 get Temporal.PlainYearMonth.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.monthsinyear
@@ -154,7 +154,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::months_in_year_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return ? CalendarMonthsInYear(calendar, yearMonth).
     // 4. Return ? CalendarMonthsInYear(calendar, yearMonth).
-    return Value(calendar_months_in_year(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_months_in_year(global_object, calendar, *year_month)));
 }
 }
 
 
 // 9.3.10 get Temporal.PlainYearMonth.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.inleapyear
 // 9.3.10 get Temporal.PlainYearMonth.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.inleapyear
@@ -170,7 +170,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::in_leap_year_getter)
     auto& calendar = year_month->calendar();
     auto& calendar = year_month->calendar();
 
 
     // 4. Return ? CalendarInLeapYear(calendar, yearMonth).
     // 4. Return ? CalendarInLeapYear(calendar, yearMonth).
-    return Value(calendar_in_leap_year(global_object, calendar, *year_month));
+    return Value(TRY_OR_DISCARD(calendar_in_leap_year(global_object, calendar, *year_month)));
 }
 }
 
 
 // 15.6.9.2 get Temporal.PlainYearMonth.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.era
 // 15.6.9.2 get Temporal.PlainYearMonth.prototype.era, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.era
@@ -186,7 +186,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::era_getter)
     auto& calendar = plain_year_month->calendar();
     auto& calendar = plain_year_month->calendar();
 
 
     // 4. Return ? CalendarEra(calendar, plainYearMonth).
     // 4. Return ? CalendarEra(calendar, plainYearMonth).
-    return calendar_era(global_object, calendar, *plain_year_month);
+    return TRY_OR_DISCARD(calendar_era(global_object, calendar, *plain_year_month));
 }
 }
 
 
 // 15.6.9.3 get Temporal.PlainYearMonth.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.erayear
 // 15.6.9.3 get Temporal.PlainYearMonth.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plainyearmonth.prototype.erayear
@@ -202,7 +202,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::era_year_getter)
     auto& calendar = plain_year_month->calendar();
     auto& calendar = plain_year_month->calendar();
 
 
     // 4. Return ? CalendarEraYear(calendar, plainYearMonth).
     // 4. Return ? CalendarEraYear(calendar, plainYearMonth).
-    return calendar_era_year(global_object, calendar, *plain_year_month);
+    return TRY_OR_DISCARD(calendar_era_year(global_object, calendar, *plain_year_month));
 }
 }
 
 
 // 9.3.16 Temporal.PlainYearMonth.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.equals
 // 9.3.16 Temporal.PlainYearMonth.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.equals
@@ -230,7 +230,7 @@ JS_DEFINE_NATIVE_FUNCTION(PlainYearMonthPrototype::equals)
         return Value(false);
         return Value(false);
 
 
     // 7. Return ? CalendarEquals(yearMonth.[[Calendar]], other.[[Calendar]]).
     // 7. Return ? CalendarEquals(yearMonth.[[Calendar]], other.[[Calendar]]).
-    return Value(calendar_equals(global_object, year_month->calendar(), other->calendar()));
+    return Value(TRY_OR_DISCARD(calendar_equals(global_object, year_month->calendar(), other->calendar())));
 }
 }
 
 
 // 9.3.17 Temporal.PlainYearMonth.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.tostring
 // 9.3.17 Temporal.PlainYearMonth.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plainyearmonth.prototype.tostring

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/TimeZonePrototype.cpp

@@ -101,9 +101,7 @@ JS_DEFINE_NATIVE_FUNCTION(TimeZonePrototype::get_plain_date_time_for)
         return {};
         return {};
 
 
     // 3. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 3. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, vm.argument(1));
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, vm.argument(1)));
 
 
     // 4. Return ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar).
     // 4. Return ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar).
     return TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, time_zone, *instant, *calendar));
     return TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, time_zone, *instant, *calendar));

+ 1 - 3
Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimeConstructor.cpp

@@ -63,9 +63,7 @@ Value ZonedDateTimeConstructor::construct(FunctionObject& new_target)
     auto* time_zone = TRY_OR_DISCARD(to_temporal_time_zone(global_object, vm.argument(1)));
     auto* time_zone = TRY_OR_DISCARD(to_temporal_time_zone(global_object, vm.argument(1)));
 
 
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
     // 5. Let calendar be ? ToTemporalCalendarWithISODefault(calendarLike).
-    auto* calendar = to_temporal_calendar_with_iso_default(global_object, vm.argument(2));
-    if (vm.exception())
-        return {};
+    auto* calendar = TRY_OR_DISCARD(to_temporal_calendar_with_iso_default(global_object, vm.argument(2)));
 
 
     // 6. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar, NewTarget).
     // 6. Return ? CreateTemporalZonedDateTime(epochNanoseconds, timeZone, calendar, NewTarget).
     return TRY_OR_DISCARD(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, *time_zone, *calendar, &new_target));
     return TRY_OR_DISCARD(create_temporal_zoned_date_time(global_object, *epoch_nanoseconds, *time_zone, *calendar, &new_target));

+ 18 - 20
Userland/Libraries/LibJS/Runtime/Temporal/ZonedDateTimePrototype.cpp

@@ -121,7 +121,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarYear(calendar, temporalDateTime).
     // 7. Return ? CalendarYear(calendar, temporalDateTime).
-    return Value(calendar_year(global_object, calendar, *temporal_date_time));
+    return Value(TRY_OR_DISCARD(calendar_year(global_object, calendar, *temporal_date_time)));
 }
 }
 
 
 // 6.3.6 get Temporal.ZonedDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.month
 // 6.3.6 get Temporal.ZonedDateTime.prototype.month, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.month
@@ -146,7 +146,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::month_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarMonth(calendar, temporalDateTime).
     // 7. Return ? CalendarMonth(calendar, temporalDateTime).
-    return Value(calendar_month(global_object, calendar, *temporal_date_time));
+    return Value(TRY_OR_DISCARD(calendar_month(global_object, calendar, *temporal_date_time)));
 }
 }
 
 
 // 6.3.7 get Temporal.ZonedDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthcode
 // 6.3.7 get Temporal.ZonedDateTime.prototype.monthCode, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthcode
@@ -171,7 +171,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::month_code_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarMonthCode(calendar, temporalDateTime).
     // 7. Return ? CalendarMonthCode(calendar, temporalDateTime).
-    return js_string(vm, calendar_month_code(global_object, calendar, *temporal_date_time));
+    return js_string(vm, TRY_OR_DISCARD(calendar_month_code(global_object, calendar, *temporal_date_time)));
 }
 }
 
 
 // 6.3.8 get Temporal.ZonedDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.day
 // 6.3.8 get Temporal.ZonedDateTime.prototype.day, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.day
@@ -196,7 +196,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDay(calendar, temporalDateTime).
     // 7. Return ? CalendarDay(calendar, temporalDateTime).
-    return Value(calendar_day(global_object, calendar, *temporal_date_time));
+    return Value(TRY_OR_DISCARD(calendar_day(global_object, calendar, *temporal_date_time)));
 }
 }
 
 
 // 6.3.9 get Temporal.ZonedDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.hour
 // 6.3.9 get Temporal.ZonedDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.hour
@@ -441,7 +441,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_of_week_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDayOfWeek(calendar, temporalDateTime).
     // 7. Return ? CalendarDayOfWeek(calendar, temporalDateTime).
-    return calendar_day_of_week(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_day_of_week(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.20 get Temporal.ZonedDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.dayofyear
 // 6.3.20 get Temporal.ZonedDateTime.prototype.dayOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.dayofyear
@@ -466,7 +466,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_of_year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDayOfYear(calendar, temporalDateTime).
     // 7. Return ? CalendarDayOfYear(calendar, temporalDateTime).
-    return calendar_day_of_year(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_day_of_year(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.21 get Temporal.ZonedDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.weekofyear
 // 6.3.21 get Temporal.ZonedDateTime.prototype.weekOfYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.weekofyear
@@ -491,7 +491,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::week_of_year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarWeekOfYear(calendar, temporalDateTime).
     // 7. Return ? CalendarWeekOfYear(calendar, temporalDateTime).
-    return calendar_week_of_year(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_week_of_year(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.23 get Temporal.ZonedDateTime.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinweek
 // 6.3.23 get Temporal.ZonedDateTime.prototype.daysInWeek, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinweek
@@ -516,7 +516,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_week_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDaysInWeek(calendar, temporalDateTime).
     // 7. Return ? CalendarDaysInWeek(calendar, temporalDateTime).
-    return calendar_days_in_week(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_days_in_week(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.24 get Temporal.ZonedDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinmonth
 // 6.3.24 get Temporal.ZonedDateTime.prototype.daysInMonth, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinmonth
@@ -541,7 +541,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_month_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDaysInMonth(calendar, temporalDateTime).
     // 7. Return ? CalendarDaysInMonth(calendar, temporalDateTime).
-    return calendar_days_in_month(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_days_in_month(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.25 get Temporal.ZonedDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinyear
 // 6.3.25 get Temporal.ZonedDateTime.prototype.daysInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.daysinyear
@@ -566,7 +566,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::days_in_year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarDaysInYear(calendar, temporalDateTime).
     // 7. Return ? CalendarDaysInYear(calendar, temporalDateTime).
-    return calendar_days_in_year(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_days_in_year(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.26 get Temporal.ZonedDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthsinyear
 // 6.3.26 get Temporal.ZonedDateTime.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.monthsinyear
@@ -591,7 +591,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::months_in_year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarMonthsInYear(calendar, temporalDateTime).
     // 7. Return ? CalendarMonthsInYear(calendar, temporalDateTime).
-    return calendar_months_in_year(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_months_in_year(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.27 get Temporal.ZonedDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.inleapyear
 // 6.3.27 get Temporal.ZonedDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.inleapyear
@@ -616,7 +616,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::in_leap_year_getter)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarInLeapYear(calendar, temporalDateTime).
     // 7. Return ? CalendarInLeapYear(calendar, temporalDateTime).
-    return calendar_in_leap_year(global_object, calendar, *temporal_date_time);
+    return TRY_OR_DISCARD(calendar_in_leap_year(global_object, calendar, *temporal_date_time));
 }
 }
 
 
 // 6.3.28 get Temporal.ZonedDateTime.prototype.offsetNanoseconds, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.offsetnanoseconds
 // 6.3.28 get Temporal.ZonedDateTime.prototype.offsetNanoseconds, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.offsetnanoseconds
@@ -677,7 +677,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::era_getter)
     auto* plain_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* plain_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarEra(calendar, plainDateTime).
     // 7. Return ? CalendarEra(calendar, plainDateTime).
-    return calendar_era(global_object, calendar, *plain_date_time);
+    return TRY_OR_DISCARD(calendar_era(global_object, calendar, *plain_date_time));
 }
 }
 
 
 // 15.6.10.3 get Temporal.ZonedDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.erayear
 // 15.6.10.3 get Temporal.ZonedDateTime.prototype.eraYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.erayear
@@ -702,7 +702,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::era_year_getter)
     auto* plain_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* plain_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Return ? CalendarEraYear(calendar, plainDateTime).
     // 7. Return ? CalendarEraYear(calendar, plainDateTime).
-    return calendar_era_year(global_object, calendar, *plain_date_time);
+    return TRY_OR_DISCARD(calendar_era_year(global_object, calendar, *plain_date_time));
 }
 }
 
 
 // 6.3.44 Temporal.ZonedDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.valueof
 // 6.3.44 Temporal.ZonedDateTime.prototype.valueOf ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.valueof
@@ -817,15 +817,13 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_year_month)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
     // 7. Let fieldNames be ? CalendarFields(calendar, « "monthCode", "year" »).
-    auto field_names = calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv });
-    if (vm.exception())
-        return {};
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "monthCode"sv, "year"sv }));
 
 
     // 8. Let fields be ? PrepareTemporalFields(temporalDateTime, fieldNames, «»).
     // 8. Let fields be ? PrepareTemporalFields(temporalDateTime, fieldNames, «»).
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date_time, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date_time, field_names, {}));
 
 
     // 9. Return ? YearMonthFromFields(calendar, fields).
     // 9. Return ? YearMonthFromFields(calendar, fields).
-    return year_month_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(year_month_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 6.3.51 Temporal.ZonedDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplainmonthday
 // 6.3.51 Temporal.ZonedDateTime.prototype.toPlainMonthDay ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.toplainmonthday
@@ -850,7 +848,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_month_day)
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
     auto* temporal_date_time = TRY_OR_DISCARD(builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar));
 
 
     // 7. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
     // 7. Let fieldNames be ? CalendarFields(calendar, « "day", "monthCode" »).
-    auto field_names = calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv });
+    auto field_names = TRY_OR_DISCARD(calendar_fields(global_object, calendar, { "day"sv, "monthCode"sv }));
     if (vm.exception())
     if (vm.exception())
         return {};
         return {};
 
 
@@ -858,7 +856,7 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::to_plain_month_day)
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date_time, field_names, {}));
     auto* fields = TRY_OR_DISCARD(prepare_temporal_fields(global_object, *temporal_date_time, field_names, {}));
 
 
     // 9. Return ? MonthDayFromFields(calendar, fields).
     // 9. Return ? MonthDayFromFields(calendar, fields).
-    return month_day_from_fields(global_object, calendar, *fields);
+    return TRY_OR_DISCARD(month_day_from_fields(global_object, calendar, *fields));
 }
 }
 
 
 // 6.3.52 Temporal.ZonedDateTime.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.getisofields
 // 6.3.52 Temporal.ZonedDateTime.prototype.getISOFields ( ), https://tc39.es/proposal-temporal/#sec-temporal.zoneddatetime.prototype.getisofields